Kalibrierung des RC-Oszillators und der Bandgap-Referenzspannungsquelle

Kalibrierung des RC-Oszillators

Die internen Oszillatoren haben eine relativ große Toleranz für die Frequenz und damit auch für den daraus resultierenden Takt. Wenn der PIC mit anderen Komponenten Takt-genau kommunizieren muss, dann führt diese große Toleranz zu Kommunikationsproblemen. Einige PICs haben deshalb einen Kalibrierwert (OSCCAL) für den internen Oszillator, der diese Toleranz verringert. Dieser OSCCAL-Wert  wird während des Fertigungsprozess von Microchip bestimmt und in die letzte Speicherstelle des Programm-Speichers einprogrammiert. 

USBurnCPP liest diesen Wert vor einem Programmieren oder Löschen aus und kopiert diesen nach dem Programmieren oder Löschen wieder in den Programmspeicher zurück. Sollte dieser jedoch verloren gehen, oder möchte man diesen Wert bewusst verändern, dann kann man den OSCCAL-Wert mit der Option -L mit dem gewünschten Wert ersetzen. Dieses Setzen kann auch vorteilhaft sein, wenn man den PIC dauerhaft bei ungewöhnlichen Temperaturen oder mit kleinen Betriebsspannungen betreibt, da dann die Werkskalibrierung nicht unbedingt die gewünschten 4 MHz ergibt. Wer als Bastler einen OSCCAL-Chip öfter mal mit einem neuen Projekt brennt, tut gut daran, den individuellen OSCCAL-Wert des Chips auf dessen Unterseite mit spitzem Bleistift zu notieren.

PIC-Prozessoren, wie z.B. PIC12F519, wie auch andere PIC-Prozessoren mit 12-Bit Befehlsbreite, haben diesen OSCCAL-Wert in Form eines MOVLW xx abgelegt, wobei xx den OSCCAL-Wert darstellt. Bei einem Reset des PICs wird der Programm-Counter (PC) auf diese letzte Adresse (Reset-Vektor) und im nächsten Takt auf 000 gesetzt. In der Folge befindet sich im W-Register jetzt der OSCCAL-Wert. Dem Anwender ist es überlassen, diesen Wert dann in das OSCCAL-Register zu speichern (oder, wenn nicht benötigt) zu verwerfen. 

PIC-Prozessoren, wie z.B. PIC12F629/675, wie auch andere PIC-Prozessoren mit 14-Bit Befehlsbreite, haben diesen OSCCAL-Wert in Form eines RETLW xx abgelegt, wobei xx den OSCCAL-Wert darstellt. Auch hier ist es dem Anwender übelassen, diesen Wert in das OSCCAL-Register zu speichern oder zu verwerfen.

        BSF      RP0               ;Bank 1
CALL 0x3FF         ;Get the cal value
MOVWF OSCCAL  ;Calibrate
BCF RP0 ;Bank 0

 

Kalibrierung der Bandgap-Referenzspannungsquelle

Was ist der Bandgap-Wert und was hat das mit einer Brown-out-Detection zu tun?

Falls die Betriebsspannung des PIC unter einen kritischen Wert fällt, ist die Funktion des PIC nicht mehr gesichert, und der PIC kann seine Arbeit einstellen. Als Gegenmaßnahmen gibt es die Brown-out-Detection, die in einem solchen Fall einen Reset für den PIC auslöst. Genaugenommen wird beim Unterschreiten einer Spannung von 2 Volt intern im PIC der Reset-Taster heruntergedrückt. Damit ist der PIC gestoppt. Gleichzeitig wird das Bit 0 im PCON-Register auf 0 gesetzt. Überschreitet die Betriebsspannung wieder die 2 Volt Grenze, dann wird der interne Resettaster mit 72 ms Verzögerung wieder losgelassen, und  der PIC fängt an, sein Programm von Anfang an abzuarbeiten. Die Software kann das Bit 0 im PCON-Register prüfen, und im Falle eines Brown-out-Resets anders arbeiten, als im Falle eines Power-on-Resets. Diese Brown-out-Detection-Funktion muss in der Config aktiviert sein und heißt dort BOD bzw. BODEN.

Wenn man den PIC mit einer niedrigen Betriebsspannung (nahe 2 Volt) betreibt, dann kann BOD sehr hinderlich sein, da schon kleine Spannungsschwankungen ein Reset auslösen würden. Es stellt sich damit auch die Frage nach der Genauigkeit der BOD-Schaltschwelle. Falls einem PIC durch Exemplarstreuung die BOD-Schwelle bei 2,2 Volt liegen sollte, dann kann der PIC mit 2,0 Volt Betriebsspannung nicht mehr funktionieren. Liegt die Schwelle aber unter 1,5 Volt, so kann es schon zu Datenverlust im Speicher gekommen sein, und der PIC könnte falsch arbeiten, was oft schlimmer ist als ein PIC der kontrolliert stoppt. Die BOD-Spannung sollte also möglichst dicht an 2,0 Volt liegen. Damit besteht ein Kalibrierungsbedarf. Die Bandgap-Referenzschwelle des PIC stellt die genaue Höhe der BOD-Schwelle ein. Dafür spricht auch, das bei den PICs mit Bandgap-Einstellung der Hersteller eine BOD-Spannung von 2.0 Volt angibt. Bei Typen ohne Bandgap wird dagegen immer ein Spannungstoleranzbereich (z.B. 3,65 .. 4,35 Volt beim PIC16F876A) angegeben. 

