Über PIC Prozessoren und deren Programmierung

Wie geht das denn? / ID-Value und Checksum / OSCCAL / Daten im EEPROM ändern / Mehr Infos ?

 
In einigen Projekten sind Controller der PIC-Serie zu finden, von mir kurz PIC genannt (gesprochen "pick"). Hierbei handelt es sich um kleine Prozessoren. Um diese zum Leben zu erwecken, müssen sie programmiert werden. Dieser Vorgang wird auch "brennen" genannt.
Hier habe ich mal ein kleines Ablauf-Diagramm gemalt. Daraus sollte eigentlich jeder erkennen, was man für Werkzeuge und Programme benötigt, um einen PIC zu programmieren:
 
pic-ablauf Programmer MPLab von www.microchip.com ist der Compiler - frei erhältlich! Das ASM-File ist der Quelltext (Assembler). Profis erstellen diesen selber. Diesen Vorgang nennt man "kompilieren" Das HEX-File kann von den Projekt-Seiten heruntergeladen werden www.digital-bahn.de Download auf dem Internet meist ein paralleles Kabel PIC "brennen" bei mir im Einsatz: 12F629 / 16F630 / 16F627 u.a.

 
Für eine Programmierung wird folgendes benötigt: Und noch der Hinweis: das bei Modell-Bahnern bekannte Programmier-Gleis hat hiermit nicht zu tun!

zurück zum Anfang nach Oben

Wie geht das denn?

Grundsätzlich gibt es 2 Arten, um einen PIC zu programmieren:

zurück zum Anfang nach Oben

Wozu gibt es den ID-Value und die Checksum?

Nach dem laden des HEX-Files in die Programmier-Software sollte diese den ID-Value und die Checksum (= Prüfsumme) anzeigen.
Bei dem ID-Value handelt es sich um einen Identifizierungs-Code, der in dem HEX-File abgelegt ist. Bei mir kann man daraus erkennen, welche Firmware man den nun wirklich vor sich hat. Die letzten 3 Ziffern entsprechen der Versions-Nummer. Hier eine kleine Übersicht zur Identifizierung:
 
ID-Values für 12F629
  Firmware für Platine..
1xxx wz_spur1 WeichZwei
2xxx wz_signal_2x2 WeichZwei
3xxx wz_3wege WeichZwei
4xxx wz_signal_1x4 WeichZwei
5xxx fdekoder_schalten WeichZwei
6xxx fdekoder_blink WeichZwei
7xxx fdekoder_neon WeichZwei
8xxx fdekoder_weiche WeichZwei
Axxx weichei WeichEi
Bxxx andreas WeichEi
Cxxx weichzwei WeichZwei
Dxxx wz_schalten WeichZwei
Exxx wz_signal_hl WeichZwei
Fxxx wz_blinkmuster WeichZwei

ID-Values für 16F684
  Firmware für Platine..
1xxx led_signal_001 (Einfahrsignal erweitert) LED-Dekoder
2xxx led_signal_002 (Ausfahrsignal erweitert) LED-Dekoder
3xxx led_signal_003 (Signal ÖBB) LED-Dekoder
4xxx led_signal_004 (2x Ausfahr-Signal) LED-Dekoder
5xxx led_signal_005 (HL-Signal erweitert) LED-Dekoder
6xxx led_signal_006 (PKP-Signal) LED-Dekoder
axxx sand_ei (Servodekoder 1er) SAnD-Ei
bxxx sand_4 (Servodekoder 4er) SAnD-4
fxxx Blinkmuster LED-Dekoder

zurück zum Anfang nach Oben

Das OSCCAL-Problem

Bei einigen PICs (12F629 / 12F675 / 16F630 / 16F676) gibt es eine Besonderheit, die unter Umständen zu Problemen führen kann: der OSCCAL.

Zweck von OSCCAL

Es handelt sich um einen OSCillator CALibration Wert. Da der PIC mit einem internen Oszillator betrieben werden kann (dies spart einen externen Quarz), wird dieser Wert bereits in der Chip-Fabrik an einer Speicherstelle programmiert. Dadurch können Toleranzen in der Taktfrequenz abgefangen werden.
Der 16F627 besitzt den OSCCAL übrigens nicht!

Warum wird der OSCCAL verwendet?

Die Verwendung des OSCCAL-Wertes wurde notwendig, damit alle Kombinationen von Dekoder und Zentrale zusammen laufen. Denn auch die Zentrale hat gewisse Toleranzen. Wenn nun eine langsame "Scharping"-Zentrale mit einem hektischen "Waalkes"-Dekoder zusammen funktionieren soll, so verstehen sich die beiden nicht mehr. Die Zentrale sendet einfach zu langsam.

Wie funktioniert das?

Der OSCCAL liegt in der letzten Speicherstelle des Programm-Speichers und wurde dort von der Chip-Fabrik einprogrammiert. Beim Start des PIC-Programmes wird dieser Wert dann ausgelesen.

Wie zeigt sich ein fehlender OSCCAL?

