Forum: Mikrocontroller und Digitale Elektronik Xmega QDEN Decoder


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jens (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.