Forum: Mikrocontroller und Digitale Elektronik Keil Assembler Programm 8051 Überprüfung


von Peter (Gast)


Lesenswert?

Hallo, Ich habe zu folgender Aufgabenstellung ein Programmablauf in Keil 
geschrieben und würde nun gerne Wissen, ob das alles so stimmt. Es wäre 
sehr nett, wenn jemand sich das mal anschauen könnte, bin nämlich noch 
ein Anfänger :/

Aufgabenstellung:

Entwerfen Sie ein Assemblerprogramm, das die folgenden Aufgaben zur 
Ausführung bringt:
Von dem Port 0 sollen zwei im Binär-Format vorliegende Werte eingelesen 
werden. Wert I liegt an den Bits 0 bis 3 und Wert II liegt an den Bits 4 
bis 7 an. Das Bar Graph Arrays 3 ist über Port 3 so zu steuern, dass die 
niederwertigsten LED-Bits 0 bis 3 durch den über Port 0 eingelesenen 
Wert II entsprechend geschalten werden, die höherwertigsten LEDs sind 
sicher
auszuschalten. Nach einer Verzögerungszeit von ca. 500msec werden die 
LEDs so geschaltet, dass alle 200msec das niederwertigste LED in das 
höchstwertigste LED übertragen wird, bis
zum Schluss die vier niederwertigsten Bits gelöscht und die vier 
höchstwertigen Bits entsprechend dem eingelesenen Wert II leuchten. Die 
gemeinsame Kathode ist über Port 1 wie folgt anzusteuern: Bar 3 über Bit 
2. Da die Controlling-Abteilung die acht Vorwiderstände pro Array aus 
Kostengründen gestrichen hat, wurden diese durch den
Vorwiderstand in dem Kathodenstromkreis ersetzt. Damit alle LEDs mit 
gleicher Helligkeit für den Betrachter leuchten, ist sicherzustellen 
dass zu jedem Zeitpunkt nur jeweils eine LED angesteuert wird. Damit 
sich einen flimmerfreie Anzeige ergibt, ist der gesamte Anzeigezyklus 
mindestens 100 mal in der Sekunde zu durchlaufen. Das Programm soll 
dauerhaft betrieben werden.



Nun der Quellcode dazu :
1
stack_seg SEGMENT IDATA ;
2
code_seg SEGMENT CODE ;
3
RSEG stack_seg
4
top_stack: DS 10h ; 16 Byte für Stack freihalten (Wertebereich freihalten)
5
CSEG AT 0 ; Start an Adresse 0
6
7
JMP START ; Sprung zum Start
8
ORG 0Bh ; Interruptvektor Timer0
9
JMP ISR_TIM_0 ; Einsprungstelle Timer0
10
timer_low EQU 0AFh ; 50msec = 15535 = 3CAF hexadezimal (65535 = FFFF mücro sekunden - 50000 mükrosekunden )
11
timer_high EQU 03Ch
12
RSEG code_seg
13
14
START:
15
MOV SP,#top_stack ; Initialisierung Stack 
16
17
MOV TL0,#timer_low ; Timer0 LowByte     
18
MOV TH0,#timer_high ; Timer0 HighByte 
19
MOV TMOD,#00000001b ; Timer Modus 1
20
SETB ET0 ; Interruptfreigabe Timer0    | 
21
SETB EA ; Globale Interruptfreigabe   |
22
MOV P0,#0 ; Port0 zwecks Eingabe
23
MOV P1,#0FBh ; Port1 zwecks Common Cathode | 0FBh 0= Lowbyte FB = Highbyte 
24
MOV P3,#0 ; Port3 zwecks Ausgabe
25
26
LOOP1:
27
MOV A,P0 ; Eingabewert nach A kopieren / sichern
28
ANL A,#0F0h ; Bit 0 bis 3 Null setzen  | 0 = Lowbyte F0= Highbyte 
29
SWAP A ; Low- und Highbyte tauschen
30
MOV R5,A ; Den bearbeiteten Eingabewert nach R5 kopieren
31
MOV R0,#10 ; R0 auf 10 setzen, Counter (10 bis 0)
32
SETB TR0 ; Timer 0 starten
33
34
LOOP2:
35
MOV A,R0 ; aktuellen Counterwert nach A kopieren
36
JNZ LOOP2 ; Sprung zum Label LOOP2 wenn Counter != 0
37
CLR TR0 ; Timer 0 stoppen
38
MOV R1,#00000001b ; R1 auf 1 setzen, Verwendung als Maske
39
MOV R0,#4 ; R0 auf 4 setzen, Counter (4 bis 0) / 4 * 50 msec = 200msec 
40
MOV R2,#5 ; R2 auf 4 setzen, Counter (4 bis 0)
41
SETB TR0 ; Timer 0 starten
42
43
LOOP3:
44
MOV A,R5 ;Den bearbeiteten Eingabewert nach A kopieren
45
ANL A,R1 ; A mit R1 (Maske) UND-verknüpfen
46
MOV P3,A ; Ausgabe von A an Port3
47
48
MOV A,R1 ;----------------------------------------;
49
RL A ; R1 (Maske) ein mal nach links rotieren / verschieben RL = Rotate LEFT  ;
50
MOV R1,A ;----------------------------------------;
51
52
MOV A,R0 ; aktuellen Counterwert nach A kopieren
53
JNZ LOOP3 ;JumpNotZero | Sprung zum Label LOOP3 wenn Counter != 0
54
CLR TR0 ; Timer 0 stoppen
55
DEC R2 ; Counterwert R2 dekrementieren
56
MOV A,R2 ; R2 nach kopieren
57
JZ LOOP1 ; Sprung zum Label LOOP1 wenn Counter == 0
58
MOV A,R5 ;----------------------------------------;
59
RR A ; R5 ein mal nach rechts rotieren ;
60
MOV R5,A ;----------------------------------------;
61
MOV R1,#00000001b ; R1 auf 1 setzen, Verwendung als Maske
62
MOV R0,#4 ; R0 auf 4 setzen, Counter (4 bis 0)
63
SETB TR0 ; Timer 0 starten
64
JMP LOOP3 ; Sprung zum Label LOOP3
65
66
;-------------------
67
;Interruptroutine 
68
;-------------------
69
70
ISR_TIM_0: ; Interruptroutine wird im hintergrund immer aufgerufen
71
72
PUSH PSW ; PSW-Wert auf Stack legen
73
PUSH ACC ; Akkumulator-Wert auf Stack legen
74
DEC R0 ; Counterwert R0 dekrementieren
75
MOV TL0,#timer_low ; Timer0 LowByte / Timer0 Register laden
76
MOV TH0,#timer_high ; Timer0 HighByte / Timer0 Register laden
77
POP ACC ; Akkumulator-Wert vom Stack holen
78
POP PSW ; PSW-Wert vom Stack holen /rekonstruiere PSW 
79
RETI ; Rücksprung aus der Interruptroutine
80
END

Mfg Peter

von 8051 (Gast)


Lesenswert?

....Münke :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.