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?
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).
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.
++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.
Diese Option zu aktivieren kann eigentlich nie schaden, aber oft die Stabilität des Systems erhöhen.
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.
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.
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.
Achtung:
Falls gleichzeitig der interne Oszillator
benutzt werden soll, droht die INTOSC&MCLR-Falle.
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.
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.