1 | #define F_CPU 14745600UL // CPU Taktfrequenz
|
2 | #include <util/delay.h> //
|
3 | #include <avr/io.h> //
|
4 |
|
5 |
|
6 | #define BAUD 9600UL // Baudrate
|
7 |
|
8 | //Berechnung der Baudrate
|
9 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
10 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
11 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
12 |
|
13 |
|
14 | UCSRB |= (1<<TXEN);
|
15 | UCSRB |= (1<<RXEN);
|
16 |
|
17 |
|
18 |
|
19 | // ------------------------------------------------------------
|
20 | // UART initalisieren
|
21 |
|
22 | void uart_init(void) {
|
23 | UBRRH = UBRR_VAL >> 8;
|
24 | UBRRL = UBRR_VAL & 0xFF;
|
25 |
|
26 | UCSRB |= (1<<TXEN); // UART TX einschalten
|
27 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
|
28 | }
|
29 |
|
30 |
|
31 | // ------------------------------------------------------------
|
32 | // UART Empfangen
|
33 |
|
34 | uint8_t uart_getc(void) {
|
35 | while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar
|
36 |
|
37 | return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben
|
38 | }
|
39 |
|
40 |
|
41 | void uart_gets( char* Buffer, uint8_t MaxLen ) {
|
42 | uint8_t NextChar;
|
43 | uint8_t StringLen = 0;
|
44 |
|
45 | NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen
|
46 |
|
47 | // Sammle solange Zeichen, bis:
|
48 | // * entweder das String Ende Zeichen kam
|
49 | // * oder das aufnehmende Array voll ist
|
50 | while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
|
51 | *Buffer++ = NextChar;
|
52 | StringLen++;
|
53 | NextChar = uart_getc();
|
54 | }
|
55 |
|
56 | // Noch ein '\0' anhängen um einen Standard
|
57 | // C-String daraus zu machen
|
58 | *Buffer = '\0';
|
59 | }
|
60 |
|
61 |
|
62 | // ------------------------------------------------------------
|
63 | // UART Senden
|
64 |
|
65 | int uart_putc(unsigned char c) {
|
66 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
|
67 | {
|
68 | }
|
69 |
|
70 | UDR = c; /* sende Zeichen */
|
71 | return 0;
|
72 | }
|
73 |
|
74 |
|
75 | /* puts ist unabhaengig vom Controllertyp */
|
76 | void uart_puts (char *s) {
|
77 | while (*s) { /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
|
78 | uart_putc(*s);
|
79 | s++;
|
80 | }
|
81 | }
|
82 |
|
83 |
|
84 |
|
85 | // ------------------------------------------------------------
|
86 | // ------------------------------------------------------------
|
87 |
|
88 | int main (void) {
|
89 |
|
90 | DDRC = 0xFF; // Digitale Ausgänge
|
91 |
|
92 | uint16_t x1, x2, x3, x4; // Variable
|
93 |
|
94 |
|
95 | while(1)
|
96 | {
|
97 |
|
98 |
|
99 | //-----------UART Werte senden-----------// !!!ÜBERTRAGEN von x1-x4!!!
|
100 |
|
101 | char s[7];
|
102 | int16_t i = -12345;
|
103 |
|
104 | uart_init();
|
105 |
|
106 | itoa( i, s, 10 ); // 10 fuer radix -> Dezimalsystem
|
107 | uart_puts( s );
|
108 |
|
109 | // da itoa einen Zeiger auf den Beginn von s zurueckgibt verkuerzt auch:
|
110 | uart_puts( itoa( i, s, 10 ) );
|
111 |
|
112 | //-------------------------------------//
|
113 |
|
114 | }
|
115 |
|
116 |
|
117 | return 0;
|
118 | }
|