RÉPUBLIQUE ALGÉRIENNE DÉMOCRATIQUE ET POPULAIRE MINISTÈRE DE L’ENSEIGNEMENT SUPÉRIEURE ET DE LA RECHERCHE SCIENTIFIQUE ÉCOLE NATIONALE POLYTECHNIQUE D’ORAN DÉPARTEMENT DE GÉNIE ÉLECTRIQUE TP: 02 PROGRAMMATION DES TIMERS Année universitaire : 2018/2019. Introduction : Les timers sont en fait des compteurs formés généralement d’un pré-diviseur suivi d’un registre compteur de 8 ou 16 bits. L’entrée d’horloge peut être interne (mode timer) ou externe (mode compteur d’évènements). Lorsque le registre compteur atteint sa valeur maximale et repasse à 0, un bit indicateur (flag) sera positionné et une interruption pourra être générée, informant aussi la CPU du débordement devra être remis à 0 après chaque debordement. Objectifs de ce TP : Comprendre les modes de fonctionnement des Timers. Mettre en œuvre les interruptions des Timers en assembleur et en MikroC . Travail demandé : Préparation: La fréquence de Quartez est : Fosc = 8 MHz. 1- Les fréquences maximales de débordement des différents Timers : 1 4 On a Fosc = 8MHZ TH = = = 0.5 × 10−6 s = 0.5 µs. 6 𝐹𝑜𝑠𝑐 /4 8×10 Pour le Timer 0 : TF0 = (256 − 𝑁)(𝐷𝐼𝑉 × 𝑇𝐻 ) Avec: DIV = 256 (PS2 PS1 PS0 =111). N=0. TF0 = 3.27 ms Pour le Timer 1 : TF1 = (65536 − 𝑁)(𝐷𝐼𝑉 × 𝑇𝐻 ) Avec: DIV = 8 (T1CKPS1 T1CKPS0 =11). N=0. TF1 = 262.144 ms 1 Pour le Timer 2 : TF2=DIV1× (𝑃 + 1) × 𝐷𝐼𝑉2 × 𝑇𝑠𝑦 Avec: DIV1=16 (T2CKPS1 T2CKPS0 =1x) . DIV2=16 (TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 =1111). P : valeur placé dans le registre PR2 (P= 255). Tsy : période de l’horloge système (Tsy =0.5µs). TF2 = 32.76 ms 2- On veut configurer l’un des Timers pour qu’il déborde toutes les 20 ms. 2.1. Le mode de fonctionnement à choisir est : le mode Timer. 2.2. Les valeurs à charger dans les registres : Timer 0 : Prediv= 256 (PS2 PS1 PS0 =111). TMR0 = (0X64). OPTION_REG= 00000111 = 0X07. Timer 1 : Prediv= 1 (T1CKPS1 T1CKPS0 =00). TMR1L= 0XC0 . TMR1H= 0X63 . T1CON= 0X31 . Timer 2 : Prediv=DIV1=16 . Postdiv=DIV2=16. PR2 = P = 0X9B. T2CON = 0x7E. 2 Manipulation: Le mode Timer : schéma sous proteus 3 1. Le programme assembleur qui permet de clignoter la LED RB2 toutes les 20ms en utilisant le Timer0 en mode scrutation : ;==================================================================== #include p16f877a.inc ; Include register definition file __config 0x3F3A ;==================================================================== ; VARIABLES ;==================================================================== ;==================================================================== ; RESET and INTERRUPT VECTORS ;==================================================================== ; Reset Vector RST code 0x0 goto Start ;==================================================================== ; CODE SEGMENT ;==================================================================== PGM code Start BANKSEL TRISB BCF TRISB,2 CLRF INTCON MOVLW 0x07 MOVWF OPTION_REG BANKSEL PORTB CLRF PORTB MOVLW 0X64 MOVWF TMR0 ; Write your code here Loop MOVLW 0X64 MOVWF TMR0 A1 BTFSS INTCON,2 goto A1 COMF PORTB,1 BCF INTCON,2 goto Loop ;==================================================================== END 4 2. Le programme assembleur qui permet de clignoter la LED RB2 toutes les 20ms en utilisant le Timer0 en mode interruption : ;==================================================================== #include p16f877a.inc ; Include register definition file __config3F3A ;==================================================================== ; VARIABLES ;==================================================================== ;==================================================================== ; RESET and INTERRUPT VECTORS ;==================================================================== ; Reset Vector RST code 0x0 goto Start ORG 04 goto int ;==================================================================== ; CODE SEGMENT ;==================================================================== PGM code Start BANKSEL TRISB BCF TRISB,2 MOVLW 0xA0 MOVWF INTCON ; INTCON =10100000 MOVLW 0x07 MOVWF OPTION_REG ; OPTION_REG = 00000111 BANKSEL PORTB CLRF PORTB MOVLW 0X64 ;N=100 MOVWF TMR0 ; Write your code here Loop goto Loop int MOVLW 0X64 MOVWF TMR0 COMF PORTB,1 BCF INTCON,2 RETFIE ;==================================================================== END 5 3. Le programme Mikroc qui permet de clignoter la LED RB2 toutes les 20ms en utilisant le Timer0 en mode interruption : void interrupt(){ TMR0=0X64; PORTB=~PORTB; INTCON.B2=0; } void main() { TRISB = 0; OPTION_REG=0X07; INTCON=0XA0; PORTB=0; TMR0= 0X64; for(;;){} } 4. Le programme Mikroc qui permet de clignoter la LED RB2 toutes les 20ms en utilisant le Timer1 en mode interruption : void interrupt() { TMR1L=0xC0; TMR1H=0x63; PORTB=~PORTB; PIR1=0; } void main() { TRISB=0x00; INTCON=0xC0; PIE1=0x01; T1CON=0x01; PIR1=0; PORTB=0; for( ; ; ) { } } 6 5. Le programme pour que la LED clignote à 2Hz : 20× 10−3 × 25 = 0.5𝑠 25d=19h ;==================================================================== #include p16f877a.inc ; Include register definition file __config 0X3F3A ;==================================================================== ; VARIABLES ;==================================================================== A EQU 0X20 ;==================================================================== ; RESET and INTERRUPT VECTORS ;==================================================================== ; Reset Vector RST code 0x0 goto Start ORG 04 goto int ;==================================================================== ; CODE SEGMENT ;==================================================================== PGM code Start BANKSEL TRISB BCF TRISB,2 MOVLW 0xA0 MOVWF INTCON;INTCON =10100000 MOVLW 07 MOVWF OPTION_REG ;OPTION_REG = 00000111 BANKSEL PORTB CLRF PORTB MOVLW 0X64 ; N=100 MOVWF TMR0 MOVLW 0X19 MOVWF A ; Write your code here Loop goto Loop int MOVLW 0X64 MOVWF TMR0 DECFSZ A,1 goto A1 COMF PORTB,1 MOVLW 0X19 MOVWF A RETFIE A1 BCF INTCON,2 RETFIE ;==================================================================== END 7 Le mode Compteur : 1. Le programme qui incrémente le contenu du registre TMR0 à chaque appui sur le bouton RA4 et affiche le compte sur les LEDs connectées au PORTB : ;==================================================================== #include p16f877a.inc ; Include register definition file __config 0X3F3A ;==================================================================== ; VARIABLES ;==================================================================== A EQU 0X20 ;==================================================================== ; RESET and INTERRUPT VECTORS ;==================================================================== ; Reset Vector RST code 0x0 goto Start ;==================================================================== ; CODE SEGMENT ;==================================================================== PGM code Start BANKSEL TRISB CLRF TRISB MOVLW 0X10 MOVWF PORTA MOVLW 0X28 MOVWF OPTION_REG ;OPTION_REG = 00000111 BANKSEL PORTB CLRF PORTB CLRF TMR0 ; Write your code here Loop MOVF TMR0,0 MOVWF PORTB goto Loop ;==================================================================== END 2. programme pour que le registre TMR0 s’incrémente après 4 appuis sur le bouton RA4 : on change la valeur de option _reg ;==================================================================== #include p16f877a.inc ; Include register definition file __config 0X3F3A ;==================================================================== ; VARIABLES ;==================================================================== A EQU 0X20 ;==================================================================== ; RESET and INTERRUPT VECTORS ;==================================================================== ; Reset Vector 8 RST code 0x0 goto Start ;==================================================================== ; CODE SEGMENT ;==================================================================== PGM code Start BANKSEL TRISB CLRF TRISB MOVLW 0X10 MOVWF PORTA MOVLW 0X21 MOVWF OPTION_REG ;OPTION_REG = 00000111 BANKSEL PORTB CLRF PORTB CLRF TMR0 ; Write your code here Loop MOVF TMR0,0 MOVWF PORTB goto Loop ;==================================================================== END 9