Softuart mit Timer

Gast #5655051
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
Gast #5655212
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.
Gast #5655256
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
Gast #5655264
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.
Gast #5655299
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
#5655342
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.
Gast #5656351
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.
Gast #5656395
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren