BT2k
LOGO

Mikrocontroller VII
Carry-Flag und Data Pointer

Lauflicht mit Carry-Flag
Lauflicht
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. 


Mikrocontroller VIII
.
Startseite Bücher Software SatTV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt