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
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
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 .
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.
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
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.