5PiP - ein PIC
"bitbanging" Programmer für die serielle
Schnittstelle, bestehend aus 3 Widerständen
und zwei Dioden. Nach den ermutigen Versuchen mit dem 4-Teile-AVR-Programmer wollte ich ähnliches mit PIC-Microcontrollern probieren. Die Homepage von Lothar Stolz ließ hoffen, dass es mit ähnlich geringem Aufwand funktionieren könnte. Die Lothar-Stolz-Variante ist für Low-Volt-Programming (LVP) vorgesehen. Das kann nicht jeder PIC und wenn, wird ein Pin verbraucht, der sonst für andere Zwecke zur Verfügung stehen würde. Die Standardvariante einen PIC zu programmieren ist High-Volt-Programming (HVP). Dabei geht der PIC in den Programmiermodus, wenn eine Spannung um die 10V an den MCLR-Pin angelegt wird. Glücklicherweise stellt eine "richtige" serielle Schnittstelle Spannungen in dieser Höhe zur Verfügung (bei mir knapp 12 V). Welche Programmierspannung (Vpp) die verschiedenen Modelle genau brauchen, ist hier schön aufgelistet. Meine Erfahrung dazu: Etwas höhere Spannungen als in der Spezifikation gehen auch. Damit ist der Nachteil auch schon genannt: Das Ganze funktioniert nicht mit Schnittstellen, die geringere Spannungen liefern (Notebooks) und nicht mit USB-seriell-Adaptern. Besitzer von aktuellen Desktop-PCs ohne serielle Schnittstelle sollten mal nachsehen, ob diese nicht doch auf dem Motherboard vorhanden ist, nur nicht nach außen geführt ist. Haben wir kein Glück, sollte auch eine PCI-Einsteckkarte funktionieren (habe ich allerdings nicht getestet). Haben wir aber einen Windows PC mit einem "echten" COM-Port, können wir mit minimalem Aufwand einen PIC programmieren (flashen). 5PiP kann aber noch mehr; er kann über seine Verbindungen auch Daten mit dem PC austauschen. Wir brauchen erstmal keine andere Hardware, wie z.B. LCD-Displays wenn der PIC uns etwas mitteilen möchte. Das Steckbrett-Arrangement auf dem Bild zeigt das was wir brauchen, um eine LED zum Leuchten zu bringen und Daten per UART in beiden Richtungen auszutauschen. Bei dem PIC handelt es sich um einen 16f1509. Auf dem PC werden die Daten in einem Terminal-Programm angezeigt. Wir müssen nur darauf achten, dass entweder die Programmer-Software ODER das Terminal-Programm die Schnittstelle benutzen kann. Da beides gleichzeitig keinen Sinn macht (während des Programmiervorgangs sind eh keine sinnvollen Daten zu erwarten), müssen wir nur unsere Programme sinnvoll konfigurieren. Schlau ist es, das Terminalprogramm so einzustellen, dass es die Schnittstelle freigibt, solange es den Fokus verloren hat. Die ganz unten verlinkten Programme können das. Die fünf Bauteile sind auf einem kleinen Stück Lochraster-Platine aufgelötet und fest mit einer 9Pol SubD Buchse verbunden. Sinnvollerweise leisten wir uns noch ein serielles Verlängerungskabel (braucht der Bastler immer). Selbiges eingerechnet wird unsere Hobbykasse mit lediglich 3 Euro (ca.) belastet! Wer über USB arbeiten möchte kann auch folgendes erwägen: Über 5PiP und einen alten PC mit besagter serieller Schnittstelle flashen wir einen Bootloader auf einen PIC unseres Interesses. Der Bootloader nimmt Programme dann asynchron (also gerade nicht per "bitbanging") über die serielle Schnittstelle entgegen und programmiert quasi sich selbst. Das geht dann auch mittels USB-seriell-Adapter. Für manche PICs gibt es sogar Bootloader, die ohne Adapter direkt an USB angeschlossen werden können. |
SchaltplanDie gesamte Pegelwandlung der seriellen Schnittstelle geschieht über möglichst hochohmige Widerstände in Verbindung mit den internen Schutzdioden des PIC. Die negativen Pegel der seriellen Schnittstelle werden so auf max. -0,7 V begrenzt. Der Programmer funktioniert also grundsätzlich ohne die Schottky Dioden. Diese negativen Spannungen hat einige meiner Test-PICs (an PGD bei m 16f1509, an MCLR beim 16f1789) offenbar in den RESET-Modus gezwungen. Das hat sich so geäußert, dass sie (nach erfolgreicher Programmierung) erst gestartet sind, nachdem der 5PiP entfernt wurde. Die Schottky-Diode begrenzt die negativen Spannungen auf ca. 0,2 V, was den geschilderten Effekt verhindert.Die Verbindung vom UART-Ausgang des PIC nach TxD des PC ist für die Programmier-Funktion nicht erforderlich. Hier kann der PIC im Betrieb Daten an den PC schicken. Falls wir auch eine UART-Datenleitung in Gegenrichtung brauchen, ergänzen wir eine Verbindung von PGD (hier kommt ja TxD vom PC an) über einen weiteren 47kOhm Widerstand zum Rx-Eingang des PIC. Die Stromversorgung der Schaltung muss separat erfolgen. |
Platine
Unser Super-Primitiv-Programmer liefert sicherlich
nicht die beste Signalqualität. Zum Glück habe ich
kein Oszilloskop, um das Elend sehen zu können. Der
Test der Prototypen hat ergeben, dass sich parallele
Signalleitungen offenbar gegenseitig stören und
manche PIC-Modelle da sehr pingelig reagieren. Das
äußerte sich dann so, dass der PIC von der
Programmiersoftware nicht erkannt wurde oder beim
Verify Fehler auftraten. Auf Kabel jenseits der
seriellen Schnittstelle verzichten wir deshalb
einfach und bauen das Ganze zwischen einer
Stiftleiste und einem weiblichen 9pol SubD Stecker
auf. |
Die ProgrammiersoftwareDazu gibt es eine klare Empfehlung: PICPgm.Kostenlos, kann sehr viele PICs bearbeiten und ist flexibel konfigurierbar. Außerdem gibt es eine GUI- und eine Kommandozeilen-Version. Letztere eignet sich astrein, um in Programmierumgebungen eingebunden zu werden. Rechts sehen wir, wie die GUI aussieht wenn alles richtig verbunden ist. Wenn wir PICPgm von der Originalseite laden, ist es nicht für 5PiP konfiguriert. Das können wir leicht machen, indem wir die "Programmer Selection/Configuration" anpassen, wie unten gezeigt. Alternativ können die Datei "pgmifcfg.xml" editieren. Noch weniger Stress haben wir, wenn wir den Download vom Ende dieser Seite nehmen. Das im ZIP enthaltene PicPgm braucht nicht installiert zu werden (portable). Einfach den enthaltenen Ordner entpacken, es ist alles fertig konfiguriert. Auch im Komplettpaket für Great-Cow-Basic (Link am Ende der Seite) ist alles fertig vorbereitet. |
Platine testen und
PicPgm einstellen
Erst
testen, dann anschließen! |
Getestete ControllerFolgende Controller haben bei mir erfolgreich mit 5PiP zusammengearbeitet:
|
Einschränkungen Wenn das Programmieren funktioniert, aber das Programm nur nach Abziehen des Programmers läuft, wird der PIC vermutlich durch den LOW-Pegel am MCLR-Pin im Reset-Status gehalten. Bei modernen PICs können wir das verhindern, indem wir MCLR als IO-Pin konfigurieren. Der Great-Cow-Basic Compiler macht das (wenn der PIC es hergibt) als Standard. Beim beim JAL-Compiler benötigen wir dazu folgende Programmzeile in unserem Quellcode: pragma target MCLR internal Haben wir eine Hex-Datei in WinPicPgm geladen, können wir die Konfiguration kontrollieren, wie im Bild dargestellt. Die entscheidenden Stellen sind gelb markiert. Es gibt jedoch PICs, die diese Möglichkeit nicht haben. Meist handelt es sich um ältere Modelle. Eine Möglichkeit zur komfortablen Programmierung wäre, ein Taster in der Leitung zum MCLR-Pin. Ggf. ist auch ein Pull-Up Widerstand an MCLR nötig (das ist unabhängig vom Programmer). Geht das Programmieren gar nicht, ist vielleicht die Spannung an MCLR zu klein. Da hilft nur messen und mit dem Datenblatt vergleichen. Bei mir liegen ca. 10,5V an. Damit funktioniert es mit allen getesteten PICs. Notfalls können wir versuchen, den 10kOhm Widerstand schrittweise verkleinern. Unter 4,7 kOhm würde ich aber nicht gehen. |
Wenn das Programmieren funktioniert, aber das
Programm nur nach Abziehen des Programmers läuft,
wird der PIC vermutlich durch den LOW-Pegel am
MCLR-Pin im Reset-Status gehalten. Bei modernen PICs
können wir das verhindern, indem wir MCLR als IO-Pin
konfigurieren. Der Great-Cow-Basic Compiler macht
das (wenn der PIC es hergibt) als Standard. Beim
beim JAL-Compiler benötigen wir dazu folgende
Programmzeile in unserem Quellcode: pragma target MCLR internal Haben wir eine Hex-Datei in WinPicPgm geladen, können wir die Konfiguration kontrollieren, wie im Bild dargestellt. Die entscheidenden Stellen sind gelb markiert. Es gibt jedoch PICs, die diese Möglichkeit nicht haben. Meist handelt es sich um ältere Modelle. Eine Möglichkeit zur komfortablen Programmierung wäre, ein Taster in der Leitung zum MCLR-Pin. Ggf. ist auch ein Pull-Up Widerstand an MCLR nötig (das ist unabhängig vom Programmer). Geht das Programmieren gar nicht, ist vielleicht die Spannung an MCLR zu klein. Da hilft nur messen und mit dem Datenblatt vergleichen. Bei mir liegen ca. 10,5V an. Damit funktioniert es mit allen getesteten PICs. Notfalls können wir versuchen, den 10kOhm Widerstand schrittweise verkleinern. Unter 4,7 kOhm würde ich aber nicht gehen. |
Links und Downloads
|
|
© Frank Steinberg |