Retro: PICs mit Fenster

Früher™ waren nichtflüchtige Speicher von Mikrocontrollern und EPROMs nicht elektronisch löschbar. Entweder, man hat nach einmaligem Programmieren Elektroschrott oder ein hoffentlich funktionierendes Programm auf dem Controller. Abhilfe schafften die praktischen aber auch recht teuren Mikrocontroller und Speicherbausteine mit einem kleinen Quarzglasfenster, welche mit einem UV-Löschgerät gelöscht und erneut programmiert werden konnten (oder immer noch können). Mir sind ein paar der PIC16C76-JW mitsamt der notwendigen Tools in die Hand gefallen.

Hardware

Spezielle Controller erfordern spezielle Hardware. Zum Beispiel ein UV-Löschgerät, mit dem sich bereits programmierte Controller wieder löschen lassen. Dabei handelt es sich um einen kleinen Kasten mit einer UV-C-Röhre und einem integrierten Timer. Da UV-C nicht gerade gesund ist und mir Fälle von „Programmierer-Sonnenbrand“ bekannt sind, habe ich die bei meinem Gerät deaktivierten Sicherheitsfunktionen wie den Türschalter wieder in Betrieb genommen. Nun erlischt die UV-Röhre, sobald man die Abdeckung öffnet.

Kleines UV-Löschgerät mit einer Handvoll PICs

 

Und die alten windowed PICs lassen sich natürlich nicht mit dem modernen PICkit3 programmieren, also braucht es zum Beispiel das fast fünfundzwanzig Jahre alte PICSTART Plus, einem universellen Programmiergerät mit serieller RS232-Schnittstelle und praktischem Nullkraftsockel. Erfreulicherweise funktioniert das Programmiergerät mit einem USB-RS232-Adapter auch an einem modernen Computer.

PICSTART+: Serielles Programmiergerät für PICs

Und da ein nackiger PIC zwar schön anzusehen, aber doch recht nutzlos ist, braucht es für die ersten Schritte noch eine kleine Test-Hardware. Zufälligerweise habe ich da noch ein minimalistisches Board, welches neben Platz für den Controller auch noch einen Quarz und eine LED enthält. Das sollte für ein „proof of concept“ ausreichen.

Ein kleines Testboard für den PIC16C76

Die Controller sind übrigens doppelt gesockelt, damit beim Herausnehmen und in die Testschaltung setzen die eigenen Anschlussbeine des Controllers geschont werden. Den Sockel kann man leicht und günstig tauschen. Den PIC seinerzeit nicht, kostete der PIC16C76 mit Fenster doch etwa 10DM.

Software

Löschgerät: Check.
Programmiergerät: Check.
Testschaltung: Check.
Software: Pending.

Ein Controller ohne Software ist wie ein Fisch ohne Fahrrad. Oder so ähnlich. Ein kleines C-Programm, welches die LED an RB0 zum Blinken bringt, sollte binnen weniger Minuten zu erstellen sein. Denkste. Das aktuelle MPLAB X von Microchip unterstützt den PICSTART+ Programmer nicht. Also habe ich MPLAB 8.92 installier, das ist die letzte Version vor MPLAB X, welche den Programmer unterstützt. Leider ist bei MPLAB standardmäßig kein C-Compiler bei und der vom X ist zu neu. Und einen alten installieren wollte ich auch nicht. Egal, ich hab ja mal PIC-Assembler in der Berufsschule gehabt. Kann ja so schwer nicht sein. Und es war auch nicht schwer.

MPLAB 8.92 mit Testprogramm

Damit blinkt eine LED mit 2Hz.

Natürlich läuft so ein Programm nicht auf Anhieb. Bei einem modernen Controller kann man schnell etwas ändern und das neue Programm auf den Controller brennen, ohne ihn aus der Schaltung nehmen zu müssen. Bei diesen Controllern ist das etwas anders und ich bin froh, dass ich nicht nur einen dieser PICs habe.
Auf dem Löschgerät liegen dauerhaft ein paar PICs. Hat man ein Programm verhauen, nimmt man einen gelöschten aus dem Löschgerät, programmiert ihn, setzt ihn in die Schaltung und legt den vorherigen Controller in das Löschgerät. Da ein Löschvorgang etwa 10 Minuten beträgt, kann man so den Arbeitsablauf einigermaßen flüssig halten und muss nicht auf das Löschen der Controller warten.

War man sich sicher, dass das Programm nun fehlerfrei läuft, konnte man das Programm für die Serienfertigung auf deutlich günstigere PICs ohne Fenster brennen und verwenden. Nur dort wurde man das Programm im Falle eines Fehler so schnell nicht mehr los. Röntgen wäre eine Möglichkeit gewesen.

Es war definitiv ein interessanter Ausflug in eine noch nicht so lang zurückliegende Ära. Ich bin froh, dass Flash-Speicher und elektronisch löschbarer Speicher günstig und Standard geworden sind.

Oh. Wenn man nicht aufgepasst hat, ist übrigens auch Tageslicht in der Lage, den Controller zu löschen. Entweder, das Programm war nach ein paar Tagen in der Sonne weg, oder einzelne Speicherzellen haben sich geändert, wodurch das Verhalten unvorhersehbar wurde. Daher sieht man noch heute, wenn man einen Controller mit Fenster in freier Wildbahn findet, dass das Fenster mit einem lichtundurchlässigen Aufkleber verschlossen ist.

Quelltext

Für alle Interessierten gibt es hier noch den Sourcecode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
;************************************************************
; Processor: PIC16C76 at 8 MHz using external oscillator
; Function: Flash a LED connected to RB0
; Author: Sebastian Rietig
;************************************************************

LIST P=16C76, R=DEC ; Use the PIC16C76 and decimal system

#include "P16C76.INC" ; Include header file

__config _WDT_OFF & _PWRTE_OFF & _BODEN_ON & _XT_OSC

; -----------
; INITIALIZE
; -----------

ORG 0x000 ; Program starts at 0x000

CLRF PORTA ; Initialize port A
CLRF PORTB ; Initialize port B

BSF STATUS,RP0 ; RAM bank 1

CLRF TRISA ; All pins port A output
CLRF TRISB ; All pins port B output

BCF STATUS,RP0 ; RAM bank 0

MOVLW 7
MOVWF ADCON1 ; Comparators off, all pins digital I/O

; ----------
; MAIN LOOP
; ----------

Main BSF PORTB,0 ; Turn on LED connected to RB0
CALL Delay
BCF PORTB,0 ; Turn off LED connected to RB0
CALL Delay
GOTO Main

; Delay = 0.5 seconds
; Clock frequency = 8 MHz
; http://www.piclist.com/techref/piclist/codegen/delay.htm

CBLOCK 0x20
d1
d2
d3
ENDC

Delay
;999990 cycles
MOVLW 0x07
MOVWF d1
MOVLW 0x2F
MOVWF d2
MOVLW 0x03
MOVWF d3
Delay_0
DECFSZ d1, f
GOTO $+2
DECFSZ d2, f
GOTO $+2
DECFSZ d3, f
GOTO Delay_0

;6 cycles
GOTO $+1
GOTO $+1
GOTO $+1

;4 cycles (including call)
RETURN

END