mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik elegante serielle 8N1 TX in Software? AVR, C


Autor: Seb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich bräuchte mal nen Anstoss für eine elegante Lösung.
Und zwar habe ich einen 4.8kHz Timerinterrupt und die Endlosschleife in 
Main zur Verfügung.

Dort zählt ggf. eine Variable von 10 herunter und entscheidet daran:

10  -> 1 Startbit
9-2 -> 8 Datenbits einer Byte-Variable
1   -> 1 Stoppbit

Das funktioniert eigentlich ganz gut.

Unzufrieden bin ich mit der eigentlichen Übertragung.
In der Endlosschleife wird die Variable von oben auf Null und eine 
weitere Zählvariable auf 3 geprüft (3 Zeichen übertragen).
Dann wird jeweils der gewünschte Wert gesetzt, und beide Zählvariablen 
aktualisiert.

Das erscheint mir umständlich, deswegen würde ich mich über bessere 
Vorschläge freuen!

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
16bit Variable für das zu sendende Zeichen. Wenn's was zu senden gibt: 
Warten bis ==0, dann 0x200|((c)<<1) reinschreiben.

Im Interrupt: Wenn != 0, dann unterstes Bit ausgeben, danach nach rechts 
schieben.

Autor: Seb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das wäre der 'eigentlich ganz gut' funkionierende Teil ohne Zählvariable 
aber mit 16 Bit Daten...

Und zwar wesentlich übersichtlicher!
Spart auch noch Speicher!

Und ist schneller?

Jedenfalls danke, ich hatte das mal angedacht..hätte ich es mal 
umgesetzt..


Jetzt bräuchte ich allerdings noch eine Art Ausgabeschlange, an die ich 
bei Gelegenheit einfach Zeichen dranhängen kann. Wie heißt sowas?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
siehe Codesammlung


Peter

Autor: Seb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
als Antwort auf welche Frage?

suart.c:79
 while( stx_count ); // until last byte finished

soll wohl 'bit' heißen ?

wenn ich das richtig verstehe, ist main für die dauer der übertragung 
blockiert. dann wird natürlich auch keine 'ausgabeschlange' benötigt..

ich dachte, das kann man noch pfiffiger machen?

Autor: Seb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
trotzdem danke für den hinweis, ich werd's erstmal mit ner zeichenkette 
machen..

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seb wrote:
> suart.c:79
>
>  while( stx_count ); // until last byte finished
> 
>
> soll wohl 'bit' heißen ?

Ne, Byte.
Es wird erst ein neues Byte gesendet, wenn das vorherige Byte fertig 
ist, also der Bitcounter 0 ist.

> wenn ich das richtig verstehe, ist main für die dauer der übertragung
> blockiert. dann wird natürlich auch keine 'ausgabeschlange' benötigt..

Das Beispiel ist ungepuffert.
Da aber Empfang und Senden über Interrupts erfolgt, kann man natürlich 
auch eine Pufferung dazu basteln.

Macht man dann genau so wie bei ner HW-UART, daher hab ichs nicht extra 
dazu geschrieben.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seb wrote:

> Spart auch noch Speicher!
>
> Und ist schneller?

Nö, auf ner 8Bit-CPU ist ein extra Bitzähler effizienter (weniger Code, 
CPU-Zeit).


Peter

Autor: Seb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ne, Byte.
Stimmt, ist egal.

Na ich feil noch ein bisschen dran rum, zumindest sieht es jetzt relativ 
ordentlich aus.
Hat denn so eine Pufferung einen speziellen Namen? Würde ich mir bei 
Gelegenheit gerne mal aneignen.

Autor: Seb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR274: Single-wire Software UART ist vielleicht auch was.

Autor: Seb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder AVR304: Half Duplex Interrupt Driven Software UART

Autor: Ulrich P. (uprinz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
AVR304 kann ich nur empfehlen. Funktioniert einwandfrei und ist leicht 
auf andere Bitzahlen modifizierbar. Musste mal ein 21-Bit serielles 
Interface adaptieren und das ging sehr gut, zumal dieser Code 0% Fehler 
bzgl. des Timings ermöglicht.

Gruß, Ulrich

Autor: Seb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder per USI in den tiny AVRs

Half-duplex Asynchronous Data Transfer

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.