Software-UART TXD                           

Elektronik-Labor  Projekte  Mikrocontroller  TLScript         




Einen seriellen Empfänger mit 500 Baud gibt es ja schon. Da fehlt nur noch ein serieller Sender mit der gleichen Übertragungsrate, und schon kann man eine direkte Datenverbindung zwischen zwei PicoBasic-Controllern aufbauen. Im Bild ist das untere System der Sender. Es wird die Fotospannung der LED an AD0 gemessen und seriell an den anderen Controller übertragen, der die Daten an seinen LEDs anzeigt. Wenn ich nicht irre, wurde da gerade die Zahl 81 übertragen.

Als seriellen Ausgang verwende ich P0 (PC0). Die Bitlänge ist 2 ms. Der Ruhepegel ist 1. Zuerst wird das Stopbit erzeugt, danach wird immer wieder das Bit 0 der Daten ausgegeben und danach werden alle Bits um eine Stelle nach rechts geschoben. Am Ende wird wieder der Ruhepegel 1 und damit das Stopbit eingeschaltet. Es hat keine definierte Länge, weil im Hauptprogramm eine längere Verzögerung von 250 ms steht, bevor das nächste Byte gesendet wird.

              Rem TX500BdTTL
0x0901  Pdir = 1
0x0801  Pout = 1
              L1:
0x3C00  A = AD0
0x2106  Call L2:
0x19FA  Delay ms = 250
0x2002  Jmp L1:
              L2:
0x3800  D = A
0x0800  Pout = 0
0x1902  Delay ms = 2
0x0307  C = 7
              L3:
0x3800  D = A
0x3900  A = D
0x1201  A = A AND 1
0x4500  Pout = A
0x1902  Delay ms = 2
0x3900  A = D
0x3200  A = A Shr 1
0x3800  D = A
0x250A  C*Jmp L3:
0x0801  Pout = 1
0x4800  Ret

So werden also etwa vier Bytes pro Sekunde übertragen und auf der anderen Seite angezeigt. Wenn Daten in beiden Richtungen ausgetauscht werden sollen, stört es vielleicht etwas, dass das Bit 0 der digitalen IO-Ports für die Schnittstelle eingesetzt wird. Deshalb soll es nun eine zweite Version geben, die den Ausgang PWM2 als TXD-Leitung verwendet.

              Rem TX500BdPWM2
0x11FF  PWM2 = 255
              L1:
0x3C00  A = AD0
0x2105  Call L2:
0x19FA  Delay ms = 250
0x2001  Goto L1:
              L2:
0x1100  PWM2 = 0
0x1902  Delay ms = 2
0x0307  C = 7
              L3:
0x3800  D = A
0x3900  A = D
0x1201  A = A AND 1
0x0201  B = 1
0x220F  If A=B Jmp L4:
0x1100  PWM2 = 0
0x2010  Jmp L5:
              L4:
0x11FF  PWM2 = 255
              L5:
0x1902  Delay ms = 2
0x3900  A = D
0x3200  A = A Shr 1
0x3800  D = A
0x2508  C*Jmp L3:
0x11FF  PWM2 = 255
0x4800  Ret

Beim ersten Test wurde eine Unzuverlässigkeit entdeckt, die durch kurze Glitches am PWM-Ausgang entstand. Auch wenn PWM2 = 255 gesetzt wird, ist der Pegel am Ausgang nicht permanent high, sondern  es gibt sehr kurze negative Impulse. Dagegen half ein Tiefpassfilter mit 10 kOhm und 3,3 nF in der TXD-Leitung. Beim CH32V003 ist die PWM-Frequenz per default 187,5 kHz, was für den Zweck ausreicht. Bei anderen Controllern muss die Frequenz möglichst hoch eingestellt werden. Im Bild unten wurde übrigens die Spannung an einem Kondensator mit 100 nF gemessen und das Ergebnis übertragen. 



Elektronik-Labor  Projekte  Mikrocontroller  TLScript