M16C Interrupt1

Gast #165480
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?
Gast #165481
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?
Gast #165482
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)
Gast #165484
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?
Gast #165485
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
Gast #165488
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?
Gast #165490
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");
}
Gast #165494
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 !

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.