成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

arduino.nba竞猜

当您需要一个响应的程序时,Arduinonba竞猜很有用 几乎立即到了一个事件。如果将数字信号应用于引脚2 或3个arduino uno,那么这些可以触发nba竞猜(还有更多 )。

在软件侧(对于Arduino代码),您需要使用两种功能:

  1.     attachInterrupt( <interrupt>,my_isr_function,mode)。
  2.     DigitalPintointerruct(Intpin)。

由于不同的Arduino板在不同的情况下具有nba竞猜功能 引脚,您应该使用DigitePintErtrupt(Intpin)函数。 follows:

    #define INTPIN 3

    AttaNtInterruct(DigitalPintErtrupt(Intpin),My_Isr_Function,下降);

这将在PIN3(INT1)上设置nba竞猜以调用"my_isr_function" 在数字输入信号的下降沿。注意:模式可能很低, 改变,上升或下降。

笔记: 解除nba竞猜的相反功能是:
   脱离(DigitalPintErtrupt(Intpin))。

有多少arduinonba竞猜?

...在Arduino Uno上只有两个外部nba竞猜针脚:

  • 引脚2 - nba竞猜0。
  • 引脚3 - nba竞猜1。

你认为这是一个真正的陈述吗?:"只有两个外部nba竞猜"

看看你是否知道正确的答案:
arduino. UNO上有多少外部nba竞猜?

  • 2
  • 5
  • 26
  • 32
2,5,26或32? (点击查看)

令人惊讶的是有26岁!

有2个外部 nba竞猜(INT0,INT1)加上三组8个引脚更改nba竞猜。

arduino.nba竞猜概述

微控制器非常友好,反复做一项任务 以另一个指令执行一个指令。他们这样做 递增程序计数器并从中获取下一个指令 记忆。当处理器必须处理意外时,问题来自 events.

对于外部事件,您需要将程序分支并执行 没有等待当前任务完成的东西。这 这样做的机制是nba竞猜。

考虑等待串口数据的程序。这是一项投票 循环不断读取串口寄存器等待数据。 但是,您希望程序对按钮进行反应,按开始 another activity.

在轮询串行端口时,您的程序就没有了 这是nba竞猜进来的地方。[是的,我知道串口有一个 nba竞猜 - 让我休息 - 它只是例证的一个例子]。

外部nba竞猜将临时将处理器从其转移 当前操作到所谓的ISR(nba竞猜服务例程) 将执行您需要的操作。不仅如此,它将执行 ISR几乎立即提供了一种快速回应的简单方法 events.

arduino.nba竞猜向量

当nba竞猜触发您的程序时 必须做点什么。你告诉Arduino通过提供一个人该做什么 函数服务nba竞猜(ISR或nba竞猜服务 Routine).

ISR的地址被放入表格中的特定位置 nba竞猜向量。该表中的每个位置都是特定于每个位置的 打断。当nba竞猜触发时,您的ISR被调用。

有6个专用的外部nba竞猜。这些是nba竞猜向量表中的前六个条目:

地址
矢量名称
0
重启
1
INT0
2
INT1
3
PCINT0
4
PCINT1
5
PCINT2
二,您已经知道了:Int0和Int1,但还有重置 坐在地址零时的向量,因此在程序计数器设置时 到其上电状态(0x0000),执行重置向量处的代码 - 在此矢量地址,您将跳转到重置的搬运程序。 pcint0〜2是 引脚nba竞猜变化向量。

arduino. Uno共有26个nba竞猜向量,大多数这些 是触发的内部nba竞猜 内部外围设备,如ADC,计时器或UART等。

nba竞猜源的总数(任何可能导致nba竞猜到触发器的内部模块)是:

26-3+3*8  =  47

[这包括内部模块nba竞猜和3x8引脚改变信号。 ]

arduino.nba竞猜调用堆栈

对于普通函数调用,堆栈用于保存和恢复 程序计数器(PC)。 PC包含当前的地址 instruction.

调用子程序时,将PC的值推送到 堆栈,并且当子程序完成时,弹出值 从堆栈。从而将PC返回到其原始地址之前 函数调用。相同的过程用于ISR子程序。

对于子程序调用,汇编程序指令调用按下PC 到堆栈上。要从呼叫返回,请托将PC从堆栈中弹出。

