Forum: Mikrocontroller und Digitale Elektronik M16C Interrupt1


von Bruno (Gast)


Lesenswert?

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?

von Peter Kasi (Gast)


Lesenswert?

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?

von Bruno (Gast)


Lesenswert?

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)

von Bruno (Gast)


Lesenswert?

Was bedeutet eigentlich .glb ??

von Bruno (Gast)


Lesenswert?

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?

von Peter Kasi (Gast)


Lesenswert?

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

von Bruno (Gast)


Lesenswert?

Danke vielmals.

Der Interrupt läuft nun. Jetzt muss ich ihn nur irgendwie noch
zurücksetzen.

von Peter Kasi (Gast)


Lesenswert?

Was meinst du mit zurücksetzen?

von Bruno (Gast)


Lesenswert?

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?

von Bruno (Gast)


Lesenswert?

Das zurücksetzen scheint nicht zu funktionieren

von Peter Kasi (Gast)


Lesenswert?

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");
}

von Bruno (Gast)


Lesenswert?

Das Problem ist, dass sich mein System nach dem ausführen des Interrupts
irgendwie aufhängt.

von Peter Kasi (Gast)


Lesenswert?

Hast du es mal mit 'ner LED versucht?

von Bruno (Gast)


Lesenswert?

Nein habe aber nun die die Interruptroutine ins main genommen, nicht
mehr im tastatur.h file. Jetzt funktionierts. Aber wieso?

von Dirk (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.