Hallo, Daniel.
Mehr oder weniger interessant in diesem Zusammenhang sind folgende Teile der von dir verlinkten Doku:
Kapitel 4.1, Seite 15
Kapitel 4.6, Seite 24
Kapitel 7.2.5, Seite 44
Kapitel 10, Table 10-4, Seite 75
Keine Angaben zur quantitativen Wirkung eines OSCCAL-Inkrements. Aber zum Glück habe ich falsch getippt: Es sind ja nur sieben Bit !
Der reale Resetvektor des PIC12F508 ist die letzte Programmadresse. Dort steht ab Werk der niemals geschützte (Zitat: "uncode protected", vermutlich kein Oxford-Englisch) Kalibrierwert, verpackt als MOVLW XX-Befehl. Nach dessen Ausführung beim Reset landet die Programmausführung durch Überlauf des Program Counters bei 0x0000.
Den so in W geladenen Wert kann man ignorieren und den effektiven Resetvektor als 0x0000 annehmen.
Andernfalls kann man den durch das MOVLW XX ins Working Register W geladenen Wert in das Register OSCCAL schreiben und so die Werkskalibrierung erst zur Wirkung bringen.
Beim nächsten frischen Controller dieser (Eigen-)Art solltest du also VOR dem ersten Programmieren/Löschen den Programmspeicher auslesen und den fälligen MOVLW XX -Befehl durch disassemblieren ermitteln oder aber als Zahlenwert auslesen und anhand des Befehlssatzes den Kalibrierwert rekonstruieren.
Das Implantieren des Kalibrierwertes geschieht im Assemblercode durch
ORG 0x0000 ; Absolut-Positionierung von Code, hier: der effektive Resetvektor
MOVWF OSCCAL ; Kalibrierwert zur Wirkung bringen
... <more individual code >
ORG 0x03FF ; Absolut-Positionierung von Code:
; an diese Adresse schreibt der Assembler den/die nachfolgenden Befehl(e)
; das muss die letzte Code-Speicherzelle und somit der tatsächliche processor reset vector sein
MOVLW dein_kalibrierwert
END ; directive 'end of program'
Ich habe in PIC16F876-Assembler geschrieben; evtl. muss das angepasst werden. Das Prinzip ist hoffentlich erkennbar.
Alles klar? Sonst frag nochmal nach.
Gruß
Christian.
Lesezeichen