Softuart mit Timer

Gast #5655051
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
Gast
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.
Gast
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
Gast
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.
Gast
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
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.
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.
Gast
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.
Gast
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.