www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Dual USART Betrieb


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel schrieb:
> Mache ich da etwas falsch??

Ja.


Peter


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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.