HOME PROJETOS PROGRAMAÇÃO |
Antes de continuar, conheça o básico sobre as Interrupções .
Na família 18F pode-se usar interrupções como normalmente se usa em MCU da família 16F, assim chamadas de interrupções em modo compatível. Mas, na família 18F, é possível atribuir níveis de prioridades para a execução das interrupções. Dois níveis de prioridade de interrupções são possíveis: interrupções de alta prioridade e interrupções de baixa prioridade, onde as interrupções de alta prioridade conseguem interromper a execução das interrupções de baixa prioridade.
O que estabelece o uso dos níveis de prioridade é o bit IPEN do registrador RCON. Quando se deseja usar níveis de prioridades de interrupções, deve-se fazer RCON<IPEN> = 1. Além disso, as interrupções de alta e baixa prioridades também devem ser habilitadas através dos bits GIEH e GIEL do registrador INTCON.
Cada periférico também tem seu próprio bit de controle de habilitação/desabilitação do nível de prioridade de sua interrupção. Por exemplo, uma interrupção externa no pino RB1 de um MCU PIC18F4550 pode ser usada com alta prioridade fazendo-se o bit INTCON3<INT1IP> = 1. Para usar a mesma interrupção com nível baixo, fazemos INTCON3<INT1IP> = 0.
As interrupções externas são as únicas em que os bits de controle de alta e baixa estão no registrador INTCON3. Nos demais periféricos, os bits de controle de alta e baixa se encontram nos registradores IPR1 e IPR2. Além disso, é para deixar qualquer um maluco o fato de que a interrupção externa em RB0 / INT0 é sempre de alta prioridade. Esse detalhe esta escrito no datasheet mas é preciso lê-lo de cabo a rabo para encontrar e você só sai lendo tudo depois que perdeu um tempão reanalisando seu circuito, refazendo todas as ligações (sorte que é no protoboard) e revendo todos os conceitos para não chegar a conclusão alguma.
As interrupções de alta prioridade são disparadas pelo vetor de interrupção no endereço 0x0008 e as interrupções de baixa prioridade são disparadas pelo vetor no endereço 0x0018.
O programa do exemplo abaixo mostra como usar os níveis de interrupções num MCU PIC18F4550.
Antes de compilá-lo faça o
download da infra estrutura de subrotinas.
; ------------------------------------------------------------------------------- ; PROGRAMA EXEMPLO ; INTERRUPCOES EXTERNAS COM CONTROLE DE NIVEL DE PRIORIDDE. ; ------------------------------------------------------------------------------- ; ESTE PROGRAMA ALTERNA O ACENDIMENTODE DE: ; 1 - dois LEDs em PORTA<0> e PORTA<1> pela interrupcao externa em RB1 ; de baixa prioridade. ; ; 2 - dois LEDs em PORTD<0> e PORTD<1> pela interrupcao externa em RB0 ; de alta prioridade. ; ------------------------------------------------------------------------------- ; HARDWARE ; Conectar resistores PULL-UP de 1K em RB0 e RB1 com chaves tacteis de BR0 a ground ; e RB1 ao ground. ; ; Conectar LEDs em PORTA<0>, PORTA<1>, PORTD<0> e PORTD<1>. ; ------------------------------------------------------------------------------- ; FUNCIONAMENTO: ; Ao pressionar uma das chaves os respectivos LEDS devem piscar. ; ------------------------------------------------------------------------------- ; OBSERVACAO: A INTERRUPCAO EXTERNA EM RB0/INT0 SEMPRE TEM ALTA PRIORIDADE. ; ISSO QUASE ME LEVOU A LOUCURA POREM ESTA ESCRITO EM ALGUM LUGAR ; OBSCURO DO DATASHEET. ; ; ------------------------------------------------------------------------------- list p=18f4550 #include <p18f4550.inc> ; ; ------------------------------------------------------------------------------- ; UDATA 0x080 delay_temp RES 1 delay_wrk1 res 1 delay_wrk2 res 1 CLOCK equ 20000000 ; Clock de 20MHZ ; ; ------------------------------------------------------------------------------- ; ResetVector CODE 0x0000 ; vetor de reset goto inicio ; HighInt CODE 0x0008 ; vetor de interrupcoes de alta prioridade goto HP_FLIH ; LowInt CODE 0x0018 ; vetor de interrupcoes de baixa prioridade goto LP_FLIH ; ; ------------------------------------------------------------------------------- ; MAIN CODE ; ; ------------------------------------------------------------------------------- ; inicio movlw b'00000011' ; RB0 e RB1 sao entradas da interrupcoes movwf TRISB ; estabelece I/O no PORTB clrf LATB ; limpa o latch do PORTB clrf TRISD ; PORTD e saida bsf LATD,0 ; acende LED 1 EM PORTD bcf LATD,1 ; apaga LED 2 EM PORTD clrf LATA ; limpa o latch do PORTA clrf TRISA ; estabelece I/O no PORTA bsf LATA,0 ; acende LED 1 EM PORTA bcf LATA,1 ; apaga LED 2 EM PORTA ; INTERRUPCAO EM RB1 DE BAIXA PRIORIDADE bcf INTCON2,INTEDG1 ; reconhece interrupcao na descida do sinal bcf INTCON3,INT1IF ; limpa o flag bsf INTCON3,INT1IE ; habilita interrupcoes externas bcf INTCON3,INT1IP ; habilita prioridade para interrupcao externa ; INTERRUPCAO EM RB0 DE ALTA PRIORIDADE (RB0 SEMPRE TEM ALTA PRIORIDADE) bcf INTCON2,INTEDG0 ; reconhece interrupcao na descida do sinal bcf INTCON,INT0IF ; limpa o flag bsf INTCON,INT0IE ; habilita interrupcoes externas ; CONTROLE EM NIVEL GLOBAL bsf RCON,IPEN ; habilita niveis de prioridade de interrupcao bsf INTCON,GIEH ; habilita as interrupcoes de alta prioridade bsf INTCON,GIEL ; habilita as interrupcoes de baixa prioridade loop goto loop ; permanece aqui deixando as interrupcoes ; trabalharem ; ------------------------------------------------------------------------------- LP_FLIH btfss INTCON3,INT1IF ; testa se veio a interrupcao esperada retfie ; sai daqui se nao for interrupcao externa em RB1 movlw .250 ; 250mS call delay_ms ; debounce para evitar triscar o botao em RB1 btg LATD,0 ; inverte estado do LED 1 btg LATD,1 ; inverte estado do LED 2 bcf INTCON3,INT1IF ; limpa flag de interrupcao retfie ; ------------------------------------------------------------------------------- HP_FLIH btfss INTCON,INT0IF ; testa se veio a interrupcao esperada retfie ; sai daqui se nao for interrupcao externa em RB0 movlw .250 ; 250mS call delay_ms ; debounce para evitar triscar o botao em RB0 btg LATA,0 ; inverte estado do LED 1 btg LATA,1 ; inverte estado do LED 2 bcf INTCON,INT0IF ; limpa flag de interrupcao retfie ; ; ------------------------------------------------------------------------------- ; #include "..\..\SUBROUTINES\delay_ms.inc" END
H P S P I N Desde 04 de Março de 2010 Atualização: 20 de Apr de 2024 |