PIC-Prozessoren - Configuration

Einstellungen des Brennprogramms

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.
Diese Seite beschreibt nur die wichtigsten Konfigurationseinstellungen einfacher PICs. Größere PICs haben deutlich mehr Konfigurationsoptionen, das erfordert dann in jedem Fall das Studium des Datenblattes.




Was ist die Konfiguration eines PIC
Welche Taktgeneratoreinstellung soll ich benutzen?
Watchdog
Brown out Reset (z.B. 16F87x)
Power up Timer
ProgMem Write Enable (z.B. 16F87x)
LV-Programming Enable (z.B. 16F87x)
Debug off (z.B. 16F87x)
Wie schütze ich Programme vor dem Auslesen durch dritte?

Wie kann ich diese Einstellungen schon im ASM-File festlegen?
 

zurück


Was ist die Konfiguration eines PIC?

Die Konfiguration eines PIC ist eine Grundeinstellung, die beim Brennen in spezielle Speicherzellen (gelegentlich auch Fuses genannt) gebrannt wird und dann im laufenden Programm nicht mehr verändert werden kann. Mit der Konfiguration wird überwiegend das Verhalten spezieller PIC-Hardware festgelegt.
Normalerweise legt der Programmierer beim Schreiben des Programms die Konfigurationseinstellungen fest, und schreibt diese in den Programmquelltext. Dadurch gelangt die Konfiguration in das HEX-File und wird dann automatisch mit dem Programmcode in den PIC gebrannt. Einige Brennprogramme erlauben die Veränderung/Einstellung der Konfiguration. Bei alter DOS-Software (PP.EXE) erfolgt das durch Kommandozeilenparameter, bei meiner Windowssoftware für Brenner2, Brenner3, Brenner5, Brenner8, Brenner9 durch grafische Auswahlfelder.

Die folgende Tabelle zeigt einige (aber nicht alle) Konfigurationen für PIC-Microcontroller.

Taktgenerator allgemeine Einstellungen Codeprotection
LP Watchdog an oberer Bereich
XT Brown out Reset enable unterer Bereich
HS Power up Timer off oberer + unterer Bereich
RC ProgMem Write Enable Data-EEPROM
ER (PIC16F62x, PIC12F6xx) LV-Programming enable
INTRC (PIC16F62x) Debug off
EC (PIC16F62x) RA5=MCLR(PIC16F62x)
INTOSC (PIC12F6xx) RA6=CLKOUT

nach oben

Welche Taktgeneratoreinstellung soll ich benutzen?   (Details  zur Takterzeugung eines PIC stehen hier)

Ein PIC kann mit einer großen Zahl unterschiedlichster Taktquellen in einem weiten Frequenzbereich betrieben werden. Man kann sich leicht vorstellen, dass es unterschiedlicher Einstellungen der Takterzeugungsschaltung des PIC bedarf, um mit einem RC-Glied, einem Quarz oder einem Keramikresonator einen Takt zu generieren. Auch ist ein 32 kHz Takt mit einem 20 MHz-Takt nicht zu vergleichen. Deshalb gibt es 4 (und oft noch mehr) unterschiedliche Taktgeneratoreinstellungen: LP, XT, HS und RC.
Die Wahl der richtigen Einstellung ist sehr wichtig, denn mit einer falschen Einstellung schwingt der Generator vielleicht nicht und der PIC verweigert die Arbeit. Noch dümmer ist es, wenn der Generator nur manchmal schwingt, was rätselhafte Aussetzer hervorruft.
LP, XT und HS sind für den Betrieb mit Quarzen, Keramikresonatoren oder externen Taktquellen vorgesehen. Diese Betriebsarten unterscheiden sich im Frequenzbereich. Die von mir angegebenen Minimalfrequenzen stellen meist keine technischen Begrenzungen dar, sondern kennzeichnen den sinnvollen Bereich. (Beispiel: Der HS-Mode geht auch bei 1 MHz, aus Gründen des Stromverbrauchs sollte aber der XT-Mode benutzt werden.)


