Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Sistemas Embarcados: Interrupções DCA0119 – Sistemas Digitais Heitor Medeiros Florencio Tópicos • Conceito de Interrupção; • Interrupção no ATMega328: – Interrupção de módulo internos; – Interrupção externa; • Rotina de tratamento de interrupção: ISR • Exemplo/Exercício 2 Interrupção • Uma interrupção é evento (mudança do valor de algum bit ou de alguma entrada) que altera o fluxo de execução do programa na memória. • Aplicações: – Detectar eventos de módulos internos (temporizadores, ADC, memória, etc) do μC; – Detectar eventos externo ao μC; 3 Interrupção • Desenvolvimento de um sistema que altere a lógica de ativação das luzes quando o botão de “panic” for pressionado. while(1){ if (PB0 == 1) panic = 1; if(panic == 1){ Ativar lógica 01 } else{ Ativar lógica 02 } } 4 Interrupção • Se o botão é utilizado apenas para emergência, é inviável que o μC fique verificando direto o valor do pino do botão. • Solução: Utilizar uma interrupção para que o programa seja interrompido quando o botão mudar seu estado (for pressionado). 5 Tratamento de Interrupção • Procedimento de tratamento de interrupção: Tempo 1(a): μC está executando um programa. 3: Depois de completar a instrução em execução, por ex. instrução de endereço 100, μC detecta a interrução em INT, salva o endereço da última instrução e executa o código do vetor de interrupção. 5: Após a execução do ISR, o programa volta a execução para a próxima instrução normal, PC = 100+1. 1(b): P1 (pino de interrup) recebe um valor no registrador. 2: P1 indica que recebeu uma interrupção para o μC. Habilita INT. 4: Depois da execução do código de interrupção P1 desabilita INT. 6 Tratamento de Interrupção • 1(a): μC está executando um programa. • 1(b): P1 (pino de interrup) recebe um valor no registrador. Program memory ISR 16: MOV R0, 0x8000 17: # modifies R0 18: MOV 0x8001, R0 19: RETI # ISR return ... Main program ... 100: instruction 101: instruction μP Data memory System bus Int PC P1 P2 0x8000 0x8001 7 Tratamento de Interrupção • 2: P1 indica que recebeu uma interrupção para o μC. Habilita INT. Program memory ISR 16: MOV R0, 0x8000 17: # modifies R0 18: MOV 0x8001, R0 19: RETI # ISR return ... Main program ... 100: instruction 101: instruction μP Data memory System bus Int PC P1 P2 0x8000 0x8001 1 8 Tratamento de Interrupção • 3: Depois de completar a instrução em execução, por ex. instrução de endereço 100, μC detecta a interrução em INT, salva o endereço da última instrução e executa o código do vetor de interrupção. Program memory ISR 16: MOV R0, 0x8000 17: # modifies R0 18: MOV 0x8001, R0 19: RETI # ISR return ... Main program ... 100: instruction 101: instruction μP Data memory System bus Int PC P1 P2 0x8000 0x8001 100 9 Tratamento de Interrupção • 4(a): O programa em ISR altera o valor de P2. • 4(b): Depois da execução do código de interrupção P1 desabilita INT. Program memory ISR 16: MOV R0, 0x8000 17: # modifies R0 18: MOV 0x8001, R0 19: RETI # ISR return ... Main program ... 100: instruction 101: instruction μP Data memory System bus Int PC P1 P2 0x8000 0x8001 0 100 10 Tratamento de Interrupção • 5: Após a execução do ISR, o programa volta a execução para a próxima instrução normal, PC = 100+1. Program memory ISR 16: MOV R0, 0x8000 17: # modifies R0 18: MOV 0x8001, R0 19: RETI # ISR return ... Main program ... 100: instruction 101: instruction μP Data memory System bus Int PC 100 +1 P1 P2 0x8000 0x8001 11 Tratamento de Interrupção • Existem várias interrupções nos μC e elas são executadas por ordem de prioridades. • Qualquer interrupção tem prioridade de execução no μC. • Os vetores de interrupção determinam qual código será executado no momento da interrupção. • Interrupções podem ser causadas por eventos externos ou internos. 12 ATMega328: Interrupções 13 ATMega328: Interrupções • Todas as interrupções tem seu bit para habilitar/desabilitar. • O bit GIE (Global Interrupt Enable) do registrador SREG (AVR Status Register) deve estar habilitado para permitir a geração de uma interrupção. • Quando ocorre uma interrupção o GIE é resetado até o término do programa de interrupção. 14 ATMega328: Interrupções Maior Prioridade 15 Interrupções Externas • Solicitadas pelos pinos INT0 e INT1, ou PCINT0 ... PCINT23. Função dos pinos PD2 e PD3, ou PORTB, PORTC, PORTD. 16 Interrupções Externas • INT0 e INT1 podem ser ativadas por nível zero, mudança de estado, na borda de subida ou de descida. • Configuração: bits ISC00, ISC01, ISC10, ISC11 do registrador EICRA. 17 Interrupções Externas • INT0 e INT1 podem ser ativadas por nível zero, mudança de estado, na borda de subida ou de descida. • Configuração: bits ISC00, ISC01, ISC10, ISC11 do registrador EICRA. 18 Interrupções Externas • Habilitas as interrupções INT0 e INT1 através dos bits INT0 e INT1 do registrador EIMSK. • Quando ocorre a interrupção, o programa desvio o fluxo de execução para o vetor de interrupção correspondente, e o bit I do registrador SREG e os registradores EIFR e PICFR são reservados. 19 Interrupções Externas • Quando ocorre a interrupção, o programa desvio o fluxo de execução para o vetor de interrupção correspondente, e o bit I do registrador SREG e os registradores EIFR e PICFR são reservados. 20 ISR (Interrupt Service Routine) • Toda vez que uma interrupção é gerada, o μC tem que saber qual o vetor de interrupção (quem gerou?) e qual o trecho de código deve ser executado. • A maioria dos compiladores de μC disponibilizam rotinas para identificar a posição de memória do vetor da interrupção. • Um programa não consegue invocar tal rotina (ISR). Apenas a ocorrência da interrupção consegue chamar a rotina. • O AVR-GCC disponibiliza a rotina ISR para definir o(s) trecho(s) de códigos referente a(s) interrupções. http://www.nongnu.org/avr-libc 21 ISR (Interrupt Service Routine) • A rotina é definida pela biblioteca “interrupt.h”. #include <avr/interrupt.h> ISR(flag-vetor-interrupt) { // trecho de código } • O programador deve indicar a que interrupção o trecho de código se refere. 22 ISR – Flags: Vetores de Interrupção • • • • • • • • • • • • ADC_vect; ANALOG_COMP_vect; EE_READY_vect; INT0_vect; INT1_vect; PCINT0_vect; PCINT1_vect; PCINT2_vect; SPI_STC_vect; SPM_READY_vect; TIMER0_COMPB_vect; TIMER0_OVF_vect; • • • • • • • • TIMER1_CAPT_vect; TIMER1_COMPA_vect; TIMER1_OVF_vect; TIMER2_OVF_vect; USART_RX_vect; USART_TX_vect; USART_UDRE_vect; WDT_vect; 23 Exemplo • Desenvolver um programa que altere o valor do bit 4 da porta B quando ocorrer uma interrupção externa no pino PD2 do ATMega328. #include <avr/interrupt.h> ISR(INT0_vect) { if(!(PORTB & 0b00010000)){ PORTB &= 0b11101111; } else{ PORTB |= 0b00010000; } } 24 Exercício: Interrupção Externa 25 Exercício: Interrupção Externa 26 Referências • VAHID, Frank; GIVARGIS, Tony. Embedded system design: a unified hardware/software introduction. New York, NY: John Wiley & Sons, 2002. • Datasheet: ATMega328. 27 Dúvidas? Dúvidas por email: [email protected] 28