www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik M16C Interrupt1


Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Kasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bedeutet eigentlich .glb ??

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Kasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke vielmals.

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

Autor: Peter Kasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst du mit zurücksetzen?

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das zurücksetzen scheint nicht zu funktionieren

Autor: Peter Kasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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");
}

Autor: Bruno (Gast)
Datum:

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

Autor: Peter Kasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du es mal mit 'ner LED versucht?

Autor: Bruno (Gast)
Datum:

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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.