Serielle Schnittstelle zwischen 2 Atmega644

OP #1641644
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
Gast #1641679
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.
#1646213
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.
OP #1646223
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
#1646412
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
1
uint16_t uart_getc(void)
2
{
3
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
4
        ;
5
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
6
}
das Zeichen ausgeben, welches empfangen wurde.
#1646417
Lesenswert?

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

das Zeichen ausgeben, welches empfangen wurde. Den \n noch irgendwie 
speziell markieren, so dass du ihn siehst.
#1646544
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
1
uint16_t uart_getc(void)
2
{
3
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
4
        ;
5
    uputc( UDR );
6
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
7
}
OP #1647392
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?

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