Descrição

.
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