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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.