Assembly 设置PINx时会发生什么?为什么有时会起作用?
昨晚我和一个朋友遇到了一个异常现象,我们正试图理解,但无法理解。当我们使用AVR组件玩ATTiny2313时,今天我在ATMega328P上复制了完全相同的Arduino体验 我注意到他在代码中有一个错误,他使用Assembly 设置PINx时会发生什么?为什么有时会起作用?,assembly,arduino,avr,Assembly,Arduino,Avr,昨晚我和一个朋友遇到了一个异常现象,我们正试图理解,但无法理解。当我们使用AVR组件玩ATTiny2313时,今天我在ATMega328P上复制了完全相同的Arduino体验 我注意到他在代码中有一个错误,他使用PINB,6设置LED高(后来又低)。我告诉他使用PORTB,6,而且(出于其他原因)根本不起作用。整个代码已经消失,所以我在ARDUNO C++中复制了它,得到了意想不到的结果,当正确分配时,所有的工作都按它的方式工作,但是当分配不正确时,LED闪烁的速率为一半。这似乎是一个分阶段的问
PINB,6
设置LED高(后来又低)。我告诉他使用PORTB,6
,而且(出于其他原因)根本不起作用。整个代码已经消失,所以我在ARDUNO C++中复制了它,得到了意想不到的结果,当正确分配时,所有的工作都按它的方式工作,但是当分配不正确时,LED闪烁的速率为一半。这似乎是一个分阶段的问题
在我进入代码之前,我知道您不能通过PIN
分配输出,问题是我们尝试了(错误)并试图了解它是如何工作的
void setup(){
DDRB=0xFF;
}
void loop(){
PORTB |= 1<<5; // turns on the LED
delay(500);
PORTB &= ~(1<<5); // turns off the LED
delay(500);
}
void setup(){
DDRB=0xFF;
}
void循环(){
PORTB |=1您遇到了ATmega行的一个经常被忽略的特性:在PINx寄存器中设置一个位将切换PORTx中相应的位
从中的第77页:
14.2.2切换插销
将逻辑1写入PINxn可切换PORTxn的值,与DDRxn的值无关。请注意,SBI指令可用于切换端口中的单个位
好吧,我会的……我在这里坐了几个小时试图弄清这一点。我已经浏览了数据表(承认是针对不同的micro,但就这一点而言,它是相同的)……我没有发现!好的,我刚刚检查过,旧MCU的文档没有这一段。它从14.2.1跳到14.2.3(没有数字)而且是一字不差的!我想我不会告诉我的伴侣,直到他也适当地拔出他的头发!哈哈。非常感谢!
void setup(){
DDRB=0xFF;
}
void loop(){
PINB |= 1<<5; // turns on the LED
delay(500);
PINB &= ~(1<<5); // turns off the LED
delay(500);
}
void loop(){
PINB |= 1<<5; // turns on the LED
delay(500);
}