Hallo ich habe eine Frage zum Uart, wenn ich eine Zeichenkette eingesesen habe und diese gespeichert wurde, kann man dann das gespeicherte Byte auf PORTB des MC ausgeben? Ich arbeite mit einem ATmega16 in C mit 4MHz und 4800 bps. Den Quelltext habe ich aus dem AVR Tutorial ich bin mir aber nicht sicher das der Quelltext zu 100% richtig ist er hat zumindest kein error. Danke an alle die sich die Mühe machen mir zuhelfen.
1 | #include <stdlib.h> |
2 | #include <avr/io.h> |
3 | #include <util/delay.h> |
4 | #include <inttypes.h> |
5 | #define F_CPU 4000000L
|
6 | #define BAUD 4800L
|
7 | #define ubrr_value ( ( F_CPU / (16*BAUD) ) - 1 )
|
8 | |
9 | |
10 | uint8_t uart_getc(void); |
11 | void initusart (); |
12 | void uart_gets( char* Buffer, uint8_t MaxLen ); |
13 | |
14 | int main(void) |
15 | {
|
16 | void initusart (); |
17 | uint8_t uart_getc(void); |
18 | void uart_gets( char* Buffer, uint8_t MaxLen ); |
19 | }
|
20 | |
21 | /* Zeichen empfangen */
|
22 | uint8_t uart_getc(void) |
23 | {
|
24 | while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar |
25 | return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben |
26 | }
|
27 | |
28 | //Zeichen sammeln und zum String zusammen setzen
|
29 | void uart_gets( char* Buffer, uint8_t MaxLen ) |
30 | {
|
31 | uint8_t NextChar; |
32 | uint8_t StringLen = 0; |
33 | |
34 | NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen |
35 | // Sammle solange Zeichen, bis:
|
36 | // * entweder das String Ende Zeichen kam
|
37 | // * oder das aufnehmende Array voll ist
|
38 | |
39 | |
40 | while( NextChar != '\n' && StringLen < MaxLen - 1 ) { |
41 | *Buffer++ = NextChar; |
42 | StringLen++; |
43 | NextChar = uart_getc(); |
44 | }
|
45 | }
|
46 | |
47 | |
48 | //UART Initialisieren
|
49 | void initusart () |
50 | {
|
51 | |
52 | UBRRH = ubrr_value >> 8; |
53 | UBRRL = ubrr_value & 0xFF; |
54 | |
55 | UCSRB |= (1<<RXEN)|(1<<RXCIE); // UART RX einschalten |
56 | UCSRC = (1<<URSEL)|(111<<UCSZ1)|(00<<UPM1)|(1<<UPM0)|(0<<USBS ); // Asynchron 8 Bite |
57 | |
58 | }
|