PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USART - AT-Mega88 - Ist er zu schlau, bin ich zu blöd!



e-Ra
21.03.2008, 15:40
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:


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;
}


Es soll solange gesendet werden bis TX_B_L erreicht ist.

Ausgeführt wird das ganze in der Main so:


char test[5] = "Hallo";
USART_TX (test, sizeof(test));


Ankommen tut genau garnichts, nada.

Initialisiert wird mit 19.200 8-N-1.

Es funktioniert wunderbar wenn ich in der main einfach ein Zeichen rüberschiebe:



while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich
UDR0 = 'X';


Das ganze mal zum testen in nen Timer gepackt der mehrmals pro Sekunde ausgeführt wird und die X-chen rattern übern Bildschirm.

Also an der Init. kanns wohl kaum liegen!? Was läuft hier falsch?

Schönen Carfreitag, e-Ra

PicNick
21.03.2008, 18:46
Du mußt schon bei JEDEM Zeichen checken, Kollege. So eine UART is ja kein ICE




for(int i=0; TX_B_L > i; i++)
{
while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich
UDR0 = TX_B[i];
}
return 0;

e-Ra
21.03.2008, 20:39
Moin moin,

also habs mal so abgeändert:



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;
}


Aber kommt immer noch nix an. Noch weiter Ideen?

Thx, e-Ra

PicNick
22.03.2008, 15:39
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 ?

e-Ra
22.03.2008, 17:57
Hi,

hier mal der Code, mit dem ich teste:



#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);
}


Wenn ich anstatt dem Funktionsaufruf in der Main einfach nur ein "UDR0 = 'X';" schreibe dann kommt auch ein X rüber.

Vielleicht entdeckst du ja nen Fehler. Danke schonmal.

e-Ra

PicNick
22.03.2008, 18:17
Egentlich sollte das ja gehen. *grmpf*
Versuch mal, die Bedingung umzukehren


for(int i=0; i < TX_B_L; i++)
{
while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich
UDR0 = TX_B[i];
}

McJenso
22.03.2008, 19:26
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

e-Ra
22.03.2008, 20:58
@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!