⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dmatimer.asm

📁 aduc842原程序代码 ad公司芯片应用笔记
💻 ASM
字号:
;********************************************************************
;
; Author        : ADI - apps            www.analog.com/MicroConverter
;
; Date          : October 2003
;
; File          : DMAtimer.asm
;
; Description   : performs Timer2 triggered DMA conversions on a
;                 single ADC channel at 116KSPS.
;		  Debugger or emulator must be used to view
;                 results.
;
;********************************************************************

$MOD842                         ; use 8052&ADuC842 predefined symbols

DMACOUNT   EQU  64              ; number of AD readings to take
DMAINIT    EQU  10h             ; top nibble of DMAINIT = ADC channel

;____________________________________________________________________
                                   ; DEFINE VARIABLES IN INTERNAL RAM
DSEG
ORG 0060h
DMASTOPH:  DS   1               ; DMA stop address hi byte
DMASTOPL:  DS   1               ; DMA stop address lo byte

;____________________________________________________________________
                                     ; DEFINE SEGMENT OF EXTERNAL RAM
XSEG
ORG 000000h
DMASTART:  DS   DMACOUNT*2      ; location for DMA results
DMASTOP:   DS   4               ; location for DMA stop sequence

;____________________________________________________________________
                                                  ; BEGINNING OF CODE
CSEG
ORG 0000h
        JMP     MAIN            ; jump to main program

;____________________________________________________________________
                                             ; INTERRUPT VECTOR SPACE
ORG 0033h ; (ADC ISR)
        CLR     TR2             ; stop Timer2
        CLR     C               ; clear C to indicate DMA done
        RETI

;====================================================================
                                                       ; MAIN PROGRAM
ORG 004Bh
MAIN:	MOV	PLLCON,#03H
	
; PRECONFIGURE external RAM for DMA capture on a single channel...
	MOV     ADCCON1,#00h
        MOV     DPTR,#DMASTOP   ; store DMASTOP 16bit value..
        MOV     DMASTOPL,DPL    ; ..as a high byte & low byte
        MOV     DMASTOPH,DPH    ; (for use in GETSTOPFLAG subr)
        MOV     DPTR,#DMASTART  ; set DPTR to DMASTART address
SETUP:  MOV     A,#DMAINIT      ; set up x-mem with init value
        MOVX    @DPTR,A
        INC     DPTR
        CLR     A               ; clear second byte
        MOVX    @DPTR,A
        INC     DPTR
        CALL    GETSTOPFLAG     ; C cleared if DPTR>=DMAEND
        JC      SETUP

        MOV     A,#DMAINIT      ; "dummy" DMA location..
        MOVX    @DPTR,A         ; ..to preceed stop command
        INC     DPTR
        CLR     A
        MOVX    @DPTR,A
        INC     DPTR

        MOV     A,#0F0h         ; DMA stop command
        MOVX    @DPTR,A

; CONFIGURE ADC and Timer2 for DMA conversion...

        MOV     DMAL,#0         ; 
        MOV     DMAH,#0         ; 
        MOV     DMAP,#0         ; 
	
	MOV     RCAP2L,#0F6h    ; sample period = 2 * T2 reload prd
        MOV     RCAP2H,#0FFh    ;   = 2*(10000h-FFF6h)*0.476us
        MOV     TL2,#0F6h       ;   = 2*9*0.476us
        MOV     TH2,#0FFh       ;   = 8.5us
        
	NOP
	NOP

       
	MOV     ADCCON2,#040h   ; DMA mode
        MOV     ADCCON1,#09Eh   ; Timer2 mode

        SETB    EA              ; enable interrupts
        SETB    EADC            ; enable ADC interrupt

; LAUNCH DMA conversion...  when finished, ADC interrupt will clear C

        SETB    TR2             ; run Timer2 = start DMA
        SETB    C
        JC      $               ; wait for DMA to finish

        NOP ;.................................... SET BREAKPOINT HERE

; REPEAT entire program...

        JMP     MAIN

;____________________________________________________________________
                                                         ; SUBROUTINE

GETSTOPFLAG:                    ; clears C if DPTR>=DMASTOP
        SETB    C
        MOV     A,DPH
        CJNE    A,DMASTOPH,RET1 ; C cleared if DPH>=DMASTOPH
        MOV     A,DPL
        CJNE    A,DMASTOPL,RET1 ; C cleared if DPL>=DMASTOPL
  RET1: RET

;____________________________________________________________________

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -