Forum: Mikrocontroller und Digitale Elektronik Softuart mit Timer


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Lesca (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,
ich benötige aus Debuggründen eine Softuart.
Leider habe ich keinen Output Compare A Match Output Pin frei.
Kann ich auch ohne so einen Pin eine Softuart realisieren?
Würde höchstens 9600Baud benötigen.
Wichtig wäre aber das die Ausgabe zuverlässig funktioniert. Habe die 
Funktion aus Beitrag "Re: Software UART mit delay" 
probiert aber leider gibt es immer wieder fehlerhafte Ausgaben.
Lg

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert
Du hast die wichtigsten Infos vergessen:

- Nur senden oder auch empfangen?
- Mit wie viel MHz ist deine CPU getaktet?
- Um welchen Mikrocontroller geht es?

Ein Beispiel mit nur senden für alle AVR findest du in meiner HelloTiny 
Vorlage: http://stefanfrings.de/avr_hello_world/HelloTiny.zip

: Bearbeitet durch User
von Karl M. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Lesca schrieb:
> Leider habe ich keinen Output Compare A Match Output Pin frei.

Wie sollte man den brauchen?
Ich benötige nur einen Timer mit zwei ISR .

von schlaubi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Timer und Interrupts für einen (TX-only)-Debug-UART?

Halte ich ja für sehr fraglich.

Meine kommen regelmässig ohne aus.
Ein Midrange PIC schafft bei 8 MHz 230 kbaud in Software
und belegt die CPU per Zeichen gerade mal mit
10 Bitzeiten: 43 us.

von Lesca (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du hast die wichtigsten Infos vergessen:

- Nur senden oder auch empfangen?
- Mit wie viel MHz ist deine CPU getaktet?
- Um welchen Mikrocontroller geht es?

Sorry nur Senden also debug ausgaben.
DIe Cpu läuft mit16MHz
Es Handelt sich um einen Atmega16

von A. S. (achs)


Bewertung
0 lesenswert
nicht lesenswert
Wenn du problemlos für z.b. je 100us blockieren darfst, dann lieber hohe 
baudrate, z.b.115.2k. einfach 1 Bit nach dem anderen raus und abgezählte 
nops als Pause dazwischen.

9600 Baud und andere Dinge nebenher ist deutlich schwieriger. Fang 
einfach (blockieren, gesperrte Interrupts) an. Zwischen 2 Bytes kannst 
Du gerne beliebige andere Dinge tun, z.b. timerinterrupt oder so.

von Lesca (Gast)


Bewertung
0 lesenswert
nicht lesenswert
schlaubi schrieb:
> Timer und Interrupts für einen (TX-only)-Debug-UART?
>
> Halte ich ja für sehr fraglich.
>
> Meine kommen regelmässig ohne aus.
> Ein Midrange PIC schafft bei 8 MHz 230 kbaud in Software
> und belegt die CPU per Zeichen gerade mal mit
> 10 Bitzeiten: 43 us.

  Und wie machst du das?

A. S. schrieb:
> Wenn du problemlos für z.b. je 100us blockieren darfst, dann lieber hohe
> baudrate, z.b.115.2k. einfach 1 Bit nach dem anderen raus und abgezählte
> nops als Pause dazwischen.
>
> 9600 Baud und andere Dinge nebenher ist deutlich schwieriger. Fang
> einfach (blockieren, gesperrte Interrupts) an. Zwischen 2 Bytes kannst
> Du gerne beliebige andere Dinge tun, z.b. timerinterrupt oder so.

ok das ist eine andere Denke aber probieren kostet ja nichts.
wie berechne ich die nops?

Danke Lg

von Purzel H. (hacky)


Bewertung
0 lesenswert
nicht lesenswert
Zum Debuggen genuegt eigentlich auch ein Schiebregister, dh ohne Start 
und Stopbit, dafuer mit einem extra Clockbit.. Die Bits kann man per 
Bitbang zusammen mit einem Clockbit raushauen. Die einzelnen Bytes sind 
auf dem Oszilloskop gut einzeln sichtbar.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Wenn die 9600Baud gestört werden, dann hast Du zuviel Interrupts 
dazwischen. In dem Fall sind 115kBaud unter Interruptsperre je Byte 
besser.
Bei 16MHz sind das 139 Zyklen, d.h. das Macro _delay_us() ist noch genau 
genug.
Die Optimierung darf natürlich nicht abgeschaltet sein (-O0), sondern 
muß -Os sein.

von A. S. (achs)


Bewertung
0 lesenswert
nicht lesenswert
Lesca schrieb:
> ok das ist eine andere Denke aber probieren kostet ja nichts.
> wie berechne ich die nops?

a) das direkt in Assembler schreiben. Einfach mal probieren, ob das was 
für die ist, einfach plan weg ohne Schleifen oder Sprünge. Dann die 
Takte auszählen nach Handbuch des Controllers/Assemblers

b) zum ersten Basteln einfach mal ausprobieren und mit Oszi / LSA 
testen. Ist nur zum ausprobieren, später mit mehr Erfahrung dann tiefer 
forschen.

c) Falls die Quarzfrequenz passt, einen Timer mit Overrun nach je einer 
Bitzeit aufsetzen.
1) Warten auf TimerFlag, Startbit (0) raus, Flag löschen
2) Warten auf Timerflag, Bit0 raus, Flag löschen
3) Warten auf Timerflag, Bit1 raus, Flag löschen
...
9) Warten auf Timerflag, Bit7 raus, Flag löschen
10) Warten auf Timerflag, Stopbit (1) raus, Flag löschen
11) Warten auf Timerflag (das ergibt 2 Stoppbits, das ist besser)
12) mit nächsten Byte zu 1 springen.

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Lesca schrieb:

> ich benötige aus Debuggründen eine Softuart.
> Leider habe ich keinen Output Compare A Match Output Pin frei.

Braucht man auch nicht, soll ja eben eine SOFT uart werden. Sprich: 
jeder freie Output-Pin ist nutzbar.

Von dem Timer brauchst du nur eine einzige Sache: einen Interrupt, der 
im richtigen Rhythmus tickt, nämlich (für's Senden) mit der Baudrate der 
beabsichtigten Soft-Uart. Für's Empfangen sollte der Timer allerdings 
mindestens mit dem Vierfachen, besser mit dem 8..16-fachen der Baudrate 
ticken. Aber zum Glück war ja nur Senden Thema...

> Wichtig wäre aber das die Ausgabe zuverlässig funktioniert.

Das wird sie genau dann tun, wenn du niemals den verwendeten 
Timerinterrupt nennenswert länger als ca. 1/4 einer Uart-Bitzeit 
blockierst. Und natürlich die Uart korrekt programmiert ist...

Das Blockieren passiert typisch durch beschissen programmierte 
konkurrierende ISRs, manchmal aber auch schlicht durch ein cli() zuviel 
irgendwo im main()...

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]
  • [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.