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