Hallo zusammen,
ich möchte auf dem ATXmega384C3 eine gewisse Anzahl von Messwerten alle 250µ einlesen, ohne die die CPU zu belasten.
Die Idee ist: Timer_ovl befeuert alle 250µ ein Event -> triggert ADC, der die Messwerte per DMA in den Speicher schiebt und dann der Int vom DMA "fertig" meldet.
Leider funktioniert das Zusammenspiel anscheinend nicht richtig.
Der Int vom DMA kommt sofort und im Messwerte-Array stehen komische Werte.
Ich vermute da eine fehlerhafte Konfiguration
Hat jemand ein simples Beispiel dafür?
Mein bisheriger Ansatz
Alles anzeigen
Danke und Gruß
ich möchte auf dem ATXmega384C3 eine gewisse Anzahl von Messwerten alle 250µ einlesen, ohne die die CPU zu belasten.
Die Idee ist: Timer_ovl befeuert alle 250µ ein Event -> triggert ADC, der die Messwerte per DMA in den Speicher schiebt und dann der Int vom DMA "fertig" meldet.
Leider funktioniert das Zusammenspiel anscheinend nicht richtig.
Der Int vom DMA kommt sofort und im Messwerte-Array stehen komische Werte.
Ich vermute da eine fehlerhafte Konfiguration
Hat jemand ein simples Beispiel dafür?
Mein bisheriger Ansatz
BASCOM-Quellcode
- Config Priority = Static , Vector = Application , Lo = Enabled , Hi = Enabled ', Med = Enabled
- Config Event_system = Dummy , Mux0 = Tcc0_ovf ' Event Channel0 wird mit Tcc0_ovf getriggert
- On Dma_ch0 Dma_ch0_int ' DMA Ch0 ISR
- Config Dma = Enabled , Doublebuf = Disabled , Cpm = Ch01rr23 ' enable DMA,
- Adca_evctrl = &B00000000 'kein Event start
- ' 250µs-Timer für Spannungsmessung
- Tcc0_per = 8000
- Config Tcc0 = Normal , Prescale = 1
- Config Adca = Single , Convmode = Unsigned , Resolution = 12bit , Dma = Ch01 , Event_channel = Ch0123 , Event_mode = Ch0 , Prescaler = 16 , Tempref = Disabled , Ch0_inp = Single_ended , Mux0 = &B0_0000_000
- Adca_refctrl = &B0_000_00_1_0 ' Interne 1V-Referenz - Bandgap ein - Tempref aus
- '_______________________________________________________________________________
- ' ADC-Messung über die CPU
- Sub Adcmessung(byval Channel As Byte , Byval Samples As Byte)
- ' Channel=0 PA.0 HV-U
- ' Channel=1 PA.1 HV-I
- ' Channel=2 PA.2 +24V-Versorgung
- ' Channel=3 PA.3 +3.3V-Versorgung
- ' Channel=4 PA.4 GND für Offsetmessung
- ' Channel=7 PA.7 Boardrevision
- ' ADCA auf richtigen Eingang setzen und DMA anpassen
- Select Case Channel ' auf welchem Kanal und wie messen
- Case Channel_hv_u ' 0...250V AC messen
- Adca_ch0_muxctrl = &B0_0000_000 ' auf richtigem Eingang messen
- If Samples = 80 Then ' bei Netztspannung 50Hz -> 80 Messungen
- Config Dmach0 = Enabled , Burstlen = 2 , Chanrpt = Disabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , _
- Sar = Burst , Sam = Fixed , Dar = Transaction , Dam = Inc , Trigger = &H10 , Btc = 160 , Repeat = 0 , Sadr = Varptr(adca_ch0_res) , Dadr = Varptr(adcwert(1))
- Else ' bei Netztspannung 60Hz -> 67 Messungen
- Config Dmach0 = Enabled , Burstlen = 2 , Chanrpt = Disabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , _
- Sar = Burst , Sam = Fixed , Dar = Transaction , Dam = Inc , Trigger = &H10 , Btc = 134 , Repeat = 0 , Sadr = Varptr(adca_ch0_res) , Dadr = Varptr(adcwert(1))
- End If
- Case Channel_gnd ' ADC Offset messen
- Adca_ch0_muxctrl = &B0_0100_000 ' auf richtigem Eingang messen
- Config Dmach0 = Enabled , Burstlen = 2 , Chanrpt = Disabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , _
- Sar = Burst , Sam = Fixed , Dar = Transaction , Dam = Inc , Trigger = &H10 , Btc = 20 , Repeat = 0 , Sadr = Varptr(adca_ch0_res) , Dadr = Varptr(adcwert(1))
- Case Channel_boardrevision ' Boardrevision messen
- Adca_ch0_muxctrl = &B0_0111_000 ' auf richtigem Eingang messen
- Config Dmach0 = Enabled , Burstlen = 2 , Chanrpt = Disabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , _
- Sar = Burst , Sam = Fixed , Dar = Transaction , Dam = Inc , Trigger = &H10 , Btc = 20 , Repeat = 0 , Sadr = Varptr(adca_ch0_res) , Dadr = Varptr(adcwert(1))
- End Select
- Zeittaktadcmessung = 1 ' Messung läuft
- Enable Tcc0_ovf , Lo ' Timer-IRQ freigeben
- Adca_evctrl = &B000_00_001 'ADC ist bereit...ADCA start über event CH.0
- Evsys_ch0mux = &B1100_0000 'eventsystem (CH.0) triggert bei TCC0 overflow
- Do
- Loop Until Zeittaktadcmessung = 0
- End Sub
- '___ DMA Ch0 ISR wenn Daten von MainCPU im SRAM sind ___________________________
- '
- Dma_ch0_int:
- Print #1 , "Dma_ch0_int"
- Reset Dma_channel_0_error
- If Dma_intflags.0 = 1 Then 'Channel 0 Transaction Interrupt Flag
- Set Dma_intflags.0 'Clear the Channel 0 Transaction Complete flag
- Zeittaktadcmessung = 0
- Evsys_ch0mux = 0 'eventsystem (CH.0) triggert bei TCC1 overflow = AUS
- Disable Tcc0_ovf ' Timer-IRQ sperren
- 'Reset Testpin
- End If
- If Dma_intflags.4 = 1 Then 'Channel 0 ERROR Flag
- Set Dma_intflags.4 'Clear the flag
- Set Dma_channel_0_error 'Channel 0 Error
- End If
- Return
Danke und Gruß