Symbol www.digital-bahn.de Symbol
Shop Forum Datenschutzerklärung Suche Kontakt

Über PIC Prozessoren und deren Programmierung

Wie geht das denn? / ID-Value und Checksum / PIC-Familien / 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-Software Pbrenner Programmer-Software IC-Prog Programmer-Software von Oshon 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
 Firmwarefür Platine..
1xxxwz_spur1 WeichZwei
2xxxwz_signal_2x2 WeichZwei
3xxxwz_3wege WeichZwei
4xxxwz_signal_1x4 WeichZwei
5xxxfdekoder_schalten WeichZwei
6xxxfdekoder_blink WeichZwei
7xxxfdekoder_neon WeichZwei
8xxxfdekoder_weiche WeichZwei
Axxxweichei WeichEi
Bxxxandreas WeichEi
Cxxxweichzwei WeichZwei
Dxxxwz_schalten WeichZwei
Exxxwz_signal_hl WeichZwei
Fxxxwz_blinkmuster WeichZwei

ID-Values für 16F630
 Firmwarefür Platine..
1xxxweich88 Weich88
2xxxfdekoder_led_schalten LED-Dekoder
2xxxled_signal_5x2 LED-Dekoder
4xxxRückmeldung Schnüffel Schnüffel
4xxxled_signal_sbb LED-Dekoder
5xxxled_gas LED-Dekoder
6xxxled_ampel LED-Dekoder
7xxxled_andreas LED-Dekoder
8xxxrelais8 Relais8
9xxxled_schalten LED-Dekoder
Axxxled_signal_aus LED-Dekoder
Bxxxled_blink LED-Dekoder
Cxxxled_kirmes LED-Dekoder
Dxxxled_neon LED-Dekoder
Exxxled_haus LED-Dekoder
Fxxxled_feuer LED-Dekoder

ID-Values für 16F676
 Firmwarefür Platine..
Axxxdrehsb (MM) Drehscheibe
Dxxxdrehsb (DCC) Drehscheibe
Fxxxdrehsb (DCC) 24 Positionen Drehscheibe

ID-Values für 16F684
 Firmwarefür Platine..
1xxxled_signal_001 (Einfahrsignal erweitert) LED-Dekoder
2xxxled_signal_002 (Ausfahrsignal erweitert) LED-Dekoder
3xxxled_signal_003 (Signal ÖBB) LED-Dekoder
4xxxled_signal_004 (2x Ausfahr-Signal) LED-Dekoder
5xxxled_signal_005 (HL-Signal erweitert) LED-Dekoder
6xxxled_signal_006 (PKP-Signal) LED-Dekoder
axxxsand_ei (Servodekoder 1er) SAnD-Ei
bxxx sand_4 (Servodekoder 4er) SAnD-4
fxxxBlinkmuster LED-Dekoder

zurück zum Anfang nach Oben

Die PIC Familien

In meinen Projekten werden verschiedene PICs verwendet, je nachdem, welche Funktionen benötigt werden. Einige PICs sind dabei zueinander Software-Kompatibel, andere nicht. Hier eine kleine Übersicht:
 
12F629 / 12F675 / 16F630 / 16F676: diese PICs sind zueinande kompatibel. Alle haben 1K ROM und im wesentlichen die selbe Peripherie auf dem Chip. Die 16Fxxx sind hier 14-polig, die 12Fxxx 8-polig. Dennoch kann man einen 12Fxxx durchaus auch anstelle eines 16Fxxx einbauen, die Lage der Versorgungsspannungs-PINs usw. ist identisch. Aber natürlich fehlen dann ein paar Ausgänge. In der Praxis heisst dies: Man kann eine Software für den 16Fxxx auch auf einen 12Fxxx brennen und umgekehrt. Man kann einen 12Fxxx (WeichZwei) auch auf eine 16Fxxx Platine löten (z.B. LED Dekoder). Man kann einen 12F675 anstelle eines 12F629 nehmen oder einen 16F675 anstelle eines 16F630. Anders herum geht dies nicht, denn der 12F675 / 16F676 hat einen zusätzlich AD-Wandler, der auf dem 12F629 / 16F630 fehlt.
 
12F683 / 16F684: Dies ist eine Familie mit jeweils 2k ROM. Die Pinbelegung ist kompatibel zur 12F629 / 12F675 / 16F630 / 16F676-Gruppe. Die Software allerdings ist es nicht, denn es gibt hier einige feine Unterschiede. Das heisst in der Praxis: ein 12F683 kann einen 12F629/675 ersetzen, wenn die Software entsprechend angepasst wird. Das gleiche gilt für 16F684 und 16F630/676. Auch hier läuft die 16F684 Software auf dem 12F683 und umgekehrt.
 
16F627 / 16F628: wird u.a. auf den S88-Modulen verwendet. Eine 16F627 Software kann auf dem 16F628 laufen, aber nicht anders herum, denn der 16F628 hat mehr Speicher. Es gibt jeweils noch einen 16F627A/16F628A, der aber Kompatibel ist.

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 / Weich 88-8 ) , 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, siehe hier )
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