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
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 ...
>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
@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.
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 ...
So in etwa: antwort[i]=uart_read(); uart_send(antwort[i]);
>Noch einfacher: >in der Empfangsroutine >UDR = UDR; Sehr sinnvoll... Der Inhalt des UDR ist dann allerdings fürn Popo...
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.)
char c; UDR = c = UDR; Danach hat man das gelesene Zeichen wenigstens in `c' stehen...
Wenn ich mich recht entsinne, geht es auch nur um ein Echo. MW
>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...
>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...
@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.
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.
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.
@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.
oh entschuldigt...Gedankenfehler! Beim Tasterdruck wird der Text vom Modul aus ans Hyperterminal gesendet nicht andersrum! Ist ja noch früh ;-)
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.