HABILITACIÓN Y USO DEL COMPARADOR ANALÓGICO |
DESCRIPCIÓN |
Esta aplicación muestra como habilitar y usar algunas características del comparador analógico de precisión de los AVR. Se puede utilizar para todos los dispositivos AVR con comparador analógico. |
La aplicación está escrita como un ejemplo de programa donde se realizan las siguientes tareas: |
- Esperar un flanco positivo de salida para elegir la salida del comparador |
- Esperar un flanco positivo de salida para elegir el flag de interrupción |
- Habilitar interrupción en el comparador de salida. La rutina de interrupción incrementa un contador de registro de 16 bit cada vez que se ejecuta |
.include "1200def.inc" | |
;***** Variables de registro general | |
.def temp = r16 | ;Registro de almacenamiento temporal |
.def cntL = r17 | ;Byte bajo del contador de registro |
.def cntH = r18 | ;Byte alto del contador de registro |
;***** Vectores de Interrupción | |
rjmp RESET | ;Salto relativo a la subrutina RESET |
.org ACIaddr | |
rjmp ANA_COMP | ;Salto relativo a la subrutina ANA_COMP |
;* | ||||||||||||||||
;* "ANA_COMP" | ||||||||||||||||
;* | ||||||||||||||||
;* Esta rutina de interrupción se utiliza cada vez que ACI en el registro ACSR está a | ||||||||||||||||
;* set, con tal que la interrupción del Comparador analógico esté habilitada (ACIE | ||||||||||||||||
;* está a set). La rutina incrementa el contador de 16 bit cada vez que se ejecuta. | ||||||||||||||||
;* | ||||||||||||||||
;* Número de words : 5 | ||||||||||||||||
;* Número de ciclos : 8 | ||||||||||||||||
;* Registros bajos usados : 1 (ac_tmp) | ||||||||||||||||
;* Registros altos usados : 2 (cntL,cntH) | ||||||||||||||||
;* | ||||||||||||||||
;***** Variables de registro de la rutina de
Interrupción
|
;* |
;* LA EJECUCIÓN DEL PROGRAMA EMPIEZA AQUÍ |
;* |
RESET: |
;***** Incluir si se usa en dispositivos con RAM |
; ldi temp,low(RAMEND) |
; out SPL,temp |
; ldi temp,high(RAMEND) |
; out SPH,temp |
;******* |
;* |
;* "wait_edge1" |
;* |
;* Este trozo de código espera hasta que la salida del comparador pase a nivel alto |
;* (el bit ACO en ACSR). Este modo de ejecución no requiere un setup, sin embargo, |
;* se pueden perder pulsos extremadamente cortos, ya que el programa corre 3 ciclos |
;* de clock entre cada vez que se consulta el comparador. Otra desventaja es que el |
;* programa tiene que esperar que la salida se vuelva negativa primero, en caso que |
;* la salida sea positiva cuando comience la elección. |
;* |
;* Número de words : 4 |
;* Número de ciclos : 4 por vuelta. Tiempo de respuesta: 3 - 5 ciclos de clock |
;* Registros bajos usados :None |
;* Registros altos usados :None |
;* |
;***** Código |
wait_edge1: | |
sbic ACSR,ACO | ;si la salida está a nivel alto |
rjmp wait_edge1 | ;esperar |
we1_1: | |
sbis ACSR,ACO | ;si la salida está a nivel bajo |
rjmp we1_1 | ;esperar |
;* | |
;* "wait_edge2" | |
;* | |
;* Este trozo de código espera hasta que la salida del comparador pase a nivel alto | |
;* (el bit ACO en ACSR). Esta es la solución más segura, ya que el flag de | |
;* interrupción está seleccionado. Esto permite al usuario insertar código dentro del | |
;* bucle de espera porque el hardware "recuerda" pulsos de menor duración que el | |
;* intervalo de elección. Otra característica positiva es que no hay necesidad de | |
;* esperar a un flanco negativo. | |
;* | |
;* Número de words : 5 | |
;* Número de ciclos : Setup inicial :2 | |
;* Borrado de flag:1 | |
;* Vuelta (Loop) :4 | |
;* Tiempo de respuesta:3 - 5 | |
;* Registros bajos usados : Ninguno | |
;* Registros altos usados : Ninguno | |
;* | |
;***** Código | |
wait_edge2: | |
;***** Setup del Hardware inicial (se asume ACIE = 0 del reset) | |
sbi ACSR,ACIS0 |
sbi ACSR,ACIS1 | ;habilitar interrupción en flanco de salida de subida |
;***** Wait | |
sbi ACSR,ACI | ;escribir un "1" en el flag ACI para borrarlo |
we2_1: | ;----------------------- el código de usuario viene aquí |
sbis ACSR,ACI | ;si ACI está a nivel bajo |
rjmp we2_1 | ;esperar más |
;* | |
;* "ana_init" | |
;* |
;* Este segmento de código habilita la interrupción del Comparador Analógico en la |
;* conmutación de la salida. |
;* El programa entra entonces en un bucle infinito. |
;* El contador de 16 bit es borrado antes de habilitar la interrupción. |
;* |
;* Número de words : 4 |
;* Número de ciclos : 5 |
;* Registros bajos usados : Ninguno |
;* Registros altos usados : 1 (temp) |
;* |
;***** Variables de registro |
.def temp =r16 | ;Registro temporal |
;***** Código | |
ana_init: | |
;***** Borrar el contador de 16-bit | |
clr cntL | |
clr cntH |
;***** Interrupción habilitada (se asume ACIE = 0 del reset) |
ldi temp,(ACI<<1) | ;borrar el flag de interrupción y ACIS1/ACIS0... |
out ACSR,temp | ;...para seleccionar interrupción en conmutación |
sei | ;habilitar interrupciones globales |
sbi ACSR,ACIE | ;habilitar interrupción del Comparador Analógico |
forever: | |
rjmp forever | |