Serielle Schnittstelle für den HT46F47

von Hermann Nieder                  
Elektronik-Labor  Projekte   Holtek

 

 
 
In vorigen Beitrag wurde beschrieben, wie sich die Platine aus dem Lernpaket Modellbahn ergänzen lässt, damit man den Mikrocontroller darauf z.B. mit einem Programmierer EIC-300 von Holtek umprogrammieren kann.Was dem HT46F47, wie ich finde, leider  fehlt, ist eine serielle Schnittstelle, über die er mit einem PC z. B. unter Windows mit 9600 Baud kommunizieren kann. Diese wollte ich  dem Mikrocontroller  nun per Software verfügbar machen.Um das Rad nicht nochmal neu erfinden zu müssen, habe ich  mir Burkhard Kainkas Assembler-Unterprogramme zum  Empfangen und  Senden  für den  ATtiny13 auf der Platine des Lernpakets Mikrocontroller genau angesehen.Zu diesen sind u. a. Einzelheiten  im  ELO-Beitrag   www.elo-web.de/mikrocontroller-und-programmierung/avr-anwendungen/empfangen-und-senden sowie auch  auf den Seiten von B. Kainka im Artikel www.elektronik-labor.de/AVR/T13oszi.html zu finden.
 
Ich begann zunächst mit einfachen Programmbeispielen, um Erfahrungen in der Assembler-Programmierung eines HT46F47 von Holtek  zu sammeln. Schließlich gelang es mir nach mehreren  Misserfolgen und  späteren Teilerfolgen, den Mikrocontroller auf der Platine aus dem Lernpaket Modellbahn  so zu programmieren, dass  nun  innerhalb eines einfachen Interface-Programms ein Senden und Empfangen mit 9600 Baud möglich ist. Der  Anwender kann z. B. an  Port A des HT46F47  ein Byte ausgeben. Außerdem lässt sich sein Analogeingang ADC0 abfragen und das betreffende Byte an den PC übertragen. Man kann auch den  PWM-Ausgang  des Mikrocontrollers  ansteuern. Mit einem bestimmten  Befehlsbyte kann PB3 gesetzt, mit einem anderen PB3 zurückgesetzt werden.


 
Für die Kommunikation mit einem PC über dessen serielle Schnittstelle dient auf der Mikrocontrollerseite Pin PB1(J1) als TXD- und PB2(J2) als RXD-Anschluss, wie dies aus dem vereinfacht dargestellten  Schaltplan der Platine des Lernpakets Modellbahn  zu entnehmen ist.Wird der Anschluss zum Schleifkontakt des Trimmpotenziometers P1 steckbar gemacht, kann man dem HT46F47 an seinem Analog-Eingang  auch externe Gleichspannungen von 0 bis 5 V zur Messung anbieten.  
 

 
Wenn man wie im Bild z. B. die Platine aus einem Lernpaket Elektronikstart mit USB für die Kommunikation zwischen PC und Mikrocontroller verwendet, entfallen R1 und R2. PB2 (J2 ) wird  unmittelbar mit dem Anschluss TXD auf der Platine mit dem USB-Chip FT232R  verbunden, während PB1(J1) an den Pin  RXD anzuschließen ist. Der Anschluss GND wird mit dem betreffenden Anschluss auf der Platine des Lernpakets Modellbahn verbunden.Verfügt der vorhandene PC noch über eine serielle Schnittstelle, sind die Widerstände R1 und R2    z. B. bei Verwendung  der abgebildeten ELEXS-Platine in Anlehnung an die Schaltung auf der Platine des Lernpakets Mikrocontroller einzufügen.  
 
 
Dies hier ist ein Auszug aus dem Programmlisting des oben erwähnten Interface-Programms:

Auswahl:
        call RdCOM
        mov A_Reg,a
        clr Z_Bit     ; Z-Bit loeschen
        xor a,1       ; Befehl 1
        sz  Z_Bit
        call DigAus  
 
mov a,A_Reg
        clr Z_Bit 
        xor a,2       ; Befehl 2
        sz Z_Bit
        call DigEin          
 
mov a,A_Reg
        clr Z_Bit  
        xor a,3       ; Befehl 3
        sz  Z_Bit
        call PWMAus
...      
 
Es gibt einige Befehlsbytes, die bestimmte Aktionen des Mikrocontrollers veranlassen. Dieser liest nach dem Empfang des Bytes 2  Eingangssignale von Port A ein und  überträgt den betreffenden Wert an den angeschlossenen PC.
 
