Forum: Mikrocontroller und Digitale Elektronik PDEC index reset funktoniert nicht (atsamd51)


von Fabian N. (flyget)


Angehängte Dateien:

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

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.