'*******************************************************************************
' FILENAME: ATXMEGA128A1 ADC Test x.bas
'
' PROCESSOR: ATXMEGA128A1
' CLOCK: 16Mhz XTAL
' TITLE:
' BOARD: 0420-04 and 0420-01
' MODIFIED: 29-NOV-2021
' AUTHOR: Frank Thomson
'*******************************************************************************
$regfile = "xm128A1Udef.dat" '"xm128A1Udef.dat" ' "C:\MCS\BASCAVR2082\DAT\xm128A1Udef.dat"
$framesize = 200 ' After global variables then after unused SRAM, grows bottom up, string conversion routines (PRINT, LCD, INPUT) require a buffer in SRAM
$swstack = 200 ' ISR routine parameters and grow top down
$hwstack = 200 ' Return address after routine call (SUB, FUNCTION, GOSUB) and grow top down
$crystal = 16000000
'Config Osc = Enabled , 32mhzosc = Enabled ' enable 2 MHz and 32 MHz internal oscillators
'Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
Config osc = disabled , EXTOSC = enabled , 32KHZOSC=DISABLED, pllosc = enabled , range = 12MHZ_16MHZ , startup = XTAL_16KCLK , pllsource = extclock , pllmul = 1
Config Sysclock = PLL , Prescalea = 1 , Prescalebc = 1_1
'$sim ' Comment this out for real program
' INITIALIZE HARDWARE
'PORT A has the first 8 Analogue inputs.
' Can only be read with ADCA
' TypRead
'PORT A.0 - 0 ADC0 - 1 Connects to GND 0R
' A.1 - 0 ADC1 13 16k to GND
' A.2 - 0 ADC2 22 16k to GND
' A.3 - 0 ADC3 19 16k to GND
' A.4 - 0 ADC4 17 16k to GND
' A.5 - 0 ADC5 14 16k to GND
' A.6 - 0 ADC6 34 24k to GND
' A.7 - 1 ADC7 34 24k to GND
Config Porta = &B00000000 ' All IN
Porta = &B00000000
' PORT B Has another 8 ADCs They can only be read with ADCB
' DDR TypRead
'PORT B.0 - 0 ADC8 7 Test Point TP126 (Open Circuit)
' B.1 - 0 ADC9 1189 RF Power Detector via divider 2k4 x 750R to GND
' B.2 - 1 ADC10 - 437 DAC1 output Not normally used for ADC
' B.3 - 0 ADC11 324 Test Point TP127 (Open Circuit)
' B.4 - 0 ADC12 1613 8K2 to GND
' B.5 - 0 ADC13 841 3k0 to GND
' B.6 - 0 ADC14 1482 1k5 to GND
' B.7 - 0 ADC15 1652 3V3 rail mon via divider 12k x 3k0 to GND
' 76543210
Config Portb = &B00000100
Portb = &B00000000
' PORTS C, D, E, F, H, J, K, Q Default to ALL INPUTS
' Except Port D which has a LED
'PORT D.0 - 0 0 LED SPARE 2
' D.1 - 0 0 LED SPARE 1
' D.2 - 0 0 LED FAIL
' D.3 - 0 0 LED STATUS
' D.4 - 0 0 LED TESTING
' D.5 - 0 0 LED DEVICE
' D.6 - 0 0 Reserved for USB N
' D.7 - 0 0 Reserved for USB N
' 76543210
Config PortD = &B00000011
PortD = &B00000000
'---- INITIALISE COMMS ---------------------------------------------------------------------
Config Com5 = 9600 , mode = ASYNCHRONEOUS, Parity = None , Stopbits = 1 , Databits = 8
Open "COM5:" For Binary As #6
Config Serialin6 = Buffered , Size = 10
'----- INITIALISE ADC ----------------------------------------------------------------------
' The XMEGA128A1 has two Analogue to Digital Converters.
' Inputs ADC0 to 7 can only be routed by the MUX register to ADCA and 8-15 to ADCB.
' There are 4 channels - For these tests we will only use Channel 0
' Prescaler= 4, 8, 16, 32, 64, 128, 256 and 512
' DIFFERENTIAL MODE
'Config Adca = Single , Convmode = signed , Resolution = 12bit , Dma = Off , Reference = Int1v , Event_mode = None , Prescaler = 512 , Ch0_gain = 1 , Ch0_inp = diff , Mux0 = &B0000000, Ch1_gain = 1 , Ch1_inp = INTERNAL , Mux1 = &B1_000 , Ch2_gain = 1 , Ch2_inp = Single_ended , Mux2 = &B10000000 , Ch3_gain = 1 , Ch3_inp = DIFF , Mux3 = &B1100000
'Config AdcB = Single , Convmode = signed , Resolution = 12bit , Dma = Off , Reference = Int1v , Event_mode = None , Prescaler = 512 , Ch0_gain = 1 , Ch0_inp = diff , Mux0 = &B0000000, Ch1_gain = 1 , Ch1_inp = INTERNAL , Mux1 = &B1_000 , Ch2_gain = 1 , Ch2_inp = Single_ended , Mux2 = &B10000000 , Ch3_gain = 1 , Ch3_inp = DIFF , Mux3 = &B1100000
' SINGLE ENDED
Config Adca = Single , Convmode = signed , Resolution = 12bit , Dma = Off , Reference = Int1v , Event_mode = None , Prescaler = 512 , Ch0_gain = 1 , Ch0_inp = SINGLE_ENDED , Mux0 = &B0000000, Ch1_gain = 1 , Ch1_inp = INTERNAL , Mux1 = &B1_000 , Ch2_gain = 1 , Ch2_inp = Single_ended , Mux2 = &B10000000 , Ch3_gain = 1 , Ch3_inp = DIFF , Mux3 = &B1100000
Config AdcB = Single , Convmode = signed , Resolution = 12bit , Dma = Off , Reference = Int1v , Event_mode = None , Prescaler = 512 , Ch0_gain = 1 , Ch0_inp = SINGLE_ENDED , Mux0 = &B0000000, Ch1_gain = 1 , Ch1_inp = INTERNAL , Mux1 = &B1_000 , Ch2_gain = 1 , Ch2_inp = Single_ended , Mux2 = &B10000000 , Ch3_gain = 1 , Ch3_inp = DIFF , Mux3 = &B1100000
' MUX is
' See Table 28-16 page 362 of XMEGA Manual "Differential without gain"
' 7 6 5 4 3 2 1 0
' / | | | | \ \ \ MUXNEG DIFFERENTIAL SINGLE_ENDED
' Not Positive \ \ \Negative Side MUXNEG is IGNORED
' Used Side of Of the ADC
' ADC 0 0 0 = ADC0Pin
' = Channel
' Number 1 0 1 = PAD Ground
' 1 1 0 = Reserved
' 1 1 1 = Internal Ground
'
'-----DIMENSION VARIABLES-------------------------------------------------------------------
dim k_b as byte ' Used to hold input
Dim LEDcounter as word
dim i as byte
dim mux as byte
Dim myADCX as integer
dim MUXNEG as byte : MUXNEG = &b00000101 ' See table above.
'-----MAIN PROGRAM START---------------------------------------------------------------------
portd.0 = 1 ' LED SPARE 2 ON
Print #6 ,
print #6, "AT X Mega 128A1U ADC Program";
loopforever:
k_b = Inkey(#6) ' Get a byte from the uart. Loop keeps running
if k_b > 0 Then ' we have a character
print #6, chr(k_b) 'echo it
' ----READ ALL 16 ADCs------------------------------------------
For i = 0 to 15
mux = i * 8
mux = mux and &b01111000 ' Make sure LS 3 bits are zero
mux = mux OR MUXNEG ' Add in the LS 3 bits
if i <= 7 then
myADCX = getadc(ADCA, 0 , mux) ' ADC inputs 0-7 can be routed to ADCA only
else
myADCX = getadc(ADCB, 0 , mux) ' ADC inputs 8-15 can be routed to ADCB only
end if
'Print #6, i ; " , "; myADCX
Print #6, myADCX
Next i
end if
' Heartbeat LED
LEDcounter = LEDcounter + 1
if LEDcounter >= 60000 then
toggle portd.1 'FAIL LED ON OFF
LEDcounter = 0
end if
goto loopforever
|