Wenn man  auf eine Ausgabe von  Bytes an Port A  verzichtet und stattdessen nur Eingangszustände  an  PA0 – PA7  einlesen möchte,  erscheint es mir sinnvoll,  an L1 –  L8 (bzw. PA0 – PA7)  zusätzlich externe Pull-up-Widerstände von jeweils 10 k anzuschließen, um eindeutige Eingangszustände zu haben.
 
 
 
Für die Überprüfung des Interface-Programms im HT46F47 auf der Platine des Lernpakets Modellbahn verwendete ich das Programm Terminal.exe von Burkhard Kainka, das auf seinen Seiten heruntergeladen werden kann. Das Bild zeigt einen Screenshot des Terminal-Programms. Gerade ist vom PC an den Mikrocontroller das Byte 1 und anschließend der Wert 15 übertragen worden, um die ersten 4 Bit des Ports A zu setzen. Nach der Übermittlung von 3  an den HT46F47  und dem nachfolgenden Byte 127 ist der PWM-Ausgang angesteuert worden. Mit dem Wert 5 ist der Ausgang PB3 gesetzt und mit dem anschließenden Byte 6 zurückgesetzt worden. Nach dem  Senden des Bytes 4  hat der Mikrocontroller den gerade am Analogeingang ADC0 eingelesenen Wert, hier 130,  an den PC gesendet.
 
Dies ist das Unterprogramm für das Empfangen eines Bytes:
 
RdCOM:
                        snz RXD    ; Teste RXD. Wenn RXD nicht 0 ist, ueberspringe naechsten Befehl
                        jmp RdCOM  ;
                        mov a,60   ; etwa 1,5 Bitlaengen warten 
                        mov Delay,a ;
D_1:
                        sdz Delay  ; Dekrementiere Delay. Wenn Delay 0 ist, ueberspringe naechsten Befehl               jmp D_1     ;          
                        mov a,8     ; 8 Durchlaeufe
                        mov Count,A; 
                        clr E_Reg ; Empfangsregister leeren
L_1:
                        mov a,0   ; Akku leeren
                        or a,128  ; Bit 7 im Akku setzen
                        rr E_Reg  ; Inhalt von E_Reg um 1 Bit nach rechts schieben
                       sz RXD    ; wenn RXD 0 ist, ueberspringe naechsten Befehl
                        orm a,E_Reg ;Ergebnis der Oder-Verknuepfung von Akku und E_Reg
                        mov a,37  ;  nach E_Reg, dann 1 Bitlaenge warten
                        mov Delay,a
D_2:
                        sdz Delay  ; Dekrementiere Delay. Wenn Delay 0 ist, ueberspringe naechsten Befehl              
                        jmp D_2     ;
                        sdz Count  ; Dekrementiere Count. Wenn Count 0 ist, ueberspringe naechsten Befehl
                        jmp L_1     ;
                        mov a,37    ;  1 Bitlaenge warten
                        mov Delay,A
D_3:
                        sdz Delay  ; Dekrementiere Delay. Wenn Delay 0 ist, ueberspringe naechsten Befehl
                        jmp D_3    ;    
                       
                        cpl E_Reg  ; Bit fuer Bit in COM_Reg negieren
                        mov a,E_Reg
                        ret
 
Das von mir entworfene Programm funktioniert mit dem abgebildeten Mikrocontroller aus dem  Lernpaket Modellbahn ohne Übertragungsfehler. Es ist aber möglich, dass das Assembler-Listing für den HT46F47 noch an einigen Stellen verbessert oder auch vereinfacht werden kann.
 
Download: HT46_SER6RC.zip
 

Nachtrag: Toleranzen

Erstaunlich ist, dass das Timing der seriellen Schnittstelle hier allein vom internen RC-Oszillator abhängt. Wie genau ist dieser Oszillator eigentlich? Zum Test kann man einfach ein Signal mit 1/4 der Taktfrequenz am Pin OSC1 abgreifen, wenn man dort einen Widerstand mit z.B. 2,2 kOhm gegen VCC anschließt. Bei einem Test mit acht Controllern wurde gemessen, dass die Frequenz des RC-Oszillators sich um maximal 2 % unterscheidet. Das ist für eine RS232 mehr als ausreichend genau.


Elektronik-Labor  Projekte   Holtek