LP - Low Power Crystal (ca. 32 kHz - 200 kHz)
Quarz, Keramikresonator oder externe Taktquelle mit geringer Frequenz.
Diese Einstellung ist für den energiesparenden Betrieb bei niedrigem Takt reserviert.
Diese Betriebsart ist für die 10-MHz-Variante PIC16F84-10 (und schnellere Typen) nicht garantiert.



XT - Crystal / Resonator (ca. 100 kHz - 4 MHz)
Quarz, Keramikresonator oder externe Taktquelle mittlerer Frequenz.
Das ist die Standardeinstellung für die meisten Quarze und Keramikresonatoren. Nur bei sehr hohem Takt (> 4 MHz) sollte man auf HS ausweichen, da dieser zu einem deutlich höheren Stromverbrauch führt.


HS - High Speed Crystal / Resonator (ca. 4 MHz - 20 MHz)
Quarz, Keramikresonator oder externe Taktquelle mit sehr hoher Frequenz.
Diese Einstellung ist bei hohem Takt nötig, sie erhöht aber den Stromverbrauch des PIC. So benötigt z.B. ein 16F84-10 im LP/XT-Mode <2mA, im HS-Mode dagegen 10mA.


RC - Resistor / Capacitor (ca. 30 kHz - 4 MHz)
Das ist die Billiglösung. Anstelle eines Quarzes oder eines Keramikresonators (1,- €) kann man auch einen Widerstand und einen Kondensator verwenden. Je nach verwendeten Bauelementewerten lässt sich ein Takt von einigen 10 kHz bis zu einigen MHz einstellen. Allerdings sollte man keinen genauen oder stabilen Takt erwarten Toleranzen von 25% sind normal. Ich halte das nur für eine Notlösung, insbesondere wenn man die niedrigen Preise für Keramikresonatoren bedenkt.
++VORSICHT++
Im RC-Mode darf der PIC nicht von einer externen Taktquelle (z.B. separater Quarzoszillator) gespeist werden!! Andernfalls kann es zur Zerstörung des PIC kommen!!


 Die folgenden Modes unterstützen nur einige PIC Typen:

ER - External Resistor (z.B. PIC16F62x;  ca. 10 kHz - 8 MHz / 37 kHz)
Eine Billiglösung, die man verwenden kann, wenn es nicht auf Präzision ankommt. Ein Widerstand von RA7 nach Masse stellt die Frequenz eines internen RC-Oszillators ein.
Microchip garantiert den Betrieb mit Widerständen von 38kOhm bis zu 1 MOhm. Empfohlen wird maximal 4MHz.
Mit dem OSCF-Bit im PCON-Register kann auf einen festen 37 kHz-Takt (unabhängig vom Wert des externen Widerstands) umgeschaltet werden.


INTRC - internal RC-Oscillator (z.B. PIC16F62x;   4 MHz / 37 kHz)
Es wird ein interner 4MHz-Oszillator verwendet, der leider nicht sehr stabil ist (3,65 ... 4,28 MHz).
Mit dem OSCF-Bit im PCON-Register kann auf einen festen 37 kHz-Takt umgeschaltet werden.
Beim 16F6xxA nennt sich dieser Mode INTOSC.


EC - External Clock In (ExtClk) (z.B. PIC16F62x, PIC12F6xx;  ca. 0 kHz - 20 MHz)
Wenn ein externer Takt vorhanden ist, kann dieser im EC-Mode dem 16F62x dierekt in Pin OSC1/RA7 eingespeist werden.


INTOSC - internal RC-Oscillator (z.B. PIC12F6xx; PIC16F62xA;   4 MHz / 37 kHz)
Dieser Mode ist eigentlich das gleiche wie INTRC. Der interne 4MHz-Oszillator der 12F6xx-PICs läuft aber stabiler. Erreicht wird das
durch einen exemplarabhängigen Korrekturwert, den man per Software in ein spezielles Register schreiben kann. Der Korrekturwert wird beim Hersteller für
jeden einzelnen PIC ausgemessen und in die letzte Speicherzelle des Programmspeichers geschrieben. Damit beträgt die Frequenz 3,92 ... 4,08 MHz (Vdd = 5V).
nach oben


Der Watchdog (alle PICs)

Auch ein PIC kann abstürzen. Damit das ohne schlimme Folgen bleibt, löst der Watchdog in so einem Fall automatisch ein Reset des PIC aus.

Der Watchdog ist ein kleiner Timer im PIC, der einen eigenen internen RC-Taktgeber besitzt, und somit von der Funktion des PIC unabhängig ist. Dieser Watchdogtimer (WDT) löst, wenn er eingeschaltet ist, alle 18 ms (Toleranzbereich: 7 ms ... 33 ms) ein Reset des PIC aus. Der Reset kann nur verhindert werden, wenn das im PIC laufende Programm den WDT immer wieder zurücksetzt, bevor er einen Reset auslösen kann. Dieses Rücksetzen erfolgt mit dem Befehl clrwdt (oder sleep).

Das ordnungsgemäß laufende Programm muss also so programmiert werden, dass in kurzen Abständen (z.B. alle 5 ms) der Befehl clrwdt ausgeführt wird, dann kommt der WDT nicht dazu ein Reset auszulösen. Stürzt das Programm aber ab, wird der WDT nicht mehr gelöscht und startet den PIC neu.

Falls 18 ms zu kurz sind, kann man den Vorteiler des TIMER0 benutzen und so einen WDT-Zyklus von bis zu 2,3 s einstellen. Dann steht der Vorteiler aber dem TIMER0 nicht mehr zur Verfügung.

Ohne besondere Notwendigkeit sollte man den WDT nicht verwenden, da er die Programmentwicklung kompliziert.
nach oben

Brown out Reset (viele PIC-Typen)

Ein kurzer Aussetzer in der Betriebsspannung des PIC kann zum Absturz oder zum Weiterarbeiten mit verfälschten Werten führen. Die "Brown out Reset-Option" überwacht die Betriebsspannung. Falls die Betriebsspannung für 0,1 ms oder länger unter 4 V fällt, wird sofort ein Reset ausgelöst. Ist die Betriebsspannung wieder im sicheren Bereich wartet der PIC noch 72 ms und startet dann neu.

++ACHTUNG++
Wer beabsichtigt, seinen PIC mit einer Betriebsspannung von 4V oder daruinter zu betreiben, darf diese Funktion natürlich nicht aktivieren.
Die Aktivieruing von Brown-out-Reset aktiviert immer auch den Power-up-Timer.

++HINWEIS++
Bei PICs der PIC18F-Familie lässt sich die Spannungsschwelle für Brown-out-Reset von 2V bis 4,5V einstellen.
nach oben


Der Power up Timer (alle PICs)

Normalerweise beginnt der PIC beim Zuschalten der Betriebsspannung sofort mit der Abarbeitung seines Programms. Manchmal benötigen andere Teile der elektronischen Schaltung, in die der PIC eingebaut ist, aber etwas Zeit, um ihren Anfangszustand einzunehmen. Deshalb kann der PIC auf Wunsch seine Arbeit mit einer festen Verzögerung von ca. 72 ms nach dem Einschalten der Betriebsspannung aufnehmen.

Diese Option zu aktivieren kann eigentlich nie schaden, aber oft die Stabilität des Systems erhöhen.
nach oben


ProgMem Write Enable (nur einige PIC-Typen, z.B. 16F87x)

Im 16F87x können Programme nicht nur auf den Datenspeicher und den Daten-EEPROM sondern auch auf den Programm-Speicher zugreifen. Programmcode kann gelesen und geschrieben werden. Man wird das weniger für die Entwicklung selbstmodifizierenden Codes als vielmehr zum Ablegen großer Datenblöcke benutzen. (Der Hersteller garantiert nur 1000 Schreibzyklen für den Programmspeicher aber 100 000 für den Daten-EEPROM.)

