Gast
#76619
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