PIC mikrovezérlők fejlődése A PIC18-as mikrovezérlő család (vázlat) Dr. Hidvégi Timót Tartalomjegyzék Alkalmazhatóság PIC architektúra összehasonlítás a korábbi és későbbi eszközökkel 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 13K50 14K50 4550 6680 8860 Összehasonlítás Programmemória Adatmemória SRAM EEPROM I/O A/D CCP MSSP Timers USB SPI I 2 C 8/16 bit 8K 512 256 15 11 1 1/3 1 16K 512 256 15 11 1 1/3 1 8K 512 256 15 11 1 1/3 1 8K 512 256 15 11 1 1/3 1 8K 512 256 15 11 1 1/3 1 USART CAN 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 Kerámia 3 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 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 másodlagos órajel 8/16 bites Timer0 (8 bites üzemmód) Ó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 (16 bites üzemmód) Timer1 blokkvázlata 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 (az eredmény felső 8 bitje) ADRESL (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 (kétszintű) ADCON2 RCON regiszter 15 16
Interrupt regiszterek 1. Interrupt regiszterek 3. (periféria kérés) INTCON PIR1 INTCON2 PIR2 INTCON3 PIR3 Interrupt regiszterek 2. (periféria eng.) Interrupt regiszterek 3. (prioritás) PIE1 IPR1 PIE2 IPR2 PIE3 IPR3 17 18
Fejlesztőrendszerek MPLABIDE (eszközkiválasztás) MpLabIDE Mikro (www.mikroe.com) MikroBasic MikroC MikroPascal (www.microchip.com) MPLABIDE (bejelentkezőkép) MPLABIDE (a fordítóprogram kiválasztása) 19 20
MPLABIDE (a projekt elmentése) MPLABIDE (a forrás hozzáadása a projekthez) MPLABIDE (a projekt leírása) MPLABIDE (a forrásfile fordítása) 21 22
MPLABIDE (szimuláció kiválasztása) MPLABIDE (az eszköz típusának kiválasztása) MPLABIDE (szimuláció, watch ablak) MPLABIDE (konfigurációs bitek beállítása) 23 24
MPLABIDE (szimuláció logikai analizátorral) MikroC (projekt jellemzőinek meghatározása) MikroC (bejelentkezőkép) MikroC (fordítás) 25 26
MikroC (szimuláció indítása) MikroC (függvénykönyvtár) MikroC (szimuláció, watchablak) Programozási lehetőségek 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 Byte mozgatások Bitműveletek Aritmetika Feltételes szerkezetek Ciklusok Néhány modul programozása (Timer0, A/D, interrupt) Bitműveletek ; 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 XXXXXXXX FR1 bsf FR1,4 XXX1XXXX FR1 XXXXXXXX FR1 bcf FR1,3 XXXX0XXX FR1 Byte mozgatások 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 label1 label2 btfsc FR1,X ; 0 X 7 utasítás1 utasítás2 label1 label2 btfss FR1,X ; 0 X 7 utasítás1 utasítás2 konstans Wreg fileregiszter movlw movwf fileregiszter1 fileregiszter2 movff 29 30
Ciklusok (hátultesztelős) movlw B 00001111 ; 15d-t írunk a Wreg-be movwf FR1 ; a 15d bekerül az FR1- regiszterbe mag utasítás 1. utasítás 2. utasítás n. decfsz FR1,? ; 0 v 1, döntsük el! goto mag folyt utasítás m. utasítás m+1.... Sajátfüggvény 1. (nincs értékátadás) #include <pic.h> // a Hi-Tech C fordítónál int i,j; keses() for(i=1; i<10000; i++) main() TRISB = 0x00; while(1) PORTB = 0x00; keses(); PORTB = 0x01; keses(); C nyelv alapjai Sajátfüggvények Header file-ok Példák C nyelven Interrupt 16F (HITEC-C) static void interrupt isr(void) if(!t0if) bad_intr = 1; count++; T0IF = 0; PORTA ^= 1; 31 32
Interrupt 18F (MCC18, EGYSZINTŰ) Programozás, fejlesztés #pragma code InterruptVectorHigh = 0x08 void InterruptVectorHigh (void) _asm goto InterruptHandlerHigh //jump to interrupt routine _endasm #pragma code #pragma interrupt InterruptHandlerHigh void InterruptHandlerHigh () if (INTCONbits.TMR0IF) INTCONbits.TMR0IF = 0; Flags.Bit.Timeout = 1; LATBbits.LATB0 =!LATBbits.LATB0; //toggle LED on RB0 PICKIT2 ICD2 Interrupt 18F (MCC18, KÉTSZINTŰ) Bootloader #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 #pragma interruptlow tmr2 void tmr2 (void) // Ide kerül az interruptfüggvény #pragma interrupt button void button (void) // Ide kerül az interruptfüggvény extern void _startup (void); #pragma code _RESET_INTERRUPT_VECTOR = 0x000800 void _reset (void) _asm goto _startup _endasm #pragma code 33 34