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”.

Similar Posts