PDEC index reset funktoniert nicht (atsamd51)

#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren