Ðåôåðàòû. Ïðîãðàììèðîâàíèå ìèêðîêîíòðîëëåðà íà àññåìáëåðå. Ñèìóëÿöèÿ èãðàëüíîé êîñòè

 

Erklärung

In dieser Aufgabe werden die Zahlen von 1 bis 6 durch eine 7-Segment-Anzeige dargestellt.

Zur Lösung der Aufgabe benützen wir eine indirekte Adressierung @DPTR im 16 bit- Adressraum und Define Byte (DB).

Die Zahlen 1 bis 6 haben folgende Entsprechungen:


Ausgabewert

Hexzahl

Eins

12h

Zwei

0BCh

Drei

0B6h

Vier

0D2h

Fünf

0E6h

Sechs

0EEh


Am Ende der Datenzeile setze man 0FFh, um das Ende der Zeile zu markieren (end of line).


 

Assemblercode


Code at 0000h

P2 equ 0A0h

P3 equ 0B0h

clr P3.6                ; Eine 7-Segment-Anzeige loeschen/abschalten

init: mov DPTR, #Daten  ; Daten laden

start: clr A            ; Akku loeschen

movC A, @A+DPTR         ; Indirekte 16-Bit-Adressierung.

                        ; Es wird auf diese Weise wegen der

                        ; Besonderheiten des Prozessors gemacht.

                        ;

CJNE A, #0FFh, weiter   ; Pruefe, ob "end of line" (Ende der Zeile).

sjmp init               ; Wenn ja, von Anfang an.

weiter: mov P2, A       ; Ausgabe des Akkuinhaltes

INC DPTR                ; Naechstes Datum nehmen.

sjmp start              ; Zurueck zu Start


ORG 0C0h  


Daten: DB 12h, 0BCh, 0B6h, 0D2h, 0E6h, 0EEh, 0FFh

                        ; Liste der Zustaende der 7-Segment-Anzeige,

                        ;                                    1 bis 6

END



Programmablaufplan

Bild 21. Programmablaufplan
für die Aufgabe 4

 
 


Adressierungsarten


1. Unmittelbare Adressierung.

Einer Variable (einem Speicherplatz, dem Akku oder einem Register) wird unmittelbar ein Wert zugeordnet.


#01h->R1

oder

mov R1, #01h


2. Direkte Adressierung.


Einer Variable (einem Speicherplatz, dem Akku oder einem Register) wird direkt der Inhalt Wert einer anderen Variable (eines Speicherplatzes, des Akkus oder eines Registers) zugeordnet.


<A>->R1

oder

mov R1, A


3. Indirekte Adressierung.


Einer Variable (einem Speicherplatz, dem Akku oder einem Register) wird direkt der Inhalt der Speicherzelle zugeordnet, deren Adresse dem Inhalt einer anderen Variable (eines Speicherplatzes, des Akkus oder eines Registers) entspricht.


<<A>>->R1

oder

mov A, 0ACh

mov R1, @A

Nach dem Ausführen steht der Inhalt der Speicherzelle mit der Adresse 0ACh in R1.


Aufgabe 5. Programmierung der 8051Win-Simulation der 7-Segment-Anzeige



Erklärung

In dieser Aufgabe werden die Zahlen von 1 bis 6 durch eine 7-Segment-Anzeige dargestellt. Zur Lösung der Aufgabe benützen wir CJNE-Befehl, DPTR und Define Byte (DB).  Die Aufgabe 5 ist im Prinzip die Aufgabe 4. Jedoch benötigen wir hier eine Zeitpause, damit wir den Ergebnis prüfen können.

Die Programmierung wurde erfolgreich während des Unterrichts durchgeführt. Die Simulation mit dem Programm 8051Win ist wegen der Zeitpause nicht sinnvoll.


Assemblercode

Code at 0000h

P2 equ 0A0h

P3 equ 0B0h

clr P3.6                ; Eine 7-Segment-Anzeige loeschen/abschalten

init: mov DPTR, #Daten  ; Daten laden

start: clr A            ; Akku loeschen

movC A, @A+DPTR         ; Indirekte 16-Bit-Adressierung.

                        ; Es wird auf diese Weise wegen der

                        ; Besonderheiten des Prozessors gemacht.

                        ;

CJNE A, #0FFh, weiter   ; Pruefe, ob "end of line" (Ende der Zeile).

sjmp init               ; Wenn ja, von Anfang an.

weiter: mov P2, A       ; Ausgabe des Akkuinhaltes

lcall uptime            ; Zeitpause

INC DPTR                ; Naechstes Datum nehmen.

sjmp start              ; Zurueck zu Start


ORG 0C0h  


Daten: DB 12h, 0BCh, 0B6h, 0D2h, 0E6h, 0EEh, 0FFh

                     ; Liste der Zustaende der 7-Segment-Anzeige.

uptime:

mov R3, #10            ; lädt 10 in R3 ein

loop3: mov R2, #100    ; Unterschleife; lädt 100 in R2 ein

loop2: mov R1, #100    ; Unterschleife; lädt 100 in R2 ein

loop1: djnz R1, loop1  ; bedingter Sprung zurück

       djnz R2, loop2  ; bedingter Sprung zurück

       djnz R3, loop3  ; bedingter Sprung zurück

RET                         ; Das Programm wird an der Stelle
                            ; fortgesetzt, an der das Unter-
                            ; programm aufgerufen wurde, also
                            ; nach der lcall uptime

END

Programmablaufplan.

 

Bild 22. Programmablaufplan
für die Aufgabe 5


 
 


Aufgabe 6. Langsam auslaufender/nachlaufender Zähler

 

Erklärung.

