Habe Probleme mit Interrupt INT1 Der Interrupt funktioniert nicht INT1IC=0x19; Interrupt steigende Flanke sect30 .lword dummy_int ; TIMER B1 (for user) (vector 27) .lword dummy_int ; TIMER B2 (for user) (vector 28) .lword dummy_int ; INT0 (for user) (vector 29) .lword Taste ; INT1 (for user) (vector 30) .lword dummy_int ; INT2 (for user) (vector 31) void Taste () /*------------------------------------------------------------------- ** Funktion: Initialisiert das LCD ** Parameter: Keine ** Rückgabe: Keine **----------------------------------------------------------------*/ { LCD_write('T'); } Jetzt müsste doch bei einem INT1 die Funktion Taste ausgeführt werden?
mit asm("FSET I") die Interrupts eingeschaltet? geht das durch den Compiler, müsste das nicht _Taste heißen und vorher noch ein .glb _Taste?
Wie meinst du das? etwa so? sect30 .lword dummy_int ; TIMER B1 (for user) (vector 27) .lword dummy_int ; TIMER B2 (for user) (vector 28) .lword dummy_int ; INT0 (for user) (vector 29) .glb _Taste ; INT1 (for user) (vector 30) .lword dummy_int ; INT2 (for user) (vector 31)
Der Interrupt läuft immer noch nicht, wenn ich den Pin auf H-Pegel ziehe. -------------------------------------------------------------------- sect30.inc .lword dummy_int ; TIMER A1 (for user) (vector 22) .lword dummy_int ; TIMER A2 (for user) (vector 23) .lword dummy_int ; TIMER A3 (for user) (vector 24) .lword dummy_int ; TIMER A4 (for user) (vector 25) .lword dummy_int ; TIMER B0 (for user) (vector 26) .lword dummy_int ; TIMER B1 (for user) (vector 27) .lword dummy_int ; TIMER B2 (for user) (vector 28) .lword dummy_int ; INT0 (for user) (vector 29) .glb _Taste ; INT1 (for user) (vector 30) .lword dummy_int ; INT2 (for user) (vector 31) --------------------------------------------------------------------- main void main(void) { /*Variabeln*/ char text; /*Init System*/ lowlevelinit(); //Init uC LCD_init(0x04); //LCD initialisieren Display InitUART(0,0X2580); //Init SIO 0 9600 InitUART(1,0X2580); //Init SIO 1 9600 Init_LED(); Init_SDCard (); ilvl0_int1ic=1; //Enable INT1 Interrupt pol_int1ic=1; //positive edge #pragma asm fset I #pragma endasm --------------------------------------------------------------------- Tastatur.h void Taste () /*-------------------------------------------------------------------** Funktion: Testroutine ** Parameter: Keine ** Rückgabe: Keine **----------------------------------------------------------------*/ { LCD_write('T'); } --------------------------------------------------------------------- Kann mir bitte jemand helfen?
void Taste( void ); #pragma INTERRUPT Taste void main(void){ .... asm ("FCLR I"); //interrupt priorität setzen //welche flanke soll verwendet werden asm("FSET I"); } void Taste (void){ LCD_write('T'); } sect30.inc .glb _Taste ; .lword _Taste ; INT1 (for user) (vector 30) .glb sagt eingentlich nur das es eine externe funktion ist o.s.ä. wenn du es nicht hinschreibst kriegst du vom assembler ne Fehlermeldung das er ein undefiniertes Symbol gefunden hat
Danke vielmals. Der Interrupt läuft nun. Jetzt muss ich ihn nur irgendwie noch zurücksetzen.
Der Interrupt wird nur einmal ausgeführt, dass bedeutet, dass bei einem Druck auf die Folientastatur das zeichen T aufs Display ausgegeben wird. beim nächsten Tastendruck passiert nichts mehr. Ich dachte also, dass ich nun das Interrupt-Flag irgendwie zurücksetzen muss. oder nicht?
Nö...? Versuch mal etwas was nicht so lange dauert mit der Taste aufzurufen, wenn du ne LED drauf hast, schalt die mal um. Ich denk mal durch das Prellen des Schalters wird der Interrupt aufgerufen während er noch bei der arbeit ist, und regiert deshalb nicht mehr. kannst ja auch mal sowas versuchen: void Taste(void){ asm("FCLR I"); int1ic = 0; // Disable Interrupt asm("FSET I"); LCD_write('T'); asm("FCLR I"); int1ic = 1; // set Interrupt ir_int1ic = 0; // Clear Flag asm("FSET I"); }
Das Problem ist, dass sich mein System nach dem ausführen des Interrupts irgendwie aufhängt.
Nein habe aber nun die die Interruptroutine ins main genommen, nicht mehr im tastatur.h file. Jetzt funktionierts. Aber wieso?
Hast du #pragma INTERRUPT Taste mit in tastatur.c eingertagen ? Ist entscheidend, da die Funktion void Taste(void); dann mit einem "Return from Interrupt" beendet wird !
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.