Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 设置PINx时会发生什么?为什么有时会起作用?_Assembly_Arduino_Avr - Fatal编程技术网

Assembly 设置PINx时会发生什么?为什么有时会起作用?

Assembly 设置PINx时会发生什么?为什么有时会起作用?,assembly,arduino,avr,Assembly,Arduino,Avr,昨晚我和一个朋友遇到了一个异常现象,我们正试图理解,但无法理解。当我们使用AVR组件玩ATTiny2313时,今天我在ATMega328P上复制了完全相同的Arduino体验 我注意到他在代码中有一个错误,他使用PINB,6设置LED高(后来又低)。我告诉他使用PORTB,6,而且(出于其他原因)根本不起作用。整个代码已经消失,所以我在ARDUNO C++中复制了它,得到了意想不到的结果,当正确分配时,所有的工作都按它的方式工作,但是当分配不正确时,LED闪烁的速率为一半。这似乎是一个分阶段的问

昨晚我和一个朋友遇到了一个异常现象,我们正试图理解,但无法理解。当我们使用AVR组件玩ATTiny2313时,今天我在ATMega328P上复制了完全相同的Arduino体验

我注意到他在代码中有一个错误,他使用
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);
}