AVR Assembler Source Blog

Ремонт частотных преобразователей AVR Assembler Source Blog: Analog_Comparator_AVR128_appnote

Sunday, October 6, 2013

Analog_Comparator_AVR128_appnote

диагностика преобразователя частоты
                              ;**** A P P L I C A T I O N   N O T E   A V R 1 2 8 ************************
                              ;*
                              ;* Title:  Setup and Use the Analog Comparator
                              ;* Version:  1.1
                              ;* Last updated: 97.07.04
                              ;* Target:  AT90Sxxxx (Devices with Analog Comparator)
                              ;*
                              ;* Support E-mail: avr@atmel.com
                              ;*
                              ;* DESCRIPTION:
                              ;* This Application note shows how to enable and use some features of the 
                              ;* AVR's on-board precision Analog Comparator. 
                              ;*
                              ;* The Application note is written as a program example performing the 
                              ;* following tasks:
                              ;*
                              ;* - Wait for a positive output edge by polling the comparator output
                              ;* - Wait for a positive output edge by polling the interrupt flag
                              ;* - Enable interrupt on comparator output toggle. The interrupt routine
                              ;*   increments a 16 bit register counter each time it is executed
                              ;*
                              ;***************************************************************************


.include "1200def.inc"

                              ;***** Global Register Variables

.def temp=r16                 ;temporary storage register
.def cntL=r17                 ;register counter low byte
.def cntH=r18                 ;register counter high byte

                              ;***** Interrupt Vectors

 rjmp RESET                   ;Reset Handle

.org ACIaddr   
 rjmp ANA_COMP                ;Analog Comparator Handle
 
                              ;***************************************************************************
                              ;*
                              ;* "ANA_COMP"
                              ;*
                              ;* This interrupt routine is served each time ACI in the ACSR register is
                              ;* set, provided that the Analog Comparator interrupt is enabled (ACIE is
                              ;* set). The routine increments a 16-bit counter each time it is run
                              ;*
                              ;* Number of words :5
                              ;* Number of cycles :8
                              ;* Low registers used :1 (ac_tmp)
                              ;* High registers used :2 (cntL,cntH)
                              ;*
                              ;***************************************************************************

                              ;***** Interrupt Routine Register Variables

.def ac_tmp=r0                ;temporary storage register for SREG

                              ;***** Code

ANA_COMP: 
       in ac_tmp,SREG         ;temporarily store the Status register 
       subi cntL,low(-1) 
       sbci cntH,high(-1)     ;counter = counter + 1
       out SREG,ac_tmp        ;restore Status register
       reti

                              ;***************************************************************************
                              ;*
                              ;* PROGRAM EXECUTION STARTS HERE
                              ;*
                              ;***************************************************************************

RESET:

                              ;***** Include if used on device with RAM
                              ; ldi temp,low(RAMEND)
                              ; out SPL,temp
                              ; ldi temp,high(RAMEND)
                              ; out SPH,temp

                              ;***************************************************************************
                              ;*
                              ;* "wait_edge1"
                              ;*
                              ;* This piece of code waits until the output of the comparator (the ACO-bit
                              ;* in ACSR) goes high. This way of doing it requires no setup, however, 
                              ;* extremely short pulses can be missed, since the program runs three clock 
                              ;* cycles between each time the comparator is checked. Another disadvantage
                              ;* is that the program has to wait for the output to be come negative first,
                              ;* in case the output is positive when polling starts.
                              ;*
                              ;* Number of words :4
                              ;* Number of cycles :4 per loop. Response time: 3 - 5 clock cycles
                              ;* Low registers used :None
                              ;* High registers used :None
                              ;*
                              ;***************************************************************************

                              ;***** Code

wait_edge1:
       sbic ACSR,ACO          ;if output is high
       rjmp wait_edge1        ;wait 

we1_1: 
       sbis ACSR,ACO          ;if output is low
       rjmp we1_1             ;wait

                              ;***************************************************************************
                              ;*
                              ;* "wait_edge2"
                              ;*
                              ;* This piece of code waits until the output of the comparator (the ACO-bit
                              ;* in ACSR) goes high. This is a more secure solution, since the interrupt
                              ;* flag is polled. This allows the user to insert code within the wait loop
                              ;* because hardware "remembers" pulses of shorter duration than the polling
                              ;* interval. Another positive feature is that there is no need to wait for
                              ;* a preceeding negative edge.
                              ;*
                              ;* Number of words :5
                              ;* Number of cycles :Inital setup :2
                              ;*    Flag clearing:1
                              ;*    Loop       :4
                              ;*    Response time:3 - 5
                              ;* Low registers used :None
                              ;* High registers used :None
                              ;*
                              ;***************************************************************************

                              ;***** Code

wait_edge2:
                              ;***** Initial Hardware setup (assumes ACIE = 0 from reset)
       sbi ACSR,ACIS0
       sbi ACSR,ACIS1         ;enable interrupt on rising output edge
 
                              ;***** Wait
       sbi ACSR,ACI           ;write a "1" to the ACI flag to clear it

we2_1:                        ;----------------------- user code goes here
       sbis ACSR,ACI          ;if ACI is low
       rjmp we2_1             ;wait more 



                              ;***************************************************************************
                              ;*
                              ;* "ana_init"
                              ;*
                              ;* This code segment enables Analog Comparator Interrupt on output toggle.
                              ;* The program then enters an infinite loop. 
                              ;* The 16-bit counter is cleared prior to enabling the interrupt.
                              ;*
                              ;* Performance figures apply to interrupt initialization only.
                              ;*
                              ;* Number of words :4
                              ;* Number of cycles :5
                              ;* Low registers used :None
                              ;* High registers used :1 (temp)
                              ;*
                              ;***************************************************************************

                              ;***** Register Variables

.def temp=r16                 ;temporary register

                              ;***** Code

ana_init:
                              ;***** Clear 16-bit counter
       clr cntL
       clr cntH

                              ;***** Enable Interrupt (assumes ACIE = 0 from reset)
 
       ldi temp,(ACI<<1)      ;clear interrupt flag and ACIS1/ACIS0...
       out ACSR,temp          ;...to select interrupt on toggle
       sei                    ;enable global interrupts
       sbi ACSR,ACIE          ;enable Analog Comparator interrupt
 
forever:
       rjmp forever

No comments:

Post a Comment