1 | #include <avr/io.h>
|
2 | #include <inttypes.h>
|
3 | #include <util/delay.h>
|
4 | #include <avr/interrupt.h>
|
5 |
|
6 | #define F_CPU 3686400UL // internal clock 3.686Mhz
|
7 |
|
8 | #define BAUD 9600UL // Baudrate
|
9 | #define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1) // Baudrate berechen
|
10 |
|
11 |
|
12 | #define PHASE_A (PINC & 1<<PINC6) // PINC.6 -> A
|
13 | #define PHASE_B (PINC & 1<<PINC7) // PINC.7 -> B
|
14 |
|
15 | volatile uint16_t enc_delta; // -32768 ... 32767
|
16 |
|
17 | void uart_init(void) // USART initialisieren
|
18 | {
|
19 | UBRRH = (uint8_t) (UBRR_BAUD>>8); // Baudrate einstellen
|
20 | UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);
|
21 | UCSRB = (1<<RXEN)|(1<<TXEN); // Aktivieren von receiver und transmitter
|
22 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
|
23 | }
|
24 |
|
25 | int uart_putc(unsigned char c) // Einzelnes Zeichen über UART senden
|
26 | {
|
27 | while (!(UCSRA & (1<<UDRE))) // Warten bis Senden möglich ist
|
28 | {
|
29 | }
|
30 | UDR = c; // Zeichen senden
|
31 | return 0;
|
32 | }
|
33 |
|
34 | void uart_puts (char *s) // String über UART senden
|
35 | {
|
36 | while (*s) // Senden bis zum Stringende
|
37 | {
|
38 | uart_putc(*s); // Einzelnes Zeichen senden
|
39 | s++; // Pointer erhöhen
|
40 | }
|
41 | }
|
42 |
|
43 | int main(void) // MAIN
|
44 | {
|
45 | uart_init(); // UART initialisieren
|
46 | uart_puts("Encoder Wert"); // Test String senden
|
47 |
|
48 | volatile uint16_t last_enc_delta; // Variable für den letzten Encoder Wert
|
49 |
|
50 | TCCR0 = 1<<CS00; // Timer ohne Vorteiler
|
51 | TIMSK = 1<<TOIE0; // Timer interrupt aktivieren
|
52 |
|
53 | sei(); // Globale Interrupts aktivieren
|
54 |
|
55 | while (1) // Für immer
|
56 | {
|
57 | if(last_enc_delta != enc_delta) // Wenn sich der Zähler geändert hat
|
58 | {
|
59 | char text[7];
|
60 | itoa(enc_delta,text,10); // Zählerwert in String wandeln
|
61 | uart_puts(text); // String senden
|
62 | uart_putc('\n'); // Neue Zeile
|
63 | last_enc_delta = enc_delta; // Gesendeten Wert als aktuellen eintragen
|
64 | }
|
65 | }
|
66 | return 0; // Wird nie erreicht
|
67 | }
|
68 | /* ENCODER CODE von Peter Dannegger */
|
69 |
|
70 | ISR (TIMER0_OVF_vect) // Timer Interrupt
|
71 | {
|
72 | static int16_t enc_last = 0x01;
|
73 | int16_t i = 0;
|
74 |
|
75 | if( PHASE_A )
|
76 | i = 1;
|
77 |
|
78 | if( PHASE_B )
|
79 | i ^= 3; // convert gray to binary
|
80 |
|
81 | i -= enc_last; // difference new - last
|
82 |
|
83 | if( i & 1 ) // bit 0 = value (1)
|
84 | {
|
85 | enc_last += i; // store new as next last
|
86 | enc_delta += (i & 2) - 1; // bit 1 = direction (+/-)
|
87 | }
|
88 | }
|