Forum: Mikrocontroller und Digitale Elektronik Softuart mit Timer


von Lesca (Gast)


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. (Gast)


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

von Karl M. (Gast)


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)


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)


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. (Gast)


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)


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)


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)


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. (Gast)


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)


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

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.