Forum: Compiler & IDEs Gleichzeitige Ein und Auslesung mit UART


von Philipp (Gast)


Angehängte Dateien:

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sieh Dir Deinen Code an einer anderen Stelle nochmal sehr genau an:
1
while ((PINC & ANF) > 0); // Wenn Taster (ANF) gedrückt dann ...
2
{
3
  PORTC = ROT;            // Rote LED an
Na? Gefunden?

Nein? Das While-Statement ist mit einem Semikolon abgeschlossen, danach 
beginnt mit { ein neuer Block. Das sieht nicht so aus, als ob das so 
sein sollte ...

von Wolfram (Gast)


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

von Philipp (Gast)


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.

von Karl H. (kbuchegg)


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 ...

von Rahul, der Trollige (Gast)


Lesenswert?

So in etwa:
antwort[i]=uart_read();
uart_send(antwort[i]);

von Michael Wilhelm (Gast)


Lesenswert?

Noch einfacher:
in der Empfangsroutine
UDR = UDR;

MW

von Rahul, der Trollige (Gast)


Lesenswert?

>Noch einfacher:
>in der Empfangsroutine
>UDR = UDR;

Sehr sinnvoll... Der Inhalt des UDR ist dann allerdings fürn Popo...

von Michael Wilhelm (Gast)


Lesenswert?

Nee, der Inhalt von UDR wird nicht geändert.

MW

von Rahul, der Trollige (Gast)


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.)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

char c;
UDR = c = UDR;

Danach hat man das gelesene Zeichen wenigstens in `c' stehen...

von Michael Wilhelm (Gast)


Lesenswert?

Wenn ich mich recht entsinne, geht es auch nur um ein Echo.

MW

von Rahul, der Trollige (Gast)


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...

von Rahul, der Trollige (Gast)


Lesenswert?

>Nee, der Inhalt von UDR wird nicht geändert.
>Wenn ich mich recht entsinne, geht es auch nur um ein Echo.

Übrigens schön, dass du dich widerlegst...

von Wolfram (Gast)


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.

von Hans-jürgen H. (hjherbert) Benutzerseite


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Philipp (Gast)


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.

von Philipp (Gast)


Lesenswert?

oh entschuldigt...Gedankenfehler! Beim Tasterdruck wird der Text vom 
Modul aus ans Hyperterminal gesendet nicht andersrum! Ist ja noch früh 
;-)

von Rahul, der Trollige (Gast)


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.

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.