Forum: Mikrocontroller und Digitale Elektronik Xmega QDEN Decoder


von Jens (Gast)


Lesenswert?

Hallo,

ich versuche einen Drehencoder zu testen und habe dafür an meinem xmega 
an PORTB0+1 zwei Schalter angeschlossen, die gegen Masse schließen.

Ich habe gehofft, mit folgendem ganz simplen Code den Hardware Decoder 
benutzen zu können. Leider sehe ich keine Aktivitäten. Ich lasse mit den 
Stand des Hardwaretimers über eine Uart ausgeben, sehe aber immer nur 
"0".

Wenn ich die Schalter im Greycode durchschalte sehe ich keine 
Veränderungen.
1
PORTA_DIR = 0b11111111;
2
  PORTB_DIR = 0b11111100; //Zwei Eingänge
3
  PORTC_DIR = 0xFF;
4
  PORTD_DIR = 0xFF;
5
  PORTE_DIR = 0xFF;
6
  PORTR_DIR = 0xFF;
7
  
8
  UART_Init(&USARTC0, 9600); //Uart aktivieren
9
  PORTC_OUTSET = PIN4_bm;
10
  
11
  TCD0.CTRLD = 0b01101000; //Timer Event Channel 0 und Qden
12
  TCD0.CTRLA = TC_CLKSEL_DIV1_gc; //Timer ohne Teiler starten                          //Timer für Drehencoder
13
  TCD0.PER =  (2^15)-1;  //Bis hier hier soll gezählt werden
14
  EVSYS.CH0MUX = EVSYS_CHMUX_PORTB_PIN0_gc; //EVCh0 soll PORTB0 nehmen                    //Event Drehencoder
15
  EVSYS.CH0CTRL = EVSYS_QDEN_bm; //QDEN aktivieren
16
  
17
  PORTB.PIN0CTRL = PORT_ISC_FALLING_gc |PORT_OPC_PULLUP_gc;
18
  PORTB.PIN1CTRL = PORT_ISC_FALLING_gc |PORT_OPC_PULLUP_gc;
19
  
20
  WORD CNT_old = 0;
21
  
22
  while(1){
23
    char resp[20];
24
    
25
    //if(CNT_old != TCD0.CNT){
26
      CNT_old = TCD0.CNT;
27
      sprintf(resp, "%d\n\r", CNT_old);
28
      UART_SendString(&USARTC0, resp); //Hier sehe ich nur 0
29
    //}
30
  }

Ich habe mich an die Anleitung aus dem Atmel Datenblatt gehalten.

Ich habe
 a) Zwei Eingänge
 b) Falling Edge sensitive
 c) Portb0 EVChannel0 zugewiesen
 d) quadratur decoding aktiviert
 e) den timer evchannel0 zugewiesen
 f) für den timer quadrature decoding aktiviert
 g) timer ohne teiler akvitiert

Was mache ich falsch?

von Jens (Gast)


Lesenswert?

Fehler entdeckt, ich muss min. Digital Filtering auf 2 Samples stellen. 
Ich verstehe aber nicht so ganz, wofür dieser Parameter gut ist.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Jens schrieb:

>   TCD0.PER =  (2^15)-1;  //Bis hier hier soll gezählt werden

Bist Du Dir sicher, dass dieser Ausdruck das gewünschte Ergebnis 
erzeugt?

Hinweis: Was macht der ^ Operator in C?

Grüßle,
Volker.

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.