Forum: Compiler & IDEs Problem mit M64 Uart1 RXC-Interrupt


von Rainer Engelhardt (Gast)


Lesenswert?

Hallo,
ich programmiere momentan an einem Mega64 und will eine
Interrupt-gesteuerte Empfängerroutine benutzten, hier die Routine für
uart0:

Initialisierung:
 UCSR0B  = 0x00;
 UBRR0L = 0x40;
 UCSR0B  = 0x98;
Interrupt service Routine:
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{ if (rec_num<127)
  { rec_field[rec_num]=UDR0;
    rec_num++;
  }
  if (rec_field[0]!=0x2a) rec_num=0;
}

Funktioniert alles bestens, nun das Problem: ich brauche eine 2.
serielle Schnittstelle und benutze selbige Routine (nur UDR1 statt UDR0
usw.), Ergebnis: die Routine empfängt das erste Zeichen korrekt,
scheint dann aber immer wieder neu angesprungen zu werden, ohne dass
neue Zeichen gesendet und damit empfangen würden -> der Zähler rec_num
ist in NullKommaNix auf 127 und im Buffer rec_field nur Müll.

Hat jemand eine Idee, was hier passiert? Ich habe mir angesehen, was
der C-Compiler (Imagecraft ICCAVR) daraus macht:

UDR1 wird via  LDS  R2,0x9C
und UDR0 via   IN   R2,0x0C

gelesen. Kann es sein, dass auch UDR1 über einen IN-Befehl gelesen
werden muss, damit das Zeichen aus dem Empfangs-Fifo der Uart gelöscht
wird? Imagecraft behauptet, dass auf Reg. 0x9c (UDR1) nur mit dem
LDS-Befehl zugegriffen werden darf, weil es im erweiterten Adressraum
(mega103 compatibility) liegt, allerdings ist uart1 ja nur dann
verfügbar, wenn der m64 nicht im m103c-Modus läuft - die entsprechende
Fuse ist daher auch gelöscht.

Vollkommen ratlos bin ich dankbar für jeden Tipp

Rainer

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.