Configuration im ASM-File festlegen


zurück zu PIC-Prozessoren , Elektronik , Homepage

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

zurück


Einführung

Was die Konfiguration eines PIC ist, und welche Einstellmöglichkeiten es für sie gibt haben wir schon besprochen. Man muss diese Optionen aber nicht unbedingt erst im Brennprogramm festlegen. Viel bequemer ist es, die Konfiguration schon beim Schreiben des Assembler-Codes festzulegen. Dann wird die Konfiguration automatisch in das HEX-File integriert, und die Brennsoftware kann diese Konfiguration dann aus dem HEX-File übernehmen, und in den PIC brennen. Das vereinfacht die Bedienung des Brennprogramms drastisch.

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.
 

nach oben

Das Config-Wort eines PIC im Detail (16F628)

Ich möchte das am Beispiel des 16F628 erläutern. Das Config-Wort eines 16F628 sieht wie folgt aus:
 
Config eines 16F628 auf Adresse 0x2007
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

CPD - codeprotection des EEPROMs LVP - brennen des PIC mit nur 5V erlauben (low voltage programming) BODEN - automatische Reset bei Spannungszusammenbrüchen (Brown-out Detect) MCLRE - Funktion des Pin4 PWRTE - power up timer deaktivieren WDTE - watch dog timer aktivieren FOSC2, FOSC1, FOSC0 - oszillator-Einstellung
nach oben

Der mühsame Weg

Man kann sich jetzt aus den einzelnen Bits ein 14-Bit langes Steuerwort zusammenbasteln, und es in das ASM-File aufnehmen, indem man dort z.B. folgende Zeile einfügt:
 

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

nach oben

Der elegantere Weg

Das Zusammenbasteln aller Bits von Hand ist ein mühsames Unterfangen, das vor allem dadurch kompliziert wird, dass die einzelnen Bits des Config-Wortes in unterschiedlichen PIC-Typen unterschiedliche Bedeutung haben. Dashalb gibt es vordefinierte Konstanten für jede Config-Option im Include-File für den jeweiligen PIC-Typ.

Am Ende der Datei  16F628.INC findet man  z.B. folgenden Abschnitt:
 
 

;==========================================================================
;
;       Configuration Bits
;
;==========================================================================

_BODEN_ON                    EQU     H'3FFF'
_BODEN_OFF                   EQU     H'3FBF'
_CP_ALL                      EQU     H'03FF'
_CP_75                       EQU     H'17FF'
_CP_50                       EQU     H'2BFF'
_CP_OFF                      EQU     H'3FFF'
_DATA_CP_ON                  EQU     H'3EFF'
_DATA_CP_OFF                 EQU     H'3FFF'
_PWRTE_OFF                   EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_LVP_ON                      EQU     H'3FFF'
_LVP_OFF                     EQU     H'3F7F'
_MCLRE_ON                    EQU     H'3FFF'
_MCLRE_OFF                   EQU     H'3FDF'
_ER_OSC_CLKOUT               EQU     H'3FFF'
_ER_OSC_NOCLKOUT             EQU     H'3FFE'
_INTRC_OSC_CLKOUT            EQU     H'3FFD'
_INTRC_OSC_NOCLKOUT          EQU     H'3FFC'
_EXTCLK_OSC                  EQU     H'3FEF'
_LP_OSC                      EQU     H'3FEC'
_XT_OSC                      EQU     H'3FED'
_HS_OSC                      EQU     H'3FEE'
 

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


nach oben

Der interessante Weg (nur für dsPIC und PIC24)

In der Entwicklungsumgebung MPLAB gibt es einen "Visual Device Initialiser" (Tools -> 2Visual Initializer). Das ist ein Programm, mit dem man im Dialog unterstützt durch eine grafische Benutzerführung festlegt, wie der der PIC beim Start des Programmes initialisiert werden soll. Also welches Port-Pin input oder output ist, und was die Timer tun sollen u.s.w.
Das Tool erstellt dann ein Quelltextfile (in Assembler oder C), das in das Projekt eingebunden wird. Dieses File enthält sowohl Quellcode für die Initialisierung der Hardware, wie auch die Direktiven zur Einstellung der Config. Das ist ein sehr interessanter Ansatz. Der erzeugte Code ist allerdings nicht gerade gut lesbar, und die Initialisierung initialisiert buchstäblich alles, auch Dinge, die nicht unbedingt benötigt werden. Das sind aber nur Schönheitsfehler.
nach oben

zurück zu PIC-Prozessoren , Elektronik , Homepage

Autor: sprut
erstellt: 09.03.2003
letzte Änderung: 05.09.2011