Gast
#877059
Hallo! Ich habe bisher meinen Mega8 immer mit Assembler programmiert. Jetzt habe ich ein Programm angefangen, dass mit Assembler einfach zu umständlich wird und bin deshalb auf C umgestiegen. Mit Assembler hat das Senden über den UART problemlos geklappt, mit C funktioniert es komischerweise nicht. Es kommt nur sporadisch mal ein Zeichen, dass so aussieht wie ein hochgesetztes L. Es wird aber scheinbar permanent etwas gesendet, da die LEDs an TX und RX flackern. Da es mit Assembler klappt, ist die Hardware also schonmal in Ordnung. Vielleicht ist es nur ein kleiner Fehler. Bitte helft mir. Hier mein Code: #define F_CPU 8000000 #define BAUD 9600 #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) #define LOW(x) ((x) & 0xFF) #define HIGH(x) (((x) >> 8) & 0xFF) #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010)) #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif #include <avr/io.h> #include <stdlib.h> void initUART() { UCSRB |= (1<<TXEN); UBRRL = LOW(UBRR_VAL); UBRRH = HIGH(UBRR_VAL); } int uart_putc(unsigned char c) { while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich */ UDR = c; /* sende Zeichen */ return 0; } void uart_puts (char *s) { while (*s) { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */ uart_putc(*s); s++; } } void main() { char buffer[20]; initUART(); while(1) { //sprintf(buffer, "Hallo"); //uart_puts(buffer); uart_putc('H'); uart_putc('A'); uart_putc('L'); uart_putc('L'); uart_putc('O'); } }