Die in der Überschrift aufgeführten PIC-Typen besitzen einen kalibrierbaren internen 4-MHz-Oszillator. Im Herstellerwerk wird für jeden PIC ein Kalibrierwert ermittelt, der in das Register OSCCAL geschrieben werden muss, damit der RC-Oszillator mit 4 MHz (±1%) schwingt. Dieser Wert wird in einen RETLW-Befehl verpackt auf die Adresse 0x03FF des Flash-Programmspeichers geschrieben.
Beim Brennen des PIC kann dieser Wert durch eine Brennerfehlfunktion oder einen Bedienfehler leicht verloren gehen. Hier stelle ich ein Verfahren vor, um den Kalibrierwert wieder neu zu bestimmen.
Eine Neubestimmung kann auch vorteilhaft sein, wenn man den PIC
dauerhaft
bei ungewöhnlichen Temperaturen oder mit kleinen
Betriebsspannungen
betreibt, da dann die Werkskalibrierung nicht mehr unbedingt 4 MHz
ergibt.
Wer als Bastler einen OSCCAL-Chip öfter mal mit einem neuen
Projekt brennt, tut gut daran, den individuellen OSCCAL des Chips auf
dessen Unterseite mit spitzem Bleistift zu notieren. Natürlich nur
wenn das Gehäuse groß genug ist :-)
Es gibt prinzipiell zwei Kalibriermethoden.
Die 2. Variante benötigt neben den Tastern nur ein Digitalmultimeter mit Frequenzmessbereich. So ein Multimeter sollte jeder Bastler ohnehin besitzen. Deshalb bevorzuge ich diese Variante. Außerdem ermöglicht sie eine präzisere Einstellung des OSCCAL-Wertes.
Leider können der 12F629 und seine Brüder nicht selber in
den
Flash-Speicher
schreiben. Deshalb muss letztendlich der ermittelte neue
OSCCAL-Wert
im EEPROM abgespeichert werden.
Die Anwendersoftware kalibriert den Oszillator dann dadurch, dass sie
den Zahlenwert aus der EEPROM-Zelle 0x7F ausliest und in das Register
OSCCAL
hineinschreibt. Wie das geht, kann man z.B. dem Assemblerquelltext
dieser
Kalibrierungssoftware (z.B. osccal2.asm)
entnehmen. Diesen Code kann
man
dann in sein eigenes Programm übernehmen.
; Wert aus EEPROM-Zelle 0x7F in OSCCAL schreiben movlw 0x7F ; Adresse im EEPROM BSF STATUS, RP0 ; Bank 1 MOVWF EEADR ; schreibe die Adresse in EEADR BSF EECON1, RD ; EEPROM Leseprozess starten MOVF EEDATA, W ; Die Daten der EEPROM Zelle ; nach W kopieren MOVWF OSCCAL ; w nach OSCCAL schreiben BCF STATUS, RP0 ; Bank 0 |
Besser ist es, aus dem ermittelten OSCCAL-Wert einen RETLW-Befehl zu
basteln, und diesen auf die Flash-Zelle 0x3FF zu brennen.
PBrenner sowie auch USBurn können den
OSCCAL-Wert aus dem EEPROM übernehmen und auf die
Flash-Zelle
0x3FF brennen..
Der PIC stellt den OSCCAL-Wert zunächst auf 128 (Mittelwert)
ein.
Falls auf der EEPROM-Zelle mit der Adresse 0x7F ein von 0x00 und 0xFF
verschiedener Wert steht, dann wird dieser in das OSCCAL-Register
geschrieben.
(Schon vorher mit dieser Methode ermittelter Kalibrierwert.)
Zwischen OSC1 und OSC2 wird ein normaler 32,768-kHz-Uhrenquarz angeschlossen. Je ein 33pF-Kondensator verbindet OSC1 und OSC2 mit Masse (Vss). Der hier erzeugte 32,768-kHz-Takt wird über den 8:1 Vorteiler in den Timer1 gespeist.
Der interne Takt des PIC wird über den 256:1 Vorteiler auf den Timer0 gegeben.
Timer0 und Timer1 werden auf 0 gesetzt.
Der Timer0 läuft immer nach 65,536 Millisekunden über. Das
Überlaufen des Timer0 löst einen Interrupt
aus.
Die Interruptroutine ändert jedesmal den Pegel des Pins GP0 (Pin
7 am 16F629). Am Pin GP0 wird somit eine Rechteckschwingung der
Frequenz
4MHz / 4 / 256 / 256 / 2 = 7,63 Hz ausgegeben, wenn der interne
Oszillator
mit 4 MHz schwingt. Eine hier angeschlossene gelbe LED flackert und
zeigt die Arbeit des PIC an.
In der Interruptroutine wird der Timer 1 ausgelesen und
anschließend
gelöscht.
Der Timer 1 sollte im Idealfall bis 0x010C (268) gezählt
haben. Der zulässige Bereich (1%) liegt von 0x0109 (265) bis
0x010F
(271).
Ist TMR1H größer als 0x01 oder kleiner als 0x00, dann wird
OSCCAL erhöht oder verringert.
Ist TMR1H=0x01, dann wird zusätzlich TMR1L ausgewertet:
Ist TMR1L größer als 0x0D oder kleiner als 0x0A, dann wird
OSCCAL erhöht oder verringert. Ansonsten wird der aktuelle
OSCCAL-Wert
auf die letzte EEPROM-Zelle 0x7F geschrieben.
Als Bestätigung wird die Erzeugung des Rechtecksignals an GPIO0 gestoppt (GPIO0 = low). GPIO1 geht auf High-Pegel, als Bestätigung für die erfolgreiche Kalibrierung leuchtet die grüne LED auf.
Der PIC wird mit drei Tastern verbunden, die die Pins GPIO0 (Taste
0),
GPIO1 (Taste 1) und GPIO2 (Taste 2) mit Masse (Vss) verbinden
können.
Am Pin GPIO5 wird ein Frequenzmesser
angeschlossen, der im Bereich
von 2 kHz arbeiten kann (normales Multimeter).
Der PIC stellt den OSCCAL-Wert zunächst auf 128 (Mittelwert)
ein.
Falls auf der EEPROM-Zelle mit der Adresse 0x7F ein von 0x00 und 0xFF
verschiedener Wert steht, dann wird dieser in das OSCCAL-Register
geschrieben.
(Schon vorher mit dieser Methode ermittelter Kalibrierwert.)
Der interne Takt des PIC wird ohne Vorteiler vom Timer0 gezählt. Immer wenn der Timer0 überläuft löst er einen Interrupt aus. Die Interruptroutine ändert jedes mal den Pegel des Pins GPIO5 (Pin 2 am 16F629). Am Pin GPIO5 wird somit eine Rechteckschwingung der Frequenz 4MHz / 4 / 256 / 2 = 1953,125 Hz ausgegeben, wenn der Oszillator mit 4 MHz schwingt.
Nach jeweils 256 Interrupts werden die drei Taster abgefragt:
(Bei einem Reset wird der neue OSCCAL-Wert wieder aus dem EEPROM ausgelesen, und der PIC erzeugt die Sollfrequenz.)