第十九课--Microduino 内部基准源ADC采样

来自Microduino Wikipedia
跳转至: 导航搜索
Language English

目的

了解中断,并通过按键来学习掌握中断的用法。

中断

中断的基本原理

一个正在做的事情被外部的事情打断,当执行完外部事情后,继续做原本的事情。例如:老师在上课,有同学迟到要进教室突然打断老师上课请老师准许进教室,老师准许之后又开始讲课,这就是中断。

中断概念

所谓中断,是指CPU在正常运行程序时,由于内部/外部事件或由程序预先安排的事件,引起CPU中断正在运行的程序,而转到为内部/外部事件或为预先安排的事件服务的程序中去,服务完毕,再返回去执行波暂时中断的程序。

由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理该事件的一个程序。该程序执行完成后,CPU接着执行被暂停的程序。这个过程称为中断。

中断分类

  • 中断源的位置
    • 中断源在CPU的内部,称为内部中断;
    • 中断源在CPU的外部,称为外部中断。
  • 中断引脚的不同或者CPU响应中断的不同条件:可屏蔽中断和不可屏蔽中断。

中断好处

  • 实行分时操作提高 CPU 的效率,只有当服务对象向CPU发出中断申请时才去为它服务,这样我们就可以利用中断功能同时为多个对象服务,从而大大提高了CPU的工作效率。
  • 实现实时处理,利用中断技术,各个服务对象可以根据需要随时向 CPU 发出中断申请,及时发现和处理中断请求。

设备

Microduino-Core Microduino-FT232R

  • 其他硬件设备
    • 面包板跳线 一盒
    • 面包板 一块
    • LED发光二极管 一个
    • 220欧姆电阻 一个
    • 按键 一个
    • USB数据连接线 一根

原理图

  • Microduino core:两路外部中断,分别为D2、D3;
  • Microduino core+:三路路外部中断,分别为D2、D3和D6。

程序

  • 不使用外部中断
int botton= 2;          // 定义输入信号引脚
int pin = 13;
volatile int state = LOW;
 
void setup()
{                
  // 设置输入信号引脚为输入状态、输出引脚为输出状态
  pinMode(botton,INPUT); 
  pinMode(pin,OUTPUT);
}
 
void loop()                     
{
  state = digitalRead(botton);      //读取微动开关状态
 
  digitalWrite(ledOut, state);    //把读取的状态赋予LED指示灯
 
  //模拟一个长的流程或者复杂的任务
  for (int i = 0; i < 100; i++)
  {
    //延时10毫秒
    delay(10); 
  }
}
  • 使用外部中断
int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, RISING);
}

void loop()
{
  digitalWrite(pin, state);//把读取的状态赋予LED指示灯
  //模拟一个长的流程或者复杂的任务
  for (int i = 0; i < 100; i++)
  {
    //延时10毫秒
    delay(10); 
  }
}

void blink()
{
  state = !state;
}

结果

结果 未使用中断时按下开关,按住一会儿LED状态才能改变,使用中断之后LED状态就会立刻变化。

中断语法

  • 语法:
    • attachInterrupt(interrupt, function, mode)
  • 参数:
    • interrupt:中断引脚数
    • function:中断发生时调用的函数,该函数会取代正在执行的程序,此函数必须不带参数和不返回任何值。该函数有时被称为中断服务程序。
    • mode:定义何时发生中断以下四个contstants预定有效值:
      • LOW: 当引脚为低电平时,触发中断
      • CHANGE: 当引脚电平发生改变时,触发中断
      • RISING :当引脚由低电平变为高电平时,触发中断
      • FALLING :当引脚由高电平变为低电平时,触发中断.

重新分配中断

中断可以再任何时候通过attachInterrupt()命令进行改变。当重新使用attachInterrupt()时,先前分配的中断就会从对应引脚上移除。

启用\停止中断

microduino也可以忽略所有中断。如果你需要在一段代码中不执行中断,只需要执行 noInterrupts()命令。当这段代码执行完以后,你可以使用 interrupts()命令重新启用中断。

删除中断

终端也可以通过detachInterrupt(interrupt_number)命令进行删除。

注意事项

当中断函数发生时,delya()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。