Forum: Mikrocontroller und Digitale Elektronik Bascom AVR Printbin bleibt hängen


von theo (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgendes Probelem. Ich habe ein kleines Programm für einen 
Atmega169 in Bascom AVR geschrieben. Ich schicke Zyklisch per RS232 
Daten vom µC zu einem PC.

Soweit funktioniert auch alles wunderbar.

Jetzt mein Problem:

Es funktioniert alles solange eine Verbindung zwischen µC und PC 
besteht. d.h. sobald ich das rs232 kabel ziehe hängt sich mein µC auf.
Das ist soweit auch noch logisch, da der Printbin-Befehl den ich 
verwende das Programm solange blokiert bis die Zeichen gesendet wurden.

Jetzt hatte ich versucht mit "Serialout" einen Sendepuffer ein zu 
richten, was aber zum selben Ergebnis führte. Ich schätze der 
Sendepuffer ist auch irgendwann voll. (Kann man den puffer irgendwie 
löschen?)

Jetzt meine Frage:

Wie kann ich verhindern, das mein Programm hängen bleibt sobald die 
Verbindung zum PC getrennt wird? Bzw. wie kann ich überprüfen ob die 
UART verbunden ist? oder den Printbin befehl zurück nehmen? oder eine 
"Try Catch" Ausnahme programmieren, mit der ich das hängenbleiben 
umgehen kann?

Die Verbindung zum PC soll beliebig gesteckt und gezogen werden können.

Vielen Dank für euere Hilfe

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das klingt überhaupt nicht logisch. Das PRINTBIN bzw. die UART Ausgabe 
sollte überhaupt nicht merken, ob ein Empfänger (PC) vorhanden ist oder 
nicht. Ich denke, deine Hardware ist unglücklich gestaltet. Leider fehlt 
der Schaltplan, um vielleicht Genaueres zu sagen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

theo schrieb:
> d.h. sobald ich das rs232 kabel ziehe hängt sich mein µC auf.
Empfängst du da evtl. durch das Abziehen irgendein Zeichen, mit dem du 
nichts anfangen kannst.

Das Senden dürfte wie schon erwähnt kein Problem darstellen: über eine 
serielle Schnitte kannst du den ganzen Tag Zeichen raussenden, ohne dass 
irgendwer mithört...

von theo (Gast)


Lesenswert?

Hallo,

den Schaltplan, habe ich momentan leider nicht hier, er ist aber im 
Prinzip gleich mit dem auf dem Demoboard butterfly verwendeten 
atmega169.

hier der link zur pdf:
http://www.atmel.com/dyn/resources/prod_documents/doc4271.pdf
ab seite 34 ist der Schaltplan.

woran kann es nun liegen das mein Programm hängen bleibt?

nehme ich den printbin Befehl raus, läuft das Programm sauber durch, bis 
halt eben auf den Sendebefehl.
Nehme ich ihn wieder rein, hängt es, also es muss am printbin liegen!

gruß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

theo schrieb:
> Nehme ich ihn wieder rein, hängt es, also es muss am printbin liegen!
Gewagter Schluss...  :-o
Mein Verdacht ist eher: du änderst mit/ohne dem printbin auch das 
Laufzeitverhalten deines Codes...

> woran kann es nun liegen das mein Programm hängen bleibt?
Weil keiner dein Programm kennt, kann dir das keiner sagen.

von Wolfgang S. (wsm)


Lesenswert?

Prüfe mal, ob der serielle Eingang einen anderen Status hat. Sollte 
dieser, ohne dass ein Signal angeschlossen ist, abgefragt werden, dann 
führt der falsche Status zu einem Hänger in der Eingaberoutine oder bei 
einer Statusabfrage.

W.

von theo (Gast)


Lesenswert?

Hallo nochmal,

was meint ihr mit ich ändere das Laufzeitverhalten? bzw wie kann ich das 
verhindern?

also es ist so, im Programm passiert nicht viel, also momentan zumindest 
nicht. Ich hähle momentan nur die Zyklen hoch und bei jedem 100. Zyklus 
schicke ich ein printbin raus mit einem festen Zahlenwert. danach folgt 
ein "waitms 10" und der Zählwert wird zurückgesetzt. und nach den 
nächsten 100 Zyklen das selbe.

Wie ist das gemeint mit dem Status des Einganges?

von Weinbauer (Gast)


Lesenswert?

hmm ... naja ...
wozu soll der waitms nach dem Printbin gut sein?
Mit Printbin schickst Du auch keinen Zahlenwert, sondern Bytes.
Wenns nur ein Byte sein soll kannst Du das auch per

UDR = bytevariable machen.

von Joe (Gast)


Lesenswert?

Code ?

von Wolfgang S. (wsm)


Lesenswert?

Status des Eingangs: Es wird kein Byte gesendet, wenn gerade eines 
empfangen wird.

Wenn also der InPort einen falschen Zustand hat, kann nicht gesendet 
werden.

W.

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.