.
Nesta versão
acrescentaremos o código referente ao tratamento da interrupção.
Foi adotado o modelo por
interrupção a fim de deixar o programa mais versátil no tratamento
do teclado. Não exigindo tempo de espera desnecessário do uC neste
modelo. Logo, faz-se necessário a implementação do tratamento das
interrupções.
Para cada periférico(1) há ao menos uma posição fixa na memória de programa destinado a
esta função, alguns tem mais de uma, iniciada na posição 0x0000.
Portanto, faz-se necessário utilizar a diretiva: “.CSEG”. Os
vetores de interrupção do uC AVR32 são mostrados na aba "Vetor".
Um conceito importante
neste modelo adotado é o contexto, que consiste nos registradores e
memórias do mesmo. Logo, faz-se necessário mantê-los intactos
durante o tratamento da interrupção em questão. Para tanto foi
criado duas macros a fim de cumprir esta tarefa que são a macro_push
e a macro_pop na pasta “inclusao” o arquivo “definicao.inc”.
Estas macros salvam todos os 32 registradores do uC.
Vamos dar mais um passo
às habilidades de usar o compilador. Faremos uma seleção a qual o
programador escolhe qual o nível de ativação da interrupção em
questão por meio da seleção da diretiva if, elif, else e endif. As
interrupções podem ser ativadas por quatro tipos de nível de
tensão que são:
- por nível alto
- por nível baixo
- na descida do nível
- na subida do nível
Para cumprir esta tarefa
de seleção foram criadas quatro variáveis, mostradas na Tabela 6,
com a diretiva .EQU que são:
;******************************************************************************
.EQU f_ativado = 1 ;
bit ativado
; .EQU __nvl_baixo_1__ =
f_ativado
; .EQU __nvl_altern_1__ =
f_ativado
.EQU __borda_desc_1__ =
f_ativado
;.EQU __borda_subi_1__ =
f_ativado
;******************************************************************************
Estas variáveis devem
ser inseridas no código na pasta “insercao” no arquivo
“definicao.inc”. Deve-se escolher uma delas e descomentá-la para
que o código de configuração do uC seja inserido durante a
compilação.
;******************************************************************************
;* 3 2 1 0
;*
ISC11 ISC10 ISC01 ISC00 MCUCR
.MESSAGE "Configurando
o nível do sinal de excetação da INT. EXT."
re_intext1_nvl: push r16
.IFDEF __nvl_baixo_1__
.MESSAGE "POR NÍVEL
BAIXO."
ldi r16,v_MCUCR
andi r16,0b11110011
sts v_MCUCR,r16
out MCUCR,r16
pop r16
ret
.ELIF defined
__nvl_altern_1__
.MESSAGE "POR
ALTERAÇÃO DO NÍVEL."
ldi r16,v_MCUCR
andi r16,0b11110011
ori r16,0b00000100
sts VAR_MCUCR,r16
out MCUCR,r16
pop r16
ret
.ELIF defined
__borda_desc_1__
.MESSAGE "POR BORDA
DE DESCIDA."
ldi r16,v_MCUCR
andi r16,0b11110011
ori r16,0b00001000
sts v_MCUCR,r16
out MCUCR,r16
pop r16
ret
.ELIF defined
__borda_subi_1__
.MESSAGE "POR BORDA
DE SUBIDA."
ldi r16,v_MCUCR
andi r16,0b11110011
ori r16,0b00001100
sts v_MCUCR,r16
out MCUCR,r16
pop r16
ret
.ELSE
.MESSAGE "Não foi
configurado o nível da INT. EXT. 1 - forçada POR BORDA DE DESCIDA."
ldi r16,v_MCUCR
andi r16,0b11110011
ori r16,0b00001000
sts v_MCUCR,r16
out MCUCR,r16
pop r16
ret
.ENDIF
;******************************************************************************
(1) Este é o termo adotado pela ATMEL para designar os circuito internos com funções particulares.
.
Nenhum comentário:
Postar um comentário