子程序返回和ISR返回之间的唯一区别是 ISR返回使用重新启用的Reti指令 interrupts.

ISR运营

因此,ISR几乎与正常的子程序呼叫相同。这 问题是可以随时损坏ISR 现有寄存器值。

要允许ISR工作时,必须存储当前寄存器值 最后并在最后恢复。幸运的是,这是照顾的 for you within the 编译器。所有相关标志和寄存器都保存在之前,然后在nba竞猜后恢复。

通过这种方式,目前的程序是 在其运作的中间nba竞猜,并不了解任何关于 interrupt.

硬件连接

将一侧的按钮连接到Arduino Pin D2,另一侧连接到地面。

将100NF电容从Arduino Pin D2连接到地。探索 nba竞猜和切换衰弱以及为什么这项工作会看到页面 切换debouncing..

示例显示Arduinonba竞猜操作

软件

arduino. IDE:1.8.9+

图书馆

没有使用。

示例素描1

arduino.nba竞猜硬件设置

将PIN D2的按钮连接到地。

arduino.nba竞猜代码描述

为了说明这个概念,请考虑下面的简单程序, 所有它确实以500ms的间隔闪烁开启和关闭,然后 重复。如果按下按钮导致nba竞猜,则将延迟时间切换到50ms。

延迟功能显示nba竞猜是 操作 - 即使大部分时间都坐在内部 延迟功能一无所获。

添加nba竞猜代码允许程序立即反应 更改LED Flash的延迟时间(更新时滞时间 立即在nba竞猜)然而,LED的闪光灯不会 自从延迟操作必须先完成以来,立即更新。这 下面的第二个例子, 展示如何避免使用 arduino. Millis..

// By John Main © best-microcontroller-projects.com
// Simple LED flash and button interrupt using delay().
#define LED LED_BUILTIN
#define interruptPin 2  // Can only be pin 2 or 3 on the Uno.

volatile uint16_t delayTime= 500;

//////////////////////////////////////////////
void setup(void) {
  pinMode(LED,OUTPUT);
  pinMode(打断Pin,INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(打断Pin), myisr, RISING);
}

//////////////////////////////////////////////
// Arduino Delay LED flash.
void loop(){

  delay(delayTime);
  digitalWrite(LED,HIGH);
  delay(delayTime);
  digitalWrite(LED,LOW);
}

//////////////////////////////////////////////
// Interrupt Service Routine
// Do not use this ISR in 'real' code because
// of switch bouncing see this page for useful
// code:
// //www.peoplescan.net/easy_switch_debounce.html
//
void myisr() {
static byte state = 1;
 
state = !state; if (state) delayTime = 500; else delayTime = 50; }

[文件:flash_led_on_interrupt_button.ino]


示例素描2

arduino.nba竞猜硬件设置

将PIN D2的按钮连接到地(与草图1相同)。

arduino.nba竞猜代码描述

这是一个更现实的例子,其中主循环更多地反应更多 快速到nba竞猜发送的信息。而不是使用延迟函数(这是无所作为的操作) 毫米()函数 用来。这允许处理器做其他有用的工作;在这种情况下,更快地执行循环函数。

注意:因为我们在此代码中使用Millis(),它也用于ISR中 过滤掉太多的弹跳即,如果我们得到2个或更多nba竞猜 在300ms内,例程仅在一个nba竞猜上行动。

提示: 看到页面 切换debouncing. 看看电容器过滤器的开关反弹。

// By John Main © best-microcontroller-projects.com
// Simple LED flash and button interrupt using millis().
#define LED LED_BUILTIN
#define interruptPin 2  // Can only be pin 2 or 3 on the Uno.

volatile uint16_t delayTime= 500;

uint32_t timeWas = 0;

//////////////////////////////////////////////
void setup(void) {
  pinMode(LED,OUTPUT);
  pinMode(打断Pin,INPUT_PULLUP);
  digitalWrite(LED,LOW);
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(打断Pin), myisr, RISING);
}

//////////////////////////////////////////////
// Arduino millis delay LED flash.
void loop(){
  static byte LEDstate=0;

  if (millis()-timeWas>delayTime) {
    timeWas = millis();
    LEDstate = LEDstate ? 0 : 1;
    if (LEDstate) digitalWrite(LED,HIGH); else digitalWrite(LED,LOW);
  }
}

