Forum: Mikrocontroller und Digitale Elektronik PIC18F2550 vergesslich


von Horst H. (horstmann)


Angehängte Dateien:

Lesenswert?

Hallo Alle zusammen,
ich hab mir eine USB Steuerung für ein paar stärkere 12V EMotoren 
gebaut. Leider vergisst der PIC 18f2550 immer wieder seine 
Programmierung. Nach 2 - 3 Benutzen (Strom Aus, Strom An) wird der 
Controller nicht mehr am BUS erkannt und der Bootloader hat sich gleich 
mit verabschiedet, so dass ich den Chip aus der Schaltung holen muss und 
ihn neu programmieren...
Es handelt sich dabei auch nicht um einen Fehler eines einzelnen Chips. 
Inzwischen habe ich ein neuen verbaut und das gleich Verhalten 
beobachtet.
Zur Funktion: An sechs IO Pins hängen RC Glieder und ich knöpfe mir 
zyklisch immer eins vor. Erst wird der Pin auf analogen Input 
umgeschaltet, dann die Spannung gemesse und wenn sie nicht im 
Zielfenster liegt entweder ein paar Instruktionen lang geladen oder 
entladen. Die Spannung am RC Glied füttere ich dann in die 
Leistungsstufe - siehe Bild. Das funktioniert soweit.
Die Versorgung ist ein PC Netzteil mit 12V für die Motoren und 5V, die 
ich schonmal für die Versorgung des Controllers benutzt habe. Den 
Controller mit der Versorgungsspannung vom Host zu betreiben hat da auch 
nichts geändert. Ground des Buses und des Netzteils hab ich zusammen 
gelegt.
Und nun meine Frage: Warum vergisst mein Chips sein Programmierung ?

von Marcus (Gast)


Lesenswert?