Die Aufgabe 6 ist eine Erweiterung der Aufgaben 4 und 5. Jetzt brauchen wir, dass der Zähler mit einer Beschleunigung oder verzögerung zählt.

Die Programmierung wurde erfolgreich während des Unterrichts durchgeführt. Die Simulation mit dem Programm 8051Win ist wegen der Zeitpause nicht sinnvoll.

Assemblercode

Code at 0000h


P1 equ 90h

P2 equ 0A0h

P3 equ 0B0h


clr P3.6                ; eine 7-Segment-Anzeige abschalten

mov 0F9h, #1            ; eins in die Speicherzelle 0F9h laden

init: mov DPTR, #Daten  ; s. Bemerkungen zu Nr. 4 und 5


start: clr A

       movC A, @A+DPTR

       CJNE A, #0FFh, weiter

       sjmp init

weiter: mov P2, A


stopp: JB P1.0, beschleunigen ; wenn P1.0-Schalter auf 1 steht,

                             ;beschleunigen


langsamer:                  ;

       mov R4, 0F9h          ; der Inhalt der Speicherzelle 0F9h ins

                             ;R4 laden

       cjne R4, #7, verzoegern ; vergleichen mit #7.

                             ;Bei Ungleichheit zum Verzoegern (also

                             ;einfach weiter) gehen

       sjmp stopp             ; Bei Gleichheit zum Stopp gehen

verzoegern:

       inc R4                ; durch Erhoehung von R4 macht man die

                             ; Pause laenger

       mov 0F9h, R4          ; Inhalt von R4 ins R3 ueber

       mov R3, 0F9h          ; eine Speicherzelle laden


       sjmp vor              ; Zur Pause springen

beschleunigen:

       mov R3, #1

       mov R4, 0F9h

       cjne R4, #1, go       ; wenn noch keine 1, beschleunigen 

                             ; durch go

       sjmp vor

go:

       dec R4                ; durch Verkleinerung von R4 macht man

;                            ; die Pause kuerzer


       mov 0F9h, R4          ; Inhalt von R4 ins R3 ueber

       mov R3, 0F9h          ; eine Speicherzelle laden

vor:

       LCALL uptime         ; Pause ausführen

       INC DPTR             ; naechstes Datum nehmen.

       sjmp start

Daten: DB 12h, 0BCh, 0B6h, 0D2h, 0E6h, 0EEh, 0FFh;

ORG 0C0h

uptime:

loop3: mov R2, #200

loop2: mov R1, #250

loopl: djnz R1, loopl

       djnz R2, loop2

       djnz R3, loop3

RET

END

Programmablaufplan


 

Bild 24. Programmablaufplan für die Aufgabe 6


 

Beschreibung der benutzten Befehle

 


Code at Adresse

Legt fest, ab welcher Adresse der Programmcode gespeichert wird. Bei uns ist es immer ab Anfang.

end

Ein Assembler-Programm wird mit dem Befehl End beendet.

DJNZ (Decrement Jump if Not Zero; dekrementiere, springe, wenn nicht Null)

DJNZ Adresse, rel

oder   

DJNZ Rn, rel

Der Befehl vermindert Adresseinhalt (Adresse) bzw. Registerinhalt (Rn) um eins und verzweigt zu rel, wenn das Ergebnis ungleich Null ist.

CJNE – Befehl (Compare Jump if Not Equal)

CJNE Adresse, #data, rel                 oder                CJNE Adresse, Adresse, rel

Vergleicht Adresse mit #data / Adresse und verzweigt nach rel wenn es ungleich ist.

JB (Jump Bit)

JB bit, rel

Springt zu rel beim gesetzten Bit (bit)

Ausgabe EQU und MOV


P2 equ 0A0h

mov P2, #data

 

Zuerst wird die Adresse 0A0h dem P2 zugewiesen, danach werden die Daten (#data) ausgegeben. Mit dem Befehl mov können einer bestimmten Adresse verschiedene Sachen zugeordnet werden z.B. Wert, Daten oder eine andere Adresse.

Auf diese Weise lässt sich auch die Ausgabe auf die LPT Schnittstelle und Parallele Schnittstelle realisieren.

SJMP (Short Jump)

SJMP Programmpunkt

Relativer Programmsprung im Bereich -128 bis 127 zur nachfolgenden Befehlsadresse.

LCALL

Mit diesem Befehl wird ein Unterprogramm aufgerufen (LCALL Unterprogrammname)

RET

Der Befehl lässt das Programm an die Stelle zurückspringen, an der er aufgerufen wurde und das Programm läuft dort weiter.

INC und DEC

Mit den Befehlen wird der Wert um 1 erhöht bzw. verkleinert.

ORG

Der Befehl legt fest die Stelle, an der der nachfolgende Quellcode abgelegt wird. Er ist mit dem Befehl „Code at Adresse“ vergleichbar (ORG Adresse). Der Wert liegt zwischen 00h und FFh.

Quellenangabe


1.    Im Unterricht angeeignetes Wissen

2.    CD von Herrn A. Hein mit Programmen und Erklärungen

3.    Wikipedia (www.wikipedia.org)

4.    http://www.humerboard.at/

5.    Modul-Hardware
( http://www.humerboard.at/doku/sb8/hardware_sb8.pdf )

6.     Uthishdran Sreeranganathan stellte mir das Foto der BB-Mikrocontrollerplatine zur Verfügung




Anlage: CD



Ñòðàíèöû: 1, 2, 3, 4



2012 © Âñå ïðàâà çàùèùåíû
Ïðè èñïîëüçîâàíèè ìàòåðèàëîâ àêòèâíàÿ ññûëêà íà èñòî÷íèê îáÿçàòåëüíà.