2016.1 - DCA

Propaganda
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
Download