Hallo,
in meinem Beispielcode verwende ich nahezu den Originalcode von Atmel
aus der App.-Note 305.
Ich verwende einen ATMEGA32 mit 16MHz und ich benötige einen
Software-Uart ohne Interrupts.
In dem Beispiel habe ich lediglich die Delay-Schleife um ein NOP
verlängert, da ich sonst nicht die Variable b mit einem 8-Bit-Wert laden
kann.
Ansonsten wartet das Programm auf eine Eingabe. Diese wird dann sofort
wieder ausgegeben.
Mein Problem ist nun folgendes: Wenn ich z.B. das Wort "Reset" sende,
dann wird nur Rst ausgegeben. Die beiden "e" fehlen also. Die Ausgabe
von Zeichenketten mittels wiederholtem putchar funktioniert ohne
Probleme.
Daher gehe ich davon aus, dass irgend etwas bei getchar nicht so gut
passt. Wie gesagt einzelne Zeichen oder auch das Festhalten einer Taste
der Tastatur wird richtig verarbeitet.
Gruß
Holger
Ich habe den auch schon verwendet, aber jetzt den Code nicht mehr genau
im Kopf.
Könnte es damit zu tun haben, dass der Soft-Uart unidirektional ist?
D.h. während er sendet kann er keine Zeichen empfangen und umgekehrt.
das erste "e" von Reset wird also nicht empfangen, weil der uC mit dem
Senden des R beschäftigt ist.
Holger schrieb:> Daher gehe ich davon aus, dass irgend etwas bei getchar nicht so gut> passt.
Wie willst du bei einem Softuart gleichzeitig senden und empfangen ?
Es ist normal, dass da nur jedes zweite Zeichen empfangen, bzw.
gesendet wird.
> Wie gesagt einzelne Zeichen oder auch das Festhalten einer Taste> der Tastatur wird richtig verarbeitet.
Nein. Auch beim Festhalten wird nur jedes zweite Zeichen verarbeitet,
aber da es sich um selbe Zeichen handelt, merkst du es nicht.
Holger schrieb:> ich benötige einen> Software-Uart ohne Interrupts.
Dann geht eben nur Halbduplex.
Holger schrieb:> Wenn ich z.B. das Wort "Reset" sende,> dann wird nur Rst ausgegeben. Die beiden "e" fehlen also.
Das ist korrekt, in der Zeit wird ja das 'R' bzw. 's' zurück gesendet.
Marc Vesely schrieb:> Wie willst du bei einem Softuart gleichzeitig senden und empfangen ?
Indem du sie so programmierst, daß sie das kann.
Das ist garnicht mal so schwierig. Allerdings ist die erreichbare
Bitrate deutlich geringer als mit einer halbduplex SoftUART. Aber das
sollte ja wohl niemanden ernsthaft überraschen...
Holger schrieb:> Ich verwende einen ATMEGA32 mit 16MHz und ich benötige einen> Software-Uart ohne Interrupts.c-hater schrieb:> Marc Vesely schrieb:>> Wie willst du bei einem Softuart gleichzeitig senden und empfangen ?>> Indem du sie so programmierst, daß sie das kann.
Ohne Interrupts ?
Wie schnell und wie sicher soll denn das Ganze sein ?
Soviel ich gesehen habe, läuft diese Softuart auch ohne Timer, da
möchte ich gerne die Code Akrobatik für gleichzeitiges Senden und
Empfangen sehen und bitte höfflichst um ein Beispiel.
Peter Dannegger schrieb:> Holger schrieb:>> ich benötige einen>> Software-Uart ohne Interrupts.>> Dann geht eben nur Halbduplex.
Gehen tut natürlich auch Vollduplex. Es ist nur nicht sinnvoll, sowas zu
machen, weil dann zu viele Restriktionen bei der Nutzung zu
berücksichtigen sind. Man braucht im wahrsten Sinne des Wortes
kooperativen Code (mit vorhersagbaren Laufzeiten) auch hinter den
Endpunkten der Verbindung.
Interruptnutzung ist um vieles einfacher.
Ich habe eine alte AVR313 von vor 1999; folglich wird die AVR305 genauso
alt sein: 38,4kBd mit 1MHz Takt. Wahnsinn - aber völlig veraltet!
Auf einem 16MHz Atmega32 tut man sich soetwas heutzutage doch nicht mehr
an. Vollduplex und Interruptbetrieb sind einfach Standard.
Als Baudrate reichen doch 19,2kBd, wenn man vier Soft-UARTs braucht ;-)
Marc Vesely schrieb:> Ohne Interrupts ?
Diese Anforderung hatte ich zuerst überlesen.
> Wie schnell und wie sicher soll denn das Ganze sein ?
Das geht nur für sehr spezielle Anwendungen, nicht als universell
einsetzbares Codemodul. Anwendung und UART müssen quasi eine Einheit
bilden.
Relativ schnell und sicher (im Sinne von zuverlässig) kann es aber
trotzdem durchaus sein.
Marc Vesely schrieb:> möchte ich gerne die Code Akrobatik für gleichzeitiges Senden und> Empfangen sehen und bitte höfflichst um ein Beispiel.
Das muss man bloss bitweise verschachteln. Für PICs gabs da mal
Beipiele.
Ansatz: in einer Schleife wird ein Bit gesendet, wenn nötig, und eines
empfangen, wenn vorhanden. Start, Stop, usw. regeln Zustandsmaschinen.
Georg
Während die Putchar Routine läuft, werden keine Zeichen Empfangen - die
gehen also verloren. Es ist schon ein kleines Wunder, dass wenigstens
das Richtige Bit als Startbit noch gefunden wird - da hätte auch
Kauderwelsch raus kommen können.
Voll duplex Soft UART macht man besser mit Interrupts. Ohne wird es sehr
anstrengend. Die Schleife müsste man schon schneller als mit Bittakt
laufen lassen, damit man den Anfang des Startbits auch fein genug
auflösen kann.
Georg schrieb:> Das muss man bloss bitweise verschachteln. Für PICs gabs da mal> Beipiele.>> Ansatz: in einer Schleife wird ein Bit gesendet, wenn nötig, und eines> empfangen, wenn vorhanden. Start, Stop, usw. regeln Zustandsmaschinen.
LOL.
c-hater weiss wenigstens wovon er spricht, du anscheinend nicht.
c-hater schrieb:> Das geht nur für sehr spezielle Anwendungen, nicht als universell> einsetzbares Codemodul. Anwendung und UART müssen quasi eine Einheit> bilden.
So könnte das natürlich gehen.
Georg schrieb:> Für PICs gabs da mal> Beipiele.
Im Philips 8051 Applikationsbuch auch.
Natürlich wurde ein Timerinterrupt benötigt mit 1/4 Bitzeit.
Von Philips gabs mal den 87C751 im DIP24, das war ein 8051 ohne HW-UART.
Ich hab da noch einige mit Fenster rumliegen.
Den Philips Code hatte ich benutzt, funktionierte prima. Vollduplex und
mehrere Byte Empfangspuffer. Das Main konnte derweil andere Tasks
ausführen.
Marc Vesely schrieb:>> Ansatz: in einer Schleife wird ein Bit gesendet, wenn nötig, und eines>> empfangen, wenn vorhanden. Start, Stop, usw. regeln Zustandsmaschinen.> LOL.> c-hater weiss wenigstens wovon er spricht, du anscheinend nicht.
Du musst das ja nicht verstehen, es gibt immer noch genug Leute, die
wissen wie sowas geht, erstaunlicherweise. Gebraucht wird so eine tricky
Assemblerprogrammierung heute nirgends mehr, deine Wissenslücken fallen
da nicht mehr ins Gewicht. Keine Panik.
Georg
Georg schrieb:> Du musst das ja nicht verstehen, es gibt immer noch genug Leute, die> wissen wie sowas geht, erstaunlicherweise.
Ja, nur gehörst du mit Sicherheit nicht zu denjenigen.
Georg schrieb:> Gebraucht wird so eine tricky> Assemblerprogrammierung heute nirgends mehr, deine Wissenslücken fallen> da nicht mehr ins Gewicht. Keine Panik.
Könntest du dich als solch ein Experte dazu erniedrigen, mir als
Unwissenden mit Lücken deine Vorgehensweise etwas genauer zu
erklären ?
Oder erzählst du wieder irgendwelchen Blödsinn denn du mühsam mit
google zusammengewürfelt hast und wovon du keinen blassen Dunst hast,
wie üblich ?
Erst muesste man sich vergewissern, ob Vollduplex wirklich benoetigt
wird. Vom PC her arbeite ich mit embedded devices immer im Master-Slave
betrieb. Dh der PC sendet und wartet auf eine Antwort. Also Halb Duplex
Marc Vesely schrieb:> Könntest du dich als solch ein Experte dazu erniedrigen, mir als> Unwissenden mit Lücken deine Vorgehensweise etwas genauer zu> erklären
Wozu? Es ist doch hoffnungslos.
Leute die das verstehen können finden alles Nötige im Microchip Embedded
Control Handbook 1993 auf Seite 2-32, oder sie wissen es sowieso.
Georg
Georg schrieb:>> Könntest du dich als solch ein Experte dazu erniedrigen, mir als>> Unwissenden mit Lücken deine Vorgehensweise etwas genauer zu>> erklären>> Wozu? Es ist doch hoffnungslos.
Gut, daß du es selbst merkst.
Ich weiss ja, dass das ein hoffnungsloser Unterfangen für dich wäre.
> Leute die das verstehen können finden alles Nötige im Microchip Embedded> Control Handbook 1993 auf Seite 2-32, oder sie wissen es sowieso.
LOL.
Willst du im Ernst behaupten, daß ein Troll wie du irgendetwas davon
verstanden hat ?
c-hater schrieb:> Das geht nur für sehr spezielle Anwendungen, nicht als universell> einsetzbares Codemodul. Anwendung und UART müssen quasi eine Einheit> bilden.
Aber selbst das kannst du nicht verstehen. Lass es dir von jemandem
erklären (und genau diese AN bitte), der Arme wird dazu auch so um
die 20 Jahre dafür brauchen (so alt ist diese AN nämlich), dann
kannst du wiederkommen.