PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XMega ADC Free Running Mode



Che Guevara
04.03.2012, 19:18
Hallo,

erst gestern ist mein selbstgemachtes ATXMega64A3 Testboard fertig geworden. Nun bin ich natürlich wie wild am rumprobieren (geile Sache so ein XMega) :D
Leider gibts auch schon die ersten Probleme:
Ich wollte den ADCA_Channel1 (PINA.1) im Free Running Mode laufen lassen und der DMA sollte dann den 8Bit Wert in das TCC0_CCA Register schreiben. Somit wollte ich mittels eines Potis völlig im Hintergrund eine einstellbare Frequenz erzeugen (Timer im Freq Modus).
Das erzeugen von Frequenzen funktioniert und auch der ADC funktioniert... Jedoch nur im Single-Mode! Im Free Running Mode steht immer nur der Wert 0 im Register (ADCA_CH1_RES).
Gibt es jemanden, der mir bei meinem Problem helfen kann? Die SuFu habe ich bereits benutzt, jedoch nichts brauchbares gefunden. Auch die XMega Samples im Bascom Ordner helfen mir nicht weiter...
Bascom-Version ist die 2.0.7.2 (Full).

Hier noch mein Code:


$regfile = "xm64a3def.dat"
$crystal = 32000000
$framesize = 100
$hwstack = 100
$swstack = 100


$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014


Config Osc = Disabled , 32mhzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1



Dim X As Byte


Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM2:" For Binary As #1


'Config Tcc0 = Freq , Prescale = 4 , Comparea = Enabled , Resolution = 8




'Config Adca = Free , Convmode = Unsigned , Resolution = 8bit , Dma = Ch01 , Reference = Arefa , Event_mode = None , Prescaler = 32 , Ch1_gain = 1 , Ch1_inp = Single_ended , Mux1 = 8
Config Adca = Free , Convmode = Unsigned , Resolution = 8bit , Dma = Off , Reference = Arefa , Event_mode = None , Prescaler = 128 , Ch1_gain = 1 , Ch1_inp = Single_ended , Mux1 = 8 '8
Config Pina.1 = Input



'Config Dma = Enabled , Doublebuf = Disabled , Cpm = Ch01rr23

'Config Dmach0 = Enabled , Burstlen = 1 , Chanrpt = Enabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , Sar = Burst , Sam = Fixed , Dar = Burst , Dam = Fixed , Trigger = &H11 , Btc = 1 , Repeat = 0 , Sadr = Varptr(adca_ch1_res) , Dadr = Varptr(x) 'tcc0_cca
'Config Dmach1 = Enabled , Burstlen = 2 , Chanrpt = Enabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , Sar = Burst , Sam = Fixed , Dar = Burst , Dam = Inc , Trigger = 1 , Btc = 5 , Repeat = 1 , Sadr = Varptr(tcd0_per) , Dadr = Varptr(empf(1))

'On Dma_ch0 Dma_ch0_int


Config Priority = Static , Vector = Application , Lo = Enabled
Enable Interrupts


Print #1 , "START"
Print


Do


'X = Getadc(adca , 1)
Print #1 , Adca_ch1_res 'L
Waitms 500


Loop

End


Vielen Dank & Gruß
Chris

EDIT:
Hat sich erledigt, ich hatte etwas übersehen; die sweep Einstellung. Hier der funktionierende Code:


$regfile = "xm64a3def.dat"
$crystal = 32000000
$framesize = 100
$hwstack = 100
$swstack = 100


$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014


Config Osc = Disabled , 32mhzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1



Dim X As Byte


Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM2:" For Binary As #1


Config Tcc0 = Freq , Prescale = 4 , Comparea = Enabled , Resolution = 8



Config Adca = Free , Convmode = Unsigned , Resolution = 8bit , Dma = Off , Sweep = Ch01 , Reference = Arefa , Event_mode = None , Prescaler = 128 , Ch1_gain = 1 , Ch1_inp = Single_ended , Mux1 = 8
Config Pina.1 = Input



Config Dma = Enabled , Doublebuf = Disabled , Cpm = Ch01rr23

Config Dmach0 = Enabled , Burstlen = 1 , Chanrpt = Enabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , Sar = Burst , Sam = Fixed , Dar = Burst , Dam = Fixed , Trigger = &H11 , Btc = 1 , Repeat = 0 , Sadr = Varptr(adca_ch1_resl) , Dadr = Varptr(tcc0_cca)



Config Priority = Static , Vector = Application , Lo = Enabled
Enable Interrupts


Print #1 , "Start"


Do


!NOP


Loop

End

Aber eine Frage habe ich noch:
Das sweep = ch01 bedeutet doch, dass abwechselnd die Kanäle 0 und 1 gemessen werden... Ich möchte aber eigentlich NUR Kanal1 einlesen. Gibt es dafür einen Trick?

EDIT2:
Hier das Ganze noch mit 16Bit Frequenz und 12Bit ADC ;)


$regfile = "xm64a3def.dat"
$crystal = 32000000
$framesize = 100
$hwstack = 100
$swstack = 100


$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014


Config Osc = Disabled , 32mhzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1




Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM2:" For Binary As #1


Config Tcc0 = Freq , Prescale = 8 , Comparea = Enabled , Resolution = 16



Config Adca = Free , Convmode = Unsigned , Resolution = 12bit , Dma = Ch01 , Sweep = Ch01 , Reference = Arefa , Event_mode = None , Prescaler = 128 , Ch1_gain = 1 , Ch1_inp = Single_ended , Mux1 = 8
Config Pina.1 = Input



Config Dma = Enabled , Doublebuf = Disabled , Cpm = Ch01rr23

Config Dmach0 = Enabled , Burstlen = 2 , Chanrpt = Enabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , Sar = Burst , Sam = Inc , Dar = Burst , Dam = Inc , Trigger = &H11 , Btc = 2 , Repeat = 0 , Sadr = Varptr(adca_ch1_res) , Dadr = Varptr(tcc0_cca)



Config Priority = Static , Vector = Application , Lo = Enabled
Enable Interrupts


Print #1 , "Start"


Do


!NOP


Loop

End


Meine Frage von oben steht jedoch noch :D