
Lernpaket Modellbahn: Serielle Schnittstelle in C
von Hermann Nieder
In
einem Beitrag zuvor wird erläutert, wie man einem HT46F47 auf der
Platine aus dem Lernpaket Modellbahn mit bestimmten Unterprogrammen in
Assembler zu einer seriellen Schnittstelle
verhelfen kann, um ihm die Kommunikation mit einem PC über dessen
COM-Schnittstelle zu ermöglichen. Der oben erwähnte
Mikrocontroller von Holtek kann auch in C programmiert werden. Die
Unterprogramme in Assembler hatte ich als Vorlage, also galt es nun,
diese in Holtek C zu übertragen. Der HT46F47 sollte ein Byte
vom angeschlossenen PC empfangen können und darauf eine bestimmte
Aktion ausführen, um dann wieder auf ein Byte vom PC zu warten
usw. Es sollte möglich sein, ein Byte an Port A auszugeben bzw.
ein Byte von demselben einzulesen. Man sollte einen Wert an den
PWM-Ausgang übertragen können sowie ein Byte vom
Analogeingang 0 einlesen können. Außerdem sollte
Ausgang Pb3 gesetzt bzw. zurückgesetzt werden können.
Dies hier ist ein Teil aus dem Programmlisting dazu :
...
while(1)
{
A_Reg=0;
RdCOM();
A_Reg=E_Reg;
switch(A_Reg)
{
case 1:
_pac = 0; // Port A Ausgang
RdCOM();
_pa=E_Reg;
break;
case 2:
_pac=0xff; // Port A Eingang
//_pa=0xff;
E_Reg=_pa;
WrCOM();
_pac=0;
break;
case 3: // PWM
RdCOM();
_pwm=E_Reg;
break;
…
Eine
wichtige Teilaufgabe bestand für mich darin, die Bytes
für die jeweiligen Wartezeiten in den Unterprogrammen WrCOM sowie
RdCOM herauszufinden.
Dafür diente mir ähnlich wie bei der
Entwicklung der oben erwähnten Assemblerroutinen ein
Testprogramm zur Erzeugung eines periodischen Rechtecksignals an dem
dafür vorgesehenen Portpin Pb1 des HT46F47.
Dies ist ein Auszug daraus:
...
_pbc1=0; // Pb1 ist Ausgang
while (1){
_pb1=1;
for(n=0; n<37; n++);
_pb1=0;
for(n=0; n<37; n++);
}
..
Die
Periodendauer des Signals an Pb1 konnte ich mit meinem Oszilloskop
bestimmen und diese schrittweise durch Verkleinerung des Werts in den
Zählschleifen so verändern, bis ich etwa die gleiche Zeit
messen konnte wie bei einem entsprechenden Programm in
Assembler.
Dies ist Listing des Unterprogramms WrCOM für das Senden eines Bytes an den PC:
void WrCOM()
{
_pb1=1;
shortdelay();
for(c=0;c<8;c++)
{
if((E_Reg & 1)==0)
{
_pb1=1;
}
else
{
_pb1=0;
}
shortdelay();
E_Reg=E_Reg>>1;
// Inhalt von E_Reg 1 Bit nach rechts schieben
}
_pb1=0;
shortdelay();
}
…
Das folgende Unterprogramm wird abwechselnd von RdCOM und WrCOM verwendet:
...
void shortdelay()
{
for(n=0;n<5;n++);
}
...
Das
Programm Terminal.exe von Burkhard Kainka lässt sich gut zur
Überprüfung des oben erwähnten C-Programms für die
serielle Kommunikation eines HT46F47 auf der Platine des Lernpaket
Modellbahn mit einem PC verwenden. Beim Einschalten sendet der
Mikrocontroller 85 an den PC. Überträgt man an ihn eine
4, so übermittelt er das Byte, das am Analogeingang 0 eingelesen
wird, im Bild ist sein Wert 131.
Auf der Platine mit dem
HT46F47 sind bereits an allen Ausgängen des Mikrocontrollers
Widerstände von jeweils 220 Ohm vorhanden, damit man dort die im
Lernpaket Modellbahn enthaltenen Leuchtdioden unmittelbar
anschließen kann.
Ich
konnte sogar beide 7-Segmentanzeigen, von denen diejenige links im Bild
zwei gemeinsame Katodenanschlüsse und das rechte Exemplar zwei
gemeinsame Anodenanschlüsse besitzt, miteinander an die Pins L1-L8
der Platine anschließen.
Der
Schaltplan ist der Übersichtlichkeit wegen vereinfacht
dargestellt. Die gemeinsame Katode des einen Anzeigeelements ist mit
dem PWM-Anschluss des Mikrocontrollers verbunden. Die gemeinsame Anode
des anderen lässt sich mit dem Ausgangssignal an Pb3 (J3)
über eine Inverterstufe mit einem PNP-Transistor ein- bzw.
ausschalten.
An
den Mikrocontroller wurde zum Setzen von Pb3 zuerst 5 ausgegeben, um
die rechte Anzeige auszuschalten. Danach wurde an den
HT46F47 eine 1 (Portausgabe) und anschließend 7
übertragen, um auf der Anzeige links die Ziffer 7 darstellen
zu lassen.
Wenn nun vom Mikrocontroller 3 und dann ein
Wert zwischen 0 und 255 empfangen wird, so steuert dieser den
PWM-Ausgang an, dessen Ausgangssignal die Helligkeit der roten Anzeige
beeinflusst.Interessant ist dabei, dass kleine Werte am PWM-Ausgang(
kleiner mittlerer Wert der Ausgangsspannung) große Helligkeit der
jeweils leuchtenden Segmente bedeuten, während bei großen
Werten(großer mittlerer Wert der Ausgangsspannung) die Segmente
der Anzeige nur schwach leuchten.
Mit
dem Byte 6 wird der Ausgang Pb3 zurückgesetzt, also die rechte
grüne Anzeige eingeschaltet. Bei ihr leuchten nun die Segmente,
die beim linken roten Exemplar ausgeschaltet sind.
Überträgt
man an den Mikrocontroller eine 1 und darauf 248 (= 255 - 7), wird auf
der rechten grünen Anzeige die Ziffer 7 dargestellt,
während auf dem linken roten Exemplar die Segmente leuchten,
die beim grünen Exemplar ausgeschaltet sind.
Sendet
man, wie dies oben erläutert worden ist, im Terminalprogramm
jeweils eine 1 und ein bestimmtes Byte, dessen Wert man
ausrechnen kann, an den Mikrocontroller, so werden
außer den Ziffern 0 – 9 auch bestimmte Buchstaben,
wie z. B. A, b, C sowie c, d, E, F und andere auf einer der beiden
7-Segmentanzeigen dargestellt.
Für
die Umprogrammierung des HT46F47 habe ich inzwischen an den
Programmieranschluss der Platine seitlich zusätzlich eine 6-polige
Stiftleiste angelötet, von der ein Stift abgezwickt wurde, um dort
die Leitung zum Programmierer EIC-300 anstecken zu können.
Ist
der Mikrocontroller auf der Platine aus dem oben erwähnten
Lernpaket programmiert, kann ich die Leitung des EIC-300 entfernen und
die Platine wie im Bild mit ihrer seitlichen Stiftleiste in Kontakte
eines Steckboards einstecken. Dort sind dann außer dem Masse- und
dem 5V-Anschluss die Portpins Pb0 und Pb4 sowie der Reset-Pin des
Mikrocontrollers unmittelbar verfügbar.
Download: HT46C_SER01_RC.zip