
Serielle Schnittstelle für den HT46F47
von Hermann Nieder
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.