Kalibrierung des RC-Oszillators

beim PIC12F629/675 PIC16F630/676


zurück zu Projekte , PIC-Prozessoren , Elektronik , Homepage


Allgemeines

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 :-)



Verfahren

Es gibt prinzipiell zwei Kalibriermethoden.

  1. Dem PIC wird über einen Eingang eine stabile Referenzfrequenz eingespeist. Der PIC vergleicht diese mit der internen Oszillatorfrequenz und verstimmt den Oszillator solange, bis er 4 MHz erzeugt.
  2. Der PIC gibt einen aus der Oszillatorfrequenz abgeleitete Frequenz aus, die man mit einem Frequenzmesser misst. Über Taster weist man den PIC an, seinen Oszillator zu höheren oder niedrigeren Frequenzen zu verstimmen.
Die 1. Variante ist eleganter, erfordert aber einen stabilen Frequenzgenerator. Alternativ kann man einen Quarzoszillator benutzen, oder einen Uhrenquarz mit 2 Kondensatoren an den Timer1 anschließen.

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..



Methode Nr. 1 - automatische Selbstkalibrierung
Man brennt zunächst die unten verlinkte Kalibriersoftware 'Methode 1' in den PIC.

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.



Methode Nr. 2 - manuelle Kalibrierung
Man brennt zunächst die unten verlinkte Kalibriersoftware 'Methode 2' in den PIC.

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:

Die Frequenz an GPIO5 überwacht man mit einem Frequenzmesser, und drückt (je nach Messergebnis ) die  Tasten 0 oder Taste 1 so oft, bis die gemessene Frequenz im Bereich von 1,94 kHz .. 1,97 kHz liegt.
Nun drückt man die Taste 2, woraufhin der aktuelle OSCCAL im EEPROM (Adresse 0x7F) gespeichert wird, und das Signal an GPIO5 zur Bestätigung abgeschaltet wird.

(Bei einem Reset wird der neue OSCCAL-Wert wieder aus dem EEPROM ausgelesen, und der PIC erzeugt die Sollfrequenz.)


Download
Hier liegt



zurück zu Projekte , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 16.07.2004
letzte Änderung: 05.09.2011