INICIO WEB

                       

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

123.gif (858 bytes)

.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
.def ac_tmp = r0 ;Registro de almacenamiento temporal para SREG
;***** Código
ANA_COMP:
          in         ac_tmp,SREG  ;Almacenamiento temporal del registro de estado
          subi     cntL,low(-1)
          sbci     cntH,high(-1) ;counter = counter + 1
          out      SREG,ac_tmp ;Restaurar el registro de estado
          reti
;*
;* 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
               
                                         

ARRIBA