Forum: Mikrocontroller und Digitale Elektronik Dual USART Betrieb


von Daniel (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> -USART0 sendet Daten in definierten Intervall (Polling)

Was exakt soll das sein und was geht da vor?

Wie ist die "Pollingabfrage über USART0" aufgebaut?

von Daniel (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Daniel schrieb:
> Mache ich da etwas falsch??

Ja.


Peter


P.S.:
Vergiß die Prosa, damit kann keiner was anfangen.
Nutze den Dateianhang.

von Daniel (Gast)


Lesenswert?

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...

von Daniel (Gast)


Lesenswert?

Ä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

von spess53 (Gast)


Lesenswert?

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