Forum: Mikrocontroller und Digitale Elektronik xmega dac + event system


von tantal (Gast)


Lesenswert?

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

: Verschoben durch Admin
von tantal (Gast)


Angehängte Dateien:

Lesenswert?

hier noch 2 Bilder vom DAC-Ausgang

von tantal (Gast)


Lesenswert?

Ok .. habs schon selbst herausgefunden ...
könnte mich selbst in den A.... treten!!

Ich habe blöderweise hinter der if-Abfrage ein Semikolon gesetzt, was an 
der Stelle auch kein Fehler ausgiebt ... somit war meine Abfrage total 
überflüssig ...

Trotzdem Danke falls sich Jemand die Mühle gemacht hat mein Problem 
nachzuvollziehen!

Gruß
Mathias

von Bassti (Gast)


Lesenswert?

Ohne DMA wirds aber schwerer... DMA solltest du dir auf jedenfall mal 
anschauen...

Vorgehen mit DMA ist dann: Timer starten, mit Überlauf oder Compare den 
DMA Triggern (kein Interrupt auslösen!), der DMA schiebt dann das 
nächste Byte in den DAC... bzw. zwei Byte, da ja 12 Bit...

das wars auch schon... alles andere sind DMA Einstellungen. Also ob er 
nach dem ersten Sinus von vorn beginnt, oder nicht....

IM Grunde braucht für nen Sinus deine CPU gar nichts mehr tun... mit 
CPU, wirds bei nem schnellen Sinus eh kein Sinus mehr ;)

Grüße

Basti

von AE (Gast)


Lesenswert?

Hallo
Weil ich gerade vor einem ähnlichen Problem stehe, möchte ich den 
Beitrag mal aufgreifen mit folgender Frage:
Ist der Betrieb mit DMA eigentlich stromsparender (Habe extra den 
ATXmega128A1U ausgesucht da er als picopower läuft, bei mir im 
Batteriebetrieb)
Da ich noch nichts mit DMA gemacht habe, hatte ich zunächst vor, mit 
Ablauf von Timer 0 meine 4 DACs zu füttern, aber das timctrl Register 
wird im Datenblatt nicht beschrieben....nix gefunden.
Gruß Andi

von Timmo H. (masterfx)


Lesenswert?

Der DMA-Betrieb ansich spart erstmal keinen Strom. DMA selbst braucht ja 
zusätzlich auch noch Strom (laut Datenblatt 108µA bei 615kbps )
Es spart aber Strom wenn du durch den Betrieb mit DMA schneller wieder 
in einen Sleep-Mode wechseln kannst.

von AE (Gast)


Lesenswert?

Danke Holger.
Wird denn der DA-Ausgang während des Sleep modus auf dem 
eingestellten/ausgegebenen Wert gehalten?
Ich müßte im S+H Modus arbeiten, damit ich alle 4 Kanäle nutzen kann.

Weiß jemand etwas über die DACA_TIMCTRL und DACB_TIMCTRL Register für 
die DACs?
Ich bin wie gesagt in diversen Beispielen und Hinweisen darüber 
gestolpert, und habe sie letztlich in der ATXmega128A1Udef.inc auch als 
deklariert gefunden, nur im Datenblatt bzw. Manual werden sie 
netterweise nicht beschrieben. Auch die AVR-Studio "Hilfe" ist in dem 
Fall keine....

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.