Forum: Mikrocontroller und Digitale Elektronik Problem Xmega Pattern Generator


von Alexxx (Gast)


Lesenswert?

Hallo,

hat schon mal jemand die AWEX-Einheit im Modus "Pattern Generator" (PGM) 
erfolgreich benutzt?

Habe das Problem, dass der Port_C konstant nur den Portwert ausgibt und 
auf AWEX-PGM nicht reagiert.
Aus dem Datenblatt werde ich nicht ganz schlau. Muss ich DTIEN, 
AWEX.OUTOVEN
(erfolglos probiert) setzen? Was fehlt?
Mit dem Debugger habe ich gesehen, dass das Flag DTHSBUFV gesetzt und 
danach wieder zurück gesetzt wird - PGM müsste also laufen...
Wieso kommt am Port nix an?

Ich habe:
- Xmega 64A3U
- AWEX.CTRL= "PGM"
- beschreibe AWEX.DTHSBUF mit verschiedenen Werten (über DMA: 
funktioniert)
- Timer C0 läuft mit TCC0.PER= Periodendauer, TCC0.CTRLB= 0

Danke für Hinweise.

von Alexxx (Gast)


Lesenswert?

Hat niemand einen Hinweis??

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Alexxx schrieb:
> Hat niemand einen Hinweis??

Leider nicht für Pattern Generation, wenn du ein funktionierendes 3 
Kanal mit DTI Unit Beispiel suchst, kann ich dir allerdings helfen.

> Aus dem Datenblatt werde ich nicht ganz schlau. Muss ich DTIEN,
> AWEX.OUTOVEN
> (erfolglos probiert) setzen?
Für meine Anwendung (Sinus Antrieb für BLDC) setzte ich DTIEN für die 
drei Kanäle und lasse AWEX.OUTOVEN unbenutzt (nicht gesetzt). Ich 
schalte statdessen die Ausgänge der PWM ab oder an übers Portregister.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Code???

von Alexxx (Gast)


Lesenswert?

Ich habe das Problem - durch probieren - selbst gelöst!
Für Andere (die evtl. irgend wann später durch googeln hier landen):
Die DTI-ENABLE-Bits (in AWEXx.CTRL) müssen für den 
Pattern-Generator-Mode ZUSÄTZLICH gesetzt werden, damit das Pattern auf 
den jeweiligen Portpins erscheint! (Die Output-Override-Bits dürfen 
NICHT gesetzt sein)
PS: Das Timer-Overflow-Interruptflag kann gleichzeitig benutzt werden um 
eine DMA zu triggern, die aus einer Tabelle AWEXx.DTHSBUF mit Patterns 
"füttert"

Knut B. schrieb:
> Code???

Da ich den Code in zwei Dateien habe - eine ist eine art Bibliothek, 
kann ich den Code schlecht als Anhang schicken, deshalb zusammenkopiert:

//**********************************************************************
void Setup_Pattern_Generator(AWEX_t *awex, float frequency, uint8_t 
startvalue)
{
  PORT_t    *port;
  TC0_t    *tptr;

  port= AWEX2Port(awex);    // ermittelt die Portadresse der 
AWEX-Ausgänge
  port->DIRCLR= 0xFF;
  port->OUT= startvalue;
  awex->CTRL= AWEX_PGM_bm;
  awex->CTRL |=   AWEX_DTICCAEN_bm | AWEX_DTICCBEN_bm | AWEX_DTICCCEN_bm 
| AWEX_DTICCDEN_bm;  // nur Pattern Generation
  awex->OUTOVEN= 0;    // Port in Portmodus, KEIN Override!
  awex->DTHSBUF= startvalue;  // PGM-Buffer= startvalue
  awex->DTLSBUF= 0;    // Port in Portmodus, KEIN Override!
  port->DIRSET= 0xFF;    // Ausgänge einschalten
  tptr= AWEX2Timer(awex);    // ermittelt die Adresse des Timer_0 der 
AWEX-Einheit
  if(frequency > 0)
    tptr->CTRLA= SetupIntervallTimer_F(tptr, frequency);  // 
konfiguriert einen Timer auf eine definierte Ausgangsfrequenz
}
//********************************************************************** 
***
/** @brief initialisiert Pattern-Ausgabe aus einer Tabelle
*/
void setup_value_output(void)
{
  // Setup Output-Tabelle
  FillBlock(&output_tab[0], 0x20, OUTTAB_MAXLEN); // Tabelle füllen
  Setup_Pattern_Generator(&AWEXC, 49.0*OUTTAB_MAXLEN, output_tab[0]);
  // Setup DMA: Quelle ist Tabelle, Ziel ist AWEXC.DTHSBUF
  SetupDmaChannel(&DMA.CH0, &output_tab[0], (uint8_t *)(&AWEXC.DTHSBUF), 
1, OUTTAB_MAXLEN, true);
        // Die DMA wird mit dem Pattern-Takt getriggert
  DMA.CH0.TRIGSRC= DMA_CH_TRIGSRC_TCC0_CCA_gc;
}

PPS: wenn jemand Interesse an meinen selbst gebastelten 
Peripherie-Routinen hat, gleich melden!

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.