mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 2 Uarts - 2 PCs


Autor: Ledy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ledy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ledy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Schnittstellen müssten doch parallel nebeneinander arbeiten können 
oder?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Fragen sollten sein:
Funktioniert die Verbindung PC1 - µC
Funktioniert die Verbindung PC2 - µC

Danach dann beide zusammen.

Autor: Ledy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Ledy (Gast)
Datum:

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

Autor: Ledy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.