Gleichzeitige Ein und Auslesung mit UART

Gast #499489
Lesenswert?
• ▲
▼
Moin moin,

also, ich möchte meinem ATmega128, mit dem Hyperterminal, Zeichen 
schicken die mir aber auch gleichzeigtig im Hyperterminal angezeigt 
werden...also muss mein Modul die Zeichen einlesen und GLEICHZEITIG sie 
wieder zum PC zurückschicken.

Meine Frage ist jetzt wie ich das am besten realisieren kann.
Ich habe es zwar schon versucht aber mein Programm funktioniert noch 
nicht richtig.

Ihr könnt es euch im Anhang ja mal anschauen. Meine Problemzone ist die 
2 for Schleife.

MFG Philipp
Angehängte Dateien:
Gast #499508
Lesenswert?
• ▲
▼
>also, ich möchte meinem ATmega128, mit dem Hyperterminal, Zeichen
>schicken die mir aber auch gleichzeigtig im Hyperterminal angezeigt
>werden...
so was nennt sich "echo" und kann auch erreicht werden ohne das 
zurücksenden des ATMEGA128
Gast #499522
Lesenswert?
• ▲
▼
@Rufus: Oh danke hab es jetzt so umstrukturiert:

while((PINC&ANF)==0)    // Wenn Taster (ANF) gedrückt...
    {
    PORTC = ROT;  // Rote LED an
                  ...
                  }

@Wofram: Gibt es den einen bestimmten Code um diese Echo auszuführen?
Und das geht wirklich ohne das zurücksenden des ATmega128? Weil ich ihm 
ja die Zeichen direkt mit der Tastatur schicken will und ich kein 
Programm auf meinem PC habe welches diese dann direkt im Hyperterminal 
anzeigen kann.
#499588
Lesenswert?
• ▲
▼
Das 'Echo' wird vom Hyperterminal selber gemacht.

Ist irgendwo in den Einstellungen zu finden.

Ich bevorzuge allerdings, wenn der µC jedes Zeichen
das er empfängt auch wieder zurücksendet.
Auf diese Weise sieht man sehr schnell, ob der µC
am anderen Ende noch da ist. Kommt das Echo vom µC, dann
arbeitet er nicht, bleibt es aus ...
Gast #499612
Lesenswert?
• ▲
▼
Wird er doch.
Beim AVR ist UDR doppelt gepuffert. Wird es ausgelesen, steht beim 
nächsten Auslesen was anderes drin.

Ausm Datenblatt eines ATmea8:
"The receive buffer consists of a two level FIFO. The FIFO will change 
its state whenever the receive buffer is accessed. Due to this behavior 
of the receive buffer, do not use Read-Modify-Write instructions (SBI 
and CBI) on this location. ..."

Für mich heisst das, dass deine Variante äusserst unpraktisch ist.
(Aber ich habe ja keine Ahnung.)
Gast #499620
Lesenswert?
• ▲
▼
>Wenn ich mich recht entsinne, geht es auch nur um ein Echo.

Unter dieser beschänkten Ansicht hast du sogar mal Recht.
Wenn dann Fragen auftauchen wie "ich erzeuge durch UDR = UDR; ein Echo, 
aber bei der Auswertung des UDR kommt nur sinnentleertes Zeug heraus. 
Woran liegt das?"
Dann wissen wir ja, wer schuld ist...
Gast #499679
Lesenswert?
• ▲
▼
@Karl heinz Buchegger:
>Ich bevorzuge allerdings, wenn der µC jedes Zeichen
>das er empfängt auch wieder zurücksendet.
Du bist mit Sicherheit kein Freund von USB-Seriell Wandlern

@Philipp
in Hyperterminal:
Datei->Eigenschaften->Einstellungen->ASCII-Konfiguration->..(lokales 
Echo)

Schreib doch mal, ob du nur in Hyperterminal sehen willst was du auf dem 
PC tippst oder ob du wirklich alles zurücksenden willst.
Persönliche Seite #501494
Lesenswert?
• ▲
▼
UDR = egal was, auch wenn es UDR = UDR ist

darf erst gemacht werden, wenn der sendepuffer leer ist.

antwort[i]=uart_read();
uart_send(antwort[i]);

ist die bessere Lösung, weil uart_send() den Sendepuffer-Status erst 
abfragt.

Außerdem brauchen Zeichen nicht zurückgeschickt werden, die anders 
interpretiert werden wie :
Delete - das letzte Zeichen löschen (Danach sendet man so etwas wie 
backspace - blank - backspace
Control-X um die Eingabe abzubrechen
usw.
Moderator Persönliche Seite #501505
Lesenswert?
• ▲
▼
Hans-jürgen Herbert wrote:

> UDR = egal was, auch wenn es UDR = UDR ist

> darf erst gemacht werden, wenn der sendepuffer leer ist.

Antwort vom Sender Jerewan: "Im Prinzip ja, aber...".

Wenn UDR nie mit etwas anderem als dem vorherigen Zeichen beschrieben
wird (es also keine weitere Zuweisung außer UDR = UDR gibt), dann kann
man diese Forderung ignorieren, da die zeitliche Abfolge des
UART-Empfangs bereits garantiert, dass der Sendepuffer freien Platz
hat.
Gast #502857
Lesenswert?
• ▲
▼
@Wolfram: Teils teils ich werde in meinem Programm wohl erst mal sehen 
wollen was ich dem PC sende und vereinzelnd die Daten wieder zurückholen 
zur verarbeitung!

Wird dieser Code in eine FOR-Schleife geschrieben?

antwort[i]=uart_read();
uart_send(antwort[i]);

Ich habe es nämlich so und habe damit viele Probleme z.b. kann ich nur 
ein Zeichen eintippen was im Hyperterminal angezeigt wird und muss dann 
erst den Taster betätigen wobei dann mein Text ans Modul geschickt wird 
und kann danach erst wieder ein Zeichen eintippen.
Gast #502859
Lesenswert?
• ▲
▼
>Wird dieser Code in eine FOR-Schleife geschrieben?
>antwort[i]=uart_read();
>uart_send(antwort[i]);

Den kannst du hinschreiben, wo du willst...
>Ich habe es nämlich so und habe damit viele Probleme z.b. kann ich nur
>ein Zeichen eintippen was im Hyperterminal angezeigt wird und muss dann
>erst den Taster betätigen wobei dann mein Text ans Modul geschickt wird
>und kann danach erst wieder ein Zeichen eintippen.

Dann solltest du mal sehen woran das liegt.
Du fragst in deinem Programm die ganze Zeit ab, ob der Taster betätigt 
wird. Und daraufhin holst du erst Zeichen von der seriellen 
Schnittstelle ab.
Anders herum wäre es sinnvoller:
Abfragen, ob ein Zeichen angekommen ist (und es in einen Puffer 
schreiben, wenn überhaupt erst eins empfangen wurde), und wenn dann die 
Taste gedrückt wird, den String entsprechend verarbeiten.

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