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?