icprog3 (11K) Versucht man, den PIC zu programmieren und ist dessen OSCCAL bereits zerstört, so zeigt z.B. IC-Prog dieses Fenster. Allerdings erscheint dieses auch, wenn die Kommunikation zwischen Programmer und PIC nicht korrekt ist oder der Programmer gar nicht mit dem PC verbunden ist.
pbrenner_nooscal (45K) Bei PBrenner kann man in der Fusszeile erkennen, wenn es mit dem OSCCAL nicht mehr so ganz stimmt. PBrenner setzt dann den Wert auf 124 (dez), also genau "auf Mitte"
 
Im Normal-Fall wird hier übrigens der echte OSCCAL-Wert angezeigt. Sollte also einmal die Programmierung schieflaufen, schnell den OSCCAL-Wert notieren, bevor man auf etwas anderes klickt!

Wie kommt es zu Problemen?

Beim Brennen des PIC wird der Programmspeicher mit dem eigentlichen Programm geladen. Und genau hier sieht man schon die Gefahr: dort liegt ja schon der OSCCAL rum. Um diesen nicht zu überschreiben, wird dieser von einer guten PC-Programmier-Software zuerst gelesen und dadurch gerettet. Eine schlechte PC-Programmier-Software überschreibt diese Speicherstelle einfach und der OSCCAL ist futsch.
Aber auch mit der guten PC-Programmier-Software kann es vorkommen, das der OSCCAL verloren geht. Wird der Programmier-Vorgang z.B. gestört, so ist evtl. der Speicher schon gelöscht, aber der OSCCAL-Wert noch nicht wieder zurück-programmiert worden. In diesem Fall: OSCCAL schnell notieren und später wieder einprogrammieren.
PBrenner zeigt übrigens bei jedem Programmier-Vorgang den OSCCAL (den PBrenner ja gerade gelesen und somit gerettet hat) in der Fusszeile an.

OSCCAL ist weg - und nun?

Je nach PC-Programmier-Software gibt es meist irgendwo ein Fenster, in dem man einen OSCCAL eintragen kann. Hier einfach mal z.B. die Dezimal-Werte 64, 128, 196 nacheinander Programmieren. Wenn der Dekoder dann auf die Digital-Befehle gehorcht, ist der Fall gerettet.
pbrenner_editoscal Hier das Edit-Fenster für den OSCCAL bei PBrenner: Schaltet man auf den Punkt "von Schieberegler" um, kann der Wert verändert werden. Die Anzeige erfolgt hier in dezimal (also von 0 bis 255). Hier rate ich jetzt zu Funktions-Tests mit den Dezimal-Werten 64, 128 und 196. Für den nächsten PIC unbedingt wieder auf "nicht verändern" schalten!, sonst wird hier der korrekte OSCCAL gleich wieder mit Schieberegler-Wert überschrieben!

zurück zum Anfang nach Oben

Parameter-Änderung im EEPROM

Bei einigen Projekten kann man Parameter anpassen, indem man in einer EEPROM-Zelle einen Wert ändert. Dies sind z.B. das Time-Out bei dem Weichen-Dekodern ( WeichEi / WeichZwei / Weichendekoder Spur1 ) , die Abschaltzeit bei den Schaltdekodern ( WeichZwei Schalten / Relais 8-Dekoder ) oder die Ablauf-Geschwindigkeit einiger Beleuchtungs-Programme ( Hausbeleuchtung ).
Um den Parameter zu ändern, muss in einer EEPROM-Zelle ein Wert geändert werden. Ja, das klingt schon wieder sehr nach einer Aufgabe für Informatik-Studenten, bitte sehen Sie mir nach, das ich (momentan) keine komfortablere Lösung realisiert habe. Aber das ganze ist auch einfacher, als es zunächst scheint! Besonders mit dem Programm ICPROG lässt sich der Wert sehr einfach editieren. Hier ein Beispiel, wie man einen Wert an der EEPROM-Adresse $20 ändert und dann den PIC damit prgrammiert:
  1. PIC-Type einstellen
  2. HEX-File laden
  3. Doppelklick auf die EEPROM-Adresse $20 (also auf die Zahl, die an dieser Stelle steht)
  4. Wert editieren, OK klicken
  5. "Alles Programmieren" (ICPROG muss natürlich richtig konfiguriert sein)
Natürlich könnte man das angepasste HEX-File jetzt auch speichern, um es direkt wieder (z.B. auch mit PBrenner) brennen zu können.
 
edit_eeprom (77K)

zurück zum Anfang nach Oben

Mehr Infos ?

Wer sich weiter über die PIC-Controller informieren möchte, kann dies auf der Homepage von Microchip tun. Hier kann auch die Entwicklungsumgebung MPLAB kostenlos heruntergeladen werden.
 
Link zum Hersteller Microchip:arrow www.microchip.com
 
Eine gute Seite für den Einstieg in die PIC-Welt (deutsch):arrow www.sprut.de

zurück zum Anfang nach Oben