www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Serielle Schnittstelle zwischen 2 Atmega644


Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
ich hab eine Frage. wenn ich eine serielle Schnittstelle zwischen 2 
Atmega 644 realisieren will, muss ich irgend etwas besonderes beachten?
weil wenn ich die daten von einen µC zum PC und vom PC dann zum 2ten µC 
schicke funktioniert es, wenn ich es direkt mache nicht.

hoffe ihr könnt helfen

Autor: Axel Krüger (axel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Code?


-TXE/RXE über Kreuz angeschlossen?
-UART/USART richtig initialisiert?

Autor: asdf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RX->TX
TX->RX
GND->GND und gleiche Betriebsspannung sollte genügen.

Je nachdem wie deine Daten aussehen und welches Terminalprogramm du am 
PC nutzt wäre es denkbar, dass der PC noch \n\r oder ähnliches 
mitschickt.

Andere Fehlerquelle wäre Baudrate/Taktquelle & Baudratenfehler. Könnte 
sein, dass der PC da Fehlertoleranter ist.

Autor: Alex Glaser (almalex)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang ist der Code

rx und tx ist ausgekreuz

aja und die baudrate ist 921600 BAUD

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
muss man bei der leitung zwischen den 2 avrs was beachtet ausser das sie 
ausgekreuzt sein muss?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wo ist in 'empfangen.c' die UART-Initialisierung?

MfG Spess

Autor: Alex Glaser (almalex)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ah das war in anderem  file. da ist die initialisierung

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex Glaser schrieb:
> muss man bei der leitung zwischen den 2 avrs was beachtet ausser das sie
> ausgekreuzt sein muss?

An sich nicht.
Du hast doch an beiden AVR einen Quarz drann, oder nicht?

Für erste Tests würde ich auch abspecken. Den ganzen SD Krempel raus.
AVR1 schickt an AVR2 ständig ein 'x' und der gibt das irgendwo aus.

Dann kann man auch kontrollieren und den PC an die Sendeleitung 
zusätzlich drannhängen und kontrollieren ob da tatsächlich was gesendet 
wird.

Dito in die umgekehrte Richtung.

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja habe bei beiden avrs einen quarz mit 14,7456MHz, ist aber bei beiden 
programmen auch so definiert

ja das hab ich heut schon gemacht
im jetzt will ich nur noch von einem µC zum anderen senden und der soll 
das dann wieder ausgeben

der erste µC schickt es richtig. es scheitert am empfangen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex Glaser schrieb:

> der erste µC schickt es richtig. es scheitert am empfangen

Na dann.
Gegentest: Sende AVR weg, PC ran und in die Tasten klimpern.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei deiner Sendroutine fällt mir auf, dass du nie ein '\n' auf die Reise 
schickst, der Empfänger aber darauf wartet.

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe jetzt ein \n angehängt und es geht immer noch nicht
wenn ich einen string vom pc zum µC sende geht es, das dieser den string 
ausgibt.
also weis ich nicht was ich noch ändern kann

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du stocherst im Nebel.

Schaff dir eine Möglichkeit, wie und wo der Empfänger ausgeben kann was 
er empfängt.

Auf gut Glück irgendwelche Modifikationen anzubringen ohne dem Programm 
bei der Arbeit zusehen zu können, bringt einen selten weiter.
Fakten müssen her. Fakten wie beispielsweise: Was empfängt der Empfänger 
wirklich?

Falls du schon eine Ausgabemöglichkeit hast, würde ich als allererstes 
hier
uint16_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
        ;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
}
das Zeichen ausgeben, welches empfangen wurde.

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kann mit einen seriell to usb wandler schaun was der erste avr 
sendet

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls du schon eine Ausgabemöglichkeit hast, würde ich als allererstes
hier
uint16_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
        ;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
}

das Zeichen ausgeben, welches empfangen wurde. Den \n noch irgendwie 
speziell markieren, so dass du ihn siehst.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex Glaser schrieb:
> ich kann mit einen seriell to usb wandler schaun was der erste avr
> sendet

Nicht was der erste sendet. Was der zweite empfängt!
Der zweite muss ausgeben, was er so reinkriegt.

Was der erste sendet hast du ja mitlerweile zur Genüge verifiziert.

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bekomme immer nur ein \0 und sonst nichts. ausser wenn ich es vom pc 
aus sende dann bekomme ich den richtigen string

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht der Empfangscode jetzt aus?
Du hast berücksichtigt, dass du aus UDR nur einmal lesen darfst?

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  uint16_t  NextChar;
  uint16_t StringLen =0 ;
 
  NextChar = uart_getc();         
 
                                 
  while( 1) {
    *Buffer++ = NextChar;
  uputc(NextChar); 
    StringLen++;
    NextChar = uart_getc();
    
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum uart_getc() einen uint16_t liefert bzw. nextChar ein uint16_t sein 
muss, ist mir zwar nicht ganz klar, aber es sollte eigentlich keinen 
Unterschied machen.

Hmm ....

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und uart_getc schaut aus wie du es mir geschrieben hast

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex Glaser schrieb:
> und uart_getc schaut aus wie du es mir geschrieben hast

Ist schon ok.
Ich hatte den Verdacht, du hättest so etwas gemacht
uint16_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
        ;
    uputc( UDR );
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns vom PC aus funktioniert und vom AVR aus nicht, andererseits der 
erste AVR an den PC sauber senden kann dann kann ich mr nur noch 
vorstellen, dass die Baudraten ganz leicht daneben liegen.

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was kann man da machen? soll ich es mit einer niedrigeren baudrate 
probieren?

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal mit 9600.
Anderseits könntest du noch kontrollieren, ob auch beide µCs mit dem 
Baudratenquarz laufen. Nicht das bei dem zweiten der interen 8MHz 
RC-Oszillator rennt.

Gruß
Rainer

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs mit einer niedrigeren baud rate probiert und geht auch nicht. habs 
mir dann mal mitn oszi angschaut und wenn ich mich mit dem tastkopf auf 
gnd und mit dem tastkopf auf die sendeleitung gehalten habe hat es auf 
einmal funktioniert und wenn ich den tastkopf weggegeben hab, hat es 
wieder nicht funktioniert. ich befürchte das ich irgendwo einen 
kontaktfehler habe, oder weist du vllt was da sein könnte?

Autor: Drachenbändiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Sonst fehlende) Masseverbindung wird über das Oszilloskop hergestellt?

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.