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
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.
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
und wenn du DTR an eine Interuptfähigen Eingang legst?
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
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
@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
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
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"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.