1 | /// Für die Kommunikation über die UART0 Schnittstelle
|
2 | unsigned char uart0_tx_buffer[255]; // Sendebuffer
|
3 | unsigned char uart0_tx_buffer_pointer=0; // Zeigt auf den nächsten freien Speicherbereich im Sendebuffer
|
4 | unsigned char uart0_txd_pointer=0; // Zeige auf das nächste zu sendende Zeichen im Sendebuffer
|
5 | unsigned char uart0_tdx_complete=0; // Zeigt an, ob alle Zeichen gesendet wurden (=1)
|
6 |
|
7 |
|
8 | //---------------------------------------------------------------------------
|
9 | // ISR(USART_TXC_vect)
|
10 | //
|
11 | // functiondescription: Interrupt für USART0 Data Register Empty. Prüft, ob weitere Zeichen im Sendebuffer stehen und sendet diese
|
12 | //
|
13 | // hand over:
|
14 | // - input parameters: nothing
|
15 | // returns:
|
16 | // - return parameter: nothing
|
17 | //---------------------------------------------------------------------------
|
18 | ISR(USART_UDRE_vect)
|
19 | {
|
20 | if(uart0_txd_pointer!=uart0_tx_buffer_pointer) // Es stehen noch ungesendete Zeichen im Sendebuffer
|
21 | {
|
22 | //while(UDRE!=1);
|
23 | UDR=uart0_tx_buffer[uart0_txd_pointer];
|
24 | //PORTC = uart0_tx_buffer[uart0_txd_pointer];
|
25 | uart0_txd_pointer++;
|
26 | if(uart0_txd_pointer>255) uart0_txd_pointer=0; // Zur Sicherheit, kann hier aber nicht passieren, da unsigned char sowieso überläuft
|
27 | }
|
28 | else
|
29 | {
|
30 | UCSRB &= ~(1<<UDRIE); // den UDRE Interrupt ausschalten
|
31 | uart0_tdx_complete=1; // Alle Zeichen gesendet
|
32 | PORTC = 0x0A;
|
33 | }
|
34 | }
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | //---------------------------------------------------------------------------
|
40 | // InitUART
|
41 | //
|
42 | // functiondescription: Initialisiert die UART Schnittstelle
|
43 | //
|
44 | // hand over:
|
45 | // - input parameters: nothing
|
46 | // returns:
|
47 | // - return parameter: nothing
|
48 | //---------------------------------------------------------------------------
|
49 | void Inituart0(void)
|
50 | {
|
51 | UCSRB=0x4C; // 8N1, RX und TX Enable, RX Interrupt
|
52 | UCSRC=0x86; // 8N1; Asynchron; kein Paritätsbit
|
53 | UBRRH = 0; // Für 9600Baud@16Khz
|
54 | UBRRL = 103; // Für 9600Baud@16Khz
|
55 | }
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | //---------------------------------------------------------------------------
|
61 | // putch
|
62 | //
|
63 | // functiondescription: Schreibt das zu sendende Zeichen in den Sendebuffer der jeweiligen Schnittstelle
|
64 | //
|
65 | // hand over:
|
66 | // - input parameters: Zu sendendes Zeichen; Schnittstelle über die gesendet werden soll
|
67 | // returns:
|
68 | // - return parameter: nothing
|
69 | //---------------------------------------------------------------------------
|
70 | void putch(unsigned char character, unsigned char channel)
|
71 | {
|
72 | switch (channel)
|
73 | {
|
74 | case 0:
|
75 | {
|
76 |
|
77 | uart0_tdx_complete=0; // Uart0 ist aktiv
|
78 | uart0_tx_buffer[uart0_tx_buffer_pointer]=character; // Zeichen in den Sendebuffer kopieren
|
79 | uart0_tx_buffer_pointer++; // Sendepuffer erhöhen
|
80 | if(uart0_tx_buffer_pointer>255) uart0_tx_buffer_pointer=0; // Zur Sicherheit, kann hier aber nicht passieren, da unsigned char sowieso überläuft
|
81 | break;
|
82 |
|
83 | }
|
84 |
|
85 | default: break;
|
86 | }
|
87 |
|
88 | }
|
89 |
|
90 |
|
91 |
|
92 | //---------------------------------------------------------------------------
|
93 | // puts
|
94 | //
|
95 | // functiondescription: Sendet den übergebenen String in den Sendebuffer der jeweiligen Schnittstelle mithilfe der Funktion putch
|
96 | //
|
97 | // hand over:
|
98 | // - input parameters: Zu sendenden String; Schnittstelle über die gesendet werden soll
|
99 | // returns:
|
100 | // - return parameter: nothing
|
101 | //---------------------------------------------------------------------------
|
102 | void puts(unsigned char *string, unsigned char channel)
|
103 | {
|
104 |
|
105 | while (*string != '\0')
|
106 | {
|
107 | if(*string == '\n') // CR senden ?
|
108 | {
|
109 | putch('\r',channel);
|
110 | string++;
|
111 | }
|
112 | else
|
113 | {
|
114 | putch(*string++,channel); // Jedes Zeichen einzeln in den Sendebuffer schreiben
|
115 | }
|
116 | }
|
117 |
|
118 | UCSRB |= (1<<UDRIE);
|
119 |
|
120 | }
|