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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.