PIC mikrovezérlők fejlődése
A PIC18-as mikrovezérlő család (vázlat) Dr. Hidvégi Timót
SRAM
Adatmemória
• Fejlesztőeszközök – fejlesztőszoftverek (MpLabIDE, mikroC, mikroPascal) – Demokártyák (Microchip, stb.)
• Programozás (assembly és „C” alapok) – különböző belső modulok használata (pl.: A/D, TimerX, interrupt)
• Példák • Irodalomjegyzék
1
I/O A/D CCP
MSSP
Timers USB
CAN
8/16 bit
SPI
Programmemória
– összehasonlítás a korábbi és későbbi eszközökkel
I2 C
• Alkalmazhatóság • PIC architektúra
USART
Összehasonlítás
EEPROM
Tartalomjegyzék
13K50
8K
512
256
15
11
1
1/3
1
14K50
16K
512
256
15
11
1
1/3
1
4550
8K
512
256
15
11
1
1/3
1
6680
8K
512
256
15
11
1
1/3
1
8860
8K
512
256
15
11
1
1/3
1
2
16F architektúra
Órajel előállítása • LP (alacsony frekvenciájú CLK)
• • • • •
XT (kristály) HS (nagyfrekvenciájú kristály) RC (külső RC tag) EC (külső CLK) ECIO (külső CLK, IO láb engedélyezve)
• HS+PLL (PLL engedélyezve) • RCIO (külső RC tag, IO láb engedélyezve)
• ECIO+SPLL (külső CLK PLLlel)
• ECIO+PLL (külső CLK PLLlel, IO láb engedélyezve)
• HS+SPLL (HS + szoftveresen felügyelt PLL-lel)
LP, XT, HS
Kristály
3
Kerámia
4
RC oszcillátor
PLL
Külső órajel (EC)
Órajelátkapcsolás Nem minden PIC18F mikrovezérlőnél létezik!
EC
ECIO
5
6
Órajelátkapcsolás regisztere
Programmemória
Órajelszervezés
Sleep / Idle • Idle : a CPU nem működik, a periféria igen • Sleep : a CPU és a periféria sem működik – Akkor alakul ki, ha: • MCLR/VPP lábon logikai „1” van • Sleep parancs kiadása – Mi történik? • Oszcillátor leáll • I/O portok megőrzik állapotuka • WDT-t és az osztóját törli • TO = 1 (WDT nulláza túlcsorduláskor), PD = 0 (tápfesz megjelenésekor „1” lesz, ez törlődik)
– Mi történik induláskor? • RCON bitek vizsgálata, hogy mi az ébresztés oka
7
8
Ébresztés sleep-ből • • • • • •
WatchDog Timer
Tápfeszültség bekapcsolása reset (POR) WDT túlcsordulás MCLR/VPP = „0” (külső reset) „B” portnál bemenetváltozás történik Megszakítás INTx lábon Periférikus egységek megszakítása – – – – –
TMR1, TMR3 CCP capture USART A/D konverzió vége SSP1 modul, ha létrejön egy triggerjel
Engedélyezés
Időzítők / számlálók
Timer0
(8 bites üzemmód)
• WDT • Timer0 : 8/16 bites – írható/olvasható (de nem az osztó!) – szoftverrel módosítható (8/16) – túlcsorduláskor megszakítást generál (sleep-ben nem)
• Timer1 : 16 bites • másodlagos órajel
• Timer2 : 8 bites • Timer3 : 16 bites
8/16 bites
• másodlagos órajel
Órajel forrása (RA4/T0CKI)
Fel/lefutó él
Osztó bekapcsolása
T0PS2:0 : osztás a 2 egész számú hatványaival
9
10
Timer0
Timer1 blokkvázlata
(16 bites üzemmód)
16 bites üzemmódban a felső byte közvetlenül nem írható/olvasható
Timer1
Timer2 blokkvázlata
• 16 bites számláló/időzítő (két regiszter) • Olvasható/írható • Megszakítást generál túlcsorduláskor • Belső/külső órajel
11
12
Timer3 blokkvázlata
A/D modul regiszterei • Eredmény tárolása: – ADRESH – ADRESL
(az eredmény felső 8 bitje) (az eredmény alsó 8 bitje)
• Konfigurációs regiszterek (max 3) – ADCON0 – ADCON1 – ADCON2
A/D átalakító
ADCON0 Max 16 csatorna 10 bites felbontás
13
14
ADCON1
Interrupt
ADCON2
RCON regiszter
15
(kétszintű)
16
Interrupt regiszterek 1.
Interrupt regiszterek 3.
INTCON
PIR1
INTCON2
PIR2
INTCON3
PIR3
Interrupt regiszterek 2.
(periféria kérés)
Interrupt regiszterek 3.
(periféria eng.)
PIE1
IPR1
PIE2
IPR2
PIE3
IPR3
17
(prioritás)
18
MPLABIDE
Fejlesztőrendszerek
(eszközkiválasztás)
• MpLabIDE (www.microchip.com) • Mikro (www.mikroe.com) – MikroBasic – MikroC – MikroPascal
MPLABIDE
MPLABIDE
(bejelentkezőkép)
19
(a fordítóprogram kiválasztása)
20
MPLABIDE
MPLABIDE
(a projekt elmentése)
MPLABIDE
(a forrás hozzáadása a projekthez)
MPLABIDE
(a projekt leírása)
21
(a forrásfile fordítása)
22
MPLABIDE
(szimuláció kiválasztása)
MPLABIDE
(szimuláció, watch ablak)
MPLABIDE
(az eszköz típusának kiválasztása)
MPLABIDE
23
(konfigurációs bitek beállítása)
24
MPLABIDE
MikroC
(szimuláció logikai analizátorral)
MikroC
(projekt jellemzőinek meghatározása)
MikroC
(bejelentkezőkép)
25
(fordítás)
26
MikroC
MikroC
MikroC
(szimuláció indítása)
(függvénykönyvtár)
Programozási lehetőségek
(szimuláció, watchablak)
• Assembly • „C” nyelv, fordítók • HI-TEC C fordító • MCC18, 24, 32 fordítók, Student változat (60 napos verziók)
• stb
27
28
Példák assembly nyelven
Bitműveletek
• Byte mozgatások • Bitműveletek • Aritmetika • Feltételes szerkezetek • Ciklusok • Néhány modul programozása (Timer0,
; az FR1 regiszter 3. bitjét 0-ra, 4. bitjét 1-be állítjuk ; feltöltjük a regisztert movlw B’00110011’ ; a Wreg-be írjuk a 33h-t movwf FR1 ; Wreg tartalma az FR1 regiszterbe kerül ; bitműveletek bsf FR1,4 ; a 4. bit egy lesz bcf FR1,3 ; a 3. bit nulla lesz
A/D, interrupt)
XXXXXXXX FR1
XXX1XXXX bsf FR1,4
XXXXXXXX FR1
Byte mozgatások
Wreg movlw
fileregiszter1
bcf FR1,3
FR1
Feltételes szerkezetek
; a B és a C portok konfigurálása movlw B’00001111’ ; Wreg-be tesszük a 0F-et, felső 4 bit kimenet, alsó ; 4 bit bemenet movwf TRISB ; Wreg-ből átmásoljuk a TRISB-be az 00001111-et movlw 0xF0 ; az F0 konstanst betesszük a Wreg-be, ; a felső 4 bit bemenet, alsó 4 kimenet lesz movwf TRISC ; a Wreg értékét átmásoljuk a TRISC-be
konstans
FR1 XXXX0XXX
btfsc FR1,X ; 0≤X≤7 label1 utasítás1 label2 utasítás2
btfss FR1,X ; 0≤X≤7 label1 utasítás1 label2 utasítás2
fileregiszter movwf
fileregiszter2 movff
29
30
Ciklusok mag
folyt
Sajátfüggvény 1.
(hátultesztelős)
movlw B’00001111’ ; 15d-t írunk a Wreg-be movwf FR1 ; a 15d bekerül az FR1- regiszterbe utasítás 1. utasítás 2.
(nincs értékátadás)
#include
// a Hi-Tech C fordítónál int i,j; keses() { for(i=1; i<10000; i++) {} } main() { TRISB = 0x00;
utasítás n. decfsz FR1,? ; 0 v 1, döntsük el! goto mag utasítás m. utasítás m+1. . . .
while(1) { PORTB = 0x00; keses(); PORTB = 0x01; keses(); } }
Példák „C” nyelven
Interrupt 16F (HITEC-C) static void interrupt isr(void) { if(!T0IF) bad_intr = 1; count++; T0IF = 0; PORTA ^= 1; }
• „C” nyelv alapjai • Sajátfüggvények • Header file-ok
31
32
Interrupt 18F (MCC18, EGYSZINTŰ) #pragma code InterruptVectorHigh = 0x08 void InterruptVectorHigh (void) { _asm goto InterruptHandlerHigh //jump to interrupt routine _endasm }
Programozás, fejlesztés
#pragma code #pragma interrupt InterruptHandlerHigh
PICKIT2
void InterruptHandlerHigh () { if (INTCONbits.TMR0IF) { INTCONbits.TMR0IF = 0; Flags.Bit.Timeout = 1; LATBbits.LATB0 = !LATBbits.LATB0; //toggle LED on RB0 } }
ICD2
Interrupt 18F (MCC18, KÉTSZINTŰ) #pragma code high_vector_section=0x8 void high_vector (void) { _asm GOTO button _endasm } #pragma code low_vector_section=0x18 void low_vector (void) { _asm GOTO tmr2 _endasm } #pragma code
Bootloader
#pragma interruptlow tmr2 void tmr2 (void) {
extern void _startup (void); #pragma code _RESET_INTERRUPT_VECTOR = 0x000800 void _reset (void) { _asm goto _startup _endasm } #pragma code
// Ide kerül az interruptfüggvény } #pragma interrupt button void button (void) { // Ide kerül az interruptfüggvény }
33
34