Hallo,
ich arbeite mit einem AtMega32 und paar Inkrementalgeber(Code aus dem
Forum & Handbetrieb), die UART lib nutze ich von Peter Fleury.
Ich Sende mit 9600 Baud da ich mit Bluetooth arbeite. Alles funktioniert
gut solange ich die Position anfahre dann halte und erst dann Sende
(Aufbau mit Taster...). Sobald ich aber ununterbrochen sende verliert
der Sensor die Position!
Ich wollte aber gern das, dass senden im Hintergrund läuft und am
liebsten ununterbrochen.
Jetzt habe ich im Forum gesucht nach einer Möglichkeit so zu senden das
es funktioniert aber ohne Erfolg!
1 | #include ….....
|
2 |
|
3 |
|
4 | /* 9600 baud */
|
5 | #define UART_BAUD_RATE 9600
|
6 |
|
7 |
|
8 | #define PHASE_A1 (PINC & 1<<PINC2) // PINC.0
|
9 | #define PHASE_B1 (PINC & 1<<PINC3) // PINC.1
|
10 |
|
11 |
|
12 | volatile int16_t enc_delta1;
|
13 |
|
14 |
|
15 | char sendString1[4];
|
16 |
|
17 | //-------------------------
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | int main(void){
|
23 |
|
24 | uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
|
25 |
|
26 | sei();
|
27 |
|
28 | while(1){
|
29 | asm volatile("nop");
|
30 |
|
31 | static char enc_last1 = 0x01;
|
32 | char i1 = 0;
|
33 |
|
34 | if( PHASE_A1 )
|
35 | i1 = 1;
|
36 |
|
37 | if( PHASE_B1 )
|
38 | i1 ^= 3; // convert gray to binary
|
39 |
|
40 | i1 -= enc_last1; // difference new - last
|
41 |
|
42 | if( i1 & 1 ){ // bit 0 = value (1)
|
43 | enc_last1 += i1; // store new as next last
|
44 |
|
45 | enc_delta1 += (i1 & 2) - 1; // bit 1 = direction (+/-)
|
46 | }
|
47 |
|
48 |
|
49 | if(!(PINB &(1<<PB0))){
|
50 |
|
51 |
|
52 | itoa(enc_delta1,sendString1,10);
|
53 |
|
54 | uart_puts(sendString1);
|
55 | uart_putc('x');
|
56 |
|
57 | }
|
58 | }
|
59 | }
|