www.mikrocontroller.net

Forum: Compiler & IDEs Gleichzeitige Ein und Auslesung mit UART


Autor: Philipp (Gast)
Datum:
Angehängte Dateien:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh Dir Deinen Code an einer anderen Stelle nochmal sehr genau an:
while ((PINC & ANF) > 0); // Wenn Taster (ANF) gedrückt dann ...
{
  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 ...

Autor: Wolfram (Gast)
Datum:

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

Autor: Philipp (Gast)
Datum:

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

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

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

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So in etwa:
antwort[i]=uart_read();
uart_send(antwort[i]);

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch einfacher:
in der Empfangsroutine
UDR = UDR;

MW

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Noch einfacher:
>in der Empfangsroutine
>UDR = UDR;

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

Autor: Michael Wilhelm (Gast)
Datum:

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

MW

Autor: Rahul, der Trollige (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char c;
UDR = c = UDR;

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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich mich recht entsinne, geht es auch nur um ein Echo.

MW

Autor: Rahul, der Trollige (Gast)
Datum:

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

Autor: Rahul, der Trollige (Gast)
Datum:

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

Autor: Wolfram (Gast)
Datum:

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

Autor: Hans-jürgen Herbert (hjherbert) Benutzerseite
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Philipp (Gast)
Datum:

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

Autor: Philipp (Gast)
Datum:

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

Autor: Rahul, der Trollige (Gast)
Datum:

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

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.