2016-12-30 4 views
0

Ich schrieb einen einfachen LED-Blinkcode mit Hardware-Interrupt 0 von 8051. Wenn Taste gedrückt wird, geht es in Interrupt Service Routine (ISR). Nach der Ausführung sollte es in der Hauptfunktion zurückkommen, aber es kommt nicht. Das ist mein c-Code. Jede positive Antwort wird geschätzt.So beenden Sie die externe Interrupt Service Routine (ISR) in 8051

sbit LED = P1^0; 

void delay(int ms) 
{ 
    int i; 

    for(i=0;i<ms;i++) 
    { 
    TMOD = 0x01;    
    TH0 = 0xFC;    
    TL0 = 0x66; 
    TR0 = 1; 
    while(TF0==0);          
    TR0 = 0; 
    TF0 = 0; 
    } 
} 



void main(void) 
{ 
    P1 = 0x00; 
/// P3 = 0x04; 
    IT0 = 1;  
    EX0 = 1;  
    EA = 1; 
    LED=1; 

    while(1) 
    { 
     LED=~LED; 
     delay(200); 
    } 

return ; 
} 



void external0_isr() interrupt 0  
{ 
    EA=0; 
    LED =0 ; 
    delay(2000); 
    LED=1; 
    EX0=1; 
    EA=1; 

    return; 
} 
+1

Im Allgemeinen möchten Sie so wenig Zeit wie möglich in einem ISR verbringen. Die Verzögerung (2000) scheint fehl am Platz zu sein. –

Antwort

1

Wenn Sie die Taste Interrupt eingeben, deaktivieren Sie globales Interrupt EA=0; , die auch das Timer-Interrupt deaktiviert. Daher würde das Programm bei while(TF0==0) in Ihrer delay(2000) Routine hängen.

+0

Vielen Dank für Ihre freundliche Antwort. Ich habe es versucht, EA = 0 kommentieren, aber es funktioniert nicht. –

+0

Der Grund EA = 0 ist es, mehrere IO-Interrupt durch Bouncing-Taste zu verhindern. Normalerweise, selbst wenn Sie nur 1 Mal drücken, kann die MCU 3-5 Unterbrechungssignal empfangen, wenn Sie keine Rauschfilterkondensatoren haben. Außerdem sollten Sie verschachtelte Interrupts (Interrupts innerhalb von Interrupts) in Ihrem Design vermeiden. Und schließlich, verwenden Sie keine Verzögerung im Interrupt. Interrupt sollte so schnell wie möglich sein. –

+0

Um sicher zu gehen, dass der Interrupt nicht der Grund für einen Fehler ist, ändern Sie bitte Ihre 'Delay' -Funktion mit' for loop' statt mit dem Systemtimer. http://blowtech.blogspot.com/2013/08/different-ways-to-generate-delays-in.html –