www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RS-232 Daten senden, nur wenn Empfänger bereit


Autor: Michael Kirsten (onkel_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich will in nächster Zeit ein kleines Projekt anfangen, bei dem ich
Daten (Meßwerte, Eingangszustände) über den USART eines ATmega (welchen
ich nehme, weiß ich noch nicht) auf einen PC ausgeben will.

Nun will ich die Daten immer erfassen, aber die Ausgabe über den USART
soll nur erfolgen, wenn der PC dransteckt und die Daten auch abnehmen
kann. Ausserdem soll, wenn der PC / Drucker dransteckt auch vor dem
ersten Datensatz ein Titel und eine Titelzeile (z.B. Spannung  |
Temperatur | Eingaenge 0 ... 7) ausgegeben werden.

Die Messwerte zu erfassen und an den USART zu schicken, schaffe ich.
Der sendet auch brav die Werte, mit oder ohne angeschlossenem PC /
Drucker.

Was bisher bei den Tests mit dem myAVR-Board nie geklappt hat, war die
Ausgabe der Titelzeile.

Wenn ich den DTR Pin am MAX232 verdrahtet habe und darauf dann im
Programm gewartet habe. Um die 2 Titelzeilen auszugeben, dann ist der
ATmega8 auf dem Board immer abgestürtzt, bzw. hat keine Werte mehr
eingelesen / ausgegeben. (Ich habe da eine LED blinken lassen, wenn auf
den USART geschrieben werden soll.)

Hat da vielleicht einer eine Idee, wie man das Programmtechnisch lösen
könnte, ohne den mit einer if - Anweisung auf den Eingang zu warten ?

Danke für jede Unterstützung.

Michael

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem wirft für mich die Frage auf: Wie sieht dein Quelltext aus?
Dass ein Hardware-Handshake notwendig ist, hast du ja schon
festgestellt. Wird dieses aber auch in der Software richtig umgesetzt?
Wenn dein Controller sowieso immer Daten sendet, könnte man in der ISR
abfragen, ob DTR den richtigen Pegel hat. Wenn dem so ist, sollte als
nächstes deine Überschrift und keine Daten gesendet werden.
Sonst in regelmässigen Abständen (Timer, ADC-fertig-ISR) nachgucken, ob
DTR den richtigen Zustand hat.

Autor: Michael Kirsten (onkel_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Rahul,

das Problem ist nur, das es noch keinen richtigen Quelltext gibt.

Wenn ich bei den Vorüberlegungen schon auf solche Probleme stoße, dann
nehme ich mir einfach, was hier so rumliegt (STK500, myAVR-Board,
Steckbrett, ...) und bastel mit kleinen Codefetzen, bis die klappen.

Dann erst mache ich mir die "richtigen" Gedanken und versuche einen
lauffähigen Quellcode hinzukriegen.

Nachdem ich Deine Antwort gelesen habe, kommt mir eine Idee...

Ich versuche das Ganze mit Interrupts zu basteln. Bisher habe ich nur
ein Hauptprogramm gehabt und da dann mit einer if - Abfrage darauf
gewartet, das das DTR - den richtigen Pegel hat.

Aber das hat auch schon nicht geklappt.

Danke für den Hinweis, das es nur mit Interrupt richtig klappen kann.

Michael

Autor: Laeubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wenn du DTR an eine Interuptfähigen Eingang legst?

Autor: Michael Kirsten (onkel_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre, auch eine Möglichkeit.

Ich bastel nun 45 Minuten mit einem ATmega16 auf dem STK500 herum und
versuche den dazu zu überreden mit einem Timer - Interrupt auf SIGNAL
reagieren zu lassen.

Aber ich bin irgendwie zu doof dazu.

Ich fahre nun mal zur Arbeit und morgen, nach der Nachtschicht und
Ausschlafen, sieht die Welt schon anders aus.

Danke für den Tipp Laeubi.

Michael

Autor: Jasmin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

du mußt Dir ein einfaches Protokoll ausdenken.
HW Handshake ist dann auch überflüssig.

Sende doch vom MC einfach alle paar sekunden eine Anfrage an den PC.

"Hallo bist du dran ??" wenn die dann der pc mit "ja bin ich"
antwortet kann der MC Daten senden.

Schwups, Problem gelöst.

Ich bin sicher dass dir nach der nachtschicht noch weitere
lösungsansätze einfallen..

Jasmin

Autor: Michael Kirsten (onkel_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jasmin

Ich wollte eigentlich "normkonform" bleiben.

Die Idee von Dir ist ganz gut, aber wenn ich statt eines PC einen
seriellen Drucker anschliesse, dann wird das leider nichts mit der
Antwort auf eine Anfrage aus einem eigenen Protokoll.

Mir ist aber aufgefallen, das ein einfaches Warten auf DTR nicht so
ganz ausreicht...

Der Hardwarehandshake verlangt ja auch noch von mir, das ich dem
Rechner / Drucker mitteile, das ich bereit zum senden bin, usw.

Ich hasse das, wenn ich mir nur "was zum basteln" für´s Wochenende
vornehme und dann gleich so eine komplizierte Kiste daraus wird.

Bin übrigens gerade dabei das RS232 Handshake zu studieren um dann
evtl. weiter zu kommen.

Michael

Autor: Jasmin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael,


wie wäre es da mit einem einfachen XON/XOFF ??

Wenn Du aber noch detektiern willst ob ein PC daranhängt (ist er dann
DTR oder DCE ??  ;-) ) UND noch "normgerecht" bleiben möchtest, dann
helfen die in der Tat nur die HW-Handshakes weiter.


Jasmin

Autor: Laeubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interupt ist meiner Meinung nach das einzig sinnvolle dafür hats ja
(auch) Handschake, das der Controller/PC derweil gemütlich was anderes
machen kann auch wenn Sender/Empfänger sehr unterschiedlich "ticken"

Autor: Baitronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst ein das TIE0 (hoffe es heißt so) Flag setzen (register TIMSK -
da bin ich mir aber wirklich GAR nicht mehr sicher, schau vorher
nochmal nach), damit der Timer0 überhaupt einen Interrupt auslöst...

Gruß Andreas

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.