Das Lesen des Programmspeichers ist immer möglich, schreiben kann man aber nur in Speicherbereiche die nicht codeprotected sind.

Die Option "ProgMem Write Enable" muss zusätzlich aktiviert werden, um das Schreiben in den Programmspeicher zu erlauben, ansonsten ist nur das Lesen möglich.
nach oben


LV-Programming Enable (nur einige PIC-Typen, z.B. 16F87x)

Alle herkömmlichen PICs benötigen zum Brennen eine 12-V-Spannung am MCLR-Eingang. Die modernen PIC16F876/873 lassen sich alternativ auch mit nur 5 V (LV = für low voltage) programmieren. Das vereinfacht in der Großproduktion die Umprogrammierung in fertigen Geräten.

Beim Einsatz der 5-V-Programmierung wird allerdings ein IO-Pin (das PGM-Pin ist meist RB3; PortB Bit 3) für die Programmierfunktion blockiert, und steht dann nicht mehr für andere I/O-Funktionen zur Verfügung. Im normalen Betrieb muss das PGM-Pin dann extern auf Masse gezogen werden oder der PIC arbeitet nicht oder nur "stotternd".

Wenn man auf das LV-Programming verzichtet, hat man also ein I/O-Pin mehr zur Verfügung. Deshalb, und weil meine Brenner LV-Programming generell nicht unterstützt, sollte man die Option "LV-Programming Enable" normalerweise nicht auswählen.

Bei einigen PIC-Typen lässt sich das MCLR-Pin zum normalen I/O-Pin umkonfigurieren. Wird das getan, und gleichzeitig LV-Programming erlaubt, kann es massive Probleme beim nächsten Brennen geben. Es ist dann nötig, das PGM-Pin (meist RB3) vor dem Brennen auf Vss (low) zu legen.
nach oben


Debug Off (nur einige PIC-Typen, z.B. 16F87x)

Die PIC16F87x-Familie unterstützt einen Debug-Mode, bei dem das Programm des schon in die Schaltung eingesetzten PICs debugt wird. Dazu benötigt man ein In-Circuit-Debuger-Modul (z.B. den ICD2), das man bei Microchip erwerben kann. An dieses Modul wird der Pic über das ICSP-Kabel angeschlossen (In Circuit Serial Programming) und dann vom MPLAB-Programm aus debugt.

Normalerweise wird man diesen Mode nicht nutzen, schon deshalb nicht, weil man das dazu benötigte In-Circuit-Debuger-Modul nicht besitzt. Da der Debug-Mode die beiden Pins RB6 und RB7 blockiert, sollte man normalerweise Debug OFF wählen.
nach oben


RA5=MCLR (nur einige PIC-Typen, z.B.  16F62x)

Ber 16F62x vereinigt viele Funktionen in einem kleinen Gehäuse. Da heist es, mit den Pins sparsam umzugehen.
In vielen Schaltungen wird das RESET-Pin (MCLR) gar nicht benötigt. Beim Einschalten wird der PIC durch das Power-on-Reset in den Anfangszustand gesetzt, falls ein Absturz auftritt, kann der Watchdog den PIC wieder zum Leben erwecken. Deshalb kann man das MCLR-Pin wahlweise auch als zusätzliches IO-Pin mit der Bezeichnung RA5 nutzen. Ob man nun lieber ein Reset-Pin oder ein IO-Pin hätte, entscheidet man durch setzen dieser Option.

Achtung:
Falls gleichzeitig der interne Oszillator benutzt werden soll, droht die INTOSC&MCLR-Falle.
nach oben


RA6=CLKOUT (nur einige PIC-Typen, z.B.  16F62x)

Ber 16F62x vereinigt viele Funktionen in einem kleinen Gehäuse. Da heist es, mit den Pins sparsam umzugehen.
Der Ausgang des Taktgenerators wird nur benötigt, wenn man einen Quarz, Keramikresonator oder RC-Glied verwendet. Benutzt man dagegen den internen RC-Generator oder den ER-Mode (externer Widerstand), dann ist der Taktausgang meistens überflüssig. Dann ist es möglich, aus dem CLKOUT-Pin ein zusätzliches IO-Pin mit der Bezeichnung RA6 zu machen.
Ob man nun lieber ein CLKOUT-Pin oder ein IO-Pin hätte, entscheidet man durch setzen dieser Option.
nach oben

