Forum: Mikrocontroller und Digitale Elektronik M16C: Immer noch UART-Rec-Interrupt


von crazy horse (Gast)


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?

von Judge (Gast)


Lesenswert?

Da fehlt noch folgendes:

#pragma INTERRUPT uart1recint

von crazy horse (Gast)


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.

von Obelix (Gast)


Lesenswert?

Welcher M16C?

von crazy horse (Gast)


Lesenswert?

M16C62P, ganz genau der M30626FHPFP

von Obelix (Gast)


Lesenswert?

Hast du das u1mr-Register gesetzt?

von crazy horse (Gast)


Angehängte Dateien:

Lesenswert?

Bitte um etwas Nachsicht, ist mein erstes Projekt mit einem M16.
Komischerweise wird die Funktion gar nicht als Interruptfunktion vom 
Compiler (NC30) eingetütet?? Siehe snapshot.

von crazy horse (Gast)


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.

von crazy horse (Gast)


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 :-)

von Obelix (Gast)


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.

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.