Hi,
ich versuche mich grade an dem DAC vom xmega32A4U. Das Teil läuft soweit
auch ohne Probleme. Ich benötige für meine Anwendung eine genaue
Sample-Rate von 100kHz und habe mir daher gedacht, den DAC über das
event-system und einen Timer zu triggern.
Hier mein code zum konfigurieren der ganzen Geschichte:
1 | DACB.CTRLC = (DAC_REFSEL_INT1V_gc | DAC_LEFTADJ_bm) ; //int 1V ref ; left-adjusted value
|
2 | DACB.CTRLB = (DAC_CHSEL_DUAL_gc | DAC_CH0TRIG_bm | DAC_CH1TRIG_bm); //dual mode ; DAC-Event-Trigger enable
|
3 | DACB.EVCTRL = 0x00; //Event Channel 0 for both DAC channels
|
4 | DACB.CTRLA = (DAC_CH0EN_bm | DAC_CH1EN_bm | DAC_ENABLE_bm); //DAC0 & DAC1 enable
|
5 |
|
6 | TCD0.CTRLA = TC_CLKSEL_DIV1_gc;
|
7 | TCD0.CTRLB = 0x00;
|
8 | TCD0.CTRLC = 0x00;
|
9 | TCD0.CTRLD = TC_EVSEL_CH0_gc;
|
10 | TCD0.CTRLE = 0x00;
|
11 | TCD0.INTCTRLA = 0x00;
|
12 | TCD0.INTCTRLB = 0x00;
|
13 | TCD0.PER = 0x0140; //10us -> 100kHz
|
14 |
|
15 | EVSYS.CH0MUX = EVSYS_CHMUX_TCD0_OVF_gc;
|
Jetzt zu meinem Problem:
Ich möchte in einer Schleife eine Tabelle von Daten ausgeben (z.B.
Sinus). Mein Gedanke war jetzt: ich schreibe ein Datum in das "CH0DATA"
Register, warte bis das event-system getriggert hat und schreibe dann
neue Daten rein. Das Warten wollte ich über das "CH0DRE" bit im DAC
Status Register machen, welches auf High gesetzt wird, wenn neue Daten
geschrieben werden können. Nur ist dieses Bit anscheinend immer auf
High, bzw. nur während er Wandlung auf Low. Am DAC-Ausgnag sieht man
genau die 100kHz Samplerate, also läuft das event-system richtig, nur
die if-abfrage in der Schleife wird ca. 10 mal öfter aufgerufen.
Hier die Schleife:
1 | while (1)
|
2 | {
|
3 |
|
4 | if(DACB.STATUS & DAC_CH0DRE_bm);
|
5 | {
|
6 | LED1_PORT.OUTTGL = LED1_PIN_bm;
|
7 | DACB.CH0DATA = sinustab[i];
|
8 | i++;
|
9 | }
|
10 |
|
11 | }
|
Gibt es irgendeine andere Möglichkleit, an der ich feststellen kann, ob
der aktuelle Wert schon gewandelt wurde oder nicht?? über das "CH0DRE"
Bit geht's anscheinend nicht.
Klar weiß ich, das es über DMA geht, nur bin ich mit den xmega noch
nicht so vertraut und wollte mir das mit DMA sparen für diese einfache
Anwendung.
Gruß
Mathias
Gruß
Mathias