Was ist Codeprotection

Schutz des Programmspeichers
So wie sich ein Programm in einen PIC hineinschreiben lässt, so kann man es auch wieder auslesen. Das ist manchmal unerwünscht, z.B. wenn man viel Zeit und Nerven in die Entwicklung eines guten Programms investiert hat und nun befürchtet, jemand anders könnte das Programm nun einfach klauen.
Deshalb kann man den Programmspeicher eines PIC vor dem Wiederauslesen schützen.
Bei den großen PIC16F876/873 ist der Programmspeicher jeweils in Teile aufgeteilt, für die sich der Leseschutz getrennt aktivieren lässt. Beim kleinen PICs (wie dem PIC16F84) schützt man immer den gesamten Programmspeicher.

 
geschützte Bereiche PIC16F84 PIC16F873 PIC16F876 PIC16F627 PIC16F628
oberer Bereich nicht möglich 0F00h - 0FFFh 1F00h - 1FFFh keine Wirkung 0400h - 07FFh
unterer Bereich nicht möglich 0800h - 0FFFh 1000h - 1FFFh 0200h - 03FFh 0200h - 07FFh
oberer + unterer Bereich 0000h - 3FFFh 0000h - 0FFFh 0000h - 1FFFh 0000h - 03FFh 0000h - 07FFh

Ein Leseschutz lässt sich mit einem Brennprogramm wieder aufheben, allerdings löscht man dabei sinnvollerweise automatisch den gesamten Programmspeicher. Die Sicherheit des schützenswerten Programms ist also gewährleistet. Während der Programmentwicklung rate ich von Codeprotection ab, da das immer nötige Gesamtlöschen beim Neuprogrammieren den Flash-Speicher des PIC unnötig belastet. Ob jemend sein fertiges Programm schützen will, wenn er programmierte PICs an andere weitergibt, ist seine persönliche Entscheidung.

++Anmerkung++
Auch wenn der Programmspeicher codeprotected ist, lassen sich die ID und die Config weiterhin lesen und beschreiben. Lediglich die Codeprotection(CP)-Bits in der Config sind nicht löschbar.
Ist im 16F87x ein Programmspeicherbereich geschützt, so kann das im PIC laufende Programm diesen Bereich zwar noch lesen,aber nicht mehr beschreiben.

++Anmerkung++
Flash und EEPROM mit Codeprotection lässt sich zwar nicht mehr von außen (via ICSP) auslesen, aber ein im PIC liegendes Programm kann sehr wohl auf geschützten Speicher lesend (nicht aber schreibend) zugreifen. Falls z.B. beim 16F876 nur ein Teil des Programmspeichers geschützt ist, dann ist der untere Teil des Flash (mindestens 0000h-0FFFh) ungeschützt. Hierhin lässt sich nun ein kleines Programm brennen, das den geschützten Bereich ausliest, und via RS232 an einen PC überträgt. (Ausprobiert habe ich das allerdings nicht.)
Wenn man schon CP benutzen will, dann sollte man unbedingt auch den unteren Teil des Flash schützen!


Schutz des Daten-EEPROMs (nur einige PIC-Typen, z.B. 16F87x)
Im PIC gibt es einen EEPROM-Bereich für Daten auf die das Programm des PIC zugreifen kann. Hier lassen sich z.B. Kalibrierwerte oder der letzte Gerätezustand vor dem Ausschalten speichern.
Dieser Bereich kann beim Brennen des PIC, aber normalerweise auch vom PIC-Programm beschrieben werden. Das Schreiben des PIC-Programms in den Daten-EEPROM kann mit dieser Option aber verboten werden.
nach oben


zurück zu PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
letzte Änderung: 19.01.2010