Programação C com o PIC16F628a 31 de Outubro de 2016
2016-2 2
Conteúdo 3
2016-2 4
Capítulo 1 Interrupções Timer0 1.1 Registradores relacionados as Interrupcoes 1.1.1 Registrador OP T ION R EG Configura a Identificacao e configuracao de interrupcoes Figura 1.1: OP T ION R EG Os bits do registrador OPTION_REG são: 1. /RBPU, Habilitacao de pull-up na porta B, (a) 1 desabilita pull-up (b) 0 habilita pull-up. 2. INTEDG, Selecao de borda de interrupcao, (a) 1 interrupcao na borda de subida do pino RB0/INT (b) 0 interrupcao na borda de descida do pino RB0/INT. 3. T0CS, Selecao da fonte de clock do TMR0, (a) 1 clock na entrada do pino RA4/T0CKI (b) 0 clock interno. 4. T0SE, Selecao da borda da fonte de clock do TMR0, 5
2016-2 (a) 1 incrementa na borda descendente no pino RA4/T0CKI (b) 0 incrementa na borda ascendente no pino RA4/T0CKI. 5. PSA, Sinalizacao do prescaler (a) 1 assinala o prescaler ao WDT (b) 0 assinala o prescaler ao TMR0. 6. PS2, PS1 e PS0, Selecão da escala do prescaler 1.1.2 Registrador INTCON P S2 P S1 P S0 W DT T MR0 0 0 0 1 : 1 1 : 2 0 0 1 1 : 2 1 : 4 0 1 0 1 : 4 1 : 8 0 1 1 1 : 8 1 : 16 1 0 0 1 : 16 1 : 32 1 0 1 1 : 32 1 : 64 1 1 0 1 : 64 1 : 128 1 1 1 1 : 128 1 : 256 Configura a Identificacao e configuracao de interrupcoes Figura 1.2: INTCON Os bits do registrador INTCON são: (1.1) 1. GIE Habilita tratamento Global de Interrupcoes (a) 1 = Trata interrupcoes. (b) 0 = Ignora interrupcoes. 2. PEIE Habilita interrupcoes dos perifericos (a) 1 = habilitadas. (b) 0 = desabilitadas. 3. T0IE Habilitacao da interrupcao de transbordo do Timer0 6
2016-2 (a) 1 = habilitada. (b) 0 = deshabilitada. 4. INTE Habilitacao da interrupcao externa (RB0/INT) (a) 1 = habilitada. (b) 0 = desabilitada. 5. RBIE Habilitacao de interrupcao por mudanca de estado na porta B (pinos RB4 a RB7) (a) 1 = habilitada. (b) 0 = desabilitada. 6. T0IF Flag sinalizador de estouro do timer 0 (a) 1 = houve transbordo do timer 0. (b) 0 = nao houve transbordo. 7. INTF Flag sinalizador de interrupcao externa (RB0/INT) (a) 1 = ha pedido externo de interrupcao (b) 0 = Nao ha pedido externo de interrupcao 8. RBIF Flag sinalizador de alteracao nos pinos RB4 a RB7 (a) 1 = Houve alteracao. (b) 0 = Nao houve alteracao. 1.2 Descrição do código C para a interrupção do timer0 1 /* Autor : 2 * T t u l o : I n t e r r u p o usando o Timer0 3 * D e s c r i o : Um circuito com dois leds. O led1 f i c a r aceso a t r a v s 4 * de uma rotina normal chamada no corpo principal. 5 * A i n t e r r u p o gerada pelo transbordo do timer 0, i r apagar 6 * o led 1 e a c e n d e r o led 2. 7 * Data0 : 230516 8 */ 9 # include <stdio.h> 10 # include <stdio.h> 11 # include <xc.h> 12 # include <htc.h> 13 # include < pic16f648a.h > 14 15 // C o n f i g u r a o 16 Use o Configuration Bits 17 18 // D e f i n i e s b s i c a s 19 # define _XTAL_FREQ 4000000 20 # define LED1 PORTBbits. RB7 7
2016-2 21 # define LED2 PORTBbits. RB6 22 23 void interrupt qqcoisa (){ 24 INTCONbits. T0IF = 0; 25 LED1 = 0; 26 LED2 = 1; 27 delay_ms (1000); 28 } 29 30 void configura (){ 31 TRISB = 0 b11100000 ; 32 // C o n f i g u r a o OPTION_REG para o timer0 33 OPTION_REGbits. nrbpu = 0; // desabilita pull - up 34 OPTION_REGbits. INTEDG = 1; // i n t e r r u p o na borda de subida para pino 35 OPTION_REGbits. T0CS = 0 ; // clock interno para timer0 36 // OPTION_REGbits. T0SE n o usado 37 OPTION_REGbits. PSA = 0 ; // define prescaler para o timer 0 38 // prescalar 1:256 39 OPTION_REGbits. PS2 =1; 40 OPTION_REGbits. PS1 =1; 41 OPTION_REGbits. PS0 =1; 42 43 // C o n f i g u r a o do INTCON 44 INTCONbits. GIE = 1; // habilita todas as i n t e r r u p e s 45 INTCONbits. PEIE = 0; // desabilita as i n t e r r u p e s dos p e r i f r i c o s 46 INTCONbits. T0IE = 1; // Habilita a i n t e r r u p o pelo timer0 47 INTCONbits. INTE = 0; // Desabilita a i n t e r r u p o externa 48 INTCONbits. RBIE = 0; // Desabilita a i n t e r r u p o do MSB do PORTB 49 INTCONbits. T0IF = 0; // Limpa o flag do timer0 50 TMR0 = 0; // Valor inicial do registrador do timer0 51 } 52 53 void acende_led (){ 54 LED1 = 1; 55 } 56 57 void main () { 58 configura (); 59 while (1) acende_led (); 60 } 8
2016-2 1 ; Autor : 2 ; Data : 080516 3 ; Titulo : I n t e r r u p o Timer0 4 ; D e s c r i o : O circuito composto de um p16f628a ligado a quatro leds 5 ; placa01, a i n t e r r u p a o de timer0 ira manter os 4 leds pendurados em 6 ; portab acesos por 2 s e desligados por outros 2 s. 7 LIST P =16 F628 8 include < p16f628a. inc > 9 10 CBLOCK 0 X20 11 aux, LIM1, LIM2, tempo1, tempo2 12 ENDC 13 14 org 0 x00 15 goto configura 16 17 org 0 x04 18 goto trata_interrupcao 19 20 configura 21 ; Configura i n t e r r u p e s 22 bsf INTCON, GIE ; libera todas as i n t e r r u p e s 23 BCF INTCON, PEIE ; inibe i n t e r r u p e s dos p e r i f r i c o s 24 ; I n t e r r u p o Timer0 25 BSF INTCON, T0IE ; libera i n t e r r u p o TIMER0 26 BCF INTCON, T0IF ; limpa flag TIMER0 27 28 bsf STATUS,5 ; vai banco 1 29 clrf TRISA ; porta s e r saida 30 BSF TRISB,7 ; PINO 7 DO PORTB S E R ENTRADA PARA A CHAVE 31 bcf STATUS,5 32 33 ; I n t e r r u p o pelo timer0 34 bcf OPTION_REG, T0CS ; Define fonte de clock =0 clock interno 35 bsf OPTION_REG, T0SE ; Incrementa na borda de subida da t r a n s i o 36 bcf OPTION_REG, PSA ; Habilita o prescaler para o timer0 37 bsf OPTION_REG,2 38 bsf OPTION_REG,1 39 bcf OPTION_REG,0 ; PS xxxx x111 faz escala 1/256, ver tabela 40 bcf STATUS,5 ; VOLTA ao banco 0 41 42 ; limpa as variaveis para inicio 43 clrf tempo1 44 clrf tempo2 45 movlw 0 x0f 46 movwf aux ; variavel para determinar m u d a n a do led1 47 BSF PORTA,1 48 49 PRINCIPAL 9
2016-2 50 GOTO PRINCIPAL 51 52 ATRASO 53 LOOP_EXTERNO 54 MOVLW 0 X80 55 MOVWF LIM1 56 LOOP_INTERNO 57 NOP 58 INCF LIM1, 1 59 BTFSS LIM1, 4 60 GOTO LOOP_INTERNO 61 INCF LIM2, 1 62 BTFSS LIM2, 7 63 GOTO LOOP_EXTERNO 64 RETURN 65 66 ; Tratamento das i n t e r r u p e s 67 ; Para um xtal de 4 MHz, cada i n s t r u o executa em 1 us, uma virada 68 ; completa do timer0 e n t o d a r 256 us. A macro conta_timer0 expande 69 ; esse limite ao repetir o processo incluindo novos contadores, 70 ; Pelo projeto deltat de 2s, fazendo as contas n e c e s s r i o 71 ; repetir a i n t e r r u p o timer0 por 7812,5 vezes ou 72 ; 2^7*2^6 = 2^13 = 8192 para efetivamente atender a i n t e r u p a o timer0. 73 ; Assim s e r n e c e s s r i o 8192 i n t e r r u p e s do timer0 para 74 ; uma espera de 2s, enquanto durar esse intervalo o led1 e s t a r 75 ; aceso. No outro ciclo de 2 s f i c a r apagado. 76 77 inverte_led 78 COMF aux,1 79 MOVFW aux 80 MOVWF PORTA 81 RETURN 82 83 incrementa_tempo2 84 clrf tempo1 ; limpa tempo1 para uma nova contagem 85 incf tempo2 86 btfsc tempo2,6 ; verifica se N O deu o intervalo de 2s, te 87 call inverte_led 88 nop 89 return 90 91 trata_int_timer0 92 incf tempo1 93 btfsc STATUS, C ; verifica se N O houve transbordo 94 call incrementa_tempo2 95 nop 96 return 97 98 ; Tratamento da i n t e r r u p o Timer0 10
2016-2 99 trata_interrupcao 100 btfsc INTCON, T0IF ; Verifica se i n t e r r u p o foi por timer0 101 call trata_int_timer0 102 retfie 103 END 11