Gast
#2242850
Hallo zusammen, leider hab ich einen sehr komischen Fehler mit der Uart auf meinem atmega8. Der mega8 kann Daten zum Pc senden und der Pc empfängt diese auch. Der umgekehrt Weg aber funktioniert nicht. Aufbau: Das meiste ist auf den Bilder im Anhang gut zu erkennen. - Max232N mit 1uF Elkos - Atmega8-16U mit 100nF (und Programmer-Schnittstelle) Ich hab auch schon einige Dinge versucht: - Am rs232 Pin 2 und 3 überbrückt. Das Echo kam an - Pin 12 und 11 am max232 überbrückt. Echo kam nicht an. - Max232 ausgetauscht. Keine Auswirkung. - R2 anstatt R1 am max232 benutzt. Hatte auch keine Auswirkung Ich habe mir auch schon einige Anleitungen angeschaut darunter auch diese hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART Auch habe ich diverse Beiträge im Forum durchgelesen aber diese bringen mir auch nichts. Leider steht mir kein Oszilloskop zur Verfügung, um genau feststellen zu können was bis wo ankommt. Ich hoffe dass mir jemand helfen kann. Im Anhang sind noch Bilder der Schaltung zu finden. Vielen Dank schon mal im Voraus. Quellcode: #include <avr/io.h> #ifndef F_CPU #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000" #define F_CPU 4000000UL // Systemtakt in Hz - Definition als unsigned long beachten // Ohne ergeben sich unten Fehler in der Berechnung #endif #define BAUD 9600UL // Baudrate // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler. #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010)) #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif // bei neueren AVRs andere Bezeichnung fuer die Statusregister, hier ATmega8: int uart_putc(unsigned char c) { while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ { } UDR = c; /* sende Zeichen */ return 0; } /* puts ist unabhaengig vom Controllertyp */ void uart_puts (char *s) { while (*s) { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */ uart_putc(*s); s++; } } static uint8_t uart_getc_wait() { // Warten, bis etwas empfangen wird while (!(UCSRA & (1 << RXC))) ; // Das empfangene Zeichen zurückliefern return UDR; } int main(void) { UCSRB |= (1<<TXEN); // UART TX einschalten UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 UBRRH = UBRR_VAL >> 8; UBRRL = UBRR_VAL & 0xFF; do { UDR; } while (UCSRA & (1 << RXC)); while(1){ uart_putc('s'); uint8_t data=uart_getc_wait(); //data++; } }


