Hi leute! Ich habe hier eine kleine Schaltung, in der mein AVR (ein ATMEGA8515) über einen MAX485 mit einem anderen Gerät kommunizieren soll. Zu aller erst: Die Hardware ist vollkommen OK. Ich habe ein Programm von einem Kollegen auf den AVR gespielt, dass vollkommen einwandfrei über den UART kommuniziert. Mein Problem: Mein eigener Code funktioniert nicht so ganz. Gesendete Daten kommen zwar am anderen Gerät an, aber ich empfange nichts. Hier der Code zum initialisieren: INITIALISIERUNG: // Die beiden Datenleitungen des MAX händen an PortD0 und D1, die Richtungsleitung ist an C0 // Port-Richtungen setzen DDRA = 0xFF; DDRB = 0x00; DDRC = 0x00; DDRD = 0x00; // UART initialisieren UCSRB = (1 << RXEN) | (1 << TXEN); // Enable transmit and recieve UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 ); UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ); DAS SENDEN UND EMPFANGEN: UCSRA = (1 << RXC) | (1 << TXC); // Clear TXC and RXC blinkSomeCrazyLEDs(); // 5 Sek blinken um anzuzeigen, dass es los geht // ----- SENDEN ------- // MAX auf senden PORTC &= ~(1 << PINC0); // C0 auf 1 while (!(UCSRA & (1<<UDRE))); // Warte bis bereit zum senden UDR = 201; // Sende byte "201" while(!(UCSRA&(1<<TXC))); // warte bis gesendet wurde UCSRA = (1 << RXC) | (1 << TXC); // Lösche alle input/output bits mit 1 // ----- EMPFANGEN------- // MAX auf empfangen PORTC |= (1 << PINC0); // C0 auf 0 while (!(UCSRA & (1<<RXC))); // warte bis byte reingekommen ist char temp = UDR; // lese byte aus blinkSomeCrazyLEDs(); // 5 Sek blinken um anzuzeigen, dass wir fertig sind WAS PASSIERT: Wie gesagt kommt das gesendete byte 201 problemlos an. Danach hängt sich das programm aber in der empfangs-endlosschleife auf ("while (!(UCSRA & (1<<RXC)));"). Das heißt also, dass der UART nichts empfängt. Dabei ist da ganz sicher eine antwort, die nur irgendwie nicht ankommt... :-( Und das Problem muss in dem code oben liegen, das es ja mit einem anderen Programm (an das ich leider nicht rankomme) funktioniert. hat jemand eine Idee? danke!!!!!
>// MAX auf empfangen >PORTC |= (1 << PINC0); // C0 auf 0 >// MAX auf senden >PORTC &= ~(1 << PINC0); // C0 auf 1 Kommentare passen nicht zum Code. Die sind vertauscht. Braucht der MAX nicht ein High zum Senden? Dann wären die auch noch vertauscht...
So falsch kann das aber nicht sein, das Senden klappt ja wunderbar...
>// UART initialisieren >UCSRB = (1 << RXEN) | (1 << TXEN); // Enable transmit and recieve >UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 >UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 ); >UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ); >DAS SENDEN UND EMPFANGEN: >UCSRA = (1 << RXC) | (1 << TXC); // Clear TXC and RXC Das Beschreiben der Register UCSRC, UBRRH und UCSRA kannst du weglassen. Ich weiß nicht in welchem Tutorial das steht, aber es kommen immerwieder Codeschnipsel dieser Art. >UART_BAUD_RATE, F_CPU sind diese Konstanten (richtig) definiert? Als 'UL' (unsigned long) Rechne das doch mal lieber von Hand aus und schreib's direkt rein.
>Das Beschreiben der Register UCSRC, UBRRH und UCSRA kannst du weglassen. >Ich weiß nicht in welchem Tutorial das steht, aber es kommen immerwieder >Codeschnipsel dieser Art. Es gibt AVR, bei denen sich UBRRH und UBRRL die Speicheradresse teilen. Welche das sind, müsste ich jetzt nachgucken. Die haben dann kein UBSEL-Bit... UCSRA braucht man aber wirklich nicht beschreiben.
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.