Du mußt schon bei JEDEM Zeichen checken, Kollege. So eine UART is ja kein ICE
Code:for(int i=0; TX_B_L > i; i++) { while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich UDR0 = TX_B[i]; } return 0;
Moin Jungs,
ich versuche grade mal eine einfache USART Verbindung zwischen meinem AT-Mega88 und Läppy hinzukriegen. Der Läppy hat nen echte RS232, also kein USB-> RS232 Wandler oder so drann.
Hier meine Routine zum senden:
Es soll solange gesendet werden bis TX_B_L erreicht ist.Code:int USART_TX(char *TX_B, unsigned int TX_B_L) { while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich for(int i=0; TX_B_L > i; i++) UDR0 = TX_B[i]; return 0; }
Ausgeführt wird das ganze in der Main so:
Ankommen tut genau garnichts, nada.Code:char test[5] = "Hallo"; USART_TX (test, sizeof(test));
Initialisiert wird mit 19.200 8-N-1.
Es funktioniert wunderbar wenn ich in der main einfach ein Zeichen rüberschiebe:
Das ganze mal zum testen in nen Timer gepackt der mehrmals pro Sekunde ausgeführt wird und die X-chen rattern übern Bildschirm.Code:while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich UDR0 = 'X';
Also an der Init. kanns wohl kaum liegen!? Was läuft hier falsch?
Schönen Carfreitag, e-Ra
Du mußt schon bei JEDEM Zeichen checken, Kollege. So eine UART is ja kein ICE
Code:for(int i=0; TX_B_L > i; i++) { while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich UDR0 = TX_B[i]; } return 0;
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Moin moin,
also habs mal so abgeändert:
Aber kommt immer noch nix an. Noch weiter Ideen?Code:int USART_TX(char *TX_B, unsigned int TX_B_L) { for(int i=0; TX_B_L > i; i++) { while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich UDR0 = TX_B[i]; } return 0; }
Thx, e-Ra
Zeig mal den aufruf der function her. Oder besser das ganze Programm.
Da is wo der Wurm drin
Du sagst, der Einzelaufruf in der main() funktioniert ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hi,
hier mal der Code, mit dem ich teste:
Wenn ich anstatt dem Funktionsaufruf in der Main einfach nur ein "UDR0 = 'X';" schreibe dann kommt auch ein X rüber.Code:#define F_CPU 7372800; #include <avr/io.h> // int USART_TX(char *, unsigned int); // Prototyp static char test[5] = { 0x48, 0x41, 0x48, 0x41, 0x48, }; int USART_TX(char *TX_B, int TX_B_L) { for(int i=0; TX_B_L > i; i++) { while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich UDR0 = TX_B[i]; } return 0; } int main( void ) { UCSR0B |= (1<<TXEN0) | (1<<UCSZ02); // Tx Enable, 8 Datenbits UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00) | (1<<USBS0); // 8 Datenbits, 1 Stoppbit UBRR0H = 23 >> 8; // HighByte, Baudrate = 19.200 bps UBRR0L = 23 & 0xFF; // LowByte, Baudrate = 19.200 bps USART_TX (test, sizeof(test)); return(0); }
Vielleicht entdeckst du ja nen Fehler. Danke schonmal.
e-Ra
Egentlich sollte das ja gehen. *grmpf*
Versuch mal, die Bedingung umzukehren
Code:for(int i=0; i < TX_B_L; i++) { while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich UDR0 = TX_B[i]; }
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo,
wenn ich das richtig sehe ist 9N2 eingestellt. Da müsste Müll entstehen. Die Baudrate habe ich mir nicht angeschaut.
Du solltest auch noch eine Endlosschleife in der Main vorsehen. Das Programm rennt ins Leere. Was dann passiert, wenn er noch am Senden ist, kann ich nicht sagen.
Gruß
Jens
@McJenso
Entweder hatte ich an dem Abend zu viel gesoffen oder..... natürlich recht dumm wenn man den USART falsch initialisiert. Dann kanns auch schlecht funktionieren. Man man man, in Zukunft: programmieren > alc
Danke an alle!
Lesezeichen