2 Uarts - 2 PCs

Gast #1361951
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.
Gast
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
Gast
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ß
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.