Hallo, ich habe versuche grade in mein Projekt ein Software UART zu implementieren, da der Hardware UART bereits für den LIN Bus belegt ist. Hierzu brauche ich 8-Bit Timmer, da der 16-Bit Timer für die PWM benötigt wird. Ich versuche nun die Methoden aus Peter Daneggers LCD1Wire und I2C Sniffer einzubauen. Angefangen habe ich mit den RX Routinen aus der LCD1Wire allerdings habe ich nun beim kompilieren einen Fehler. ../suart.c:41: error: dereferencing pointer to incomplete type bzw tritt dieser 3 mal an den entsprechenden Stellen auf. Hier erstmal der Code
1 | #include "suart.h" |
2 | #include "main.h" |
3 | |
4 | #ifdef RX_INVERT
|
5 | #define get_rxd() (RXD_PIN == 0)
|
6 | #else
|
7 | #define get_rxd() (RXD_PIN == 1)
|
8 | #endif
|
9 | |
10 | uint8_t srx_tmp; |
11 | uint8_t srx_data; |
12 | uint8_t srx_mask; |
13 | volatile uint8_t srx_done; |
14 | |
15 | |
16 | void suart_init( void ) |
17 | {
|
18 | srx_done = 0; |
19 | |
20 | srx_mask = 0; // also change direction flag |
21 | PCMSK2 = 1<<RXD_INT; // enable start detection pin |
22 | PCIFR = 1<<PCIF2; |
23 | |
24 | TCCR0A = 0; |
25 | TCCR0B = 0; |
26 | OCR0A = BIT_TIME; |
27 | TIMSK0 = 1<<OCIE0A; |
28 | }
|
29 | |
30 | |
31 | uint8_t sgetchar( void ) |
32 | {
|
33 | while( !srx_done ); |
34 | srx_done = 0; |
35 | return srx_data; |
36 | }
|
37 | |
38 | |
39 | ISR( PCINT2_vect ) |
40 | {
|
41 | if( get_rxd() == 0 ){ // if start bit |
42 | TCNT0 = 256 - (BIT_TIME/2); // 1.5 bit time until compare |
43 | TCCR0A |= ( 1<<WGM01 ); |
44 | TCCR0B |= ( 1<<CS01 ); // start T1 with XTAL / 8 |
45 | srx_tmp = 0; // clear bit storage |
46 | srx_mask = 1; // start with LSB |
47 | PCMSK2 = 0; // disable start detection |
48 | }
|
49 | }
|
50 | |
51 | |
52 | ISR( TIMER0_COMPA_vect ) |
53 | {
|
54 | if( srx_mask ){ |
55 | if( get_rxd() == 1 ) |
56 | srx_tmp |= srx_mask; |
57 | srx_mask <<= 1; |
58 | return; |
59 | }
|
60 | if( get_rxd() == 1 ){ // Stop bit valid |
61 | srx_done = 1; // mark rx data valid |
62 | srx_data = srx_tmp; // store rx data |
63 | TCCR0A = 0; // stop T1 |
64 | TCCR0B = 0; |
65 | PCMSK2 = 1<<RXD_INT; // enable further start detection |
66 | }
|
67 | }
|
Controller ist ein ATA6613 bzw ein ATmega168