Beim Brennen eines Programms in einen PIC müssen eine Reihe von Optionen ausgewählt werden, die auf die spätere Funktion des PIC einen großen Einfluss haben.
Einführung
Das
Config-Wort
eines PIC im Detail (16F628)
Der
mühsame
Weg
Der
elegantere
Weg
Der
interessante Weg
In den meisten PICs der Serien PIC16F..
und PIC12F.. ist die Konfiguration ein 14-Bit langes Datenwort, das auf
die Adresse 2007h im PIC gebrannt wird. Jedes Bit in diesem Wort hat
eine
bestimmt Bedeutung, z.B. ist ein Bit dafür zuständig, ob der
WDT ein oder ausgeschaltet ist.
Leider ist die Belegung der 14 Config-Bits
nicht in allen PICs gleich, wie ja auch nicht alle PICs die gleichen
Config-Optionen
haben. Deshalb sind in den zu den jeweiligen PICs gehörigen
Include-Files Konstanten festgelegt, mit denen sich relativ einfach
eine
für den jeweiligen PIC stimmende Config zusammenbasteln
lässt.
Bit | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Name: | CP1 | CP0 | CP1 | CP0 | - | CPD | LVP | BODEN | MCLRE | FOSC2 | PWRTE | WDTE | FOSC1 | FOSC0 |
Wir sehen, dass das Bit 9 keine Funktion hat.
Alle Bits, deren Namen mit 'CP'
anfangen
steuern die Codeprotection-Funktion des PIC.
Die Bits CP0 und CP1 sind wirklich doppelt
vorhanden und müssen jeweis gleich beschrieben werden.
CP1, CP0 - codeprotection des Programmspeichers
; Configuration festlegen __CONFIG B'11110100100000 ' |
Durch den Pseudobefehl '__CONFIG' erkennt der Assembler, dass er dieses Datenwort als Config in das HEX-File aufnehmen soll, und es wird später automatisch in den PIC gebrannt.
Wenn man sich die Bits in diesem
Beispiel
einmal anschaut, dann erkennt man z.B., dass alle codeprotection-Bits
auf
1 stehen. Folglich ist codeprotection für den Programmspeicher,
wie
auch für den EEPROM abgeschaltet.
Alle FOSC-Bits stehen auf 0, was bedeutet
(wenn ich es auch oben nicht explizit aufgelistet habe) dass der
Oszillator
im LP-Mode arbeiten soll.
Am Ende der Datei 16F628.INC
findet
man z.B. folgenden Abschnitt:
;========================================================================== ; ; Configuration Bits ; ;========================================================================== _BODEN_ON
EQU
H'3FFF' |
Diese vordefinierten Werte lassen sich
mit der &-Funktion (logisches UND) zu jedem benötigten
Config-Word
kombinieren. Wenn man z.B. den LP-Oszillator-Mode (_LP_OSC), keinen
Watchdog-Timer
(_WDT_OFF) und kein Bwown-out-detect (_BODEN_OFF) haben möchte, so
schreibt man im ASM-File:
; Configuration festlegen __CONFIG _LP_OSC & _WDT_OFF & _BODEN_OFF |
Die logische UND-Verknüpfung der
drei
Werte ergibt den Wert 3FECh & 3FFBh & 3FBFh = 3FA8h =
B'11111110101000'.
Das ist genau das Config-Wort, das in
diesem Fall benötigt wird.
Alle nicht berücksichtigten Config-Bits bleiben auf 1. So ist z.B. der Power-up-timer abgeschaltet worden, und codeprotection is Off. Man muss also schon noch darüber nachdenken, ob man damit leben kann, das alle nicht explizit gesetzten Optionsbits auf 1 stehen.
Wie auch immer, mit diesem Verfahren
ist
die Config-Einstellung recht einfach, und wenn man ein Projekt auf
einen
anderen Prozessor umstellt, und das für den neuen Typ nötige
Include-File benutzt, passt sich die Config automatisch an die
Gegebenheiten
des neuen PIC an.
Einige PICs (z.B.
PIC16F886) haben mehrere Konfigurationsworte, auf die sich die
einzelnen Optionen verteilen. In diesem Fall muss dem Assembler
mitgeteilt werden, wie diese Worte aussehen sollen. Im folgenden ein
Beispiel für den PIC16F886, der die Konmfigurationsworte _CONFIG1
und _CONFIG2 hat:
; Configuration festlegen __CONFIG _CONFIG1, _PWRTE_ON & _WDT_OFF & _HS_OSC & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF __CONFIG _CONFIG2, _WRT_OFF & _BOR40V |