PDEC index reset funktoniert nicht (atsamd51)

OP #7940264
Lesenswert?
• ▲
▼

Hallo zusammen, ich kämpfe aktuell mit dem PDEC Peripheral am atsamd51 µC. Das zählen funktioniert so weit sauber, aber "alles" was mit Index zu tun wird offenbar ignoriert. Die Signale liegen sauber am µC an. Signal B und I werden per Software invertiert.

  • Es erfolgt leider kein Reset des Counter-Reg, egal wie viele Umdrehungen der Encoder macht.
  • Das STATUS.IDXerr wird nie gesetzt
  • Die eigentliche Funktion des Zählens, vorwärts+rückwärts, funktioniert ohne Probleme

Ich verwende folgenden Code:

1
/*************************************************************/
2
/********** PDEC initialisieren ******************************/
3
/*************************************************************/
4
void Encoder_init(void)
5
{
6

7
// PDEC Encoder
8
  PORT->Group[0].PMUX[12].bit.PMUXE = 6;    // PA24 ==> PDEC/QDI[0]
9
  PORT->Group[0].PMUX[12].bit.PMUXO = 6;    // PA25 ==> PDEC/QDI[1]
10
  PORT->Group[1].PMUX[11].bit.PMUXE = 6;    // PB22 ==> PDEC/QDI[2]
11
  
12
  PORT->Group[0].PINCFG[24].reg = PORT_PINCFG_INEN | PORT_PINCFG_PMUXEN; // PORT PA24 MUX an, Input buffer an
13
  PORT->Group[0].PINCFG[25].reg = PORT_PINCFG_INEN | PORT_PINCFG_PMUXEN; // PORT PA25 MUX an, Input buffer an
14
  PORT->Group[1].PINCFG[22].reg = PORT_PINCFG_INEN | PORT_PINCFG_PMUXEN; // PORT PB22 MUX an, Input buffer an
15

16
  MCLK->APBCMASK.bit.PDEC_ = 1;                      // Main-Clock auf PDEC aktivieren
17
  GCLK->PCHCTRL[31].reg = GCLK_PCHCTRL_CHEN |  GCLK_PCHCTRL_GEN_GCLK0;    // PDEC an GCLK0
18
  
19
  PDEC->DBGCTRL.bit.DBGRUN = 1;
20
  PDEC->CTRLA.bit.SWRST = 1;
21
  while(PDEC->SYNCBUSY.bit.SWRST);
22
  while(PDEC->CTRLA.bit.SWRST);
23
  //PDEC->CTRLA.reg = PDEC_CTRLA_ANGULAR(7) | PDEC_CTRLA_PINEN(7) | PDEC_CTRLA_MODE_QDEC | PDEC_CTRLA_ENABLE | PDEC_CTRLA_PINVEN(6) | PDEC_CTRLA_PEREN | PDEC_CTRLA_CONF_X4;
24
  PDEC->CTRLA.reg = PDEC_CTRLA_ANGULAR(7) | PDEC_CTRLA_PINEN(7) | PDEC_CTRLA_MODE_QDEC | PDEC_CTRLA_ENABLE | PDEC_CTRLA_PINVEN1 | PDEC_CTRLA_PINVEN2 | PDEC_CTRLA_PEREN | PDEC_CTRLA_CONF_X4;
25
  PDEC->INTENSET.reg = PDEC_INTENSET_MC0;
26
  PDEC->CC[0].reg = ENC_MAX_CNT; // 280 lines * 4 * 16 (interpolation)
27
  while(PDEC->SYNCBUSY.bit.ENABLE);
28
  PDEC->CTRLBSET.reg = PDEC_CTRLBSET_CMD_START;
29
  while(PDEC->SYNCBUSY.bit.CTRLB);
30
  PDEC->INTFLAG.reg = 0x3f;
31
}

Jemand ne Idee an was das liegen kann?

Beste Grüße, Fabian

Angehängte Dateien:

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.