Hallo, ich habe folgendes Problem: ich nutze beide UARTS des AT90CAN128 um Strings zu empfangen. Bei dem String der über UART0 (115600 BAUD) empfangen wird fehlt allerdings ab und zu ein Byte. Der String von UART1 (19200 BAUD) ist komplett richtig. Ist der UART1 ausgeschaltet empfängt auch der UART0 alle Bytes. Ich nutze jeweils den jeweiligen RX-Interrupt zum Empfang eines Bytes.
Hans schrieb: > Ich nutze jeweils den jeweiligen RX-Interrupt zum Empfang eines Bytes. Lass mal deinen Code sehen, was da sonst noch alles in der ISR gemacht wird... In der Interruptroutine solltest du nur das Zeichen abholen und in einen Fifo schreiben. Irgendwer/-was in der Hauptschleife holt sich dann die Zeichen aus dem Fifo ab.
Bei 115600 Baud kommt alle 86,5 µs ein Byte (bei 8n1). UDR vom RX kann nur 2 Bytes puffern. Wahrscheinlich brauchen Deine ISRs mehr Zeit, wenn beide USARTS aktiv sind. Zur Bestätigung kannst Du Data Overrun für USART 0 auswerten! Testweise UART0 mit niedrigerer Baudrate betreiben.
vielen Dank für die Tips. Ich habe die UART-Interrupt-Rountine wie oben empfohlen umgebaut, jetzt funktioniert alles. Problem war, das in der UART1 Routine noch auf ein weiteres Byte gewartet wurde. Währenddessen wurden Daten die per UART0 kamen ignoriert
In der ISR warten ist immer schlecht. Gut, dass du das Problem behoben hast. :)
@ Henrik (Gast) >In der ISR warten ist immer schlecht. Eben, siehe Interrupt und Multitasking. MfG Falk
Falk Brunner schrieb: > @ Henrik (Gast) > >>In der ISR warten ist immer schlecht. > > Eben, siehe Interrupt und Multitasking. Bzw. das was jedem der es hören will, bzw. nicht hören will, seit Jahr und Tag hier im Forum gepredigt wird :-) In einer ISR wird nicht gewartet ISR so lang wie notwendig aber so kurz wie möglich
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.