PIC16F145x-Urlader - mehr als nur das!

Die Mikrocontroller PIC16F1454, PIC16F1455 und PIC16F1459 sind gerade für Bastler äußerst interessante Chips, da es diese sehr preiswert im Durchsteck-Gehäuse zu kaufen gibt und diese einen quarzlosen USB-Full-Speed-Devicecontroller enthalten. Mit gerade mal 2 externen Kondensatoren kann damit ein USB-Seriell-Konverter USB-standardkonform realisiert werden. Mit 8 KWort Flash kann man auch komlexere Aufgaben in C ausprogrammieren. Für 14-Bit-Core-PICs bieten diese Chips ziemlich umfangreiche Peripherie, etwa einen 16-Bit-Zeitgeber, serielle Schnittstellen (UART, SPI und I²C) sowie (nicht beim '1454) einen 10-Bit-A/D-Wandler. Wie bei allen vierstelligen PICs mit 14-Bit-Core gibt es (endlich!) eine lineare RAM-Adressierung, die die jeweils 80 RAM-Bytes in jeder einzelnen Bank ab der Adresse 0x2000 spiegelt.

Der Pferdefuß mit diesem Chips ist nur, dass diese nicht mit einem USB-Urlader ausgeliefert werden, sodass deren Erstkontakt mit einem Programmierinterface erfolgen muss, etwa dem PICKIT2 oder einer einfachen Bastelschaltung am Parallelport.

Deshalb gibt es im Web eine Reihe USB-Urlader, mit eher mauer Funktionalität und mieser Komatibilität, oftmals viel zu groß. Die Idealgröße des Urladers für diese Chips ist 512 Programmworte, weil diese Größe via Konfigurationsbits gesondert vor Überschreiben abgesichert werden kann. USB bekommt man da nur mit Assembler­programmierung hinein, bei Verzicht auf Interrupts sogar bequem.

Der übrig bleibende Platz in der Firmware dient schließlich dazu, einfache Aufgaben der Labormesstechnik ganz ohne eigene Firmware lösen zu können, wie das Einlesen eines Analogwertes oder die Steuerung einer digitalen Leitung. Damit erleichtert sich der Einstieg in diese Mikrocontroller ungemein.

Eingesetzt wird bei mir ein solcher PIC16F1454 im Projekt PCS500 am USB.

Der erweiterte Urlader

Hier ist er. Er läuft nun auch unter Windows. Und erzeugt nicht permanent USB-Verkehr wie die Vorlage: Diese generierte ständig 0-Byte-Pakete, anstatt die Sache mit dem Data-Toggle richtig zu imlementieren und nur dann etwas zu senden, wenn er gefragt wird.

Die beigefügte INF-Datei ist derart frisiert, dass fortan alle USB-Seriell-Konverter (u.a. alle Arduinos) von Windows ohne Treiberanfrage installert werden. Eine Bindung an USB-VID&PID erfolgt nicht.

Der Urlader ist trotzdem kleiner als das Original von der Softwaremüllhalde. Die Art der Funktion wird von der Länge des OUT-Transfers bestimmt. Das obligatorische IN-Byte (Antwort) macht zwar die Kommunikation etwas langsamer, verhindert jedoch zuverlässig, dass Softwareschichten (bspw. NI-VISA) Bytes zusammenfassen, was hier unzulässig wäre.

Liste der Funktionen des Urladers, grün die neuen Funktionen
Länge in BytesFunktionDaten (Länge Bytes)Antwort (1 Byte)
0wird ignoriertkeinekeine
1Reset: Sprung zum Anwenderprogramm = Adresse 0x0200'R'
  • 1 = okay
  • 2 = kein 'R'
2Byte lesenAdresseDatenbyte
3Byte schreiben
  • Adresse (2 Bytes)
  • Datenbyte
  • 1 = okay
4Flash-Schreiben vorbereiten und ggf. Flash-Speicherseite löschen
  • Wortadresse (2 Bytes)
  • 1 Byte Daten-Prüfsumme
  • 1 Flagbyte: 'E' = löschen
  • 1 = okay
  • 2 = Wortadresse nicht durch 32 teilbar
64Flash beschreiben 32 14-Bit-Worte (High-Bits 0)
  • 1 = okay
  • 3 = falsche Prüfsumme
  • 4 = Vergleichs-Fehler

Mit der Funkion Byte lesen kann man ein Byte von jedem I/O-Port, vom RAM und vom Flash lesen. Um Bytes vom Flash zu lesen, ist das Bit 15 der Adresse zu setzen. Es kann so nur das Low-Byte gelesen werden.
Achtung! Einige Portadressen haben beim Lesen Seiteneffekte!

Mit der Funkion Byte schreiben kann man ein Byte auf jedes I/O-Port und in den RAM schreiben.
Achtung! Alle Portadressen haben (logischerweise) Seiteneffekte! Aber auch das Beschreiben des RAM und von Sonderfunktionsregistern kann den Urlader durcheinanderbringen. Dann hilft nur noch ein Reset = Ab- und Anstecken des USB-Kabels. Die Urlader-Firmware im Flash-Speicher ist unzerstörbar.

Die entsprechenden Portadressen und Bitbelegungen holt man sich vom Datenblatt des Mikrocontrollers. Die wichtigsten:

Einige Portadressen der PIC16F145x
NameAdresseBedeutungVorgabe
PORTA000C
  • Schreiben: Ausgangstreiber-Latch LATA
  • Lesen: Pinzustand
TRISA008C
  • 0 = Ausgabe
  • 1 = Eingabe
3B
LATA010CAusgangstreiber-Latch00
ANSELA018CAnalog-Auswahl: 0 = analog+digital, 1 = analog10
WPUA020CPullup-Enable: 0 = kein Pullup, 1 = Pullup38
OPTION_REG0095Bit 7: 0 = globale Pullup-Freigabe7F

Um sich ein PIC-Programmiergerät zu ersparen, habe ich einen PC mit Parallelport aufgesucht und die Firmware mit dem Low-Voltage-Programmierinterface (also keine hohe Reset-Spannung) draufgetan. Das ist so ähnlich wie beim AVR ISP mit MOSI und MISO. Braucht man unbedingt den RESET-Anschluss als Eingang, muss man die Konfigurationsbits (AVR-Deutsch: Fuses) entsprechend ändern.

Wie kommt der Urlader in die PIC?

Am einfachsten nehme man sich einen PC mit Parallelport. Man benötigt:

In meinem Fall tut's nunmehr ein überlassener GALEP-III.

Anwendungsprogramm

Hier ist es.

Das Windows-Programm ermöglicht es, mit allen Portadessen und Speicherzellen herumzuspielen sowie Firmware hochzuladen. Es läuft von Windows 98 bis mindestens Windows 10 und benötigt keine besonderen DLLs. Es ist zweisprachig.

Die Möglichkeit der Manipulation ist eher als Demo-Programm zu sehen, wie man ohne einen Strich eigene Firmware schreiben zu müssen einige alltägliche Probleme der Laborautomatisierung sehr preiswert lösen kann. So genügt es bspw. in LabVIEW, mit dem vorhandenen Knoten zum Senden und Empfangen von der seriellen Schnittstelle (seltsamerweise unter VISA zu finden) digitale Ausgänge zu steuern, einzulesen und in der Richtung umzuschalten. Ein NI USB-6008 und ein Arduino (jener leider nur mit Firmware) kann das auch, aber ein Durchsteck-Chip ohne Quarz am USB und mit einem winzigen USB-Urlader, das ist doch schon fetzig.

Außerdem kann man damit ohne Steckerstöpseln und ohne sich über die USB-Vendor- und Produkt-ID (VID&PID) einen Kopf machen zu müssen seine Firmware drauftun. Der mit den Fuses gesperrte Urlader-Bereich, der nur 116 des gesamten Flashs abzwackt, ist vor dem Überschreiben sicher. Zurück zum Urlader geht es mit dem RESET-Eingang, falls sich die Firmware mal verhakt. (Dieser Eingang steht fürs Anwendungsprogramm erst mal nicht zur Verfügung.)