L4.1 Lecia 4. Utilizarea numrtoarelor [604411]
L4.1 Lec\ia 4. Utilizarea num[r[toarelor
4.1. Obiectivul lec\iei
Realizarea unui program simplu de utilizare a TIMER -ului 0 (PIC18F4520).
4.2. Resurse necesare
Pentru realizarea proiectului sunt necesare urm[toarele resurse software :
• mediul integrat pentru dezvoltarea aplica\iilor MPLAB IDE ;
• compilatorul C pentru familia de microcontrollere PIC18F MCC18 ;
• interfa\a grafic[ pentru program area serial[ a memoriei FLASH PICUL (PIC USART
Loader V 2.0.0 sau PIC USART Bootloader V1.3).
Resurse hardware :
• placa de dezvoltare KT458-V0 (cu nucleul K4520 V1.0).
4.3. Preg[tirea hardware-ului
Se procedeaz[ conform lec\iei 1.
4.4. Realizarea programului
4.4.1. Func\ia programului =i detalii hardware
Programul utilizeaz[ modulul TIMER 0 pentru aprinderea intermitent[ a backlight-ului.
}n figura 4.1 este prezentat[ schema bloc a modulului TIMER 0.
Figura 4.1. Modulul TIMER 0.
Func\ionarea sa este controlat[ cu ajut orul registrului T0CON (vezi figura 4.2).
Aplica\ia de fa\[ utilizeaz[ modulul ]n mod temporizator ( timer ) care genereaz[ o ]n trerupere la fiecare
0.5 secunde (frecven\a ]ntreruperilor: FT0=2 Hz).
Deoarece ceasul sistem are frecven\a de 12 MHz, la n\ul format din prescaler =i TIMER0 trebuie s[
realizeze o divizare de 1:N, unde:
1500000=⋅=⋅=2412000000
F4FN
0TOSC
Aleg`nd pentru prescaler o divizare de 1:32, TIMER0 trebuie s[ ge nereze o ]ntrerupere la fiecare
46875= ==321500000
ePrNN0T impulsuri cu frecven\a FCY.
}n consecint[, valoarea de re]nc[r care pentru TIMER0 este: 65536-46875 =18661 =0x48E5.
}n program acest[ constant[ este numit[ “TMR0_RELOAD”.
Lec\ia 4. Utilizarea num[r[toarelor
L4.2 Figura 4.2. Registrul T0CON.
Figura 4.3. Registrul INTCON.
Lec\ia 4. Utilizarea num[r[toarelor
L4.3 Bi\ii registrului T0CON se vor programa astfel:
• T0PS2:0 =100 ⇒ prescaler 1:32
• PSA=0 ⇒ prescaler asignat
• T0CS =0 ⇒ sursa este TCY
• T08BIT =0 ⇒ num[r[tor pe 16 bi\i
Bitul TMR0ON se va pune ]n “1” pentru a porni num[r[torul =i ]n “0” pentru a-l opri.
}ntreruperea generat[ de dep[=ire a TIMER 0 utilizeaz[ bi\ii TMR0IF (semafor de ]ntrerupere) =i
TMR0IE (semafor de activare ]ntrerupere). Ace=ti bi \i se g[sesc ]n registrul INTCON (vezi figura 4.3).
}ntreruperile se activeaz[ global cu bitul GIE/GIEH din acela=i registru.
4.4.2. Generarea proiectului
Se creaz[ un nou proiect cu numele “Lectia4” ]n directorul “ C:\MPLAB\Work\Tutorial\L4 ” (vezi
Lec\ia 1).
Fi=ierul “main.c” are urm[torul con\inut:
/***********************************************
main.c Tutorial Lectia 4 Utilizare Timer 0 pe intreruperi Hardware: KT458-V0 (PIC18F4520) Nucleu: K5420 V1.0 Adresa de start Firmware: 0x400 Resurse utilizate: RC1 – intrare tasta RIGHT RC5 – iesire LCD backlight ***********************************************/ /***********************************************
Fisiere incluse
***********************************************/ #include <p18cxxx.h> /*********************************************** Definitii ***********************************************/ #define BKL LATCbits.LATC5 // Comanda backlight #define RIGHT PORTCbits.RC1 // Tasta RIGHT // Macro-uri pentru comanda backlight #define BKL_Off() BKL = 0 #define BKL_On() BKL = 1 #define BKL_Toggle() BKL = !BKL // Constante temporizari #define TMR0_RELOAD 0x48E5 // Perioada Timer 0 /*********************************************** Prototipuri ***********************************************/ void high_isr(void); void low_isr(void);
/***********************************************
Redirectari intreruperi ***********************************************/ #pragma code high_vector = 0x408 void interrupt_at_high_vector(void) { _asm goto high_isr _endasm }//end interrupt_at_high_vector
Lec\ia 4. Utilizarea num[r[toarelor
L4.4 #pragma code low_vector = 0x418
void interrupt_at_low_vector(void) { _asm goto low_isr _endasm }//end interrupt_at_low_vector /*********************************************** Rutine de tratare a intreruperilor (ISR) ***********************************************/ #pragma code #pragma interrupt high_isr void high_isr(void) { // Intrerupere Timer 0 if(INTCONbits.TMR0IF) { T0CONbits.TMR0ON = 0; // Stop Timer 0 INTCONbits.TMR0IF = 0; // Sterge semafor intrerupere
TMR0H = (TMR0_RELOAD >> 8) & 0xFF; // Incarca valoare temporizare
TMR0L = TMR0_RELOAD & 0xFF; T0CONbits.TMR0ON = 1; // Start Timer 0 BKL_Toggle(); } }//end high_isr #pragma interruptlow low_isr void low_isr(void) { }//end low_isr /*********************************************** Functia main ***********************************************/ #pragma code void main(void) { // Initializare pini interfata LATAbits.LATA4 = 1; // Initializare PORT LATCH TRISAbits.TRISA4 = 1; // RA4 intrare LATC = 0b11011111; // Initializare PORT LATCH
TRISC = 0b11011111; // RC5 – iesire, restul intrari
// Initializare Timer 0 T0CON = 0b00000100; // |||||||| // |||||+++––––––––––> T0PS2:0=100 -> prescaler 1:32 // ||||+–––––––––––> PSA=0 -> utilizeaza prescaler // |||+–––––––––––> T0SE=0 (N.U.) // ||+–––––––––––-> T0CS=0 -> sursa Tcy // |+––––––––––––> T08BIT=0 -> 16 biti // +––––––––––––> TMR0ON=0 -> stop Timer 0 TMR0H = (TMR0_RELOAD >> 8) & 0xFF; // Incarca valoare temporizare TMR0L = TMR0_RELOAD & 0xFF; INTCONbits.TMR0IF = 0; // Sterge semafor intrerupere T0CONbits.TMR0ON = 1; // Start Timer 0 // Activeaza intreruperile INTCONbits.TMR0IE = 1; // Activeaza intrerupere Timer 0 INTCONbits.GIEH = 1; // Activeaza global intreruperile while(1) { if(!RIGHT) // Test tasta RIGHT apasata
Reset(); // Reset
}//end while }//end main /*********************************************** End Of File main.c ***********************************************/
Se compileaz[ proiectul =i se verific[ apari\ia ]n directorul “ C:\MPLAB\Work\Tutorial\L4\_output ” a
fi=ierului “Lectia4.hex”.
Lec\ia 4. Utilizarea num[r[toarelor
L4.5 O alt[ variant[ a programului, care nu utilizeaz[ ]ntr eruperea Timer 0, este prezentat[ mai jos.
Pentru a u=ura programare a oric[rei perioade a timer-ului, form ulele din paragraful 4.4.1 au fost
introduse ]n program sub form a unor defini\ii (vezi sec\i unea “Constante Timer 0”).
/***********************************************
main.c Tutorial Lectia 4 Utilizare Timer 0 fara intreruperi Hardware: KT458-V0 (PIC18F4520) Nucleu: K5420 V1.0 Adresa de start Firmware: 0x400 Resurse utilizate: RC1 – intrare tasta RIGHT RC5 – iesire LCD backlight ***********************************************/
/***********************************************
Fisiere incluse ***********************************************/ #include <p18cxxx.h> /*********************************************** Definitii ***********************************************/ #define BKL LATCbits.LATC5 // Comanda backlight #define RIGHT PORTCbits.RC1 // Tasta RIGHT // Macro-uri pentru comanda backlight #define BKL_Off() BKL = 0 #define BKL_On() BKL = 1 #define BKL_Toggle() BKL = !BKL // Frecventa oscilator (Hz) #define FOSC 12000000UL // Constante Timer 0 #define TMR0_PERIOD 500 // Perioada TIMER0 [ms] #define TMR0_PRE_MASK 0b100 // Masca prescaler (1:32) #define TMR0_PRE (1UL << (TMR0_PRE_MASK + 1)) #define TMR0_RELOAD 0x10000UL – FOSC/4000UL * TMR0_PERIOD/TMR0_PRE
/*********************************************** Prototipuri ***********************************************/ void high_isr(void); void low_isr(void); /*********************************************** Redirectari intreruperi ***********************************************/ #pragma code high_vector = 0x408 void interrupt_at_high_vector(void) { _asm goto high_isr _endasm }//end interrupt_at_high_vector #pragma code low_vector = 0x418 void interrupt_at_low_vector(void) { _asm goto low_isr _endasm
}//end interrupt_at_low_vector
/*********************************************** Rutine de tratare a intreruperilor (ISR) ***********************************************/ #pragma code #pragma interrupt high_isr void high_isr(void) { }//end high_isr
Lec\ia 4. Utilizarea num[r[toarelor
L4.6 #pragma interruptlow low_isr
void low_isr(void) { }//end low_isr /*********************************************** Functia main ***********************************************/ #pragma code void main(void) { // Initializare pini interfata LATAbits.LATA4 = 1; // Initializare PORT LATCH TRISAbits.TRISA4 = 1; // RA4 intrare LATC = 0b11011111; // Initializare PORT LATCH TRISC = 0b11011111; // RC5 – iesire, restul intrari // Initializare Timer 0 T0CON = 0b00000000;
// ||||||||
// |||||+++––––––––––> T0PS2:0=000 -> biti prescaler // ||||+–––––––––––> PSA=0 -> utilizeaza prescaler // |||+–––––––––––> T0SE=0 (N.U.) // ||+–––––––––––-> T0CS=0 -> sursa Tcy // |+––––––––––––> T08BIT=0 -> 16 biti // +––––––––––––> TMR0ON=0 -> stop Timer 0 T0CON = T0CON | TMR0_PRE_MASK; // Incarca bitii de selectie prescaler TMR0H = (TMR0_RELOAD >> 8) & 0xFF; // Incarca valoare temporizare TMR0L = TMR0_RELOAD & 0xFF; INTCONbits.TMR0IF = 0; // Sterge semafor intrerupere T0CONbits.TMR0ON = 1; // Start Timer 0 while(1) { while(!INTCONbits.TMR0IF) // Asteapta depasire Timer 0 { if(!RIGHT) // Test tasta RIGHT apasata Reset(); // Reset }//end while TMR0IF=0 T0CONbits.TMR0ON = 0; // Stop Timer 0 TMR0H = (TMR0_RELOAD >> 8) & 0xFF; // Incarca valoare temporizare
TMR0L = TMR0_RELOAD & 0xFF;
INTCONbits.TMR0IF = 0; // Sterge semafor intrerupere T0CONbits.TMR0ON = 1; // Start Timer 0 BKL_Toggle(); // Actualizeaza stare BKL }//end while (1) }//end main /*********************************************** End Of File main.c ***********************************************/
4.4.3. Preg[tirea fi=ierul Intel Hex pentru programare ]n FLASH
Vezi lec\ia 2 (se export[ fi=ierul “L4.hex”).
4.5. Programarea memoriei FLASH
Vezi lec\ia 2.
4.6. Execu\ia programului
}n fereastra PICUL se apas[ butonul “Open”.
}n Hyper Terminal , se introduce de la tastatur[ comanda:
g[ENTER]
Pentru revenirea ]n BootLoader , se apas[ tasta “RIGHT”.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: L4.1 Lecia 4. Utilizarea numrtoarelor [604411] (ID: 604411)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
