Microchip PIC led flash OR 操作罕见行为
Microchip PIC led flash OR operation rare behaviour
我是 Microchip PIC uC 的新手。我对 AVR 有一些经验,但几周前我决定学习 PIC。
嗯,问题如下。我正在尝试用 2 个闪烁的 LED 来做我的第一个程序,这非常简单。 RA1 和 RA2 闪烁。
当我输入代码 1 和代码 2 时,程序运行完美。
代码 1:工作正常。
//Code 1. OK.
main(){
while(1){
__delay_ms(1000); //wait 1 second
PORTA |= 0b00000110; //RA1 & RA2 on
__delay_ms(1000); //wait 1 second
PORTA &= 0b00000000; //RA1 & RA2 off
}
}
代码 2:工作正常。
//Code 2. OK
main(){
while(1){
__delay_ms(1000); //wait 1 second
PORTA |= (1 << 1) | (1 << 2); //RA1 & RA2 on
__delay_ms(1000); //wait 1 second
PORTA &= ~(1 << 1) & ~(1 << 2); //RA1 & RA2 off
}
}
代码 3:此代码无效。只有 1 个 LED 闪光灯。我将其与 AVR 一起使用,代码运行良好。问题是什么? OR 操作应该不会影响 RA1 操作。
//Code 3. Don't work. Only RA2 flash.
main(){
while(1){
__delay_ms(1000); //wait 1 second
PORTA |= (1 << 1); //RA1 on
PORTA |= (1 << 2); //RA2 on
__delay_ms(1000); //wait 1 second
PORTA &= ~(1 << 1); //RA1 off
PORTA &= ~(1 << 2); //RA2 off
}
}
非常感谢您的帮助。
此致
PIC I/O 寄存器使用读取-修改-写入。在某些情况下,这可能会导致它从引脚重新读取电压,而不是您在程序中期望的逻辑值。如果输出引脚有一些电容导致它改变值慢于指令序列告诉它对引脚执行的操作,则尤其如此。
在你的情况下,第三种情况是试图连续非常快速地修改 PORTA 上的引脚。这可能会导致第二个值锁存输出上的实际电压,而不是您的代码预期的电压。
在这种情况下,您需要使用变量来隐藏 PORTA 寄存器:
main(){
unsigned char output = 0;
while(1){
__delay_ms(1000); //wait 1 second
output |= (1 << 1); //RA1 on
PORTA = output;
output |= (1 << 2); //RA2 on
PORTA = output;
__delay_ms(1000); //wait 1 second
output &= ~(1 << 1); //RA1 off
PORTA = output;
output &= ~(1 << 2); //RA2 off
PORTA = output;
}
}
始终写入 LATx 端口(输出锁存器)并从 PORTx 读取。
写入 PORTx 总是会让人头疼。
我是 Microchip PIC uC 的新手。我对 AVR 有一些经验,但几周前我决定学习 PIC。
嗯,问题如下。我正在尝试用 2 个闪烁的 LED 来做我的第一个程序,这非常简单。 RA1 和 RA2 闪烁。
当我输入代码 1 和代码 2 时,程序运行完美。 代码 1:工作正常。
//Code 1. OK.
main(){
while(1){
__delay_ms(1000); //wait 1 second
PORTA |= 0b00000110; //RA1 & RA2 on
__delay_ms(1000); //wait 1 second
PORTA &= 0b00000000; //RA1 & RA2 off
}
}
代码 2:工作正常。
//Code 2. OK
main(){
while(1){
__delay_ms(1000); //wait 1 second
PORTA |= (1 << 1) | (1 << 2); //RA1 & RA2 on
__delay_ms(1000); //wait 1 second
PORTA &= ~(1 << 1) & ~(1 << 2); //RA1 & RA2 off
}
}
代码 3:此代码无效。只有 1 个 LED 闪光灯。我将其与 AVR 一起使用,代码运行良好。问题是什么? OR 操作应该不会影响 RA1 操作。
//Code 3. Don't work. Only RA2 flash.
main(){
while(1){
__delay_ms(1000); //wait 1 second
PORTA |= (1 << 1); //RA1 on
PORTA |= (1 << 2); //RA2 on
__delay_ms(1000); //wait 1 second
PORTA &= ~(1 << 1); //RA1 off
PORTA &= ~(1 << 2); //RA2 off
}
}
非常感谢您的帮助。
此致
PIC I/O 寄存器使用读取-修改-写入。在某些情况下,这可能会导致它从引脚重新读取电压,而不是您在程序中期望的逻辑值。如果输出引脚有一些电容导致它改变值慢于指令序列告诉它对引脚执行的操作,则尤其如此。
在你的情况下,第三种情况是试图连续非常快速地修改 PORTA 上的引脚。这可能会导致第二个值锁存输出上的实际电压,而不是您的代码预期的电压。
在这种情况下,您需要使用变量来隐藏 PORTA 寄存器:
main(){
unsigned char output = 0;
while(1){
__delay_ms(1000); //wait 1 second
output |= (1 << 1); //RA1 on
PORTA = output;
output |= (1 << 2); //RA2 on
PORTA = output;
__delay_ms(1000); //wait 1 second
output &= ~(1 << 1); //RA1 off
PORTA = output;
output &= ~(1 << 2); //RA2 off
PORTA = output;
}
}
始终写入 LATx 端口(输出锁存器)并从 PORTx 读取。
写入 PORTx 总是会让人头疼。