Hi Habe 2 Uarts am Atmega aktiviert und möchte an beide jeweils einen PC anschließen. Meines Erachtens müssten beide PCs miteinander komunizeiren können oder? Ich denke das ist einfach realisierbar in der Form: Uart1_Write(Uart2_Read); Uart2_Write(Uart1_Read); besser aber wahrscheinlich mit Interrupts... Ledy
Ob mit Interrupts oder nicht ist nicht der Punkt. Wichtig ist, dass das Programm nicht auf dem Empfang vom ersten Kanal wartet während am zweiten Kanal reihenweise Daten reinkommen und verloren gehen. Das geht auch per Polling im Hauptprogramm, wenn da keine grösseren Warte/Arbeitszeiten anderweitig auftreten.
Also ich hab mittlerweile folgenden Code: void Uart0_Write(char datab) { while(!(UCSR0A & (1<<UDRE0))) { } UDR0=datab; } void Uart2_Write(char dataa) { while(!(UCSR2A & (1<<UDRE2))) { } UDR2=dataa; } int main(void) { Usart0_Init(); Usart2_Init(); char dataa; char datab; while(1) { if (UCSR0A & (1<<RXC0)) { dataa = UDR0; Uart2_Write(dataa); } if (UCSR2A & (1<<RXC2)) { datab = UDR2; Uart0_Write(datab); } } } allerdings funzt es nicht so recht. Wenn ich auf PC1 was eingebe, kommt es auf PC1 wieder retour, dazu noch mit veränderten Zeichen, zum Beispiel gebe ich "a" ein und bekomm "Ø" zurück. Auf PC2 verhält es sich ebenso. Sieht jemand den Fehler? Gruß Ledy
Fehler ist dass du nicht Schritt für Schritt, die eine und dann die andere Serielle Schnittstelle in Betrieb nimmst, sondern alles auf einmal.
Deine Fragen sollten sein: Funktioniert die Verbindung PC1 - µC Funktioniert die Verbindung PC2 - µC Danach dann beide zusammen.
ja die funktionieren beide wenn ich schreibe: while(1) { if (UCSR0A & (1<<RXC0)) { dataa = UDR0; Uart0_Write(dataa); //anstatt Uart2_Write() } if (UCSR2A & (1<<RXC2)) { datab = UDR2; Uart2_Write(datab); //anstatt Uart0_Write() } } dann funktioniert es einwandfrei, das heißt ich kann bei beiden PCs tippen und bekomm ein Echo mit den korekten Zeichen.
Ledy schrieb: > ja die funktionieren beide > > wenn ich schreibe: > > > while(1) > { > if (UCSR0A & (1<<RXC0)) > { > dataa = UDR0; > Uart0_Write(dataa); //anstatt Uart2_Write() > } Glaube ich dir ! > if (UCSR2A & (1<<RXC2)) > { > datab = UDR2; > Uart2_Write(datab); //anstatt Uart0_Write() > } > } Das hiesse ja du hast 3 UARTS und nit 2 (siehe die 2 hinter den Registern)! Versuchs mal strickt nach Datenblatt mit 1 als Register "n" (z.B. UDR1, statt UDR2 .....), bzw nenn mal den µC !!! > > dann funktioniert es einwandfrei, das heißt ich kann bei beiden PCs > tippen und bekomm ein Echo mit den korekten Zeichen. Komisch aber mag sein ;-/ Gruß
hab nun ein paar Modifizierungen am Code vorgenommen, jetzt läufts einwandfrei: void Uart0_Write(char send_b) { while(!(UCSR0A & (1<<UDRE0))) { } UDR0=send_b; } void Uart2_Write(char send_a) { while(!(UCSR2A & (1<<UDRE2))) { } UDR2=send_a; } int main(void) { Usart0_Init(); Usart2_Init(); char receive_a; char receive_b; while(1) { if (UCSR0A & (1<<RXC0)) { receive_a = UDR0; Uart2_Write(receive_a); } if (UCSR2A & (1<<RXC2)) { receive_b = UDR2; Uart0_Write(receive_b); } } } // Gruß Ledy
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.