mikrocontroller-praxis pic18 architektur pic18 Überblick gruppe - datenbus (bit) familie instr.-set...
TRANSCRIPT
Mikrocontroller-Praxis
PIC18
Heiko Böhmer
Stand: 27.04.15
Inhaltsverzeichnis1 Einführung.....................................................................................................................................1
2 Architektur PIC18..........................................................................................................................3
3 Softwareentwicklung.....................................................................................................................9
3.1 Assemblerprogrammierung.................................................................................................10
3.2 C-Compiler...........................................................................................................................13
3.3 Debugger.............................................................................................................................15
4 Hardwareentwicklung – Single-Chip-System...............................................................................16
5 I/O-Ports......................................................................................................................................19
5.1 Digitale Ein-/Ausgangssignale.............................................................................................19
5.2 Analoge Eingangssignale....................................................................................................20
6 Mikrocontroller-Interface-Techniken............................................................................................22
6.1 Parallele Schnittstellen.........................................................................................................22
6.2 Serielle Schnittstellen...........................................................................................................27
7 Enhanced Universal Synchronous Asynchronous Receiver Transmitter (EUSART)...................28
8 Master Synchronous Serial Port (MSSP)....................................................................................31
8.1 Serial-Peripheral-Interface-Bus (SPI)..................................................................................31
8.2 Inter-Integreated-Circuit-Bus (I²C).......................................................................................37
9 Interrupt-System..........................................................................................................................40
10 Ergänzungen.............................................................................................................................44
III
1 EinführungBedeutung der Mikrocontrollertechnik anhand typischer Anwendungen
• KFZ-Elektronik (ABS, ASR, Airbag, Klimaanlage, Autoradio, Wegfahrsperre)• Kommunikationstechnik (Telefon, Fax)• Konsumer-Elektronik (weiße und schwarze Ware)• Industrie (Sensorik, Steuerungstechnik, Regler, Antriebstechnik)• PC-Technik (Maus, Tastatur, Monitor)• Sicherheitstechnik (Smart-Cards)• Medizintechnik
Übersicht Mikrocontrollerhersteller
• viele Anwendungen = viele Anbieter = viele Architekturen
Bild 1.1: Mikrocontroller-Vielfalt
Allgemeiner Aufbau und Arbeitsweise eines Mikrorechnersystems
Bild 1.2: Aufbau eines Mikrorechnersystems
Bild 1.3: Aufbau der CPU
1
Microchip:PIC12/PIC16/PIC18/PIC24/dsPIC/PIC32
Atmel:AVR8/AVR32/8051
Infineon:8051/C166/TriCore
NXP Semiconductors:8051/ARM7/ARM9/Cortex-M0/Cortex-M3
Renesas:RL78/78K0/78K0R/R8C/SuperH/V850/RX
Freescale:S08/S12/ColdFire/Cortex-M4
ST Microelectronics:STM8/ST7/STM32
Fujitsu Microelectronics:F²MC-8/F²MC-16/FR 32bit
Toshiba Electronics:TLSC 870/TLCS 900/ARM9/Cortex-M3
weitere Hersteller:Texas Instruments/Zilog/Silicon Laboratories/Maxim/Energy Micro/Samsung/Epson/...
Central Processing Unit(CPU) Speicher Input/Output
Adress-BusSteuer-BusDaten-Bus
CPU
Rechenwerk Steuerwerk
Arithmetic Logic Unit (ALU) Ablaufsteuerung mit Befehls-Dekoder
Systembus
Daten-Register
Adress-Register
Programm-Counter
Instruction-Register
Bild 1.4: Funktionsweise der Ablaufsteuerung
Bild 1.5: Aufbau von Speicher- und Input-/Output-Komponenten
2
Programm-Counter = 0
Increment Program-Counter
Befehl holen
Befehl dekodieren
Befehl ausführen
Adress-Bus
Steuer-Bus(RD, WR, CS)
Wort
Daten-Bus
Adresse 1Adresse 0
2 Architektur PIC18Überblick
Gruppe - Datenbus (bit) Familie Instr.-Set (bit) I/O-Pins DerivateBaseline 8 PIC10, PIC12, PIC16 12 4..32 19Midrange 8 PIC12, PIC16 14 4..54 62Enhanced-Midrange 8 PIC12, PIC16 14 6..53 46High Performance 8 PIC18 16 16..85 212High Performance 16 PIC24F 16 12..85 114High Performance 16 PIC24H/E 16 13..85 65High Performance 16 dsPIC30F 16 12..68 24High Performance 16 dsPIC33F/E 16 13..85 154High Performance 32 PIC32 32/16 51/53/85 113
Summe: 809
Tabelle 2.1: PIC-Familien (Quelle: www.microchip.com, September 2014)
• Die 8-Bit-Familie PIC17 wurde abgekündigt.
CPU-Architektur
Bild 2.1: CPU, interne Busse PIC18F
Bild 2.2: Stack- und Programmspeicherzugriff
3
Central Processing Unit(CPU)
DB (16)AB (21-1)SB (1)
DatenspeicherInput/OutputProgrammspeicher
DB (8)AB (12)SB (2)
PC
Stack Level 1
Stack Level 31
:::
Reset Vektor
High Pri. Interrupt Vektor
21 bit
8 bit
000000H
000008H
1FFFFFH
Low Pri. Interrupt Vektor000018H
Stack PointerSTKPTR<4:0>
Top-of-Stack Register(TOSU TOSH TOSL)
FFFH TOSU FDFH INDF2 FBFH CCPR1H F9FH IPR1FFEH TOSH FDEH POSTINC2 FBEH CCPR1L F9EH PIR1FFDH TOSL FDDH POSTDEC2 FBDH CCP1CON F9DH PIE1FFCH STKPTR FDCH PREINC2 FBCH CCPR2H F9CHFFBH PCLATU FDBH PLUSW2 FBBH CCPR2L F9BH OSCTUNEFFAH PCLATH FDAH FSR2H FBAH CCP2CON F9AHFF9H PCL FD9H FSR2L FB9H F99HFF8H TBLPTRU FD8H STATUS FB8H BAUDCON F98HFF7H TBLPTRH FD7H TMR0H FB7H PWM1CON F97HFF6H TBLPTRL FD6H TMR0L FB6H ECCP1AS F96H TRISEFF5H TABLAT FD5H T0CON FB5H CVRCON F95H TRISDFF4H PRODH FD4H FB4H CMCON F94H TRISCFF3H PRODL FD3H OSCCON FB3H TMR3H F93H TRISBFF2H INTCON FD2H HLVDCON FB2H TMR3L F92H TRISAFF1H INTCON2 FD1H WDTCON FB1H T3CON F91HFF0H INTCON3 FD0H RCON FB0H SPBRGH F90HFEFH INDF0 FCFH TMR1H FAFH SPBRG F8FHFEEH POSTINC0 FCEH TMR1L FAEH RCREG F8EHFEDH POSTDEC0 FCDH T1CON FADH TXREG F8DH LATEFECH PREINC0 FCCH TMR2 FACH TXSTA F8CH LATDFEBH PLUSW0 FCBH PR2 FABH RCSTA F8BH LATCFEAH FSR0H FCAH T2CON FAAH F8AH LATBFE9H FSR0L FC9H SSPBUF FA9H EEADR F89H LATAFE8H WREG FC8H SSPADD FA8H EEDATA F88HFE7H INDF1 FC7H SSPSTAT FA7H EECON2 F87HFE6H POSTINC1 FC6H SSPCON1 FA6H EECON1 F86HFE5H POSTDEC1 FC5H SSPCON2 FA5H F85HFE4H PREINC1 FC4H ADRESH FA4H F84H PORTEFE3H PLUSW1 FC3H ADRESL FA3H F83H PORTDFE2H FSR1H FC2H ADCON0 FA2H IPR2 F82H PORTCFE1H FSR1L FC1H ADCON1 FA1H PIR2 F81H PORTBFE0H BSR FC0H ADCON2 FA0H PIE2 F80H PORTA
Bild 2.3: Übersicht Spezialfunktionsregister (SFR) PIC18F4520
4
Bit 7Bit 6Bit 5
nicht implementiert
Bit 4 N R/WX
Negative bit (bei arithmetischen Operationen mit Zweierkomplement)1 = Ergebnis war negativ0 = Ergebnis war positiv
bit 3 OV R/WX
Overflow bit (Überlauf-Bit bei Vorzeichen-Arithmetik)1 = Überlauf aufgetreten0 = kein Überlauf aufgetreten
Bit 2 Z R/WX
Zero Bit1 = Ergebnis arithmetischer oder logischer Operation war gleich Null0 = Ergebnis arithmetischer oder logischer Operation war ungleich Null
Bit 1 DC R/WX
Digit carry/borrow bit (Überlauf-Bit zwischen den Operanden-Nibbeln für ADD- und SUBB-Operationen)1 = Überlauf aufgetreten0 = kein Überlauf aufgetreten
Bit 0 C R/WX
Carry/borrow bit (Überlauf-Bit für ADD- und SUBB-Operationen, Zwi-schenspeicher für Schiebe-Operationen)1 = Überlauf aufgetreten0 = kein Überlauf aufgetreten
Tabelle 2.2: SFR STATUS
Bild 2.4: Datenspeicherzugriff über direkte und indirekte Adressierung
5
07
direkte Adressierung indirekte Adressierung
0
***
Bank 0 GPR
Bank 1 GPR
Bank 15 SFR
000H0FFH100H1FFH
F00HFFFH
Opcode-BestandteilBSR3 070
FSRnLFSRnH3
INDFn
1a-Bit
07Opcode-Bestandteil
0a-Bit
POSTINCnPOSTDECnPREINCnPLUSWn
Befehlssatz
• Befehlsaufbau: Opcode (Mnemonic) gefolgt von Operandenf: Register im Register-File (GPR, SFR)k: Konstante (literal - 4; 8; 12 oder 16 bit)d: Zielregister (destination), d=0: dest.=W, d=1: dest.=fb: Bit-Stelle in Register (f.b)a: RAM access bit, a=0: Zugriff auf Access Banks: Fast Call/Return mode select bit, s=1: fast moden: FSRn
Mnemonic Beschreibung StatusTransferoperationen
MOVF f, d, a Move f (d=0: f ⇒ W; d=1: f ⇒ f) Z, NMOVFF fs, fD Move fs to fD
MOVWF f, a Move W to f (W ⇒ f)MOVLW k Move literal to W (k ⇒ W)MOVLB k Move literal to BSR<3:0>LFSR n, k Move literal to FSRnSWAPF f, d, a Swap nibbles in fPUSH Increment STKPTR<4:0>, TOS = PC+2POP Decrement STKPTR<4:0>Logische Operationen
ANDWF f, d, a AND W with f Z, NANDLW k AND literal with W Z, NIORWF f, d, a Incl. OR W with f Z, NIORLW k Incl. OR literal with W Z, NXORWF f, d, a Excl. OR W with f Z, NXORLW k Excl. OR literal with W Z, NCLRF f, a Clear f ZSETF f, a Set f ( f = FFH)COMF f, d, a Compement f Z, NArithmetische Operationen
ADDWF f, d, a Add W and f alleADDWFC f, d, a Add W, f and C alleADDLW k Add literal and W alleSUBFWB f, d, a Subtract f from W (W - f) with Burrow alleSUBWF f, d, a Subtract W from f (f – W) alleSUBWFB f, d, a Subtract W from f (f – W) with Burrow alleSUBLW k Subtract W from literal (k – W) alleDECF f, d, a Decrement f (f – 1) alleINCF f, d, a Increment f (f + 1) alleNEGF f, a Negation im Zweierkomplement (bitweise inv. +1) alleMULWF f, a Multiply WREG with fMULLW k Multiply literal with WREGDAW Decimal Adjust W (BCD-Operation) CSchiebeoperationen
RLCF f, d, a Rotate Left f through Carry C, Z, NRLNCF f, d, a Rotate Left f without Carry Z, NRRCF f, d, a Rotate Right f through Carry C, Z, NRRNCF f, d, a Rotate Right f without Carry Z, NBit-Operationen
BCF f, b, a Bit Clear f.bBSF f, b, a Bit Set f.bBTG f, b, a Bit Toggle f.b
6
Mnemonic Beschreibung StatusOperationen für Programmverzweigungen
GOTO k Go to addressCALL k, s Call subroutineRCALL k Relative CallRETURN s Return from SubroutineRETLW k Return with literal in WRETFIE s Return from interruptBTFSC f, b, a Bit Test f.b, Skip if ClearBTFSS f, b, a Bit Test f.b, Skip if SetDECFSZ f, d, a Decrement f, Skip if ZeroINCFSZ f, d, a Increment f, Skip if ZeroDCFSNZ f, d, a Decrement f, Skip if Not ZeroICFSNZ f, d, a Increment f, Skip if Not ZeroCPFSEQ f, a Compare f with W, Skip if f = WCPFSGT f, a Compare f with W, Skip if f > WCPFSLT f, a Compare f with W, Skip if f < WTSTFSZ f, a Test f, Skip if ZeroBC k Branch relative if CarryBNC k Branch relative if Not CarryBN k Branch relative if NegativeBNN k Branch relative if Not NegativeBOV k Branch relative if OverflowBNOV k Branch relative if Not OverflowBZ k Branch relative if ZeroBNZ k Branch relative if Not ZeroBRA k Branch relative unconditionallySonstige Operationen
NOP No OperationCLRWDT Clear Watchdog Timer /TO, /PDSLEEP Go into standby mode /TO, /PDRESET Software device resetProgramm-Speicher Lese-/Schreib-Operationen
TBLRD* Table ReadTBLRD*+ Table Read with post-incrementTBLRD*- Table Read with post-decrementTBLRD+* Table Read with pre-incrementTBLWT* Table WriteTBLWT*+ Table Write with post-incrementTBLWT*- Table Write with post-decrementTBLWT+* Table Write with pre-increment
Tabelle 2.3: Assembler-Befehlssatz
7
Bild 2.5: Befehls-Pipeline
Überblick On-Chip-Peripherie
Bild 2.6: On-Chip-Peripherie PIC18F4520
8
Oszillatortakt
Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4
Fetch Instr. nExecute Instr. n
DI RD PD WD
Q1 Q2 Q3 Q4
Fetch Instr. n+1Execute Instr. n+1
DI RD PD WD
Program Counter PC PC+1 PC+2
Fetch Instr. n+2
DI: Decode InstructionRD: Read DataPD: Processing DataWD: Write Data
CPUProgrammspeicher
(32 KB Flash)Datenspeicher
(1536 Byte RAM)
PORTA .. PORTEbis zu 36 I/O-Pins
Parallel Slave Port
8x8 HardwareMultiplizierer
Timer0/1/2, Timer3(1x8 Bit, 3x16 Bit)
Interner OszillatorPLL
256 ByteEEPROM
Low Voltage DetectSynchronousSerial PortUSART
A/D-Wandler(10 Bit)
Interrupt-Controller
Power-on ResetPower-up Timer
Brown-out ResetWatchdog Timer
Oszillator Start-upTimer
In-Circuit-Serial-Progr./Debugging
Low-VoltageProgramming
Komparator-ModulSpannungsreferenz
Compare/Capture/PWM-Module 1/2
3 Softwareentwicklung
Bild 3.1: Entwicklungszyklus für Mikrocontrollersoftware
Bild 3.2: Übersetzungsvorgang
Bild 3.3: Allgemeine Struktur eines Mikrocontrollerprogramms
9
Projekt anlegen
Quelldateien anlegen, Quelltexte editieren
Übersetzen
Syntax-Fehler
logischeFehler
Debuggen
Maschinenprogramm
testprog.asm/testprog.c(Quell-Datei)
ASSEMBLER/COMPILER
testprog.mcp(Projekt-Datei)
testprog.hex(Intel-Hex-Datei)
testprog.map(MAP-Datei)
testprog.cof(Symbol-und Debug-Datei)
p18f4520.inc/p18f4520.h(Include/Header-Datei)
LINKER
18f4520_g.lkr(Linker-Script-Datei)
testprog.o(Objekt-Datei)
Initialisierung
Endlosschleife
ISR1 ISRn
3.1 AssemblerprogrammierungDirektiven zur Arbeit mit Symbolen für Assemblerkonstanten
EQU, SET, CONSTANT, VARIABLE, CBLOCK, ENDC
Makro-Direktiven MACRO, ENDM, LOCAL, EXITM, EXPAND NOEXPANDDirektiven zur Erzeugung von Kon-stanten im nichtflüchtigen Speicher
DA, DATA, DB, DW, DE, DT, FILL
Direktiven zur Erzeugung relokati-bler Module
CODE, EXTERN, GLOBAL, PAGESEL, IDATA, UDATA, UDATA_ACS, UDATA_OVR, UDATA_SHR, RES, BAKISEL, BANKSEL, ACCESS_OVR, CODE_PACK, IDATA_ACS, PAGESELW
Direktiven zur bedingten Assemblie-rung
#DEFINE, #UNDEFINE, IFDEF, IFNDEF, IF, ELSE, ENDIF, WHILE, ENDW, ERROR, ERRORLEVEL, MESSG
Direktiven zur Steuerung der Lis-tingausgabe
LIST, NOLIST, PAGE, SPACE, TITLE, SUBTITLE
Sonstige Direktiven ORG, END, #INCLUDE, PROCESSOR, RADIX, CONFIG_ _MAXRAM, _ _BADRAM, _ _CONFIG, _ _IDLOCKS, _ _MAXROM, _ _BADROM
Tabelle 3.1: Übersicht Assemblerdirektiven
dezimal D'255'hexadezimal H'FF', 0xFF, 0FF (Default-Zahlensystem)oktal O'77'binär B'10110100'ASCII A'Y' (=D'89')
Tabelle 3.2: Zahlensysteme
Operator Beschreibung$, (, ) aktueller PC, Klammern!, -, ~ logisches Komplement, Zweier-Komplement, bitweise Komplementlow, high, upper liefert Bit 0..7, Bit 8..15, Bit 16..23 einer Assembler-Konst.*, /, % Multiplikation, Division, Rest+, - Addition, Subtraktion<<, >> Verschieben>=, >, <, <=, ==, != logische Vergleiche&, |, ^ bitweise AND, OR, XOR&&, || logisches AND, OR=, +=, −=, *=, /=, %=, <<=, >>=, &=, |=, ^=
Zuweisungen mit arithmetischen Operationen, Verschiebe- und Bit-Operationen
++, − − Inkrement, Dekrement
Tabelle 3.3: Operatoren
10
Programmbeispiel: Assembler-Programmierung
#include "P18F4520.INC"
config OSC = ECIO6, WDT = OFF, PBADEN = OFF, LVP = OFF, PWRT = OFF
AnzQByte EQU D'16'
cblock 20Quelle: AnzQByteErgebnisLauf endc
Temp EQU 2FF
ORG 0
GOTO 10
ORG 10
MOVLB 2 ; Auswahl Bank 2 für direkte AdressierungCLRF Temp, BANKED ; Temp = 0, Zugriff über direkte AdressierungLFSR 0, Quelle ; FSR0 = H'20'MOVLW AnzQByte ; W = D'16'MOVWF Lauf, ACCESS ; Lauf = D'16', Zugriff über Access-BankCLRF WREG, ACCESS ; W = 0
Loop:ADDWF POSTINC0, W, ACCESS ; W = W + Variable, FSR0++BTFSC STATUS, C, ACCESS ; wenn kein Übertrag, nächsten Befehl überspr.INCF Temp, F, BANKED ; Übertrag aufaddierenDECFSZ Lauf, F, ACCESS ; Lauf = 0 ?GOTO Loop ; Schleife
MOVWF Ergebnis, ACCESS
RRCF Temp, F, BANKEDRRCF Ergebnis, F, ACCESSRRCF Temp, F, BANKEDRRCF Ergebnis, F, ACCESSRRCF Temp, F, BANKEDRRCF Ergebnis, F, ACCESSRRCF Temp, F, BANKEDRRCF Ergebnis, F, ACCESS
GOTO $
END
11
Software-Entwurf und Dokumentation
Bild 3.4: Elemente eines Programmflussplanes
Häufig gebrauchte Programmstrukturen
Bild 3.5: Bedingte Programmverzweigung If-Then
Bild 3.6: Bedingte Programmverzweigung If-Then-Else
• weitere Programmstrukturen:• Schleifen (anfangsgeprüft, endgeprüft, for-to-next)• Selektive Programmverzweigung (CASE-Strukturen)
12
UP Ausgabe Var3 = Var1 + Var2
Programmverzweigung
Var = 0 ?
Start/Ende Anweisungsblock
ja
nein
Flussrichtungs-pfeil
LED an
Taste = 1 ?
ja
neinBTFSC PORTB, Taste, ACCESSCALL LED_an :
LED1 an
Taste = 1 ?
ja
nein
LED2 an
BTFSC PORTB, Taste, ACCESSGOTO Led1_anBSF PORTC, LED2, ACCESSGOTO End_Tst_Taste
Led1_an:BSF PORTC, LED1, ACCESS
End_Tst_Taste::
3.2 C-Compiler
if-then-else-Programmverzweigung if (var == 25) var = 1;else var = var + 1;
selektive Programmverzweigung switch (code) case 0: var = 100; break; case 1: var = 200; break; default: var = 300;
anfangsgeprüfte Schleife while (var != 0) count++;
endgeprüfte Schleife do count++;while (wert < 80);
for-to-next-Schleife for (lauf = 1; lauf <= 10; lauf++) var1 = var2 / 20;
Bildung von Blöcken
Tabelle 3.4: Kontrollstrukturen
8-Bit-Ganzzahl ohne Vorzeichen unsigned char
8-Bit-Ganzzahl mit Vorzeichen char
16-Bit-Ganzzahl ohne Vorzeichen unsigned int, unsigned short
16-Bit-Ganzzahl mit Vorzeichen int, short
24-Bit-Ganzzahl ohne Vorzeichen unsigned short long
24-Bit-Ganzzahl mit Vorzeichen short long
32-Bit-Ganzzahl ohne Vorzeichen unsigned long
32-Bit-Ganzzahl mit Vorzeichen long
32-Bit-Fließpunktzahl float, double
Tabelle 3.5: Elementare Datentypen des C-Compilers MPLAB C18
13
( ) [ ] -> . Klammern, Zugriff auf Felder und Strukturen
! ~ ++ -- + - * & (type) sizeof
logische Negation, Einer-Komplement, Increment, Decrement, Vorzeichen, Dereferenzierung, Adresse, Typumwandlung, sizeof
* / % Multiplikation, Division, ganzzahliger Rest
+ - Addition, Subtraktion
<< >> Verschiebeoperatoren
< <= > >= Vergleichsoperatoren: kleiner/größer
== != Vergleichsoperatoren: gleich, ungleich
& bitweise AND
^ bitweise XOR
| bitweise OR
&& logisch AND
|| logisch OR
?: Konditional-Ausdruck
= += -= ... Zuweisung, Zuweisung kombiniert weiterem Operator
, Komma-Operator
Tabelle 3.6: Operatoren geordnet nach Prioritäten (höchste Priorität ganz oben)
Pragma-Schlüsselwort Erläuterung
interrupt, interruptlow Definition von Interrupt-Funktionen
udata, idata, romdata, code, tmpdata
Änderung der Einstellungen zur Ablage von Code und Daten in Sections
varlocate Anzeige der Section oder Bank von Variablen
config Definition der Konfigurations-Register
Tabelle 3.7: Compilerspezifische Pragma-Direktiven
Programmbeispiele: Variablendeklarationen
// direkte Adressierung von funktionslokalen Variablen im Access-RAM#pragma udata access my_access/*******************************************************************/char func1(static near char loc_var1, static near char loc_var2) return (loc_var1 & loc_var2);#pragma udata
const char no_number[ ] = "keine Zahl\r\n"; // Anlegen einer String-Konstanten im Datenspeicherconst rom char zeilenumbruch[ ] = "\r\n"; // Anlegen einer String-Konstanten im Codespeicher
// Anlegen eines Pointers auf eine String-Konstante im Codespeicherconst char rom * no_number = "keine Zahl\r\n";
// Funktionsdeklaration mit Pointer auf eine String-Konstante im Codespeicher als Parametervoid send_string_rom(const char rom * str);
// Funktionsdeklaration mit Pointer auf eine String-Konstante im Datenspeicher als Parametervoid send_string_ram(const char str[ ]);
// Achtung !! auch folgende String-Konstante wird im Codespeicher abgelegt (ohne 'rom')// wird dieser Pointer an send_string_ram übergeben erfolgt keine Fehlermeldungconst char * no_number = "keine Zahl\r\n";
14
Software-Entwurf und Dokumentation
Bild 3.7: Struktogramm-Elemente
3.3 Debugger
15
AktionAktionsblock
Aktion1 Aktion2
?nein
Verzweigung
Aktion1 Aktion2 Aktion3
X = ?1 2 sonst
Mehrfachverzweigung
Aktion
wiederhole, solange Bedingung erfülltanfangsgeprüfteSchleife
Aktion
wiederhole, solange Bedingung erfüllt
endgeprüfteSchleife
ja
4 Hardwareentwicklung – Single-Chip-System
/MCLR, VPP RE3 1 40 RB7 KBI3, PGDAN0 RA0 2 39 RB6 KBI2, PGCAN1 RA1 3 38 RB5 KBI1, PGM
AN2, VREF-, CVREF RA2 4 37 RB4 KBI0, AN11AN3, VREF+ RA3 5 36 RB3 CCP2, AN9
T0CKI,C1OUT RA4 6 35 RB2 INT2, AN8AN4, /SS, HLVDIN, C2OUT RA5 7 34 RB1 INT1, AN10
AN5, /RD RE0 8 33 RB0 INT0, FLT0, AN12AN6, /WR RE1 9 32 VDD
AN7, /CS RE2 10 31 VSS
VDD 11 30 RD7 PSP7, P1DVSS 12 29 RD6 PSP6, P1C
CLKI, OSC1 RA7 13 28 RD5 PSP5, P1BCLKO, OSC2 RA6 14 27 RD4 PSP4
T1OSO, T13CKI RC0 15 26 RC7 RX, DTT1OSI, CCP2 RC1 16 25 RC6 TX, CK
CCP1, P1A RC2 17 24 RC5 SDOSCK. SCL RC3 18 23 RC4 SDI, SDA
PSP0 RD0 19 22 RD3 PSP3PSP1 RD1 20 21 RD2 PSP2
Bild 4.1: Pinbelegung Mikrocontroller PIC18F4520 im DIP40-Gehäuse
Bild 4.2: geregelte Spannungsversorgung 5V
Bild 4.3: Auswahl Taktversorgung
16
Primärer Takt externer Taktgenerator
Quarz/Keramik-Oszillator R/C-Oszillator
Sekundärer Takt (T1OSC) Quarz-Oszillator 32,768 kHz
Interner Haupt-Oszillator-Takt 8 MHz-Oszillator
Interner RC-Oszillator-Takt 31 kHz-Oszillator
:256
:64
:32
:16
:8
:4
:24 MHz
2 MHz
1 MHz
500 kHz
250 kHz
125 kHz
31 kHz
8 MHz
PLLfOUT = 4 • fIN
7805
+
47µF 0,1µF
I OGND
9V
0,1µF
5V
VSS
VDD
Externe Oszillatorschaltungen
Bild 4.4: Quarz-/Keramik-Oszillator
Bild 4.5: externer Oszillator
Bild 4.6: RC-Oszillator
17
PIC
OSC1
OSC2
RC
C
XTAL
PIC
OSC1
OSC2
OUTGND
NC VDD
XTAL
VDD
1
7
14
8
PIC
OSC1
OSC2
VDD
fOSC
/4
R
C
Reset-System
Bild 4.7: a) externer Reset-Taster, b) externe Power-On-Reset-Schaltung
Bild 4.8: Zeitverlauf Power-On
Offset
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
01 IESO FCMEN - - FOSC3 FOSC2 FOSC1 FOSC002 - - - BORV1 BORV0 BOREN1 BOREN0 /PWRTEN03 - - - WDTPS3 WDTPS2 WDTPS1 WDTPS0 WDTEN05 MCLRE - - - - LPT1OSC PBADEN CCP2MX06 /DEBUG XINST - - - LVP - STVREN08 - - - - CP3 CP2 CP1 CP009 CPD CPB - - - - - -0A - - - - WRT3 WRT2 WRT1 WRT00B WRTD WRTB WRTC - - - - -0C - - - - EBTR3 EBTR2 EBTR1 EBTR00D - EBTRB - - - - - -
Tabelle 4.1: Übersicht Konfigurations-Register PIC18F4520 (Adress-Offset ab 0x300000)
18
PIC
/MCLR
VDD
R < 40kΩ
PIC
/MCLR
VDD
R
R1≥ 1kΩ
VDD
D
C
VDD
/MCLR
interne Power-On-Erkennung
interner Reset
TPWRT
TOST
TPLL
5 I/O-Ports
5.1 Digitale Ein-/Ausgangssignale
Bild 5.1: Beschaltung digitaler I/O-Ports
Programmbeispiel: I/O-Ports
#include <p18f4520.h>
#pragma config OSC = ECIO6, WDT = OFF, PBADEN = OFF, LVP = OFF, PWRT = OFF
void main(void) LATC = 0; // Ausgangssignale = LOW TRISC = 0; // PORTC = Output while(1) if (PORTBbits.RB0 == 0) LATC = 0; // oder PORTC = 0; else LATC = 0xFF; // oder PORTC = 0xFF;
19
RB0
VDD
4,7kΩ
470Ω
RCx (x=0..7)
470Ω
LED
5.2 Analoge Eingangssignale
Bild 5.2: Interner Aufbau A/D-Wandler
ADCS2:ADCS0 PeriodendauerADC-Takt (TAD)
fOSC_max
000 2 TOSC 2,86 MHz100 4 TOSC 5,71 MHz001 8 TOSC 11,43 MHz101 16 TOSC 22,86 MHz010 32 TOSC 40 MHz110 64 TOSC 40 MHzx11 ca. 1,2µs (RC-Osz.) 1 MHz, Sleep
Tabelle 5.1: Einstellmöglichkeiten ADC-Takt
Bit 7Bit 6
--
R0
nicht implementiert
Bit 5Bit 4Bit 3Bit 2
CHS3CHS2CHS1CHS0
R/W0
Analog Channel Select0000..1100 entspricht AN0..AN12
Bit 1 GO/DONE R/W0
A/D Conversion Status1 = AD-Wandlung läuft (Setzen dieses Bit startet AD-Wandlung, Bit wird am Ende der Wandlung per Hardware gelöscht)0 = AD-Wandler gestoppt
Bit 0 ADON R/W0
A/D On1 = AD-Wandler eingeschaltet0 = AD-Wandler ausgeschaltet (keine Stromaufnahme des ADC)
Tabelle 5.2: SFR ADCON0
20
ADC-Takt
AN0AN1AN2AN3AN4
AN12
CHS3:CHS0
CHOLD
Sampling Switch
VDD
VSS
VCFG1:VCFG0
ADCS2:ADCS0GO/DONE
ADON
ein/aus
Start/Ende
VREF+
VREF-
10 Bit ADC
Takt
ADRESH / ADRESLVAIN Ergebnis
Ende ADIF
10
ADFM
: :
TACQACQT2:ACQT0
Bit 7Bit 6
--
nicht implementiert
Bit 5Bit 4
VCFG1VCFG0
R/W0
Reference Voltage Configuration11 = AN2 → VREF- / AN3 → VREF+
00 = VSS → VREF- / VDD → VREF+
Bit 3Bit 2Bit 1Bit 0
PCFG3PCFG2PCFG1PCFG0
R/W
0000oder0111
A/D Port Configuration Control
PCFG
AN
12
AN
11
AN
10
AN
9
AN
8
AN
7
AN
6
AN
5
AN
4
AN
3
AN
2
AN
1
AN
0
000x A A A A A A A A A A A A A0010 A A A A A A A A A A A A A0011 D A A A A A A A A A A A A0100 D D A A A A A A A A A A A0101 D D D A A A A A A A A A A0110 D D D D A A A A A A A A A0111 D D D D D A A A A A A A A1000 D D D D D D A A A A A A A1001 D D D D D D D A A A A A A1010 D D D D D D D D A A A A A1011 D D D D D D D D D A A A A1100 D D D D D D D D D D A A A1101 D D D D D D D D D D D A A1110 D D D D D D D D D D D D A1111 D D D D D D D D D D D D D
Tabelle 5.3: SFR ADCON1
Bit 7 ADFM R/W0
A/D Result Format Select1 = rechtsbündig (6 höchstwertige Bit von ADRESH = 0)0 = linksbündig (6 niederwertigste Bit von ADRESL = 0)
Bit 6 - nicht implementiert
Bit 5Bit 4Bit 3
ACQT2ACQT1ACQT0
R/W0
A/D Acquisition Time Select000 = 0 TAD
001 = 2 TAD
010 = 4 TAD
011 = 6 TAD
100 = 8 TAD
101 = 12 TAD
110 = 16 TAD
111 = 20 TAD
Bit 2Bit 1Bit 0
ADCS2ADCS1ADCS0
R/W0
A/D Conversion Clock Select000 = fOSC/2001 = fOSC/8010 = fOSC/32011 = fRC
100 = fOSC/4101 = fOSC/16110 = fOSC/64111 = fRC
Tabelle 5.4: SFR ADCON2
21
6 Mikrocontroller-Interface-Techniken
6.1 Parallele Schnittstellen
Bild 6.1: Anschluss eines statischen RAM 8K x 8Bit (z.B. Cypress CY6264) an einen Mikrocontroller mit Intel-kompatiblen Steuerbus
22
Mikrocontroller mitIntel-kompatiblemSteuerbus
A0
A12
AD0
AD7
A8
A12
74HC373 CY6264D0
D7
Q0
Q7LE/OE
A13A14A15
ALE
/RD/WR
≥1 /CE1CE2/WE/OE
VCC
I/O0
I/O7
ALE
/RD
AD0 .. AD7
A8 .. A15
A0..A7 D0..D7
Lese-Zyklus
ALE
/WR
AD0 .. AD7
A8 .. A15
A0..A7 D0..D7
Schreib-Zyklus
Bild 6.2: Anschluss ein statischen RAM 8K x 8Bit (z.B. Cypress CY6264) an einen Mikrocontroller mit Motorola-kompatiblen Steuerbus
23
Mikrocontroller mitMotorola-kompatiblemSteuerbus
A0
A12
AD0
AD7
A8
A12
74HC373 CY6264D0
D7
Q0
Q7LE/OE
A13A14A15
AS
ER/W
≥1 /CE1CE2/WE/OE
VCC
I/O0
I/O7
&&
&
AS
R/W
AD0 .. AD7
A8 .. A15
A0..A7 D0..D7
Lese-Zyklus
AS
AD0 .. AD7
A8 .. A15
A0..A7 D0..D7
Schreib-Zyklus
E
R/W
E
Bild 6.3: Anschluß eines LCD-Moduls an einen PIC
Bild 6.4: Aufbau LCD-Display - 16 Zeichen x 2 Zeilen, 5x8 Punkte/Zeichen(Quelle: Datenblatt LCD-Module 162C Series, Firma Dispaytech Ltd. Hong Kong)
24
PIC
RD0..RD7RE0RE1RE2
LCD
D0..D7RSR/WE
Vdd
Vss
Vo10kΩ
330Ω
Bild 6.5: Interner Aufbau LCD-Controller(Quelle: Datenblatt Display-Controller KS0070B, Firma Samsung)
Bild 6.6: Timing Schreibzugriff LCD-Modul(Quelle: Datenblatt LCD-Module 162C Series, Firma Dispaytech Ltd. Hong Kong)
25
Tabelle 6.1: Timing-Spezifikation Schreibzugriff LCD-Modul(Quelle: Datenblatt LCD-Module 162C Series, Firma Dispaytech Ltd. Hong Kong)
Kommando RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 DauerDisplay Clear L L L L L L L L L H 1,64msReturn Home L L L L L L L L H X 1,64msEntry Mode Set L L L L L L L H I/D SH 42µsDisplay On/Off L L L L L L H D C B 42µsShift L L L L L H S/C R/L X X 42µsSet Function L L L L H DL N F X X 42µsSet CG RAM Addr L L L H CG RAM Addr 42µsSet DD RAM Addr L L H DD RAM Addr 42µsRead BF-Flag L H BF Address Counter 0µsWrite Data H L Data 46µsRead Data H H Data 46µs
I/D H: Cursor move direction Increase / L: Curcor move direction DecreaseSH H: Display is shifted / L: Display is not shiftedD H: Display On / L: Dispay OffC H: Cursor On / L: Cursor OffB H: Blinking On / L: Blinking OffS/C H: Display shift / L: Cursor MoveR/L H: Right shift / L: Left shiftDL H: 8-Bit-Interface / L: 4-Bit-InterfaceN H: 2 line display / L: 1 line displayF H: 5x10 dots / L: 5x7 dotsBF H: Busy / L: Ready
Tabelle 6.2: Steuer-Kommandos LCD-Modul
26
6.2 Serielle SchnittstellenRS-232
Signal Erläuterung 25-polig 9-polig DTE DCETD Transmit Data 2 3 Output InputRD Receive Data 3 2 Input OutputGND Ground 7 5
Tabelle 6.3: Steckerbelegung RS-232 ohne Handshake-Signale
Bild 6.7: Elektrische Pegel RS-232
Bild 6.8: Datenrahmen RS-232
Bild 6.9: Anschluss RS-232-Leitungstreiber an PIC
27
High-Pegel EmpfängerHigh-Pegel Sender
Low-Pegel EmpfängerLow-Pegel Sender
U in V
25
53
-25
-5-3
-12
12
Sta
rtB
it0B
it1B
it2B
it3B
it4B
it5B
it6B
it7S
top
Ruh
e
Ruh
e
T1INT2INR1OUTR2OUT
C1+
C1-C2+
C2-
T1OUTT2OUT
R1INR2IN
VCC
V+V-
GND
MAX232APIC
TX
RX
100nF
100nF
100nF
100nF
VCC
7 Enhanced Universal Synchronous Asynchronous Receiver Transmitter (EUSART)Asynchrone Betriebsart
Bild 7.1: Prinzip-Schaltbild UART-Kommunikation
Bild 7.2: USART in asynchroner Betriebsart
28
Sende-Schieberegister
Taktgenerator
UART 1
TXEmpfangs-Schieberegister
Empfangs-Schieberegister Sende-Schieberegister
Taktgenerator
TX
UART 2
RX
RX
TXREG
Daten-Bus
TXIF
TXIE&
Interrupt
Stop (Bit8) Bit7 Bit0• • • Start RC6/TX
Schiebe-Register Senden
TRMT
TX9D
TX9
Baud-Raten-Generator
SPBRG
BRGH
TXEN
SPENTakt
Stop(Bit8)Bit7Bit0 • • •Start
Schiebe-Register Empfang
Fehler-korrektur
Pin-Buffer
RC7/RX
FERR OERRRC9
16•Takt
RCREG RX9D
Daten-Bus
FIFO RCIF
RCIE&
Interrupt
Pin-Buffer
CREN
SPBRGHBRG16
Bit 7 CSRC R/W0
Clock Source SelectASYNC: keine BedeutungSYNC: 1 = Master (Takt wird intern generiert)
0 = Slave (Takt wird extern zugeführt)Bit 6 TX9 R/W
09-bit Transmit Enable1 = 9-Bit-Sender0 = 8-Bit-Sender
Bit 5 TXEN R/W0
Transmit Enable1 = Sender eingeschaltet0 = Sender ausgeschaltet
Bit 4 SYNC R/W0
Synchronous Mode Select1 = Betriebsart Synchron0 = Betriebsart Asynchron
Bit 3 SENDB R/W0
Send Break CharacterASYNC: 1 = Sende Synchronisations-Break (LIN-Bus)
0 = Synchronisations-Break gesendetSYNC: keine Bedeutung
Bit 2 BRGH R/W0
Baud Rate Generator High Speed SelectASYNC: 1 = High Speed
0 = Low SpeedSYNC: keine Bedeutung
Bit 1 TRMT R1
Transmit Shift Register Status1 = TSR leer0 = TSR voll
Bit 0 TX9D R/W0
Bit 9 der Transmit-Daten
Tabelle 7.1: SFR TXSTA
Bit 7 SPEN R/W0
Serial Port Enable1 = RC7/RX/DT und RC6/TX/CK werden dem USART zugeordnet0 = RC7 und RC6 als normale I/O-Leitungen nutzbar
Bit 6 RX9 R/W0
9-Bit Receive Enable1 = 9-Bit-Empfänger0 = 8-Bit-Empfänger
Bit 5 SREN R/W0
Single Receive EnableASYNC: keine BedeutungSYNC: 1 = Single Receive Betriebsart eingeschaltet
0 = Single Receive Betriebsart ausgeschaltetBit 4 CREN R/W
0Continuous Receive Enable1 = Kontinuierlicher Empfang eingeschaltet0 = Kontinuierlicher Empfang ausgeschaltet
Bit 3 ADDEN R/W0
Address Detect Enable (nur relevant bei: RX9=1)ASYNC: 1 = Adresserkennung eingeschaltet
0 = RX9D kann per Software als Parität verwendet werdenSYNC: keine Bedeutung
Bit 2 FERR R0
Framing Error1 = Framing Error (Stop-Bit = 0)0 = kein Framing Error
Bit 1 OERR R0
Overrun Error1 = Overrun Error (RCREG wurde nicht gelesen)0 = kein Overrun Error
Bit 0 RX9D RX
Bit 9 der Empfangs-Daten
Tabelle 7.2: SFR RCSTA
29
Bit 7 ABDOVF R/W0
Auto-Baud Acquisition Rollover Status1 = BRG-Überlauf ist aufgetreten (Auto Baud Rate Detect)0 = BRG-Überlauf ist nicht aufgetreten
Bit 6 RCIDL R1
Receive Operation Idle Status1 = Empfänger ist nicht beschäftigt (Idle)0 = Empfänger ist aktiv
Bit 5 - R0
nicht implementiert
Bit 4 SCKP R/W0
Synchronous Clock Polarity SelectASYNC: keine BedeutungSYNC: 1 = Clock-Idle-Zustand ist High-Pegel
0 = Clock-Idle-Zustand ist Low-PegelBit 3 BRG16 R/W
016-bit Baud Rate Register Enable1 = 16-bit Baud Rate Generator (SPBRGH und SPBRG)0 = 8-bit Baud Rate Generator (nur SPBRG - Kompatibilitätsmodus)
Bit 2 - R0
nicht implementiert
Bit 1 WUE R/W0
Wake-up EnableASYNC: 1 = Auto-Wake-up eingeschaltet
0 = kein Auto-Wake-up eingeschaltetSYNC: keine Bedeutung
Bit 0 ABDEN R/W0
Auto-Baud Detect Enable bitASYNC: 1 = Auto-Baud Detect für nächstes Zeichen ein (55H)
0 = Auto-Baud Detect ausgeschaltetSYNC: keine Bedeutung
Tabelle 7.3: SFR BAUDCON: BAUD RATE CONTROL REGISTER
SYNC BRG16 BRGH = 0 (Low Speed) BRGH = 1 (High Speed)0 0 BR = FOSC/(64(SPBRG+1)) BR = FOSC/(16(SPBRG+1))0 1 BR = FOSC/(16(SPBRGH:SPBRG+1)) BR = FOSC/(4(SPBRGH:SPBRG+1))1 0 BR = FOSC/(4(SPBRG+1)) -1 1 BR = FOSC/(4(SPBRGH:SPBRG+1)) -
Tabelle 7.4: Konfiguration des Baud-Raten-Generators (BR..Baud-Rate)
30
8 Master Synchronous Serial Port (MSSP)
8.1 Serial-Peripheral-Interface-Bus (SPI)
Bild 8.1: Prinzip-Schaltbild SPI-Schnittstelle
Bild 8.2: Prinzip-Schaltbild SPI-Schnittstelle mit 2 Slaves
Bild 8.3: MSSP in SPI-Masterbetriebsart
31
MOSI
8-Bit Schieberegister 8-Bit SchieberegisterMISO
TaktgeneratorSCK
/CEPort-Pin RxxMaster Slave
MOSI
8-Bit Schieberegister 8-Bit SchieberegisterMISO
TaktgeneratorSCK
/CEPort-Pin RB1
Master
Slave1
Port-Pin RB28-Bit Schieberegister
/CE Slave2
SSPM0
SSPBUF
SSPM1 SSPM2 SSPM3
CKE CPOLTaktgenerator
Daten-Bus
Schieberegister
SSPEN
RC5/SDO
RC4/SDI
RC3/SCK
BFWCOL
Bild 8.4: SPI Master Timing (CPHA = 0)(Quelle: Motorola Technical Data MC68HC908AB32 - Rev. 1.0)
Bild 8.5: SPI Master Timing (CPHA = 1)(Quelle: Motorola Technical Data MC68HC908AB32 - Rev. 1.0)
32
Bild 8.6: SPI Master Timing (CKE = 0)(Quelle: PICmicro 18C MCU Family Reference Manual)
Bild 8.7: SPI Master Timing (CKE = 1)(Quelle: PICmicro 18C MCU Family Reference Manual)
33
Bit 7 SMP R/W0
SampleSPI Master Mode1 = Eingangsdaten werden am Ende der Ausgabe-Zeit abgetastet0 = Eingangsdaten werden in der Mitte der Ausgabe-Zeit abgetastetSPI Slave Modemuss gelöscht werdenI²C Mode1 = Slew rate control ausgeschaltet0 = Slew rate control eingeschaltet
Bit 6 CKE R/W0
SPI Clock Edge SelectSPI Mode1 = Daten werden mit der ersten Flanke eines Taktzyklus gelesen0 = Daten werden mit der zweiten Flanke eines Taktzyklus gelesenI²C Mode1 = Eingangspegel sind konform zur SMBUS-Spezifikation0 = Eingangspegel sind konform zur I²C-Spezifikation
Bit 5 D/A R0
Data/Address (nur I²C Mode)1 = letztes empfangenes oder gesendetes Byte war ein Datum0 = letztes empfangenes oder gesendetes Byte war eine Adresse
Bit 4 P R0
Stop (nur I²C Mode)1 = ein Stop-Bit wurde als letztes erkannt0 = kein Stop-Bit wurde als letztes erkannt
Bit 3 S R0
Start (nur I²C Mode)1 = ein Start-Bit wurde als letztes erkannt0 = kein Start-Bit wurde als letztes erkannt
Bit 2 R/W R0
Read/Write information (nur I²C Mode)I²C Slave-Mode1 = Read0 = WriteI²C Master-Mode1 = Sendung ist in Bearbeitung0 = Sendung ist nicht in Bearbeitung
Bit 1 UA R0
Update Address (nur 10-Bit I²C Mode)1 = Adresse im Register SSPADD müsste erneuert werden0 = Adresse muß nicht erneuert werden
Bit 0 BF R0
Buffer Full StatusEmpfang (SPI Mode und I²C Mode)1 = Empfang abgeschlossen, SSPBUF ist voll0 = Empfang noch nicht abgeschlossenSenden (nur I²C Mode)1 = Datensendung in Bearbeitung, SSPBUF ist voll0 = Datensendung ist abgeschlossen
Tabelle 8.1: SFR SSP Status Register: SSPSTAT
34
Bit 7 WCOL R/W0
Write Collision Detect1 = SSPBUF wurde beschrieben, während das vorherige Wort noch
gesendet wurde (bzw. im I²C-Master-Mode während die I²C- Bedingungen nicht gültig waren)
0 = keine KollisionBit 6 SSPOV R/W
0Receive OverflowSPI Mode1 = im Slave-Mode wurde ein neues Byte empfangen, während
SSPBUF noch die vorherigen Daten enthielt; im Master-Mode wird SSPOV nicht gesetzt
0 = kein ÜberlaufI²C Mode1 = ein Byte wurde empfangen, während SSPBUF noch die vorherigen
Daten enthielt; im Sende-Mode ohne Bedeutung0 = kein Überlauf
Bit 5 SSPEN R/W0
Synchronous Serial Port Enable1 = Freigabe des SSP0 = SSP gesperrt
Bit 4 CKP R/W0
Clock PolaritySPI Mode1 = Ruhezustand des Taktsignal ist High-Pegel0 = Ruhezustand des Taktsignal ist Low-PegelI²C Slave Mode1 = Freigabe Takt0 = Takt Low halten (Takt dehnen, Einhaltung Data-Setup-Time)I²C Master Modeungenutzt
Bit 3Bit 2Bit 1Bit 0
SSPM3SSPM2SSPM1SSPM0
R/W0
SSP Mode0000 = SPI Master-Mode, Takt = fOSC/40001 = SPI Master-Mode, Takt = fOSC/160010 = SPI Master-Mode, Takt = fOSC/640011 = SPI Master-Mode, Takt = Timer2-Output/20100 = SPI Slave-Mode, mit /SS-Pin-Steuerung0101 = SPI Slave-Mode, ohne /SS-Pin-Steuerung0110 = I²C Slave-Mode, 7-Bit-Adresse0111 = I²C Slave-Mode, 10-Bit-Adresse1000 = I²C Master-Mode, Takt = fOSC/(4*(SSPADD+1))1011 = I²C Master-Mode (Firmware), Slave inaktiv1110 = I²C Slave-Mode, 7-Bit-Adresse mit Start/Stop-Bit-Interrupt1111 = I²C Slave-Mode, 10-Bit-Adresse mit Start/Stop-Bit-Interrupt1001, 1010, 1100, 1101 = reserviert
Tabelle 8.2: SSP Control Register: SSPCON1
35
Beispiel Ansteuerung eines Single-Port-I/O-IC
Bild 8.8: Single-Port-I/O-IC mit SPI-Schnittstelle
Bit 7Bit 6
ID1ID0
Chip Identify
Bit 5 RS Register Select1 = Datenrichtungsregister ausgewählt0 = Datenregister ausgewählt
Bit 4 R/W Read/Write1 = Schreibzugriff0 = Lesezugriff
Bit 3Bit 2
DF1DF0
Data Format (nur bei Schreibzugriff von Bedeutung)0X = Daten werden direkt in ausgewähltes Register geschrieben10 = Datenbyte dient als Maske, Bits mit Wert 1 in Maske bewirken ein Lö-
schen der korrespondierenden Bits im ausgewählten Register11 = Datenbyte dient als Maske, Bits mit Wert 1 in Maske bewirken ein
Setzen der korrespondierenden Bits im ausgewählten RegisterBit 1Bit 0
CM1CM0
Compare Mode (Eingänge werden mit den korrespondierenden Bits im Datenregister verglichen)00 = mindestens eine Nichtübereinstimmung01 = in allen Bitpositionen Übereinstimmung10 = in keiner Bitposition Übereinstimmung11 = mindestens eine Übereinstimmung
Tabelle 8.3: Steuer-Byte CDP68HC68P1
Bild 8.9: Schreib-/Lesezugriff auf CDP68HC68P1
36
CDP68HC68P1
/CE
MOSI
MISO
SCK
ID0
ID1
D0..D7
MOSI ID1 ID0 RS R/W DF1 DF0 CM1 CM0 8-Bit-DatenwortMISO Z Z ID1 ID0 RS R/W DF1 C vorheriges 8-Bit-Datenwort
/CE
Schreib-Operation
Lese-Operation
MOSI ID1 ID0 RS R/W DF1 DF0 CM1 CM0 XXXXXXXXMISO Z Z ID1 ID0 RS R/W DF1 C 8-Bit-Datenwort
/CE
X = "don't care"Z = hochohmigC = Compare-Flag (wird gespeichet, wenn /CE aktiviert wird)
8.2 Inter-Integreated-Circuit-Bus (I²C)
Bild 8.10: Prinzip-Schaltbild I²C-Bus
Bild 8.11: Pegel der Daten- und Takt-Leitung während der Datenübertragung
Bild 8.12: Vollständige Datenübertragung mit 7-Bit-Adressierung
THE I2C-BUS SPECIFICATION S.15/Fig. 11, 12
THE I2C-BUS SPECIFICATION S.15/Fig. 13
Bild 8.13: 10-Bit-Adressierung
37
SDA
8-Bit Schieberegister
TaktgeneratorSCL
Master
8-Bit Schieberegister
Slave1
8-Bit Schieberegister
Slave2
VDD2 x 1,8kΩ
SDA
SCL
S SDAunverändert
SDA-Änderung
erlaubtP
SDA
SCL
S P
1 82..7 9
ACK(Slave)
R/WAdresse
Takt-Verlängerung
91..8
ACK(Empfänger)
Daten
notacknow-ledge
11110XX 0S
write
A1 A2XXXXXXXX Data A Data A P
11110XX 0S
write
A1 A2XXXXXXXX 11110XX 1Sr
read
A3 Data A A PData
Bit 7 GCEN R/W0
General Call Enable (I²C Slave-Mode)1 = Interrupt zulassen, wenn General-Call-Adresse empfangen0 = General-Call-Adresse ausgeschaltet
Bit 6 ACKSTAT R/W0
Acknowledge Status (I²C Master-Sende-Mode)1 = kein Acknowledge vom Slave empfangen0 = Acknowledge vom Slave empfangen
Bit 5 ACKDT R/W0
Acknowledge Data (I²C Master-Empfangs-Mode)1 = Not Acknowledge wird nach einem empfangenen Byte gesendet0 = Acknowledge wird nach einem empfangenen Byte gesendet
Bit 4 ACKEN R/W0
Acknowledge Sequence Enable (nur I²C Master-Empfangs-Mode)1 = Ausführung der Acknowledge Sequence0 = Ruhezustand
Bit 3 RCEN R/W0
Receive Enable (I²C Master-Mode)1 = Ausführung der Receive Sequence0 = Ruhezustand
Bit 2 PEN R/W0
Stop Condition Enable (I²C Master-Mode)1 = Ausführung der Stop Condition Sequence0 = Ruhezustand
Bit 1 RSEN R/W0
Repeated Start Condition Enable (I²C Master-Mode)1 = Ausführung der Repeated Start Condition Sequence0 = Ruhezustand
Bit 0 SEN R/W0
Start Condition Enable (I²C Master-Mode)1 = Ausführung der Start Condition Sequence0 = RuhezustandStretch Enable (I²C Slave-Mode)1 = Ausführung der Taktzeitverlängerung0 = keine Taktzeitverlängerung
Tabelle 8.4: SSP Control Register 2: SSPCON2
Bild 8.14: Mikrocontroller-Erweiterung am I²C-Bus
38
Programmbeispiel: I²C-Funktionen
// Unterprogramm zum Schreiben eines Bytes über den I²C-Busvoidvoidvoidvoid write_i2c((((unsignedunsignedunsignedunsigned charcharcharchar address,,,, unsignedunsignedunsignedunsigned charcharcharchar value)))) PIR1bits....SSPIF ==== 0;;;; // reset SSPIF // *********** Start senden SSPCON2bits....SEN ==== 1;;;; whilewhilewhilewhile (!(!(!(!PIR1bits....SSPIF);););); // warte solange SSPIF = 0 PIR1bits....SSPIF ==== 0;;;; // reset SSPIF // *********** Adresse senden SSPBUF ==== address;;;; whilewhilewhilewhile (!(!(!(!PIR1bits....SSPIF);););); // warte solange SSPIF = 0 PIR1bits....SSPIF ==== 0;;;; // reset SSPIF // *********** Daten-Byte senden SSPBUF ==== ~~~~value;;;; whilewhilewhilewhile (!(!(!(!PIR1bits....SSPIF);););); // warte solange SSPIF = 0 PIR1bits....SSPIF ==== 0;;;; // reset SSPIF // *********** Stop senden SSPCON2bits....PEN ==== 1;;;; whilewhilewhilewhile (!(!(!(!PIR1bits....SSPIF);););); // warte solange SSPIF = 0 PIR1bits....SSPIF ==== 0;;;; // reset SSPIF
// Unterprogramm zum Lesen eines Bytes über den I²C-Busunsignedunsignedunsignedunsigned charcharcharchar read_i2c((((unsignedunsignedunsignedunsigned charcharcharchar address)))) unsignedunsignedunsignedunsigned charcharcharchar rec_byte;;;;
PIR1bits....SSPIF ==== 0;;;; // reset SSPIF // *********** Start senden SSPCON2bits....SEN ==== 1;;;; whilewhilewhilewhile (!(!(!(!PIR1bits....SSPIF);););); // warte solange SSPIF = 0 PIR1bits....SSPIF ==== 0;;;; // reset SSPIF // *********** Adresse senden SSPBUF ==== address;;;; whilewhilewhilewhile (!(!(!(!PIR1bits....SSPIF);););); // warte solange SSPIF = 0 PIR1bits....SSPIF ==== 0;;;; // reset SSPIF // *********** Byte empfangen SSPCON2bits....RCEN ==== 1;;;; whilewhilewhilewhile (!(!(!(!PIR1bits....SSPIF);););); // warte solange SSPIF = 0 rec_byte ==== SSPBUF;;;; PIR1bits....SSPIF ==== 0;;;; // reset SSPIF // *********** Not Acknowledge senden SSPCON2bits....ACKDT ==== 1;;;; SSPCON2bits....ACKEN ==== 1;;;; whilewhilewhilewhile (!(!(!(!PIR1bits....SSPIF);););); // warte solange SSPIF = 0 PIR1bits....SSPIF ==== 0;;;; // reset SSPIF // *********** Stop senden SSPCON2bits....PEN ==== 1;;;; whilewhilewhilewhile (!(!(!(!PIR1bits....SSPIF);););); // warte solange SSPIF = 0 PIR1bits....SSPIF ==== 0;;;; // reset SSPIF
returnreturnreturnreturn rec_byte;;;;
39
9 Interrupt-System
Bild 9.1: Interrupt-Mechanismus
Bild 9.2: Interrupt-Quellen im Mikrocontroller PIC18F4520
40
Int-Vektor
Return-From-Int
Reg. sichern
Reg. wiederherst.
ISR
Hauptprogramm
RB0 oder
RB1 oder
RB2 oder
INT0IF
INT1IF
INT2IF
RB4 .. RB7 oder RBIF
TMR0IF
TMR1IF
TMR2IF
TMR3IF
CCP1IFRC2-Capt. od. Comp.
CCP2IFRC1-/RB3-Capt. od. Comp.
ADIFEnd of Conversion
Externer Interrupt 0
Externer Interrupt 1
Externer Interrupt 2
Port Change Interrupt
Timer 0 Überlauf
Timer 1 Überlauf
Timer 2 Periode
Timer 3 Überlauf
Compare/Capture 1
Compare/Capture 2
A/D Converter
PSPIFSchreib-/Lese-Operatiopn Parallel Slave Port
RCIFEmpfangs-Puffer voll EUSART Receive
TXIFSende-Puffer leer EUSART Transmit
SSPIFSenden/Empfang beendet Master Sync. Serial Port
OSCFIFFehler ext. Osz. Überwachung Oszillator
CMIFÄnderung Comp.-Ausgang Comparator
EEIFSchreib-Operation beendet EEPROM/Flash
BCLIFBus-Kollision I²C-Bus
HLVIFVDD-Überwachung High/Low-Voltage
Inte
rrup
t-A
ktiv
ieru
ng u
nd P
rioris
ieru
ng
Bit 7 IPEN R/W0
Interrupt Priority Enable Flag1 = Interrupt-Prioritäten aktiviert0 = keine Interrupt-Prioritäten (PIC16-Kompatibilität)
Bit 6 SBOREN R/W1
Software Brown-Out-Reset Enable Bit (BOREN1:BOREN0 = 01)1 = BOR aktiviert0 = BOR deaktiviert
Bit 5 - nicht implementiertBit 4 /RI R/W
1RESET Instruction Flag1 = RESET-Befehl nicht ausgeführt0 = RESET-Befehl ausgef. (muß per Software wieder gesetzt werden)
Bit 3 /TO R1
Watchdog Time-out Flag bit1 = Power-On, CLRWDT- oder SLEEP-Befehl0 = Watchdog-Timeout aufgetreten
Bit 2 /PD R1
Power-Down-Flag1 = Power-On oder CLRWDT-Befehl0 = SLEEP-Befehl
Bit 1 /POR R/W0
Power-On-Reset Flag1 = kein Power-On-Reset aufgetreten0 = Power-On aufgetreten (muß per Software wieder gesetzt werden)
Bit 0 /BOR R/W0
Brown-Out-Reset-Flag1 = kein Brown-Out-Reset aufgetreten0 = Brown-Out aufgetreten (muß per Software wieder gesetzt werden)
Tabelle 9.1: Reset Control Register – RCON
Bit 7 GIE/GIEH R/W0
Global Interrupt Enable/ Global Interrupt Enable High1 = erlaubt alle unmaskierten / hochprioren Interrupts (IPEN=0/1)0 = sperrt alle Interrupts
Bit 6 PEIE/GIEL
R/W0
Peripheral Interrupt Enable/ Global Interrupt Enable Low1 = erlaubt alle unmaskierten Peripherie-/niederprioren Int.(IPEN=0/1)0 = sperrt alle Peripherie-Interrupts/ niederprioren Interrupts
Bit 5 TMR0IE R/W0
Timer0 Interrupt Enable1 = erlaubt den Timer0-Überlauf-Interrupt0 = sperrt den Timer0-Überlauf-Interrupt
Bit 4 INT0IE R/W0
INT0 Interrupt Enable1 = erlaubt den externen Interrupt 00 = sperrt den externen Interrupt 0
Bit 3 RBIE R/W0
RB Interrupt Enable (Pegeländerung an RB<7:4>)1 = erlaubt den Interrupt bei Pegeländerung0 = sperrt den Interrupt bei Pegeländerung
Bit 2 TMR0IF R/W0
Timer0 Interrupt Flag (Timer0-Überlauf)1 = Timer0-Überlauf aufgetreten0 = Timer0-Überlauf nicht aufgetreten
Bit 1 INT0IF R/W0
INT0 Interrupt Flag1 = externer Interrupt 0 aufgetreten0 = externer Interrupt 0 nicht aufgetreten
Bit 0 RBIF R/WX
RB Interrupt Flag (Pegeländerung an RB<7:4>)1 = Pegeländerung an RB aufgetreten0 = Pegeländerung an RB nicht aufgetreten
Tabelle 9.2: Interrupt Control Register – INTCON
41
Bit 7 /RBPU R/W1
RB Pull-up Enable1 = alle Pull-up-Widerstände an Port RB gesperrt0 = Pull-up-Widerstände an Port RB individuell durch Latch-Wert akt.
Bit 6 INTEDG0 R/W1
Interrupt Edge 01 = steigende Flanke INT0 ausgewählt0 = fallende Flanke INT0 ausgewählt
Bit 5 INTEDG1 R/W1
Interrupt Edge 11 = steigende Flanke INT1 ausgewählt0 = fallende Flanke INT1 ausgewählt
Bit 4 INTEDG2 R/W1
Interrupt Edge 21 = steigende Flanke INT2 ausgewählt0 = fallende Flanke INT2 ausgewählt
Bit 3 - nicht implementiertBit 2 TMR0IP R/W
1Timer0 Interrupt Priority1 = hohe Priorität0 = niedrige Priorität
Bit 1 - nicht implementiert
Bit 0 RBIP R/W1
RB Interrupt Priority1 = hohe Priorität0 = niedrige Priorität
Tabelle 9.3: Interrupt Control Register 2 – INTCON2
Bit 7 INT2IP R/W1
INT2 Interrupt Priority1 = hohe Priorität0 = niedrige Priorität
Bit 6 INT1IP R/W1
INT1 Interrupt Priority1 = hohe Priorität0 = niedrige Priorität
Bit 5 - nicht implementiertBit 4 INT2IE R/W
0INT2 Interrupt Enable1 = INT2 aktiviert0 = INT2 gesperrt
Bit 3 INT1IE R/W0
INT1 Interrupt Enable1 = INT1 aktiviert0 = INT1 gesperrt
Bit 2 - nicht implementiert
Bit 1 INT2IF R/W0
INT2 Interrupt Flag1 = Interrrupt aufgetreten0 = Interrrupt nicht aufgetreten
Bit 0 INT1IF R/W0
INT1 Interrupt Flag1 = Interrrupt aufgetreten0 = Interrrupt nicht aufgetreten
Tabelle 9.4: Interrupt Control Register 3 – INTCON3
42
Bit 7 PSPIF R/W0
Parallel Slave Port Interrupt Flag1 = ein Lese- oder Schreibzugriff auf den PSP ist erfolgt0 = kein Lese- oder Schreibzugriff auf den PSP ist erfolgt
Bit 6 ADIF R/W0
A/D Converter Interrupt Flag1 = die A/D-Wandlung wurde abgeschlossen0 = die A/D-Wandlung ist noch nicht abgeschlossen
Bit 5 RCIF R/W0
USART Receive Interrupt Flag1 = im USART-Empfangs-Puffer (RCREG) steht ein Zeichen0 = der USART-Empfangs-Puffer ist leer
Bit 4 TXIF R/W0
USART Transmit Interrupt Flag1 = der USART-Sende-Puffer (TXREG) ist wieder leer0 = der USART-Sende-Puffer ist noch nicht leer
Bit 3 SSPIF R/W0
Synchronous Serial Port Interrupt Flag1 = ein Sende/Empfangs-Vorgang hat stattgefunden0 = kein Sende/Empfangs-Vorgang hat stattgefunden
Bit 2 CCP1IF R/W0
CCP1 Interrupt Flag1 = ein Timer1-Compare/Capture-Ereignis ist aufgetreten0 = kein Timer1-Compare/Capture-Ereignis ist aufgetreten
Bit 1 TMR2IF R/W0
Timer2 to PR2 Match Interrupt Flag1 = Timer2-Compare PR2 Reset-Ereignis ist aufgetreten0 = Timer2-Compare PR2 Reset-Ereignis ist nicht aufgetreten
Bit 0 TMR1IF R/W0
Timer1 Overflow Interrupt Flag1 = Timer1 Zählregister-Überlauf0 = kein Timer1 Zählregister-Überlauf
Tabelle 9.5: Peripheral Interrut Request Register 1 – PIR1
Bit 7 OSCFIF R/W0
Oscillator Fail Interrupt Flag1 = Fehler externe Takterzeugung, Umschaltung auf INTOSC0 = Takterzeugung OK
Bit 6 CMIF R/W0
Comparator Interrupt Flag1 = Umschaltung Comparator0 = keine Änderung Comparator-Zustand
Bit 5 - nicht implementiert
Bit 4 EEIF R/W0
EEPROM/Flash Interrupt Flag1 = EEPROM/Flash-Schreiboperation abgeschlossen0 = EEPROM/Flash-Schreiboperation nicht abgeschl. bzw. gestartet
Bit 3 BCLIF R/W0
Bus Collision Interrupt Flag1 = Bus-Kollision aufgetreten0 = keine Bus-Kollision aufgetreten
Bit 2 HLVDIF R/W0
High/Low Voltage Detect Interrupt Flag1 = High/Low-Spannungs-Bedingung eingetreten0 = keine High/Low-Spannungs-Bedingung eingetreten
Bit 1 TMR3IF R/W0
Timer3 Interrupt Flag1 = Timer3 Überlauf aufgetreten0 = kein Timer3 Überlauf aufgetreten
Bit 0 CCP2IF R/W0
CCP2 Interrupt Flag (im PWM-Mode ungenutzt)1 = Timer1-Capture/Compare-Ereignis aufgetreten0 = kein Timer1-Capture/Compare-Ereignis aufgetreten
Tabelle 9.6: Peripheral Interrut Request Register 2 – PIR2
43
10 Ergänzungen
00 1 02 03 04 05 06 07NUL SOH STX ETX EOT ENQ ACK BEL
08 09 0A 0B 0C 0D 0E 0FBS HAT LF VT FF CR SO SI
10 11 12 13 14 15 16 17DLE DC1 DC2 DC3 DC4 NAK SYN ETB
18 19 1A 1B 1C 1D 1E 1FCAN EM SUB ESC FS GS RS US
20 21 22 23 24 25 26 27! " # $ % & '
28 29 2A 2B 2C 2D 2E 2F( ) * + , - . /
30 31 32 33 34 35 36 370 1 2 3 4 5 6 7
38 39 3A 3B 3C 3D 3E 3F8 9 : ; < = > ?
40 41 42 43 44 45 46 47@ A B C D E F G
48 49 4A 4B 4C 4D 4E 4FH I J K L M N O
50 51 52 53 54 55 56 57P Q R S T U V W
58 59 5A 5B 5C 5D 5E 5FX Y Z [ \ ] ^ _
60 61 62 63 64 65 66 67` a b c d e f g
68 69 6A 6B 6C 6D 6E 6Fh i j k l m n o
70 71 72 73 74 75 76 77p q r s t u v w
78 79 7A 7B 7C 7D 7E 7Fx y z | ~ DEL
Tabelle 10.1: Der ASCII-Zeichensatz
44