HOME PROJETOS PROGRAMAÇÃO MÓDULOS EMAIL
  1. INTRODUÇÃO
  2. RECURSOS
  3. ARQUITETURA
  4. ENDEREÇAMENTO
  5. INTERRUPÇÕES
  6. NÍVEIS DE INTERRUPÇÕES NA FAMÍLIA 18F
  7. RESETS DO MICROCONTROLADOR
  8. MODO SLEEP
  9. WATCHDOG TIMER
  10. O STACK
  11. A LINGUAGEM ASSEMBLER
  12. MPLAB - Criando Projetos
  13. LIBRARIES - Usando Bibliotecas de Funções


NÍVEIS DE INTERRUPÇÕES NA FAMÍLIA 18F


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.




Programa Exemplo

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





  1. INTRODUÇÃO
  2. RECURSOS
  3. ARQUITETURA
  4. ENDEREÇAMENTO
  5. INTERRUPÇÕES
  6. NÍVEIS DE INTERRUPÇÕES NA FAMÍLIA 18F
  7. RESETS DO MICROCONTROLADOR
  8. MODO SLEEP
  9. WATCHDOG TIMER
  10. O STACK
  11. A LINGUAGEM ASSEMBLER
  12. MPLAB - Criando Projetos
  13. LIBRARIES - Usando Bibliotecas de Funções

H P S P I N

Desde 04 de Março de 2010

Atualização: 8 de Setembro de 2020