Lernpaket Modellbahn: Serielle Schnittstelle in C

von Hermann Nieder                  
Elektronik-Labor  Projekte   Holtek



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



Elektronik-Labor  Projekte   Holtek