01 Einführung

Transcrição

01 Einführung
1.Einführung
1.1 Übersicht
Der Pic 16F84 ist ein Mikrocontroller, der eine CPU, Speicher und I/O-Ports auf einem Chip vereint.
Die CPU ist in Risc-Architektur aufgebaut und kennt 35 Befehle.
Features:
•
13 Ein- /Ausgänge (I/Os)
•
einen integrierten 8-Bit Timer \Zähler mit einstellbarem Teiler
•
Verschiedene Interrupts: Timerüberlauf, Extern, PortB change
•
einen RAM mit 68 Byte freier Kapazität
•
ein Daten-EEPROM mit 64 Bytes Speicher
•
Programmspeicher mit 1024 Worten (bis zu 10.000 mal beschreibbar)
•
Taktfrequenz bis 5MHz
•
Betriebsspannung: 2- 6V
•
Niedrige Stromaufnahme - da CMOS-Technologie
•
Einfache Programmierung direkt in der fertigen Schaltung (fast keine zusätzliche Hardware nötig)
Empfohlene Literatur:
PIC16F84A.pdf
Mid-Range_MCU_Family_Reference_Manual.pdf
1.2 Pin-Belegung
RA0 - RA4
I/O Port A ( ! RA4 ist open-collector ! )
RB0 - RB7
I/O Port B
RB0/INT
External interupt input
T0CKI
Timer0 external clock input
MCLR
Master clear (reset)
OSC1
Oscillator input
OSC2
Oscillator output
Vdd
Power supply
Vss
Ground
1-1
1.3 Blockschaltbild
13
Program Counter
Data Bus
8
EEPROM Data Memory
FLASH
Program
Memory
8 Level Stack
(13-bit)
1K x 14
Program
Bus
14
RAM
File Registers
EEDATA
68 x 8
7
RAM Addr
EEPROM
Data Memory
64 x 8
EEADR
Addr Mux
Instruction Register
7
Direct Addr
5
TMR0
Indirect
Addr
FSR reg
RA4/T0CKI
STATUS reg
8
MUX
Power-up
Timer
Instruction
Decode &
Control
Timing
Generation
Oscillator
Start-up Timer
8
ALU
Power-on
Reset
Watchdog
Timer
I/O Ports
RA3:RA0
W reg
RB7:RB1
RB0/INT
OSC2/CLKOUT
OSC1/CLKIN
MCLR
VDD , VSS
Die PIC Prozessoren besitzen eine Harvard-Architektur, das bedeutet dass Programm- und Datenspeicher
getrennt sind:
Es gibt einen Flash-Program-Memory in den das Programm des Prozessors geladen wird (man spricht hier
vom „Flashen“). Dieser Flash kann bis zu 1024 Befehle speichern; sie bleiben auch nach dem Entfernen der
Betriebsspannung gespeichert.
Im RAM stehen 88 jeweils ein Byte breite Register zur Verfügung. Ein Teil davon (die SFR Special Function
Register) wird verwendet um die Ein- und Ausgänge, dem Timer0, Interrups und andere on-chip Funktionen
einzustellen. Die restlichen Register (68 Stück) sind vom Anwender frei verwendbar, in ihnen lassen sich also
Variablen und Flaggen abspeichern (GPR = General Purpose Register).
Des weiteren verfügt der PIC über einen EEPROM, in dem Werte nicht-flüchtig abgespeichert werden
können. Das heisst die Daten bleiben - im Gegensatz zu den im RAM gespeicherten – auch nach dem
Entfernen der Betriebsspannung erhalten.
1-2
1-3
RP0 = 1 : Bank 1
RP0 = 0 : Bank 0
Der Datenspeicher ist in zwei Bänke aufgeteilt. Die Umschaltung zwischen den Bänken erfolgt durch Bit 5 (RP0) im STATUS -Register:
Note 1: Not a physical register.
Unimplemented data memory location, read as ’0’.
FFh
7Fh
Bank 1
Mapped
(accesses)
in Bank 0
8Ch
8Bh
8Ah
86h
85h
84h
83h
82h
CFh
D0h
Bank 0
68
General
Purpose
Registers
(SRAM)
INTCON
PCLATH
TRISA
FSR
STATUS
4Fh
50h
0Ch
INTCON
EEDATA
0Bh
89h
EECON2(1)
—
07h
08h
EEADR
PORTB
06h
PCLATH
EECON1
PORTA
05h
09h
—
FSR
04h
0Ah
87h
88h
TRISB
STATUS
03h
PCL
81h
PCL
OPTION_REG
TMR0
02h
File Address
80h
01h
Indirect addr. (1)
Indirect addr. (1)
00h
File Address
1.4 Register
1.5 Befehlssatz
Parameter
Beschreibung
f (file)
Ein Register
d (destination)
Ergebnis speichern in
d=0 → w (working register)
d=1 → f (file, ein Register)
k
Konstante
b (bit)
Position eines einzelnen Bits innerhalb eines Registers
1-4
1.6 Ein-/Ausgänge
Der PIC16F84A besitzt insgesamt 13 I/O Ports: PORTA (5 Bit) und PORTB (8 Bit) welche über die
Register PORTA und PORTB angesteuert bzw. ausgelesen werden können. Sie können über die TRISRegister (TRISA, TRISB) individuell als Ein- bzw. Ausgänge geschaltet werden.
Wichtig: PORTA,4 ist ein open-collector Ausgang.
1.7 Timer
Der Timer0 (TMR0) ist wahlweise ein vom Prozessortakt abhängiger 8-Bit Timer oder ein Zähler. Dies kann
im Option-Register durch Bit 5 (T0CS) festgelegt werden; Man schaltet damit eigentlich nur die Taktquelle
des Zählers um.
T0CS gelöscht: Zähler incrementiert mit Prozessortakt
T0CS gesetzt: Zähler zählt Impulse an RA4
Das TMR0-Register, in dem gezählt wird, kann beschrieben und gelesen werden.
Zur Verringerung der Zählfrequenz kann dem Zähler ein Prescaler vorgeschaltet werden. Dieser ist alternativ
beim WDT (siehe unten) oder TMR0 einsetzbar. Die Zuweisung erfolgt durch Bit 3 (PSA) im OptionRegister
PSA gelöscht: Prescaler wird TMR0 zugeordnet
PSA gesetzt: Prescaler wird dem WDT zugeordnet
Der Wert des Prescalers wird durch die Bits 2-0 im Option-Register bestimmt.
Sobald der Timer von 0xFF nach 0x00 überläuft, wird Bit 2 (T0IF) im INTCON-Register gesetzt und ein
Interrupt (siehe unten) ausgelöst, sofern dieser aktiviert ist.
Ist das T0CS Bit gelöscht (Zähler zählt Impulse an RA4), kann durch Bit 4 (T0SE) im Option-Register
gewählt werden, ob der Zähler bei einer positiven oder negativen Flanke an RA4 erhöht wird. Auch hier kann
wie beim Timer-Betrieb der Prescaler genutzt werden, ebenso kann ein Interrupt beim Überlaufen ausgelöst
werden.
1-5
1.8 Interrupt
Ein Interrupt ist eine Unterbrechung des laufenden Programms, um eine andere Aufgabe zu erledigen. Ein
Interrupt beim PIC16F84 kann 4 Ursachen haben:
1. Externer Interrupt durch Flanke an Pin RB0/INT
2. Timer/Zähler (TMR0) Überlauf
3. Änderung an den Ports RB4 bis RB7
4. EEPROM Beschreiben beendet (internes EEPROM)
Um das Auftreten eines Interrupts zu ermöglichen, müssen im
Interrupt Control Register (INTCON) die entsprechenden Bits aktiviert werden.
Das Global Interrupt Enable Bit (GIE, INTCON Register, Bit 7) aktiviert/deaktiviert die Interrupts.
1 = Aktiviert alle eingeschalteten Interrupts
0 = Deaktiviert alle eingeschalteten Interrupts
Ist dieses Flag gesetzt, sind Interrupts möglich, aber es ist noch keiner aktiviert. Dazu müssen die einzelnen
Interrupts noch explizit eingeschalten werden:
EEIE: Aktiviert den Interrupt, der auftritt, nachdem das Beschreiben des internen EEPROM
beendet ist (IE steht für Interrupt Enable).
T0IE: Aktiviert den Interrupt, der bei einem Überlauf des Timer 0 (TMR0) auftritt.
INTE: Aktiviert den externen Interrupt, der bei einer Flanke an Pin RB0/INT auftritt. (Port
RB0/INT muss im TRISB Register als Eingang definiert sein)
RBIE: Aktiviert den Interrupt, der auftritt, wenn sich an Port RB 4-7 ein Pegel ändert. (Die
Ports müssen im TRISB Register als Eingang definiert sein)
Tritt ein aktivierter Interrupt auf, so wird das laufende Programm unterbrochen, und die Routine
an der Speicherstelle 4h ausgeführt. An deren Ende der Interrupt Service Routine muss der Befehl RETFIE
(Return from Interrupt) stehen, damit das Programm an der Stelle der Unterbrechung fortgesetzt wird.
In dieser Interupt-Routine kann dann die Ursache des Interrupts abgefragt werden. Diese wird
ebenfalls im INTCON Register in Flaggen festgehalten. Eine gesetzte Flagge zeigt an, dass ein Interrupt
aufgetreten ist. Folgende Flaggen sind vorhanden:
T0IF: Der Interrupt wurde durch einen Timer Überlauf hervorgerufen (Timer0 Interrupt Flag).
INTF: Der Interrupt wurde durch eine Flanke am RB0/INT Eingang hervorgerufen.
RBIF: Der Interrupt wurde durch eine Änderung an einem der Ports RB4 – RB7 ausgelöst.
EEIF: Dieses Bit liegt im EECON1 Register und wird gesetzt, wenn ein Schreibvorgang in den internen
EEPROM abgeschlossen wurde.
1-6
Gelöscht werden müssen diese Flaggen „von Hand“.
Die Interruptflaggen werden auch gesetzt wenn die entsprechenden Interrupts nicht aktiviert sind. Durch
explizites Testen der Flaggen lässt sich so zum Beispiel ein Timerüberlauf einfach feststellen.
In diesem Zusammenhang sei auf das Kapitel 6.8 des Datenblatts PIC16F84A.pdf hingewiesen, in welchen
die einzelnen Interrupts und ihre Besonderheiten detailiert besprochen werden.
Noch ausführlichere Informationen zu allen Modulen des Controllers finden sich in
Mid-Range_MCU_Family_Reference_Manual.pdf
1.9 Specials
Sleep
Wird der Prozessor durch den Befehl SLEEP in den Sleep-Modus gesetzt, wird der Quarzoszillator
angehalten, und der Prozessor hält die Ausführung des Programmes an.
Ist ein Interrupt eingeschaltet (EEIE, T0IE, RBIE, INTE), so kann dieser den Prozessor wieder aufwecken.
Es wird dann zuerst der Befehl nach dem Sleep-Befehl ausgeführt und wenn das GIE-Bit gesetzt ist
anschließend in die Interruptroutine gesprungen.
WDT
Der Watchdog-Timer ist dazu gedacht den Prozessor zu resetten, wenn ein Programm aufgrund eines
Fehlers dem WDT nicht alle 18ms durch den Befehl clrwdt löschen kann.
1-7