Hallo, ich möchte einen ATMEGA128 mit beiden USART's betreiben. Problemstellung: -USART0 sendet Daten in definierten Intervall (Polling) -USART1 wartet auf sporadisch einkommende Daten (RX Interrupt) Wenn nun eine Pollingabfrage über USART0 läuft und während dieser Zeit ein RX Ereigniss auf USART1 auftritt geht dieses verloren trotz aktiviertem Interrupt. Ich habe mir die Register der USART angesehen. Finde aber keine Lösung, das senden bei einem anstehenden RX Interrupt (RXCIEn) abzubrechen. Das senden des Pollings ist absolut unkritisch, ich will nur verhindern dass ich während des sendens eingehende Daten verliere. Hat da jemand einen Lösungsansatz?
> -USART0 sendet Daten in definierten Intervall (Polling)
Was exakt soll das sein und was geht da vor?
Wie ist die "Pollingabfrage über USART0" aufgebaut?
Hallo, es sind drei uP im Spiel: -uP Zentrale -uP Bedienteil -uP Mobile über den USART0 der Zentrale wird jede Sekunde ein Protokoll (12 Byte) an den uP des Bedienteils gesendet (ist also nicht wirklich ein Polling). Das Bedienteil zeigt danach den neuen Status an. Über den USART1 kommen Meldungen vom uP Mobile an den uP Zentrale. Das Problem dabei: Wenn der uP Zentrale gerade den uP Bedienteil aktualisiert, gehen die Infos vom uP Mobile verloren. Kannst du das nachvollziehen? Gruss Daniel
Hi
>Kannst du das nachvollziehen?
Nein. Das sind 2 unabhängige UARTS. Wenn du Z.b. das Senden der einen
UART über einen Timer steuerst, hat die andere jede Zeit der Welt um zu
Pollen. Wobei das auch nicht notwendig ist.
MfG Spess
Ich habe mir eine kleine Testprozedur programmiert bei der die USART0 dauernt Daten sendet. In diesem Fall bekomme ich leider keinen Interrupt mehr von der USART2 wenn Daten ankommen.. Mache ich da etwas falsch?? Danke Daniel
Hi >Ich habe mir eine kleine Testprozedur programmiert bei der die USART0 >dauernt Daten sendet. In diesem Fall bekomme ich leider keinen Interrupt >mehr von der USART2 wenn Daten ankommen.. Mache ich da etwas falsch?? Anscheinend ja. Dein ' bei der die USART0 dauernt Daten sendet.' kann keinen Interrupt verhindern. MfG Spess
Daniel schrieb: > Mache ich da etwas falsch?? Ja. Peter P.S.: Vergiß die Prosa, damit kann keiner was anfangen. Nutze den Dateianhang.
Hi danke für die Antworten @Spess: Du hattest recht: #pragma used+ void putchar1(char c) { while ((UCSR1A & DATA_REGISTER_EMPTY)==0); UDR1=c; } #pragma used- Ich benutze Code Vision bei #pragma used- war etwas faul - normalerweise werden Preprozessoranweisungen rot angezeigt das war bei mir nicht der Fall. Habe etwas gefummelt dann wurde #pragma used- rot und es ist gut (hoffe ich zumindest). @peda: Auch mit Prosa kann man was erreichen -> www.prosa-gmbh.de im Ernst, es ist mir nicht einfach die Einstellungen der UART/Timer Register und die betreffenden Codeteile auf den Punkt zu bringen um sie hier übersichtlich darzustellen. Manchmal hilft einfach nur weiter zu wissen, dass man selber im Fehler ist...
Ähm, war leider doch nich so. In meinem Programm verhält es sich aber wirklich so dass während dem ausshiften eines Bytes über den UART0 der Interrupt 'Rxcomplete' des UART nicht ausgelöst wird. Mir ist klar dass es sich hier nicht um eine Runde von Kaffesatzlesern handelt. Deshalb werde ich das Problem weiter eingrenzen und in einem neuen Treat angehen. Gruss Daniel
Hi >In meinem Programm verhält es sich aber >wirklich so dass während dem ausshiften eines Bytes über den UART0 der >Interrupt 'Rxcomplete' des UART nicht ausgelöst wird. Hier scheint etwas unklar zu sein. Du hast 3 Flags, die dir den Zustand anzeigen: RXC: Ein Zeichen wurde empfangen und kann abgeholt werden. TXC: Ein Zeichen wurde vollständig gesendet. UDRE: Der Sendepuffer ist frei und kann ein Zeichen aufnehmen. MfG Spess
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.