M16C: Immer noch UART-Rec-Interrupt

Gast #530305
Lesenswert?
• ▲
▼
sect30.inc:

.glb    _uart1recint
.lword  _uart1recint    ; uart1 receive(for user)(vector 20)

init:
//ConfigUart1();
u1brg = (CLOCK/ 16/ BAUD1) - 1;
s1ric=0x05;         //UART1 rec Int Prio 5
asm( "\tFSET  I");  /* Enable interrupt */

Interrupt:
void far uart1recint(void)
{unsigned char data;
  LedOff(11);    //Test LED
  data=u1rbl;    //read UDR
  rx_buffer[rx_wr_index]=data;
  if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
  if (++rx_counter == RX_BUFFER_SIZE)
     {rx_counter=0;
      };
return;
}

Hab ich was vergessen? Interrupt kommt nie, getchar() aber funktioniert. 
Muss das ganze aber auf Interruptbetrieb umstellen.  Irgendwelche Ideen?
Gast #530334
Lesenswert?
• ▲
▼
#pragma INTERRUPT  ta0int  /* Declares interrupt handler TA0  */
#pragma INTERRUPT  ta1int  /* Declares interrupt handler TA1  */
#pragma INTERRUPT  uart1recint  //interrupt handler UART1 receive
#pragma INTERRUPT  int0    /* Declares interrupt handler INT0 */
#pragma INTERRUPT  int1    /* Declares interrupt handler INT1 */

ne, leider, das ist schon drin.
Gast #530440
Lesenswert?
• ▲
▼
u1mr: explizit ich nicht, aber das wurde vom Compiler erledigt. 
putchar/getchar funktioniert ja, aber eben nur im polling. Beim Senden 
kann ich damit prima leben, aber nicht beim Empfang. Ich will einfach 
nur die ankommenden Bytes in einen Buffer schreiben und mit 
alternate_getchar von dort lesen.
Gibts eigentlich einen Simulator für die Teile? Der KD30 nützt mir in 
diesem Fall wenig, da er unbedingt mit UART1 arbeiten will.
Gast #530466
Lesenswert?
• ▲
▼
Kommando zurück, ist doch eine Interrupt-Funktion. Hatte wohl ein altes 
File in den STK-Viewer geladen.
Und beim Versuch:
uart1recint();
meckert der Compiler erwartungsgemäss: Error, interrupt function called.
Es gibt eigentlich nur 2 Möglichkeiten:
-entweder ist der Interrupt nicht freigegeben, aber das müsste mit
s1ric=0x05; erledigt sein.
-oder der Interruptvektor stimmt nicht, das habe ich 10mal überprüft.

ratlos :-)
Gast #530641
Lesenswert?
• ▲
▼
> Gibts eigentlich einen Simulator für die Teile?

Es gibt ein Monitor, der ins Flash geschrieben werden kann. Damit kannst 
du ohne weitere Hardware dein M16C debuggen. Die Monitor-Programme gibt 
es auch für die anderen Schnittstellen.

Ich habe meine Interruptroutinen noch nie mir einem "return" beendet, 
man kann ja eh keine Parameter zurück geben. Das wird aber nicht das 
Problem sein. Setzt mal trotzdem das m1mr-Register selber. Sicher ist 
sicher :-) .
Überprüfe nochmal, ob deine sect30.inc wirklich richtig ist, nicht das 
du aus Versehen eine Zeile gelöscht hast und dadurch sind nie Vectoren 
verschoben.

Antwort schreiben

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.

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.