Datum:
Brauche Eure Hilfe M16C65 R5F3650EDFB Habe Probleme mit INT0 und INT1. Beim ausführen des Interrupts hängt sich der uC auf. Was ist falsch??? main
//Include Dateien #include "sfr65.h" //Special Function Register Definition #include "stdio.h" //Standart io #include "stdlib.h" #include "lowlevelinit.h" //Lowlevelinit #include "driver_lcd.h" //Treiber 4x20 Zeichen LCD //Variabeln Konstanten Global char encoder_wert=0x00; char encoder_flag=0x00; //Defines //Interrupts /*INTERRUPTROUTINE------------------------------------------------------------ ** Funktion: INT0 Interruptroutine encoder taste ** Parameter: Keine ** Rückgabe: Keine ** Hardwareadresse INT0 **---------------------------------------------------------------------------*/ #pragma INTERRUPT int_enc_taste //Encoder Tasten Interrupt void int_enc_taste (void) { asm("fclr I"); //protect bit löschen int0ic = 0; //int0 deaktivieren asm("fset I"); //protect bit aktivieren p10_0 = 0x00;//TEST asm("fclr I"); //protect bit löschen ir_int0ic = 0; //int0 flag löschen int0ic = 1; //int0 aktivieren asm("fset I"); //protect bit aktivieren return; } //ENDE INTERRUPTROUTINE ENCODER_Kanal1 /*INTERRUPTROUTINE------------------------------------------------------------ ** Funktion: INT1 Interruptroutine encoder kanal1 ** Parameter: Keine ** Rückgabe: Keine ** Hardwareadresse INT1 **---------------------------------------------------------------------------*/ #pragma INTERRUPT int_enc_ch1 //Encoder Kanal1 Interrupt void int_enc_ch1 (void) { asm("fclr I"); //protect bit löschen int1ic = 0; //int1 deaktivieren asm("fset I"); //protect bit aktivieren p10_0 = 0x00;//TEST asm("fclr I"); //protect bit löschen ir_int1ic = 0; //int1 flag löschen int1ic = 1; //int1 aktivieren asm("fset I"); //protect bit aktivieren // return; } //ENDE INTERRUPTROUTINE ENCODER_Kanal1 //Hauptprogramm void main(void) { } |
*sect30.inc*
.lword dummy_int ; vector 27 (for user) timer B1 .lword dummy_int ; vector 28 (for user) timer B2 .glb _int_enc_taste ; INT0 (software int 29) .lword _int_enc_taste ; INT0 (software int 29) .glb _int_enc_ch1 ; INT1 (software int 30) .lword _int_enc_ch1 ; INT1 (software int 30) .lword dummy_int ; vector 31 (for user) int2 .lword dummy_int ; vector 32 (for user or MR30) .lword dummy_int ; vector 33 (for user or MR30) |
Danke
Datum:
Ohne mir das Datenblatt des µC anzusehen, eine Interrupt-Routine zu einem externen INT sieht immer so aus: INT-Flag löschen, Aktion ausführen und fertig. Ich sehe nicht, was 'fclr I', 'fset I' und das Aktivieren und Deaktivieren in der Routine sollen. Das INT-Flag muß gelöscht werden, das sehe ich nicht. Bleibt es gestzt, hängt der Prozessor. Falls Du erwartest, dass P10_0 toggelt, dann solltest Du einmal eine '1' und das andere Mal eine '0' schreiben.
Datum:
Also FSET I schaltet die Interrupts frei Aber es sieht so aus als der Eintrag in sect30.inc fehlschlägt und der uC ins Nirvana geht!
Datum:
Habe den Fehler gefunden! im sect30.inc stand
.if 0 |
;---------------------------------------------------------------------
; variable vector section
;---------------------------------------------------------------------
.section vector,ROMDATA
.org __VECTOR_ADR__
.if = 0
.lword dummy_int ; vector 0 BRK
.lword dummy_int ; vector 1
.lword dummy_int ; vector 2
.lword dummy_int ; vector 3
.lword dummy_int ; vector 4 (for user) int3
.lword dummy_int ; vector 5 (for user) timerB5
.lword dummy_int ; vector 6 (for user) timerB4
.lword dummy_int ; vector 7 (for user) timerB3
.lword dummy_int ; vector 8 (for user) si/o4/int5
.lword dummy_int ; vector 9 (for user) si/o3/int4
.lword dummy_int ; vector 10 (for user) Bus collision detection
.lword dummy_int ; vector 11 (for user) DMA0
|
müsste aber
.if __MVT__ == 0 |
stehen
;---------------------------------------------------------------------
; variable vector section
;---------------------------------------------------------------------
.section vector,ROMDATA
.org __VECTOR_ADR__
.if __MVT__ == 0
.lword dummy_int ; vector 0 BRK
.lword dummy_int ; vector 1
.lword dummy_int ; vector 2
.lword dummy_int ; vector 3
.lword dummy_int ; vector 4 (for user) int3
.lword dummy_int ; vector 5 (for user) timerB5
.lword dummy_int ; vector 6 (for user) timerB4
.lword dummy_int ; vector 7 (for user) timerB3
.lword dummy_int ; vector 8 (for user) si/o4/int5
.lword dummy_int ; vector 9 (for user) si/o3/int4
.lword dummy_int ; vector 10 (for user) Bus collision detection
.lword dummy_int ; vector 11 (for user) DMA0
|
Was es genau bedeutet weis ich nicht, funktioniert aber ;-)