* Filename      : ATD.ASM
* Programmer    : Michael Hattermann
* Date          : February 22, 2002
* Version       : 1.0
* Description   : This file contains the Analog to
*                  Digital (A/D) conversion functions
*                  for the input of analog signals. The
*                  following functions are available:
*
*                   INITATD - Initializes the ATD system
*                   KILLATD - Shuts down the ATD system
*                   ANALOG - Returns ATD value for port specified
*
*#define __DEBUGATD_     1


#include "hc12.asm"
*
************************************************************
* A/D Equates
************************************************************
*
CHANNEL0    EQU     $00
CHANNEL1    EQU     $01
CHANNEL2    EQU     $02
CHANNEL3    EQU     $03
CHANNEL4    EQU     $04
CHANNEL5    EQU     $05
CHANNEL6    EQU     $06
CHANNEL7    EQU     $07
*
************************************************************
* A/D Channel Assignments
************************************************************
*
LEFTIR          EQU     CHANNEL0
RIGHTIR         EQU     CHANNEL1
CENTERIR        EQU     CHANNEL2
CENTERFOLLOW    EQU     CHANNEL4
LEFTFOLLOW      EQU     CHANNEL5
RIGHTFOLLOW     EQU     CHANNEL6
BUMPER          EQU     CHANNEL7
*
************************************************************
* A/D Debug Code
************************************************************
*
#ifdef __DEBUGATD_
            ORG     USERPROG_PVECT
            JMP     TEST

            ORG     $B000

TEST        LDAA    #$00            ; turn off COP watchdog timer
            STAA    COPCTL

            LDS     #$0bff          ; init the stack pointer

            JSR     INITATD         ; init A/D system
            JSR     INITSCI         ; init SCI system
            MOVB    #$80,TSCR       ; enable the timer

HERE
*            LDX     #LEFT           ; print left IR message
*            JSR     OUTSTR          ;
            LDAA    #CHANNEL7       ; get left IR value
            JSR     ANALOG          ;
            JSR     OUTNUM          ; print value
            LDX     #NEWLINE        ; print newline
            JSR     OUTSTR          ;

*            LDX     #RIGHT          ; print right IR message
*            JSR     OUTSTR          ;
*            LDAA    #CHANNEL1       ; get right IR value
*            JSR     ANALOG          ;
*            JSR     OUTNUM          ; print value
*            LDX     #NEWLINE        ; print newline
*            JSR     OUTSTR          ;

            LDX     #500            ; wait 1/2 second
            JSR     WAIT            ;

            BRA     HERE            ; end of program

LEFT        DC.B    'Left IR value = '
            DC.B    EOS
RIGHT       DC.B    'Right IR value = '
            DC.B    EOS
NEWLINE     DC.B    CR,LF           ; Newline string
            DC.B    EOS

#include "sci.asm"
#include "wait.asm"

#endif
*
*******************************************************************************
*                       SUBROUTINE -  INITATD
* Description: Initializes the analog to digital converter
* Input         : None.
* Output        : None.
* Destroys      : None.
* Calls         : None.
*******************************************************************************
*
INITATD     PSHA                        ; save reg A
            MOVB    #$80,ATDCTL2        ; turn on ATD system
            MOVB    #$00,ATDCTL3        ; enable conversions in bgnd mode
            MOVB    #$01,ATDCTL4        ; setup conversion rate = 2MHz

            LDAA    #195                ; load loop counter
INITATD1    NOP                         ; wait for ATD to power up
            DBNE    A,INITATD1          ; if we still need to wait, wait

            PULA                        ; restore reg A
            RTS                         ; return to caller
*
*******************************************************************************
*                       SUBROUTINE -  KILLATD
* Description: Shuts down the analog to digital converter
* Input         : None.
* Output        : None.
* Destroys      : None.
* Calls         : None.
*******************************************************************************
*
KILLATD     MOVB    #$00,ATDCTL0        ; stop current conversion (if there is one)
            MOVB    #$00,ATDCTL2        ; turn off ATD system
            RTS                         ; return to caller
*
*******************************************************************************
*                       SUBROUTINE -  ANALOG
* Description: Converts the analog channel specified by reg A and returns the
*               converted value in reg A.  Valid values for channel are (the
*               equates an be found above):
*
*                   CHANNEL0    - A/D Channel #0
*                   CHANNEL1    - A/D Channel #1
*                   CHANNEL2    - A/D Channel #2
*                   CHANNEL3    - A/D Channel #3
*                   CHANNEL4    - A/D Channel #4
*                   CHANNEL5    - A/D Channel #5
*                   CHANNEL6    - A/D Channel #6
*                   CHANNEL7    - A/D Channel #7
*
* Input         : Channel to convert in reg A.
* Output        : Digital value of channel in reg A.
* Destroys      : None.
* Calls         : None.
*******************************************************************************
*
ANALOG      STAA    ATDCTL5                     ; start conversion on channel specified
ANALOG1     BRCLR   ATDSTATH,BIT7,ANALOG1       ; wait for conversion to complete
            LDAA    ADR2H                       ; load conversion result
            RTS                                 ; return to caller
*
************************************************************************
