Atmega "kackt ab" wenn UART gesteckt/ entfernt wird

Gast #1806067
Lesenswert?

Moin!

Ich habe an der UART meines Atmega8 eine GPS- Maus angeschlossen, dessen 
Informationen fleissig gelesen und angezeigt werden.

Mein Problem: wenn -warumauchimmer- kurz die Verbindung getrennt wird, 
so bleibt der Atmega stehen.

Warum?

Vermutung: durch das Abstecken entsteht ein Zeichenwirrwarr, in dem sich 
eine Folge befindet, die als Was-auch-immer-Befehl interpretiert wird.

Gibts da Abhilfe?
#1806083
Lesenswert?

Ja - Programmieren lernen.
Scheinbar verwendest du Code ohne über dessen Funktion zu kennen, sonst 
hättest du die Frage nicht, oder zumindest nicht so gestellt.
Hättest du Ahnung von dem was du tust, wüsstest du erstens welcher Teil 
des Programms dafür verantwortlich ist und zweitens wie du 
Fehlinterpretationen abfangen kannst (Stichwort: Timeout).

Der AVR interpretiert nämlich ein bisschen gar nichts, höchstens dein 
Programm. Wenn der AVR selbst abschmiert, hast du Probleme mit der 
Stromversorgung.

mfG
Markus
#1806084
Lesenswert?

UART dient nur zum Datenaustausch. Diesen Austausch machst du selbst in 
deinem Programm auf dem Mega. Du kannst also sehr wohl mechanismen 
einbauen, dass ausgewertet wird, ob die Daten richtig/sinnvoll sind oder 
nicht.

>Gibt es denn nicht auch einen "Achtung, Chip, hier kommt ein neues
>Programm für Dich!"- Befehl?

Dein Mega bekommt über UART ein neues Programm von der GPS Maus?
#1806087
Lesenswert?

Stephan R. schrieb:

> Vermutung: durch das Abstecken entsteht ein Zeichenwirrwarr, in dem sich
> eine Folge befindet, die als Was-auch-immer-Befehl interpretiert wird.

> Gibt es denn nicht auch einen "Achtung, Chip, hier kommt ein neues
> Programm für Dich!"- Befehl?

Nö.

Das was über die UART kommt wird ja nicht als Programmcode 
interpretiert.
Das sind einfach nur Daten, die von deinem Programm weiter verarbeitet 
werden. Wenn dein Programm aber nicht damit klarkommt, dass über die 
Schnittstelle etwas anderes hereinkommt als es erwartet, dann kann es 
schon sein, dass dein Programm sich andere wichtige Daten überschreibt 
und als Folge davon dann unvorhergesehene Dinge passieren.

> Gibts da Abhilfe?

Programm fehlerfrei schreiben.
Beim Programmieren auch immer ein Auge darauf haben: Was kann an dieser 
Stelle alles passieren.
#1806095
Lesenswert?

Stephan R. schrieb:
> Er "kackt so richtig ab". Danach hilft -vergessen zu erwähnen, sorry-
> nur erneutes Flashen.

Das ist ziemlich unwahrscheinlich.

Wenn ein Druck auf den Reset Knopf nicht hilft, musst du schon sehr 
unglücklich in deinem Programm zugeschlagen haben.
Aber spätestens nach einem Strom Aus / Strom ein, muss wieder alles 
normal sein.

Sofern du die GPS Maus erst nach dem µC startest, natürlich :-)

Denn ansonsten steigt der µC schon wieder schräg in eine Übertragung ein 
und das nächste Abkacken gleich nach dem Hochfahren ist nur eine Frage 
von Millisekunden.
#1806105
Lesenswert?

Peter schrieb:

> Ich halte es zwar hier für unwarscheinlich aber möglich ist es.

So war das auch auf den Fragesteller gemünzt.
Ich erinnere mich ja noch, dass er GPS auswerten will und wie üblich 
keine Ahnung von Stringverarbeitung hat :-)
D.h. er hat mit 99% Sicherheit das SRAM niedergebügelt. Höchst 
wahrscheinlich in der Empfangsschleife (Abfrage auf Buffer voll 
vergessen). Da müsste er schon sehr viel Pech haben, wenn ein 
misglückter Return dann ausgerechnet so landet, dass das Flash verändert 
wird.
Gast #1806113
Lesenswert?

> keine Ahnung von Stringverarbeitung hat

Nanana! Während die Kiste dransteckt läuft alles tadellos!

Aber welche Missetaten könnte meinen Chip dazu veranlassen, seinen Flash 
zu überschreiben?
#1806118
Lesenswert?

Stephan R. schrieb:
>> keine Ahnung von Stringverarbeitung hat
>
> Nanana! Während die Kiste dransteckt läuft alles tadellos!

Das ist keine Kunst.
Die Kunst in der Programmierung fängt dann an, wenn es gilt auch in 
Fehlerfällen ein System noch am laufen zu halten. Ein Programm so zu 
schreiben, dass es nicht durch fehlerhafte Daten aus der Bahn geworfen 
wird, sondern die ignoriert/korrigiert/was_auch_immer_damit_macht. Aber 
auf jeden Fall nicht abstürzt.

> Aber welche Missetaten könnte meinen Chip dazu veranlassen, seinen Flash
> zu überschreiben?

Vergiss das fürs erste.
Mit an Sicherheit grenzender Wahrscheinlichkeit überschreibst du den 
Flash nicht. Dazu müsste man noch eine ganze Handvoll Zusatzannahmen 
treffen, was noch gleichzeitig alles schief gelaufen ist.
Occams Messer sagt: Das ist es höchst wahrscheinlich nicht

Nicht wenn ich mich so zurückerinnere, welche Schwierigkeiten du bei 
banalem Stringhandling hattest. Das ist viel wahrscheinlicher die 
Ursache.
Gast #1808219
Lesenswert?

Hallo!

Karl heinz Buchegger schrieb:
> Die Kunst in der Programmierung fängt dann an, wenn es gilt auch in
> Fehlerfällen ein System noch am laufen zu halten. Ein Programm so zu
> schreiben, dass es nicht durch fehlerhafte Daten aus der Bahn geworfen
> wird, sondern die ignoriert/korrigiert/was_auch_immer_damit_macht. Aber
> auf jeden Fall nicht abstürzt.

Das stimmt, so sollte es immer sein, aber Microsoft hat das bis heute 
nicht kapiert. Leg mal eine fehlerhafte DVD in dein DVD-Laufwerk ein und 
das System verabschiedet sich oder du musst eine halbe Ewigkeit warten, 
bis das System verstanden hat, dass die DVD nicht zu lesen ist ;-)

Nun aber Scherz beiseite. Ich selbst hatte mal ein ähnliches Problem. 
Ich habe eine Platine mit einem FT232BM und einem ATMEGA-Prozessor 
entworfen.
Mein Programm lief recht gut, aber jedes Mal, wenn ich während des 
Betriebes das USB-Kabel des Computers ansteckte oder absteckte, stürzte 
der Prozessor ab und nichts tat sich mehr. Nach einem Reset oder 
Power-UP war trotzdem alles eingefrohren, der Prozessor tat nichts mehr. 
Nur ein Neuflashen half. Dann ging der Prozessor wieder so lange bis man 
das USB-Kabel wieder ansteckte oder absteckte. Danach wieder Neuflashen.

Es ist schon ein paar Jahre her. Ich arbeitete mit Codevision und 
verwendete zusätzlich einen Watdog-Timer. Diesen hatte ich per Fuse-Bit 
standardmäßig eingeschaltet. Der Watdog wurde jeodch früher in der 
startup.asm standardmäßig abgeschaltet, was mich dazu verleitete eine 
andere startup einzubinden. Es gibt ja diese Option "User External 
Startup Initialization File", welche ich auswählte. Im Startup-File 
schaltete ich die Watdog-Befehle ab und los ging es. Es schien alles zu 
funktionieren, bis auf das oben geschilderte Problem. Die UART Sende- 
und Empfangsroutinen waren schon des Öfteren eingesetzt worden und 
hatten sich bereits fehlerfrei bewährt.

Erst nach langem Suchen kam ich dahinter, dass dieses externe 
Startup-File, welches mit Codevision mitgeliefert wurde, irgendetwas 
"Böses" macht. Keine Ahnung warum sich das System in diesem Fall so 
verhielt, aber ein Abschalten der Option half. Das interne Startup-File 
wurde wieder verwendet und der Fehler trat nie wieder auf. Leider musste 
ich dann den Watchdog-Timer nach dem Start mit eigenen Befehlen wieder 
aktivieren.

Ich hoffe, ich konnte helfen.


Schöne Grüße

Emil

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren