Guten Abend,
Ich versuche gerade vergebens eine Zeichenkette mithilfe eines Atmega8
an meinen Computer zu schicken. Scheinbar sind meine C Kenntnisse etwas
eingerostet da einzelne Zeichen mit der Funktion "uart_putc" einwandfrei
übertragen werden, innerhalb einer Schleife erhalte ich aber nur Müll.
Möglicherweise liegt ein Compilerfehler vor?
Code:
1 | #include <avr/io.h>
|
2 | #include <string.h>
|
3 |
|
4 | #define OSCSPEED 8000000 /*OSC in Hz*/
|
5 |
|
6 |
|
7 | void InitUART(uint32_t baud)
|
8 | {
|
9 | uint16_t baudrate=(OSCSPEED/(16*baud))-1;
|
10 | /*Set baud rate*/
|
11 | UBRRH = (unsigned char)(baudrate>>8);
|
12 | UBRRL = (unsigned char)baudrate;
|
13 | /* Enable Receiver and Transmitter */
|
14 | UCSRB = (1<<RXEN)|(1<<TXEN);
|
15 | /* Set frame format: 8data, 1stop bit */
|
16 | UCSRC = (1<<URSEL)|(3<<UCSZ0);
|
17 | }
|
18 |
|
19 | unsigned char UARTReceive(void)
|
20 | {
|
21 | if (UCSRA & (1<<RXC))
|
22 | return UDR;
|
23 | else /* no data pending */
|
24 | return 0;
|
25 | }
|
26 |
|
27 | int uart_putc(unsigned char c)
|
28 | {
|
29 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
|
30 | {
|
31 | }
|
32 |
|
33 | UDR = c; /* sende Zeichen */
|
34 | return 0;
|
35 | }
|
36 |
|
37 | /* puts ist unabhaengig vom Controllertyp */
|
38 | void uart_puts (const char *s)
|
39 | {
|
40 | while (*s) {
|
41 | uart_putc(*s);
|
42 | s++;
|
43 | }
|
44 | }
|
45 |
|
46 | int main()
|
47 | {
|
48 | char *str = "TEST";
|
49 | unsigned char c;
|
50 |
|
51 | InitUART(9600);
|
52 |
|
53 | while(1){
|
54 |
|
55 | c=UARTReceive();
|
56 |
|
57 | if (c){
|
58 | if(c=='p') {
|
59 | uart_putc('S');
|
60 | uart_putc('T');
|
61 | uart_putc('R');
|
62 | uart_putc('I');
|
63 | uart_putc('N');
|
64 | uart_putc('G');
|
65 | uart_putc(':');
|
66 |
|
67 | while (*str) {
|
68 | uart_putc(*str);
|
69 | str++;
|
70 | }
|
71 | }
|
72 | }
|
73 |
|
74 | }
|
75 |
|
76 | return 0;
|
77 | }
|
Ausgabe am Terminalprogramm:
1 | 53 54 52 49 4E 47FFFFFFFFFFFFFF- FFFFFFFFFFFFFF STRING:. .
|
2 | FF
|
Compiler/programer Anweisungen:
1 | avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -Os -fsigned-char -I./ -o uart.out rs.c
|
2 | avr-objcopy -j .text -O ihex uart.out uart.hex
|
3 |
|
4 | avrdude -p m8 -P usb -c avrispv2 -U flash:w:uart.hex
|
Bin für jeden Hinweis dankbar!
beste Grüße
Martin