2 Uarts - 2 PCs

Gast #1361951
Lesenswert?

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
#1361954
Lesenswert?

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 #1362290
Lesenswert?

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 #1362322
Lesenswert?

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.
#1362349
Lesenswert?

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 #1362604
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren