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
:
Verschoben durch User
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
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.