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