www.mikrocontroller.net

Forum: Compiler & IDEs UART verständnis problem


Autor: Kofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte daten vom PC in den µC schreiben...
sagen wir mal 101 Bytes wobei das 1. Byte die Speicher-Startadresse für
die 100 folgenden Bytes beinhaltet.

Ich weiß nur das ein Interrupt ausgeführt wird sobald Daten im
Uart-buffer angekommen sind... wird der nach jedem empfangenen Byte
ausgeführt oder wie läuft das ? In Peters Uart library gibt es keinen
Funktionsblock für einen "Incomming-Data-Uart-Interrupt" z.B.

uart-incomming-int(blah blah) //wird ausgeführt sobald ein Byte im
buffer liegt
{
  /*
    Hier könnte ich jetzt jedes mal reinschreiben was mit dem aktuell
empfangenen Byte geschehen soll.
  */
}

Wie funktioniert das ohne soeinen Interrupt-Funktionsblock ?

c = uart_getc();

Gehe ich recht in der Annahme das c nun das zuletzt empfangene Byte
beinhaltet ?
Wie muss ich dann diese abfrage machen, das ich die Wertzuweisung c =
uart_getc(); immer genau dann habe nachdem ein Byte empfangen wurde ?
Und wieviel zeit bleibt mir bei 9600 baud um das Letzt Byte zu
verarbeiten bevor das nächste kommt?

Danke... Ich hoffe es verstht jemand wie ich das meine g

gruß
 kofi

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine UART library verwendet natürlich Interrupts zum empfangen und
senden.
Bitte schaute das Beispiel "test_uart.c" sowie die Online Doku an um
zu verstehen wie man diese Library verwenden muss.

Autor: Kofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte ja wirklich nicht unhöflich sein aber ziemlich oft bekommich
als Antwort schau dir das Beispiel an oder leiß die Anleitung...
Hätte ich mir das Beispiel (uartlibrary.zip) nicht angesehen, hätte ich
auch keine verständnis Probleme! Ich bin nunmal kein Profi der diese
grob kommentierten Beispielsources auf anhieb versteht
du hast z.B. KEINE meiner Fragen beantwortet.
Wenn ich jetzt nur geschrieben hätte "DAS GEHT NICHT - WARUM??" ...
dann könnte ich verstehen wieso deine Antwort so "detailiert" ist
aber meine Fragen waren doch wohl schon RELATIV konkret.

Ich verstehe nicht wo das Ereignis "UART-Daten sind angekomen"
Bearbeitet wird... Ich vermisse diesen Block ...
Ich habe schonmal mit Timer Interrupts gearbeitet da gibts das doch
auch: Gibt es einen Overflow im Timer Register wird der Block
ausgeführt:

SIGNAL(SIG_OVERFLOW1) // handler for tcnt1 overflow interrupt
{
     blah_blah();
}

Autor: leo9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 9600Baud, 1Stopbit und no parity hast du mindestens 1,04ms Zeit
zwischen zwei Bytes (bei den meisten Sendern wohl noch ein bis zwei
bitlängen mehr).
Bytelänge = 1 / Baud * Bitanzehl = 1 / 9600 * 10
(1Start+8Daten+1Stopbit) = 1,04ms

grüsse leo9

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die UART libarary empfängt die Daten via Interrupt und speichert sie in
einen internen Ringbuffer.
Das Hauptprogramm muss sich deshalb nicht um Interrupts kümmern sondern
nur mittels uart_getc() die empfangenen Daten aus diesem Ringbuffer
entnehmen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"sagen wir mal 101 Bytes wobei das 1. Byte die Speicher-Startadresse
für
die 100 folgenden Bytes beinhaltet."


Zuerst solltest Du Dir ein Protokoll ausdenken, welches bei
fehlerhaften Paketen immer in der Lage ist, den Anfang des nächsten
Pakets zu erkennen und danach korrekt zu empfangen.


In der Regel passiert es nämlich, wenn man beide Geräte zu
unterschiedlichen Zeiten einschaltet bzw. wenn man das Kabel
reinsteckt, daß dann fälschlich ein Startbit erkannt werden kann, bzw.
daß der eine schon sendet, während der andere sich noch initialisiert.
Also Bytes zuviel oder zuwenig empfangen werden.

Ohne Protokoll hast Du dann nur lauter unsinnige Daten.


Peter

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man könnte ja auch drauf verzichten, das Fahrrad nochmal zu erfinden,
und eins der bewährten Protokolle benutzen.  X-Modem sollte simpelst
zu implementieren sein, allerdings hat es keine Prüfsumme.  Z-Modem
bietet bißchen mehr, kostet aber auch mehr Aufwand.  Kermit ist
ebenfalls noch gängig.  Das kann sogar mein alter HP48 Taschenrechner,
kann also so schlimm auch nicht zu implementieren sein.

Beispielimplementierungen für all dies findet man auch mit bißchen
Suche.

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.