Forum: Mikrocontroller und Digitale Elektronik 2 Uarts - 2 PCs


von Ledy (Gast)


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

von (prx) A. K. (prx)


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.

von Ledy (Gast)


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

von Gast (Gast)


Lesenswert?

Fehler ist dass du nicht Schritt für Schritt, die eine und dann die 
andere Serielle Schnittstelle in Betrieb nimmst, sondern alles auf 
einmal.

von Ledy (Gast)


Lesenswert?

die Schnittstellen müssten doch parallel nebeneinander arbeiten können 
oder?

von Gast (Gast)


Lesenswert?

Deine Fragen sollten sein:
Funktioniert die Verbindung PC1 - µC
Funktioniert die Verbindung PC2 - µC

Danach dann beide zusammen.

von Ledy (Gast)


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.

von Jean P. (fubu1000)


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ß

von Ledy (Gast)


Lesenswert?

der avr hat 4 uarts, momentan sind 0 und 2 aktiv...

von Ledy (Gast)


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

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
Noch kein Account? Hier anmelden.