Hi hab bereits hier im Forum gesucht. Leider fand ich kein passendes Thema zu meinem Problem. Ich versuche auf einem AT90USB1287 beim betätigen eines Tasters ein Zeichen zu senden. Quellcode: #include <avr/io.h> #include <inttypes.h> #define F_CPU 8000000UL #define BAUD 19200UL #define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1) // USART initialisieren void uart_init(void) { // Baudrate einstellen (Normaler Modus) UBRR1H = (uint8_t) (UBRR_BAUD>>8); UBRR1L = (uint8_t) (UBRR_BAUD & 0x0ff); // Aktivieren von receiver und transmitter UCSR1B = (1<<RXEN1)|(1<<TXEN1); // Einstellen des Datenformats: 2 Stoppbit, 8 Datenbits UCSR1C = (1<<USBS1)|(3<<UCSZ10); } void USART_Transmit( unsigned char data ) { /* Wait for empty transmit buffer */ while ( !( UCSR1A & (1<<UDRE1)) ) ; /* Put data into buffer, sends the data */ UDR1 = data; } int main(void) { // Hardwareinitialisierung DDRE = 0xff; DDRD &=~ ((1 << DDD0) | (1 << DDD1) | (1 << DDD4) | (1 << DDD5) | (1 << DDD6)); uint8_t data; // USART initialisieren uart_init(); while (1) { if (!( PIND & (1<<PIND4) )) { //wenn Taster S4 betätigt (low) USART_Transmit('z'); //Sende z } } } Wenn ich den Taster halte und dabei den Reset Taster drücke, sendet er was. Allerdings nur Müll! Lauter Nullen. Ohne Reset passiert beim Betätigen gernichts. An dieser Stelle soll erwähnt werden das ich Anfänger bin! Hoffe jemand weiß einen Rat. Danke im vorraus
>Autor: Gast (Gast)
Eigentlich antworte ich auf namenlose Beiträge nicht, und ich habe
obiges Posting auch nur überflogen: Wenn Du sonst alles richtig gemacht
hast könnte es mal wieder das Problem mit dem Prescaler sein. Der
AT90USB1287 teilt den Takt intern (zunächst) durch 8, wenn er nicht
anders programmiert wurde. Wenn Du das nicht berücksichtigst stimmt dein
UART Timing natürlich nicht. Es gab schon einige Leute mit diesem
Problem, auch hier im Forum.
>gab schon einige Leute mit diesem Problem, Finde ich jetzt nicht, aber eigentlich kannst Du Dir von hier alles zusammen suchen: http://www.ssalewski.de/USB-Sources/usart_drv.c http://www.ssalewski.de/USB-Sources/SUDD.c
Hi, erstmal danke für die Antwort! Was hat das mit dem Prescaler auf sich? An dem habe ich nichts eingestellt! Hab mal das init()von Ihrer Uart_dev übernommen die Einstellungen passen soweit mit dem was ich will überein. #include <avr/io.h> #include "lcd-routines.h" #ifndef F_CPU #define F_CPU 8000000UL #define KB_HIT() (UCSR1A & (1 << RXC1)) #endif #define Wait_USART_Ready() while (!(UCSR1A & (1<<UDRE1))) #define BAUDRATE 19200UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung void uart_init() { uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1); UBRR1H = (uint8_t) (ubrr>>8); UBRR1L = (uint8_t) (ubrr); // UART Receiver und Transmitter anschalten // Data mode 8N1, asynchron UCSR1B = (1 << RXEN1) | (1 << TXEN1); UCSR1C = (1<<UCSZ10) | (1<<UCSZ11); // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) do { UDR1; } while (UCSR1A & (1 << RXC1)); } Trotzdem kommen nur Kryptische Zeichen an!!! Gesendet wird das ganze über: if (!( PIND & (1<<PIND4) )) { //wenn Taster S4 betätigt USART_WriteChar('z'); //Sende z } Hoffe jemand weiß Rat!!! Gruß Alex
>Hi, >erstmal danke für die Antwort! Was hat das mit dem Prescaler auf sich? >An dem habe ich nichts eingestellt! Na du könntest schon mal ins Datenblatt gucken! >Hab mal das init()von Ihrer Uart_dev übernommen >die Einstellungen passen soweit mit dem was ich will überein. Ich schätze mal so geht es nicht -- entweder deaktivierst Du den Prescaler, etwa wie ich es in http://www.ssalewski.de/USB-Sources/SUDD.c getan habe int main(void) { cli(); CLKPR = (1<<7); CLKPR = 0; // clock prescaler == 0, so we have 16 MHz mpu frequency with our 16 MHz crystal oder Du akzeptierst den durch 8 geteilten Takt, etwa mit #define F_CPU 1000000UL Und dann würde ich nicht gleich mit #define BAUD 19200UL sondern langsamer, etwa wie bei mir #define USART_BAUD 9600UL // baud(rate) for serial port Und dann kommt es natürlich auf deine Hardware-Verdrahtung und die Einstellungen Deines Terminal-Programms an, wenn die nicht korrekt sind wird es nicht funktionieren.
Hier noch zwei Links, die mir damals bei dem USART Kram nützlich waren http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial http://www.roboternetz.de/wissen/index.php/UART_mit_avr-gcc
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.