1 | #include <uart.h> // Headerdatei von uart.c
|
2 |
|
3 |
|
4 | /// Für die Kommunikation über die UART0 Schnittstelle
|
5 | //--Senden--//
|
6 | char uart0_tx_buffer[255]; // Sendebuffer
|
7 | unsigned char uart0_tx_buffer_pointer=0; // Zeigt auf den nächsten freien Speicherbereich im Sendebuffer
|
8 | unsigned char uart0_txd_pointer=0; // Zeige auf das nächste zu sendende Zeichen im Sendebuffer
|
9 | unsigned char uart0_txd_complete=0; // Zeigt an, ob Senden über UART0 im gange ist. 0 = Senden, 1 = Alle Zeichen gesendet
|
10 | //--Empfangen--//
|
11 | char uart0_rx_buffer[255]; // Empfangsbuffer
|
12 | unsigned volatile char uart0_rx_buffer_pointer=0; // Zeigt auf den nächsten freien Speicherbereich im Empfangsbuffer
|
13 | unsigned char uart0_rxd_complete=0; // Zeigt an, ob ein komplettes Telegramm (bis zum Endezeichen CR) von der UART0 Schnittstelle empfangen wurde
|
14 | unsigned char uart0_rxd_DataLength=0; // Gibt die Anzahl der empfangenen Daten an
|
15 | //--------------------------------------
|
16 |
|
17 |
|
18 | unsigned char test2=0;
|
19 |
|
20 |
|
21 |
|
22 | //---------------------------------------------------------------------------
|
23 | // ISR(USART_TXC_vect)
|
24 | //
|
25 | // functiondescription: Interrupt für USART0 recieve. Schreibt die empfangenen Zeichen in einen Empfangsbuffer bis das Endezeichen (CR=0x0D) erkannt wurde
|
26 | //
|
27 | // hand over:
|
28 | // - input parameters: nothing
|
29 | // returns:
|
30 | // - return parameter: nothing
|
31 | //---------------------------------------------------------------------------
|
32 | ISR(USART_RXC_vect)
|
33 | {
|
34 | char dummy_read;
|
35 |
|
36 | dummy_read=UDR; // UDR muss erst über dummy_read ausgelesen werden, da sonst unverhersehbares Verhalten
|
37 |
|
38 | if(dummy_read!=0x0D) // Kein Endezeichen empfangen ?
|
39 | {
|
40 | uart0_rx_buffer[uart0_rx_buffer_pointer]=dummy_read;
|
41 | uart0_rxd_DataLength++; // Wieder ein Datum mehr empfangen
|
42 |
|
43 |
|
44 | // Einzellne empfangene Zeichen anzeigen lassen
|
45 | /*
|
46 | putch('-',0);
|
47 | putch(uart0_rx_buffer[uart0_rx_buffer_pointer],0);
|
48 | putch('[',0);
|
49 | putdec((unsigned long)uart0_rx_buffer_pointer,0);
|
50 | putch(']',0);
|
51 | */
|
52 | // ------
|
53 |
|
54 | uart0_rx_buffer_pointer++;
|
55 | if(uart0_rx_buffer_pointer>255) uart0_rx_buffer_pointer=0; // Zur Sicherheit, kann hier aber nicht passieren, da unsigned char sowieso überläuft
|
56 |
|
57 | }
|
58 | else // Wenn ein Endezeichen empfangen wurde
|
59 | {
|
60 | UCSRB &= ~(1<<RXCIE); // Empfangsinterrupt deaktivieren
|
61 | uart0_rx_buffer[uart0_rx_buffer_pointer]='\0'; // Das String-Terminierungszeichen '\0' wird als letztes in den Empfangsbuffer geschrieben
|
62 | uart0_rx_buffer_pointer=0;
|
63 | uart0_rxd_complete=1;
|
64 | }
|
65 | }
|
66 |
|
67 |
|
68 |
|
69 | //---------------------------------------------------------------------------
|
70 | // ISR(USART_TXC_vect)
|
71 | //
|
72 | // functiondescription: Interrupt für USART0 Data Register Empty. Prüft, ob weitere Zeichen im Sendebuffer stehen und sendet diese
|
73 | //
|
74 | // hand over:
|
75 | // - input parameters: nothing
|
76 | // returns:
|
77 | // - return parameter: nothing
|
78 | //---------------------------------------------------------------------------
|
79 | ISR(USART_UDRE_vect)
|
80 | {
|
81 | if(uart0_txd_pointer!=uart0_tx_buffer_pointer) // Es stehen noch ungesendete Zeichen im Sendebuffer
|
82 | {
|
83 | UDR=uart0_tx_buffer[uart0_txd_pointer];
|
84 | uart0_txd_pointer++;
|
85 | if(uart0_txd_pointer>255) uart0_txd_pointer=0; // Zur Sicherheit, kann hier aber nicht passieren, da unsigned char sowieso überläuft
|
86 | }
|
87 | else // Wenn keine zu sendende Zeichen mehr übrig sind
|
88 | {
|
89 | UCSRB &= ~(1<<UDRIE); // Den "Data register empty Interrupt" deaktivieren
|
90 | uart0_txd_complete=1; // Alle Zeichen gesendet
|
91 | }
|
92 | }
|
93 |
|
94 |
|
95 |
|
96 |
|
97 | //---------------------------------------------------------------------------
|
98 | // InitUART
|
99 | //
|
100 | // functiondescription: Initialisiert die UART Schnittstelle
|
101 | //
|
102 | // hand over:
|
103 | // - input parameters: nothing
|
104 | // returns:
|
105 | // - return parameter: nothing
|
106 | //---------------------------------------------------------------------------
|
107 | void Inituart0(void)
|
108 | {
|
109 | UCSRB=0xB8; // 8N1, RX und TX Enable, RX Interrupt; UDRE Interrupt (Data Register empty)
|
110 | UCSRC=0x86; // 8N1; Asynchron; kein Paritätsbit
|
111 | UBRRH = 0; // Für 9600Baud@16Khz
|
112 | UBRRL = 103; // Für 9600Baud@16Khz
|
113 | }
|
114 |
|
115 |
|
116 |
|
117 |
|
118 | //---------------------------------------------------------------------------
|
119 | // putch
|
120 | //
|
121 | // functiondescription: Schreibt das zu sendende Zeichen in den Sendebuffer der jeweiligen Schnittstelle
|
122 | //
|
123 | // hand over:
|
124 | // - input parameters: Zu sendendes Zeichen; Schnittstelle über die gesendet werden soll
|
125 | // returns:
|
126 | // - return parameter: nothing
|
127 | //---------------------------------------------------------------------------
|
128 | void putch(char character, unsigned char channel)
|
129 | {
|
130 | switch (channel)
|
131 | {
|
132 | case 0:
|
133 | {
|
134 |
|
135 | uart0_txd_complete=0; // Uart0 ist aktiv
|
136 | uart0_tx_buffer[uart0_tx_buffer_pointer]=character; // Zeichen in den Sendebuffer kopieren
|
137 | uart0_tx_buffer_pointer++; // Sendepuffer erhöhen
|
138 | if(uart0_tx_buffer_pointer>255) uart0_tx_buffer_pointer=0; // Zur Sicherheit, kann hier aber nicht passieren, da unsigned char sowieso überläuft
|
139 | UCSRB |= (1<<UDRIE); // Den"Data register empty Interrupt" aktivieren
|
140 | break;
|
141 | }
|
142 |
|
143 | default: break;
|
144 |
|
145 | }
|
146 | }
|
147 |
|
148 |
|
149 |
|
150 | //---------------------------------------------------------------------------
|
151 | // putstring
|
152 | //
|
153 | // functiondescription: Sendet den übergebenen String in den Sendebuffer der jeweiligen Schnittstelle mithilfe der Funktion putch
|
154 | //
|
155 | // hand over:
|
156 | // - input parameters: Zu sendenden String; Schnittstelle über die gesendet werden soll
|
157 | // returns:
|
158 | // - return parameter: nothing
|
159 | //-------------------------------------------------------------------------
|
160 |
|
161 | void putstring(char *string, unsigned char channel)
|
162 | {
|
163 | while (*string != '\0')
|
164 | {
|
165 | if(*string == '\n') // CR senden ?
|
166 | {
|
167 | putch('\r',channel);
|
168 | string++;
|
169 | }
|
170 | else
|
171 | {
|
172 | putch(*string,channel); // Jedes Zeichen einzeln in den Sendebuffer schreiben
|
173 | string++;
|
174 | }
|
175 | }
|
176 | }
|
177 |
|
178 |
|
179 | //---------------------------------------------------------------------------
|
180 | // string_to_dec_value
|
181 | //
|
182 | // functiondescription: Wandelt einen übergebenen String der Länge len in eine Zahl um und gibt diese zurück.
|
183 | //
|
184 | // hand over:
|
185 | // - input parameters: String der in eine Zahl umgewandelt werden soll; Länge des Strings
|
186 | // returns:
|
187 | // - return parameter: nothing
|
188 | //-------------------------------------------------------------------------
|
189 |
|
190 | unsigned int string_to_dec_value(char *inputStr)
|
191 | {
|
192 |
|
193 | return 0;
|
194 | }
|