Capítulo 1 Interrupções 1.1 Noções básicas sobre interrupções em Microcontroladores PIC Interrupções é obrigação em uma programação profissional. Quando um evento ocorrer, uma bandeira de interrupção será definida forçando o programa a desviar para o endereço de interrupção. Isso libera a necessidade de um loop a espera do evento. As interrupções podem ocorrer na mudança de port, transbordo do temporizador, na comunicação serial Interrupções recursos que permitem o tratamento imediato a eventos de maior prioridade interrompendo a execução normal do programa para executar tarefas de maior prioridade no momento. Atende determinados eventos executando o código armazenado em uma posição de memória vinculada a própria interrupção e depois tem retorno imediato a execução normal do programa. As interrupções são tratadas como sub-rotinas de hardware. Observe que a distância entre o vetor de inicialização (0000h) e o vetor de reset (0004h) é de apenas 4 endereços. Dessa forma quando as interrupções estão desabilitadas o PC passa por 0004h normalmente durante a execução de um programa. Quando se faz necessário o uso de interrupções, as rotinas de tratamento de interrupção são colocadas a partir do vetor de reset 0004h. No intervalo entre o vetor de inicialização e o vetor de reset é colocado um desvio para um endereço após as rotinas de interrupção a partir do qual o programa realmente começa. Quando da interrupção, o programa é desviado para um endereço pré-estabelecido, o vetor de reset (0004h). O tratamento da interrupção é feito a partir desse endereço executando rotinas associadas ao evento da interrupção. O PIC 16F877A possui 15 fontes de interrupções: 1. Interrupção do timer 0; 2. Interrupção do timer 1; 3. Interrupção do timer 2; 4. Interrupção externa (RB0/INT); 5. Interrupção por mudança de estado (bits 4 a 7 do portal B); 1
6. Interrupção de transmissão serial; 7. Interrupção de recepção serial; 8. Interrupção do módulo comparador analógico; 9. Interrupção do módulo CCP1; 10. Interrupção do módulo CCP2; 11. Interrupção da memória EEPROM; 12. Interrupção do conversor analógico para digital; 13. Interrupção da porta paralela escrava; 14. Interrupção da comunicação SPI; 15. Interrupção por colisão no barramento I2C. Na interrupção estão associados quatro bits: o flag indicador de interrupção, setado na interrupção ou pelo próprio programa, o bit de habilitação de interrupção ser alterado apenas pelo programa, PEIE interrupções dos periféricos egie (bit de habilitação global) interrupção global quando em 0 todas interrupções estão desabilitadas em 1 as interrupções habilitadas geram interrupção na CPU. Os flags das interrupções são setados por um evento mesmo que essa interrupção desabilitada. A interrupçção INT atende diretamente os eventos externos ao microcontrolador e a interrupção RB0 atende as mudanças de estado do port B. As demais interrupções são internas e causadas pelos periféricos para indicar determinados eventos (chegada de dado pelo portal serial, estouro de timer, etc). Qualquer interrupção sempre chama o vetor de interrupção no endereço (0004h). Obviamente é o endereço para qualquer a rotina de tratamento de interrupção O teste dos bits de flags determinam interrupção ocorrida entre todas as interrupções ativas. A prioridade das interrupções fica determinada pela ordem dos bits do flag. Numa interrupção nenhum registro é salvo automaticamente. Há a necessidade de salvar os registros W, STATUS e qualquer outro SFR antes do tratamento da interrupção, o chamado salvamento de contexto. Recomenda se que o registro STATUS seja zerado. Tudo isso enseja que a criação de variáveis para manter esses registros. Também não se deve usar durante o tratamento da interrupção de registros em uso em outro segmento do programa Esses cuidados garantem o tratamento adequado das interrupções. pode ocorrer a qualquer momento. Na execução de um trecho qualquer do programa determinados endereços de memória (variáveis do programa ou SFR) são usadas, e seus valores devem ser reestabelecidos após a interrupção ser tratada. Recomenda se um codigo curto para o tratamento das interrupções Durante o tratamento de qualquer interrupção chamada, todas as demais permanecem desabilitadas, pois GIE é resetado até a execução da intrução RETFIE que o seta novamente. 2
Os eventuais pedidos de interrupção nesse intervalo não são descartados O tratamento da interrupção é realizado através do flag setado correspondente da interrupção. Assim é necessário resetar o flag associado a ela ao fim do tratamento. Ao contrário o programa trava pela necessidade de responder novamente a tal interrupção A latência natural é o atraso decorrente entre a chamada da interrupção e seu tratamento, pois além do controle observar um processo interno de varredura de interrupções será necessário um desvio para o endereço 0004h além das medidas preventivas já ditas. Valores usuais são de 3 ciclos de máquina após para uma interrupção interna, e de 3 a 3,75 ciclos de máquina para interrupção externa. Em aplicações com precisão de tempo é importante considerar tais atrasos. A configuração do periférico associado a interrupção é o primeiro passo para o tratamento, normalmente executada na inicialização programa e eventualmente reconfigurado em outros trechos. A habilitação das interrupções depende da sua persistência, em alguns casos se quer ela disponível todo o tempo de execução e assim sua habilitação deve ser feita na inicialização. Em outros casos o interesse pela a interrupção só existirá a partir de um certo instante e sua habilitação ocorre num instnate conveniente O bit de habilitação global (GIE) estiver habilitado para as interrupções geram as chamadas. Finalmente as Rotinas de Tratamento de Interrupção (RTI) serão chamadas para o tratamento das as interrupções habilitadas. 1.2 Registradores relacionados as Interrupções 1.2.1 Registradores de Controle da CPU OPTION REG Configura: 1. PSA define TMR0 ou watchdog 2. PS2,PS1,PS0 valores do prescaler 3. TOSE Sentido da transição da borda do sinal aplicado am TMR0 4. TOCS fonte de impulsos para TMR0: clock ou impulso externo 5. INDEDG define bordo para ativação da interrupção RB0/INTCON 6. RBPU habilita resistor pull-up do port B 7. Na programação usa-se option-reg, pois em PICs mais antigos existia uma instrução option. Configura a Identificação e configuração de interrupções 1. /RBPU, Habilitação de pull-up na porta B, (a) 1 desabilita pull-up 3
Figura 1.1: OPTION REG (b) 0 habilita pull-up. 2. INTEDG, Seleção de borda de interrupção, (a) 1 interrupção na borda de subida do pino RB0/INT (b) 0 interrupção na borda de descida do pino RB0/INT. 3. T0CS, Seleção da fonte de clock do TMR0, (a) 1 clock na entrada do pino RA4/T0CKI (b) 0 clock interno. 4. T0SE, Seleção da borda da fonte de clock do TMR0, (a) 1 incrementa na borda descendente no pino RA4/T0CKI (b) 0 incrementa na borda ascendente no pino RA4/T0CKI. 5. PSA, Sinalização do prescaler, (a) 1 assinala o prescaler ao WDT (b) 0 assinala o prescaler ao TMR0. 6. PS2, PS1 e PS0, Seleção da razão da escala do prescaler 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 (1.1) 4
Figura 1.2: INTCON 1.2.2 Registradores de Controle da CPU INTCON Configura a Identificação e configuração de interrupções 1. GIE Habilita tratamento Global de Interrupções (a) 1 = Trata interrupções. (b) 0 = Ignora interrupções. 2. PEIE Habilita interrupções dos periféricos (a) 1 = habilitadas. (b) 0 = desabilitadas. 3. T0IE Habilitação da interrupção de transbordo do Timer0 (a) 1 = habilitada. (b) 0 = deshabilitada. 4. INTE Habilitação da interrupção externa (RB0/INT) (a) 1 = habilitada. (b) 0 = desabilitada. 5. RBIE Habilitação de interrupção por mudança 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 = não houve transbordo. 7. INTF Flag sinalizador de interrupção externa (RB0/INT) 5
(a) 1 = há pedido externo de interrupção (b) 0 = Não há pedido externo de interrupção 8. RBIF Flag sinalizador de alteração nos pinos RB4 a RB7 (a) 1 = Houve alteração. (b) 0 = Não houve alteração. 6
Circuito com Interrupção Externa Objetivo: Verificar o tratamento de interrupções e a inserção de uma chave simples para alterar o sequência de comandos. Uso dos registradores OPTION REG e INTCON. O código descreve a estrutura para tratamento de interrupções acendendo um led pendurado no PORTd, desde que a interrupção tenha sido estabelecida pela mudança interrupção externa no pino RB)/INT 1 p r o c e s s o r 16 f877a 2 #i n c l u d e p16f877a. i n c 3 4 CONFIG FOSC XT & WDTE OFF & PWRTE OFF & BOREN OFF & LVP OFF & C 5 6 ; DEFINE O ENDERE O INICIAL E O VETOR DE INTERRUP O 7 ORG 0x00 8 goto c o n f i g u r a r 9 ORG 0x04 10 ; c a l l i n t e r r u p c a o 11 12 CBLOCK 0 x20 13 Loop1, Loop2 14 ENDC 15 16 c o n f i g u r a r 17 BSF STATUS, RP0 18 CLRF TRISD 19 BSF STATUS, RP0 20 ; CONFIGURAR AS INTERRUP ES 21 ; REGISTRADOR OPTION REG 22 BCF OPTION REG, 7 ; RESISTORES PULLUP DESABILITADOS 23 BCF OPTION REG, 6 ; INTERRUPCAO EXTERNA NA BORDA DE DESCIDA 24 BCF OPTION REG, 5 ; CLOCK INTERNO PARA TIMER0 25 BCF OPTION REG, 4 ; INCREMENTA TIMER0 NA BORDA ASCENDENTE 26 BCF OPTION REG, PSA ; PREESCALER USADO PRO TIMER0 27 ; PRESCALER 1:256 NO TIMERO 28 BSF OPTION REG, 2 29 BSF OPTION REG, 1 30 BSF OPTION REG, 0 31 ; REGISTRADOR INTCON 32 BSF INTCON, GIE ; HABILITA TRATAMENTO GLOBAL DE INTERRUPCOES 7
33 BCF INTCON, PEIE ; DESABILITA INTERRUPCOES DOS PERIFERICOS 34 BCF INTCON, T0IE ; DESABILITA INTERRUP O DO TIMERO 35 BSF INTCON, INTE ; HABILITA INTERRUP O EXTERNA 36 BCF INTCON, RBIE ; DESABILITA INTERRUP O DO PORTB 37 BCF INTCON, T0IF ; LIMPA O FLAG DO TIMER0 38 BCF INTCON, INTF ; LIMPA O FLAG DA INTERRUPCAO EXTERNA 39 BCF INTCON, RBIF ; LIMPA O FLAG DO PORTB 40 41 p r i n c i p a l 42 movlw 0 x01 43 c a l l a c e n d e r l e d s 44 goto p r i n c i p a l 45 46 a c e n d e r l e d s 47 movwf PORTD 48 CALL a t r a s o 49 RRF PORTD 50 BTFSS PORTD, 7 51 GOTO a c e n d e r l e d s 52 RETURN 53 54 a t r a s o 55 MOVLW 0XFF 56 MOVWF Loop1 57 externo 58 MOVLW 0XFF 59 MOVWF Loop2 60 i n t e r n o 61 NOP 62 DECFSZ Loop2 63 GOTO i n t e r n o 64 DECFSZ Loop1 65 GOTO externo 66 return 67 68 i n t e r r u p c a o 69 CLRF PORTD 70 CALL a t r a s o 71 BCF INTCON, INTF ; RESETA FLAG DA INTERRUPCAO EXTERNA 72 RETFIE 73 74 end O circuito, na figura 1.3 descreve a conexão de uma interrupção externa no pic16f877: 8
Figura 1.3: Uso de interupção externa Figura 1.4: Pinagem do pic16f628a 9