mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C517: Interruptquelle unbekannt


Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vor einiger Zeit habe ich schonmal rumgegrübelt, warum ein C517 (oder 
C515, C509) nicht feststellen kann, was ein Interrupt ausgelöst hat. 
Dazu habe ich in der ISR an 3 Stellen Befehle eingefügt, die jeweils 
LED's einschalten. Aber nix ist passiert, außer daß die "ISR-Entry"-LED 
eingeschaltet wurde. Ich hatte eher den Eindruck, daß ein IRQ 
aufgetreten ist, aber kein entsprechendes Bit im S1CON-Register gesetzt 
wurde. Was läuft nicht richtig? Wichtig in dem Zusammenhang ist wohl 
auch die Tatsache, daß RxD und TxD über einen 2-Draht-1-Draht Konverter 
kommunikationsmäßig zusammenhängen, d.h. was über Tx rausgeht kommt bei 
Rx gleich wieder rein. Aber in diesem Fall kommt nur was über Rx rein, 
weil der C517 nichts ausgegeben hat.
#define IsBit(value, mask)  ((value) & (mask))

// voreingestellt:
// LED's an P5 alle aus

void UART_ISR1(void) interrupt 16
{
  P5 = 0x01; // wenn ISR, dann LED an -> ok, funxoniert
  // Sende-IRQ?
  if(IsBit(S1CON, TI1_BIT))
  {
    P5 = 0x03; // 2 LED's an 
    ClrBit(S1CON, TI1_BIT);
    // TxConf: Empf. wieder zuschalten
    SetBit(S1CON, REN1_BIT);
    UART_TxConf1(); // Sendepause für X ms
  }

  // Empfangs-IRQ? Warum läuft das Proggi bei Datenempfang nicht in diese if-Kiste??
  if(IsBit(S1CON, RI1_BIT))
  {
    P5 = 0x05; // 2 LED's an
    // Empf. war ein
    Uart1Receive(S1BUF);    // Datenbyte wegspeichern
    ClrBit(S1CON, RI1_BIT); // RI-Bit resetten
  }
}
Ratlos
   Hegy

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warscheinlich hast Du noch nen anderen Interrupt freigegeben, ohne einen 
Handler dafür geschrieben zu haben.

Dann läuft dieser einfach in den nachfolgenden Handler rein und der 
wundert sich dann, wieso er aufgerufen wurde.


Peter

Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerade bei durchforsten der Doku mit der Freigabe irgendeines anderen 
Interrupts ist mir folgendes aufgefallen (Datenbladl v. C509, S. 216, 
Tabelle 7-3, Interrupt Sources and Vektors), in der Tabelle steht:

Int. Source         Int. Vector Addr.
-----------------+-------------------+-
Ext. Interrupt 0   0003  (= "interrupt 0"?)
Timer 0 Ovfl.      000B  (= "interrupt 1"?)
Ext. Interrupt 1   0013  (= "interrupt 2"?)
Timer 1 Ovfl.      001B  (= "interrupt 3"?)
Serial Channel 0   0023  (= "interrupt 4"?)
usw. (7 Einträge)  ....
Serial Channel 1   0083  (= "interrupt 16"?)

Im Code stehen folgende ISR-Aufrufe:
void Timer0Overflow(void) interrupt 1
void Timer1Overflow(void) interrupt 3
void UART_ISR0(void) interrupt 4
void UART_ISR1(void) interrupt 16
Verglichen mit der Tabelle ergibt sich für mich folgender Zusammenhang, 
keine Ahnung ob das korrekt ist:

Timer 0 Overflow ist "interrupt 1", weil dieser an 2. Stelle in der 
Tabelle steht, die nach Vektor-Adressen sortiert ist. Also ist die erste 
Einsprungadresse "interrupt 0" (Ext. Interrupt 0). Zähle ich weiter, ist 
"interrupt 3" dann auch Timer 1 Overflow. Kurzum, meine Annahme deckt 
sich mit der Tabelle. ABER, dann past das nicht mit dem "interrupt 16" 
für Serial Channel 1, da dieser an 13. Stelle in der Tabelle steht. 
Daher müßte es doch eigentlich heißen
void UART_ISR1(void) interrupt 12
oder etwa nicht?

Der gaze Code ist übrigens für den Keil-C geschrieben worden.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hegy wrote:
> Daher müßte es doch eigentlich heißen
>
void UART_ISR1(void) interrupt 12
> oder etwa nicht?

Paßt schon:

0x83 / 8 = 16

Setz mal nen Handler für Interrupt 15 auf, der ne LED setzt und ne 
Endlosschleife macht.
Der sollte dann nie aufgerufen werden, wenn alles stimmt.


Peter

Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum wird die Adresse durch 8 geteilt?

Wenn so die Werte für die ISR-Funktionen "void ISR(void) interrupt 16" 
berechnet werden, gibt es lt. Datenblatt vom C509 keinen Interrupt 15. 
Der nächste untendrunter ist 13 für external Interrupt 6, und da ist der 
Pin 6 des C509 für zuständig (P1.3, CC3, INT6). Grade mal wieder den 
Code durchgekramt und festgestellt, daß nur am IEN2 Register 
rumgeschraubt wird (ES1 wird auf 1 gestzt). An IEN1 wird nix gemacht, 
also Default-Wert = 0 = externer Int. 6 aus. Bleibt nur noch CC3. Dies 
hängt mit CC0 bis CC3 unter einer Decke und kann mit CCEN abgeschaltet 
werden, bzw. aktiviert werden. Default-Wert auch hier wieder 0, also 
alle CC[0..3] aus.

Da nur die Interrupts 1, 3, 4 und 16 verwendet werden, müßte ich, um die 
Sache einfach mal abzukürzen, für die Interrupts 5 bis 15, eine ISR 
bauen, die dann jeweils eine LED setzt, vorzugsweise in jeder ISR eine 
andere, und dann die Endlosschleife. Das wären dann die Interrupts 5, 8, 
9, 10, 11, 12 und 13, danach kommt schon 16 für UART1.

Wird denn vom Keil-C kein direkter Rücksprung für nicht definierte ISR's 
eingebaut, also so Teile wie
void ISR5(void) interrupt 5
{}
void ISR8(void) interrupt 8
{}
void ISR9(void) interrupt 9
{}
usw.
oder ähnliche Funktionskonstrukte? Oder gibt es eine Funktion, in die 
alle ungenutzten Interrupts quasi vereint, wie es beim avr-gcc geht?
void unusedISRs(void) interrupt all_unused
{
  // insert your code here
}

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.