sprut hat einmal die Wirkung verschiedener Bandgap-Einstellungen bei einem PIC12F629 getestet. Das Ergebnis steht in der nachfolgenden Tabelle.  Andere PICs werden natürlich ganz andere Spannungswerte aufweisen. 

Bandgap-Wert PIC schaltet ab
bei Unterschreitung von
PIC schaltet wieder ein
bei Überschreitung von
0 2,03 Volt 2,08 Volt
1 2,14 Volt 2,18 Volt
2 2,20 Volt 2,23 Volt
3 2,24 Volt 2,28 Volt

 

 

Auslesen des OSCCAL- und des Bandgap-Wertes

Vor dem Programmieren oder Löschen eines PICs wird der OSCCAL und der Bandgap-Wert aus dem PIC gelesen, um diesen wieder in den PIC zu speichern. Daher muss man sich um beide Werte eigentlich nicht kümmern. USBurnCPP gibt beide Werte aus, die man sich zur Sicherheit notieren sollte. Sollte etwas schief gehen, dann kann man diese zuvor notierten Werte wieder in den PIC (mittels der Schalter --OSCCAL bzw. --BANDGAP) programmieren.

Beispiel einer Ausgabe beim Blankcheck eines unprogrammierten PIC12F675:
$ USBurnCPP -S8 -b 
USBurnCPP Version 1.0 (30th May 2026) by Karsten based on sprut
option -b : check, if PIC is blank
option -S : change socket (SOCKET::SOC_8_14_20)
668 PICs loaded from Database (Version 32) from 30/05/2026
Sprut-Brenner Brenner 8 (Firmware-Version: 17) was found!
Check firmware... (check sum=0xad24) ...ok
Calibration data loaded!
PIC with (id=4032) inserted in the programmer found in the database (PIC name: PIC12F675)!
Processor 'PIC12F675'  with Vpp = 13V -- Chip-ID: 4032 -- Revision 11 was selected.  
## read band gap value as stored in configuration memory... Important: band gap value: 2 (10) in PIC! Please note this device specific calibration value! ( Configuration word: 00100001 11111111 )
## check, if OSCCAL value was stored in program memory...  Important: OSCCAL: '0x30' in PIC was found! Please note this device specific calibration value! ( OpCode: retlw 30h )
PIC 'PIC12F675' is empty.
$
Beispiel einer Ausgabe beim Programmieren eines PIC12F675:

Hier wurde ein Hexfile verwendet, welches auf der letzten Programmspeicheradresse einen OSCCAL-Wert (fürs Debugging) enthielt. Der Hinweis "The last address in the program memory is overwritten with the OSCCAL value previously saved from the PIC! Check your program code!" zeigt nun an, dass dieser Wert aus der Hex-Datei mit dem zuvor ausgelesenen (Hersteller-spezifischen) Wert überschrieben wurde. 

$ USBurnCPP -S8 -W PIC12F675.hex  
USBurnCPP Version 1.0 (30th May 2026) by Karsten based on sprut
option -S : change socket (SOCKET::SOC_8_14_20)
option -W : program HEX-file 'PIC12F675.hex' into PIC
668 PICs loaded from Database (Version 32) from 30/05/2026
Sprut-Brenner Brenner 8 (Firmware-Version: 17) was found!
Check firmware... (check sum=0xad24) ...ok
Calibration data loaded!
PIC with (id=4032) inserted in the programmer found in the database (PIC name: PIC12F675)!
Processor 'PIC12F675'  with Vpp = 13V -- Chip-ID: 4032 -- Revision 11 was selected.  
## read band gap value as stored in configuration memory... Important: band gap value: 2 (10) in PIC! Please note this device specific calibration value! ( Configuration word: 00100001 11111111 )
## check, if OSCCAL value was stored in program memory...  Important: OSCCAL: '0x30' in PIC was found! Please note this device specific calibration value! ( OpCode: retlw 30h )
program PIC ...  
>> programming program memory...    The last address in the program memory is overwritten with the OSCCAL value previously saved from the PIC! Check your program code!     programming done
>> programming UserIDs...      programming done
>> programming EEPROM...      programming done
>> program memory: OK
>> UserIDs: OK
>> EEPROM: OK
>> programming configuration memory...   done!
>> configuration: OK
programming completed - PIC: OK
$
Beispiel einer Ausgabe beim Blankcheck eines programmierten PIC12F675:
$ USBurnCPP -S8 -b 
USBurnCPP Version 1.0 (30th May 2026) by Karsten based on sprut
option -b : check, if PIC is blank
option -S : change socket (SOCKET::SOC_8_14_20)
668 PICs loaded from Database (Version 32) from 30/05/2026
Sprut-Brenner Brenner 8 (Firmware-Version: 17) was found!
Check firmware... (check sum=0xad24) ...ok
Calibration data loaded!
PIC with (id=4032) inserted in the programmer found in the database (PIC name: PIC12F675)!
Processor 'PIC12F675'  with Vpp = 13V -- Chip-ID: 4032 -- Revision 11 was selected.  
## read band gap value as stored in configuration memory... Important: band gap value: 2 (10) in PIC! Please note this device specific calibration value! ( Configuration word: 00100001 10010100 )
## check, if OSCCAL value was stored in program memory...  Important: OSCCAL: '0x30' in PIC was found! Please note this device specific calibration value! ( OpCode: retlw 30h )
PIC 'PIC12F675' is not empty.
$