Digitaleingänge
Die interne RAM-Adresse 90h entspricht im Sios dem Digitaleingang. Der Zustand dieses Speichers kann man mit MOV A,DIN in den Akku laden. In diesem einfachen beispiel wird lediglich das Eingangsbyte negiert (Complement: CPL A) und wieder an die Digitalausgänge geschickt (MOV DOUT,A). Somit erscheint an den Digitalausgängen das invertierte Eingangssignal.
0001 0000 DOUT .equ 0E8H ;D-Ausgang
0002 0000 DIN .equ 090H ;D-Eingang
0003 0000
0004 8100 .org 8100H
0005 8100 E5 90 start mov a,DIN
0006 8102 F4 cpl a
0007 8103 F5 E8 mov DOUT,a
0008 8105 80 F9 sjmp start
0009 8107 .end
tasm: Number of errors = 0 |
Analogeingänge
Das Einlesen der Analogeingänge erfolgt über ein Unterprogramm im ROM. Die entsprechende Routine steht an Adresse 0177h und erwartet im Akku eine Zahl zwischen 0 bis 3, entsprechend den vier Analogeingängen A bis D. Das Beispielprogramm gibt am Digitalausgang das Ergebnis der AD-Wandlung von Eingang 0 (A) aus.
0001 0000 DOUT .equ 0E8H ;D-Ausgang
0002 0000 DIN .equ 090H ;D-Eingang
0003 0000 AIN .equ 0177h ;Analog 0..3
0004 0000
0005 8100 .org 8100H
0006 8100 74 00 start mov A,#00
0007 8102 12 01 77 LCALL AIN
0008 8105 F5 E8 mov DOUT,A
0009 8107 80 F7 sjmp start
0010 8109 .end
tasm: Number of errors = 0
|
Vergleich und Sprung
Es soll nun am Digitalausgang 00001111b erscheinen, wenn der Analogeingang 0 kleiner als 128 ist, sonst soll 11111111b ausgegeben werden. Der 80535 kennt den Befehl CMP A ,#data (Vergleiche Akku mit Konstante) nicht. Darum wird auf eine Subtraktion zurückgegriffen, die das Überlauf-Flag (Carry) beeinflußt. Da der Subtraktionsbefehl SUBB auch noch das Carry-Flag mit abzieht, wird mit CLR C vorher das Carry-Bit zurückgesetzt. Mit dem Jump Carry (JC) wird nun verzweigt und die entsprechende Digitalausgabe realisiert. In einer Hochsprache würde dieses Problem wie folgt formuliert werden:
If AIN < 128 Then DOUT 15 Else DOUT 255
0001 0000 DOUT .equ 0E8H ;D-Ausgang
0002 0000 DIN .equ 090H ;D-Eingang
0003 0000 AIN .equ 0177h ;Analog 0..3
0004 0000
0005 8100 .org 8100H
0006 8100 74 00 start mov A,#00
0007 8102 12 01 77 LCALL AIN
0008 8105 C3 clr c
0009 8106 94 80 subb a,#128
0010 8108 40 05 jc less
0011 810A 75 E8 FF mov DOUT,#255
0012 810D 80 F1 sjmp start
0013 810F 75 E8 0F less mov DOUT,#15
0014 8112 80 EC sjmp start
0015 8114 .end
tasm: Number of errors = 0
|
Analog-Eingang direkt
Wurde bisher eine Rom-Routine benutzt, um einen Analogeingang zu lesen, wird diese Routine nun selbst nachgebildet. Dazu muss der Hardwareaufbau bekannt sein. Das Betriebssystem des Entwicklungssystems ES535 ist in [3] auf Seite 223ff abgedruckt. Mit Hilfe der im Anhang 12.3 angegebenen Include-Datei 80535.SFR kann die Routine MESSEN nachgebildet werden.
0001 0000 DOUT .equ 0E8H ;D-Ausgang
0002 0000 DIN .equ 090H ;D-Eingang
0003 0000 ADCON .equ 0D8H ;AD-CONTROL
0004 0000 DAPR .equ 0DAH ;D/A Program
0005 0000 BSY .equ 0DCH ;ADCON.4 Busy-Flag
0006 0000 ADDAT .equ 0D9H ;A/D Data
0007 0000
0008 8100 .org 8100H
0009 8100 74 00 start mov A,#00 ;Eingang A
0010 8102 44 80 orl a,#80h ;BD=1
0011 8104 F5 D8 mov ADCON,a ;Einstellen
0012 8106 75 DA 00 mov DAPR,#00h ;5 Volt
0013 8109 20 DC FD busy jb BSY,busy ;Nicht fertig
0014 810C E5 D9 mov a,ADDAT ;Holen
0015 810E F5 E8 mov DOUT,a ;Ausgabe
0016 8110 80 EE sjmp start
0017 8112 .end
tasm: Number of errors = 0 |
|