Lauflicht mit Carry-Flag
Schiebebefehle werden für den Aufbau eines Lauflicht-Programms benutzt. Der Inhalt des Spezialregisters Akku kann nach links oder nach rechts geschoben werden. Binäres Linksschieben bedeutet gleichzeitig eine Verdopplung, Rechtsschieben einer Halbierung.
Wird die Binärzahl 00001000b (8) um ein Bit nach rechts geschoben, ist das Ergebnis 00000100 (4). Die MC-Befehle RR A, RL A, RLC A und RRC A schieben (rotieren) den Akkuinhalt. RLC bedeutet Rotate Right though Carry.
Das Carry-Flag ist ein Statusbit im Mikrocontroller.
Die Sprungbefehle JC (Jump Carry) und JNC (Jump No Carry) verzweigen, je nach Zustand des Carry-Bits. Bei RRC und RLC wird durch das Carrs-Flag geschoben. Es rotieren also insgesamt 9 Bit.
0001 0000 DOUT .equ 0E8H ;DOUT
0002 0000
0003 8100 .org 8100H
0004 8100 74 00 start mov a,#00 ;0000001
0005 8102 D3 setb c ;Carry=1
0006 8103 33 loop rlc a ;Schieben
0007 8104 F5 E8 mov DOUT,a ;Ausgeben
0008 8106 31 0C acall warte ;Warten
0009 8108 50 F9 jnc loop ;Sprung?
0010 810A 80 F4 sjmp start ;Anfang
0011 810C
0012 810C 7F FF warte mov R7,#255
0013 810E 7E FF l1 mov R6,#255
0014 8110 DE FE l2 djnz R6,l2
0015 8112 DF FA djnz R7,l1
0016 8114 22 ret
0017 8115 .end
tasm: Number of errors = 0 |
Der JNC-Sprung kann auch entfallen, wenn das Programm ein wenig umgebaut wird. Dadurch wird nicht nur das Programm wiederum kürzer (19 Bytes), auch die Verarbeitungszeiten sind gleich. Die etwas längere Initialisierung A=0 und Carry=1 wird nur noch beim Start durchlaufen.
0001 0000 DOUT .equ 0E8H ;DOUT
0002 0000
0003 8100 .org 8100H
0004 8100 74 00 start mov a,#00 ;00000000
0005 8102 D3 setb c ;Carry=1
0006 8103 33 loop rlc a ;Schieben
0007 8104 F5 E8 mov DOUT,a ;Ausgeben
0008 8106 31 0A acall warte ;Warten
0009 8108 80 F9 sjmp loop ;Schleife
0010 810A
0011 810A 7F FF warte mov R7,#255
0012 810C 7E 64 l1 mov R6,#100
0013 810E DE FE l2 djnz R6,l2
0014 8110 DF FA djnz R7,l1
0015 8112 22 ret
0016 8113 .end
tasm: Number of errors = 0
|
Musterausgabe über Tabelle
Soll nicht nur ein Lauflicht erscheinen, sondern beliebige Muster, so können die auszugebenden Bytes als eine Tabelle im Speicher abgelegt werden. Ein entsprechendes Programm gibt dann nacheinander diese Bytes am Digitalausgang aus. Die Daten werden mit .org 8120h hinter dem Programm abgelegt. Nun wird das einzig vorhandene 16-Bit-Register DTPR benötigt. Dieser Data Pointer kann auch inkrementiert (+1) und dekrementiert (-1) werden. Dieses Register enthält die Adresse des auszugebenden Bytes. Mit MOV A,@DTPR wird der Inhalt der von DPTR adressierten Speicheradresse in den Akku übertragen. Register R5 dient hier als Zähler.
0001 0000 DOUT .equ 0E8H ;DOU
0002 0000
0003 8100 .org 8100H
0004 8100 start
0005 8100 90 01 20 mov DPTR,#0120h
0006 8103 7D 09 mov R5,#9
0007 8105 E0 loop movx a,@DPTR
0008 8106 F5 E8 mov DOUT,a
0009 8108 31 10 acall warte
0010 810A A3 inc DPTR
0011 810B DD F8 djnz R5,loop
0012 810D 02 81 00 ljmp start
0013 8110
0014 8110 7F 9B warte mov R7,#155
0015 8112 7E FF l1 mov R6,#255
0016 8114 DE FE l2 djnz R6,l2
0017 8116 DF FA djnz R7,l1
0018 8118 22 ret
0019 8120 .org 8120h
0020 8120 01 table .byte 001H
0021 8121 03 .byte 003H
0022 8122 07 .byte 007H
0023 8123 0F .byte 00FH
0024 8124 1F .byte 01FH
0025 8125 3F .byte 03FH
0026 8126 7F .byte 07FH
0027 8127 FF .byte 0FFH
0028 8128 00 .byte 000H
0029 8129 .end
tasm: Number of errors = 0 |
Zeile 0005 ist kein Schreibfehler. Die Speicheraufteilung im Sios ist etwas komplex. Die vier Betriebsmodi werden in der Datei "SiosDok.Doc" beschrieben. Dieses Dokument befindet sich auf der CD zum Buch "Messen, Steuern und Regeln mit Word und Excel" im Verzeichnis Hardware\Sios. Diese Beschreibung befindet sich auch auf der Diskette zum Sios. Der im Excelblatt benutzte DLL-Befehl PROLADEN sendet die Binärdatei 0.obj des TASM an die Adresse 0100h. Mit PROSTART wird das Programm an der Adresse 8100h gestartet! Diese Speicherverwaltung kommt durch die sehr flexible Hardware des Sios zustande. Die Hardware lehnt sich stark an das Entwicklungssystem ES535 an. Schaltplan und Platinenlayout, sowie die Beschreibung der gesamten Hardware wird im Buch "Erfolgreich Messen, Steuern und Regeln mit Mikrocontrollern", Burkhard Kainka, Franzis-Verlag, beschrieben.
Das gesamte RAM besitzt als Daten-RAM die Adresslage 0000 bis 7FFF, als Programm-RAM dagegen 8000 bis FFFF. Jeder Zugriff auf ein Programmbyte schaltet den Speicher in die obere Adresslage. Daher können Programme oberhalb 8000 gestartet werden und Systemroutinen aus dem EPROM in der unteren Hälfte des Adressbereichs aufrufen. Programme werden immer in den Datenbereich ab 0000 geladen, müssen aber für den Bereich ab 8000 übersetzt werden. Legt man Datentabellen im Programm ab, müssen sie (z.B. mit org 8120h) zunächst in den Programmcode integriert werden. Man muss aber bedenken, dass sie mit dem MOVX-Befehl als Daten tatsächlich bei 0120 erscheinen. |