2016-10-02 55 views
0

我是新的與Microchip PIC uC。我有一些AVR的經驗,但幾個星期前我決定學習PIC。Microchip PIC閃存或操作罕見行爲

那麼,問題是以下。我想用2個閃光燈做我的第一個程序,它非常簡單。 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 
} 
} 

非常感謝您的幫助。

致以問候

回答

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

許多PIC還具有輸出鎖存寄存器,它們更適合控制輸出,因爲它們只包含您寫入它們的值。 AKA。 LATA vs PORTA –

+0

感謝您的回答,兩個解決方案都爲我工作。在AVR上,PORTX寄存器不存在這種類型的問題。 –

+0

@JuanLuis在PIC之外的任何微控制器上,這都不是問題。爲什麼人們會在新設計中使用PIC,我不知道。 – Lundin

1

總是寫的LATx端口(輸出鎖存器),並從閱讀的PORTx。

寫入PORTx將不可避免地會導致頭痛。

+0

非常感謝!我會做的! –