Forum: Mikrocontroller und Digitale Elektronik Perfomance bei SoftUART (AVR305) in Assembler


von Holger (Gast)


Angehängte Dateien:

Lesenswert?

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
von Conny G. (conny_g)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von c-hater (Gast)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Ulrich H. (lurchi)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
von Georg (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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 ?

von Trotznilp (Gast)


Lesenswert?

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

von Georg (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
Noch kein Account? Hier anmelden.