Moin! Ich benutze für meinen AT90CAN128 folgende Befehle um Zeichen einzulesen und zu versenden (RS232): void uart_putc( uint8_t data ) { while ( !(UCSR0A & (1<<UDRE0)) ); UDR0 = data; } uint8_t uart_getc(void) { while (!(UCSR0A & (1<<RXC0))); return UDR0; // Zeichen aus UDR an Aufrufer zurueckgeben } So siehts dann in der Main schleife aus: NextChar=uart_getc(); uart_putc(NextChar); Ich will mir also vom programm die eingegebenen Zeichen anzeigen lassen! Aber leider kommt nur Müll zurück, undzwar jedes mal anderer Müll. Wenn ich hingegen uart_putc('A'); schreibe gibt er mir ganz normal ein A raus! Kann mir da jemand helfen?
Immer andere Müll ist ein Anzeichen dafür dass die Baudrate nicht 100% stimmt
okay! aber wenn ich zeichen vom µc aus sende kommen die ja einwandfrei an. dann scheint ja die baudrate für den empfang beim µc falsch zu sein.. aber die kann ich doch nicht separat einstellen... ist ein at90can128 auf nem evaluationsboard...
leg dir mal das empfangene Zeichen auf einen Port und sieh mit 8 LED (oder einem Voltmeter) nach, wo das Problem liegt. Beim Senden oder beim Empfangen.
danke für den tipp! und an der LED wird tatsächlich die richtige zahl dargestellt. Ich habe folgendes festgestellt. Ich kann die Funktion putchar erstmal ohne probleme verwenden, getchar dann auch einmal. wenn ich jetz wieder putchar verwenden will klappt nichts mehr! Das muss also doch irgendwie mit meinen Funktionen zusammenhängen dass ich in dem UART register irgendwas vergessen hab. Aber ich benutz doch die Standard Funktionen aus den Beisipelprogrammen...
Wie sieht denn deine Init-Funktion für den UART aus und wie ist dein Takt (auch FUSES richtig eingestellt, wegen internen und externen Takt?) Bedenke, dass der Interne Oszillator nicht so genau ist und daher durchaus Störungen auftreten können.
JTAGEN und SPIEN wobei an SPIEN son kleines rotes fragezeichen hängt. ext crystl. osz 8Mhz Start up time 16K Cycles + 65ms die uart init: U8 uart_init (U8 mode, U32 baudrate) { Uart_clear(); // Flush, Disable and Reset UART if (Uart_set_baudrate(baudrate) == 0) return 0; //!< c.f. macro in "uart_drv.h" Uart_hw_init(mode); //!< c.f. macro in "uart_drv.h" Uart_enable(); //!< c.f. macro in "uart_drv.h" return (1); } also das is aus der uart_lib.c und ich initalisiere das ganz dann so: Uart_select(UART_0); uart_init(CONF_8BIT_NOPAR_1STOP,9600);
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.