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


von Michael K. (onkel_michi)


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

von Rahul (Gast)


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.

von Michael K. (onkel_michi)


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

von Laeubi (Gast)


Lesenswert?

und wenn du DTR an eine Interuptfähigen Eingang legst?

von Michael K. (onkel_michi)


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

von Jasmin (Gast)


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

von Michael K. (onkel_michi)


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

von Jasmin (Gast)


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

von Laeubi (Gast)


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"

von Baitronic (Gast)


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

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.