//////////////////////////////////////////////
// Interrupt Service Routine
void myisr() {
static byte state = 1;
static uint32_t lastButtonTime=0;

  // Filter out too quick buttons = errors.
  if (millis()-lastButtonTime > 300) {
    state = !state;
    if (state) delayTime = 500; else delayTime = 50;
    lastButtonTime = millis();
  }
}

[文件:flash_led_on_interrupt_button_millis.ino]

arduino. - 何时使用挥发性

只有在正常程序流程外可以更改变量,才需要arduino volatile命令。

您可以在上面的草图中看到易失性的示例。

在普通函数中,变量被输入到函数 参数。然后在功能中使用这些,并且可以返回 作为功​​能的值。

在这种情况下,编译器知道可能发生的所有操作 那个变量和它们发生的时候。它完全由代码定义 写在功能内。因此,编译器可以做出假设 关于优化操作的变量。

对于从nba竞猜例程接收信息的函数, 通过全局变量沟通,nba竞猜可以更改值 在任何时候都在该功能的情况下运行!

编制者在幕后和Arduino背后进行花哨的优化 volatile关键字告诉编译器"单独留下这个变量" and 没有优化它。必须对变量留下可用的变量 函数和读取和更新的ISR。它告诉编译器重新阅读 值且未读取缓存版本,因为该变量可能已被nba竞猜更新。

PCINT Arduinonba竞猜

这些是与每个端口相关联的引脚更改nba竞猜 arduino。因此,有3个端口每个都有8个引脚,可以检测到8个引脚 用于nba竞猜使用。这些标记为pcint0..23。

提示: PCINT0..23可用于从睡眠模式(除空闲)唤醒零件。

nba竞猜是PCINT2..0寄存器。使用它们必须使用 硬件寄存器名称(READ-THE-DATASHEET)即它不太 易于正常的Arduinonba竞猜方法。

警告: 警告:PCINT0..23即使输出引脚也会触发nba竞猜。

如何使用pcint

硬件设置

  • 将PIN A0的按钮连接到地。
  • 将PIN A4的按钮连接到地。
  • 将A3的声音连接到地面(Piezo Disc:可选)。

如何设置引脚更改nba竞猜

由于这些nba竞猜比Int0和Int1更简单,因此它们仅限 触发引脚更改。它们也只触发8位的块 没有指示引起nba竞猜的迹象。这 three problems are:

  1. 任何8个引脚的单个nba竞猜触发器。
  2. 没有指示哪个引脚触发nba竞猜。
  3. 这些nba竞猜仅触发引脚更改。

第一个要做的是使用掩码寄存器启用或禁用 一个8位块中的单个引脚。然后只有这些会导致一个 nba竞猜触发。你不'要触发nba竞猜的输出 - 他们可以做到这一点,可以用作软件nba竞猜机制。

第二件事是在(和之后)之前录制端口值 nba竞猜操作。这样你可以使用XOR表达式来查找 out the pin changes.

让我们从端口C中获取一些nba竞猜PC4和PC0 分别位于PCINT8和PCINT12上。端口C的掩模寄存器是 PCMSK1.

代码描述

串口显示一些信息,因为按钮被推动。 按A0按钮将LED闪光灯设置为500ms和推动 A4按钮将闪光速率设置为50ms。

循环代码

在循环()代码中,LED在Delaytime中设置的速率闪烁 (在ISR中更改)。如果检测到nba竞猜(设置了FLGTONE),则nba竞猜的数量将打印到串行 港口。如果有多个nba竞猜(intsfound),则高频声音是 否则制造了低频声音。

FLGTONE和INTSFOUND都重置为零准备下一个按钮推动。

警告: 由于检测到PIN上的任何更改 作为nba竞猜,下降和上升的边缘将导致nba竞猜但是 开关弹跳 也会导致更多的nba竞猜。

由于开关反弹,每个按钮都可以有很多以上的弹跳。看看 如何 消除nba竞猜例程中的开关弹跳。

ISR Code.

在ISR中,旧端口值是具有新值的xored(任何 不同的比特显示为“那些”)。 v1和v2给出了旧值 the port. 

