我是Microchip PIC uC的新手。我有一些AVR的经验,但几周前我决定学习PICs。
嗯,问题如下。我正在尝试用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
}
}
非常感谢你的帮助。
祝你好运
答案 0 :(得分:2)
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;
}
}
答案 1 :(得分:1)
始终写入LATx端口(输出锁存器)并从PORTx读取。
写给PORTx总会引起麻烦。