Dual USART Betrieb

Gast #1777106
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?
Gast #1777206
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
Gast #1777223
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
Gast #1777235
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
Gast #1777239
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
Gast #1777290
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...
Gast #1777306
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
Gast #1777432
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.