Der Pic kann seinen eigenen Programmspeicher selbst flashen.
Stell' mal die entsprechenden Config-Bits (Write-Protection)
entsprechend ein und überprüfe dein Programm, ob Du irgendwo ins
Nirwana springst. ( Und dann dort 'code' ausführst, der Dir deinen Flash 
ruiniert.

Falls Du mit Boot-Loader flashst klappt das mit dem Write-Protecten 
natürlich nicht. Hier musst Du sicherstellen, daß dein BootLoader 
Niemals im laufenden Betrieb aktivert werden kann.
(Auch hier liegt der Verdacht nahe, daß Du aus Deinem Programm in den 
Bootloader springst und dadurch irgendwas überschreibst.



Viele Grüße,
Marcus

von Carsten S. (dg3ycs)


Lesenswert?

Hi,
Marcus schrieb:
>... Und dann dort 'code' ausführst, der Dir deinen Flash
> ruiniert.
> ...
> Auch hier liegt der Verdacht nahe, daß Du aus Deinem Programm in den
> Bootloader springst und dadurch irgendwas überschreibst.

DAs oben geschriebene wird wohl mit Abstand die häufigste Ursache für 
zerstörte Programmspeicherinhalte sein.

Es gibt aber (neben Einzelfaktoren wie schadhafte Bausteine) noch einen 
Fehler der allerdings heute immer seltener Auftritt, aber im Falle das 
man Probleme hat durchaus Kopfzerbrechen bereiten kann.

Wenn die Programmierspannung zu gering ist kann es sein das die 
Programmierung scheinbar erfolgreich war, aber nicht wirklich dauerhaft 
ist und der Pic dann ganz schnell vergesslich ist. Je nachdem wie 
dramatisch die Spannungsunterschreitung ist um so schneller tritt das 
Vergessen ein.

Aber wie gesagt, die Oben von Markus genannten Ursachen sind um welten 
Wahrscheinlicher... Erst wenn du da nichts findest solltest du dich um 
mögliche EMV Probleme und erst dann um diese Möglichkeit kümmern...

(Zu zeiten als man noch mit ein paar Widerständen und Dioden am 
PArallel- oder Seriellport gearbeitet hat -oder wo selbstbaubrenner noch 
an der Tageordnung waren- kam soetwas noch häufiger vor. HAtte das auch 
das eine oder andere mal das der 16C84, später 16F84 der sich ja 
definitiv nicht selbst löschen kann, nach ein paar Tagen auf einmal 
nicht mehr wollte...)

Gruß
Carsten

von Horst H. (horstmann)


Lesenswert?

Vielen Danke für die Antworten !
Dass der Programcounter einen Ausflug in kreative Bereiche des ROMs 
unternimmt will mir nicht einleuchten. Die Firmware ist komplett in C 
ohne goto geschrieben. C Sprachkonstrukte können - bis auf einen 
Kompilerfehler - keinen Sprung ins Blaue erzeugen. Der Interrupt Handler 
und der Bootloader haben natürlich jeweils ein goto auf eine feste 
Adresse, die auch richtig sein muss, da der Chip erstmal seine Arbeit 
klaglos verrichtet.
Durch die Harvard Architektur kann auch nicht eben Mal irgendwo eine 
Write Instruction für das ROM entstehen und die einzige Stelle an der es 
schon eine gibt ist im Bootloader. Der wiederrum schreibt nur, wenn er 
das Passende Kommando über den Bus bekommt ... oder ein misteriöse 
Sprung direkt in den Kontrollzweig für das Löschen bzw das Schreiben 
stattfindet.
Zu letzt ist dann noch die Sache mit dem Timing. Der Fehler tritt 
irgendwann auf, wenn ich das System wieder in Betrieb nehme. Zu diesem 
Zeitpunkt habe ich den Kontroller schon einige Male über Stunden laufen 
lassen und auch mehrmals ein und aus geschaltet ohne das der Fehler 
aufgetreten ist. Wenn es also in meiner Software einen Fehler gibt, 
sollte er doch viel wahrscheinlicher wärend des Betriebs auftreten ... 
Was den Bootloader angeht, so ist das der von Microchip und ich 
unterstelle mal, dass der keine großen Bugs hat.
Ich hatte auf einen bekannten elektrotechnischen Grund gehofft, wie 
Spannungsspitze durch die Induktivität der Motoren oder etwas in der 
Richtung.
Ich mach den Programspeicher jetzt erstmal schreibgeschützt, 
programmiere das Ding ohne Bootloader und sehe dann ob es wieder 
vorkommt.

Gruß an alles Leser

von Peter D. (peda)


Lesenswert?

Ein häufiger Fehler ist, daß das Brownout nicht eingeschaltet ist.
Ein MC mit Bootloader oder EEPROM aktiv braucht zwingend ein 
Unterspannungsreset.

Sonst kann eine Unterspannung fehlerhafte Codeausführung bewirken, also 
z.B. ein Flash oder EEPROM Schreiben.


Peter

von usuru (Gast)


Lesenswert?

Das Schreiben ins FLASH eines PIC ist nicht so einfach, wie Ihr das Euch 
vorstellt. Es muss eine bestimmte Befehlsfolge eingehalten werden und 
ein bestimmtes Timing. Accidentell kann das eigentlich nicht vorkommen.

ABER: der Schreibvorgang ins EEPROM ist nahezu identisch mit dem ins 
FLASH, ist hier - falls EEPROM beschriebn wird - evtl ein 
"klitzekleiner" Programmierfehler reingerutscht?

von Sergey (Gast)


Lesenswert?

Hat zwar nichts mit diesem Bootloader-Problem direkt, aber doch indirekt 
zu tun: Ich hatte mal beim PIC12F508 den Fall, dass wenn die 
Versorgunsspannung "glitch-artig" eingeschaltet wurde der kleine PIC hin 
und wieder mal mitten ins Programm gesprungen ist oder anderen Unsinn 
ausführte. Selbst der Power-On-Timer half da nichts.

Gelöst habe ich das Problem, indem ich den gesamten restlichen Speicher 
mit Reset-Sprüngen auffüllt und ausserdem eine kleine 
Hash-Berechnungsroutine (Addieren, XORs mit Konstanten, ...) in der 
Initialisierungsteil packte und die erwarteten Resultate dann an 
verschiedenen Stellen des Programms abfragt.  Stimmte das Resultat nicht 
überein, gab es sofort einen Reset.

Das hat das Problem komplett gelöst.

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Carsten Sch. schrieb:
> Wenn die Programmierspannung zu gering ist kann es sein das die
> Programmierung scheinbar erfolgreich war, aber nicht wirklich dauerhaft
> ist und der Pic dann ganz schnell vergesslich ist. Je nachdem wie
> dramatisch die Spannungsunterschreitung ist um so schneller tritt das
> Vergessen ein.

Ich kann das von Carsten beschriebene nur bekräftigen. Es gibt ganz 
offensichtlich Grenzbereiche bei denen die Programmierung zwar klappt, 
aber eben nicht dauerhaft ist. Erlebe das selber oft bei Sachen die 
einen Bootloader benutzen, und somit die eigentliche VPP für den PIC 
nicht wirklich festgelegt ist. Wenn da dann die Batterien ausgelutscht 
sind, oder dier Versorgung nicht 100% ist so das zwar alles noch 
funktioniert, aber halt gerade nur so, dann kommt es oftmals dazu das 
der betreffende PIC irgendwann sein programm "vergisst".

Auch mit "irgendwas-das-geht" Programmern habe ich schlechte Erfahrungen 
gemacht. Seitdem ich "Standard" Programmer benutze habe ich das nichr 
mehr erlebt. Selbst di billigen PicKit-Clones machen da keine Probleme.

Grüße,

Chris

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Horst Horstmann schrieb:
> C Sprachkonstrukte können - bis auf einen
> Kompilerfehler - keinen Sprung ins Blaue erzeugen.

Das stimmt so leider überhaupt nicht. Insbesondere der C18 macht da 
treilweise ganz seltsame Dinge, insbesondere wenn man Pointer auf 
Funktionen beuntzt. Dürfte bei Dir aber wohl eher nicht der Fall sein.

Grüße,

Chris

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Sergey schrieb:
> Gelöst habe ich das Problem, indem ich den gesamten restlichen Speicher
> mit Reset-Sprüngen auffüllt ...

??

Keine Ahnung wie das bei den PIC12 ist, aber zumindest bei den 18 (und 
ich glaube ich 16) ist es so das gelöschter Speicher ein NOP 
represäntiert, und somit der µC das ganze solange NOP't bis er an das 
Ende seine Speicher gekommen ist. Dann wird er Befehelscounter auf 0 
gesetzt und das ganze fängt beim "echten" Start wieder an.

Grüße,

Chris

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.