对于以下代码;如果检测到A0的变化,并且V1为零,则延迟时间设置为500ms。

if(v1 == 0&& change & (1<<PCINT8))延迟= 500;

为A4完成类似的过程。

如果发现任何上升沿,则Flgtone递增。

如果(改变&&(v1 == 0 || v2 == 0))flgtone ++; //仅限上升沿

旧斗篷值是更新的,如果nba竞猜检测(intsfound)递增,则数字是更新的。

// By John Main © best-microcontroller-projects.com
// Using Pin Change interrupts.
const byte LED = LED_BUILTIN;
const byte TONE_PIN = A3;
const byte PC0_pin = A0;
const byte PC4_pin = A4;
volatile byte state = LOW;

volatile static byte oldPorta;
volatile static byte PCMask;
volatile uint16_t delayTime= 500;
volatile byte flgTone = 0, 在 tsFound = 0;

void setup() {

  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  pinMode(PC0_pin, INPUT_PULLUP);
  pinMode(PC4_pin, INPUT_PULLUP);

  oldPorta = PINC;
  PCMSK1 |= (1<<PCINT8);
  PCMSK1 |= (1<<PCINT12);
  Serial.println(PCMSK1,HEX); // What is the total mask.
  PCMask = PCMSK1;

  PCICR |= (1<<PCIE1); // Enable PCINT on portc.
}

//////////////////////////////////////////////
// Arduino Delay LED flash.
void loop(){

  delay(delayTime);
  digitalWrite(LED,HIGH);
  delay(delayTime);
  digitalWrite(LED,LOW);

  if(flgTone) {
    Serial.print("Found ");Serial.print( 在 tsFound);
    Serial.print(" interrupts, using: ");Serial.println(flgTone);

    if( 在 tsFound>1)
       tone(TONE_PIN,600,100);
    else
       tone(TONE_PIN,300,100);

     在 tsFound = flgTone = 0;
  }
}

ISR( PCINT1_vect ) {
  byte change,v1,v2;
  change = oldPorta ^ PINC;

  v1 = oldPorta & (1<<PCINT8);
  v2 = oldPorta & (1<<PCINT12);

  // v1==0 previously so detecting rising edge.
  if (v1==0 && change & (1<<PCINT8) ) delayTime = 500;
  if (v2==0 && change & (1<<PCINT12)) delayTime = 50;
  if (change && (v1==0 || v2==0) ) {
     在 tsFound++; // Only count rising edge interrupts (as this interrupt reacts to both).
    flgTone = 1; // rising edge only
  }

  oldPorta = PINC;
}

[文件:Arduino-pinchange-Interrupt.ino]


警告: 按钮按下将导致多个反弹。 要正确地取消nba竞猜引脚上的按钮输入请参阅 这一页.

PIN更改寄存器

PCICRnba竞猜控制寄存器

控制8个nba竞猜的银行是活动的(启用)。

位:PCIe [2..0]:端口B(0),C(1),D(2)的nba竞猜使能。

PCMSKnba竞猜掩码寄存器[2..0]

使单个引脚与掩码寄存器nba竞猜。

PCMSK2:包含PCINT [23..16] - portd [7..0]。
PCMSK1:包含PCINT [14..8] - PORTC [6..0]。
PCMSK1:包含PCINT [7..0] - Portb [7..0]。

笔记: PORTC位7(PCINT15)不可用[ATMEGA328P数据表]。 PC6也是复位引脚 - 除非由保险丝编程为I / O引脚。

PCINT引脚更改nba竞猜

PCINT0 for PortB(使用PINB输入) - 编译器向量是PCINT0_VECT。
PCINT1 for portc(使用胶片输入) - 编译器矢量是pcint1_vect。
PCINT2 for Portd(使用PIND输入) - 编译器矢量是PCINT2_VECT。

PCIFRnba竞猜标志寄存器

触发nba竞猜(对轮询有用)时设置标志位。

位:pcif [2..0]:nba竞猜标志。





新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。




隐私政策 | 接触 | 关于我

网站地图 | 使用条款


ezoic. 报告此广告

访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino.模拟输出...易模拟输出生成

    arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
镭 _tr.<at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。"


- Anon.

回到顶部