Forum: Mikrocontroller und Digitale Elektronik 2 x 7 segment Anzeige


von Arthur (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ich hoffe Ihr könnt mir helfen. Es geht um folgende Aufgabe, siehe 
Anhang. Soweit habe ich es hinbekommen, nun worüber ich mir nicht sicher 
bin ist die wartezeit im Timer, nämlich der Wert -5000. In der Aufgabe 
steht, damit es flimmerfrei verläuft, sollen min 100 mal in der sekunde 
realisiert werden. Nun war meine überleung 12MHz / 200 = 60000. Mir 
wurde empfohlen den wert -5000 sowohl in der low als auch in den 
highteil einzugeben. Verstdanden habe ich es nicht. Ich hoffe ihr könnt 
mir da behilflich sein. Zweites problem ist die sache mit dem Interrupt. 
Man kann diese aufgabe über einen irq machen. Nun weiss ich leider nicht 
wie ich da vorgehen soll. Was muss ich am Programm ändern damit das 
ganze mit dem irq läuft? Ich wäre euch sehr verbunden, wenn ihr mir eure 
mögliche lösung mit komments senden würdet.

Vorüberlegung für irq:

setb PT0  ; prio hoch
setb ET0  ; interruptfreigabe für timer0
setb EA   ; glob Interruptfreigabe

dann fehlt mir leider das know-how :(
1
org 0000h
2
jmp init
3
org 0050h
4
5
tabelle: 
6
db 0x3f
7
db 0x06
8
db 0x5b
9
db 0x4f
10
db 0x66
11
db 0x6d
12
db 0x7d
13
db 0x07
14
db 0x7f
15
db 0x6f
16
17
org 0080h
18
19
init: 
20
    mov tmod, 01h      ; t0 = 16 bit
21
    setb tr0           ; starte timer0
22
    
23
main:
24
   mov a, p2           ; Wert von Port 2 in a schieben
25
   mov b, #16          ; Konstante 16 in b schieben
26
   div ab              ; quotient High
27
   call check
28
   call wait
29
   setb p1.0           ; digit 0 off
30
   mov  p0, a          ; high digit
31
   clr  p1.0           ; 
32
   mov  a, b           ; remainder = low nibble
33
   
34
   call check
35
   call wait
36
   setb p1.1           ; digit 1 off
37
   mov  p0, a          ; high digit
38
   clr  p1.1           ; 
39
   mov  a, b           ; remainder = low nibble
40
   jmp main
41
42
wait:
43
   jbc tf0, _wait1     ; warte bis overflow
44
   jmp main
45
46
_wait1:
47
   mov th0, #high(-5000); 
48
   mov tl0, #low(-5000); 
49
   ret
50
51
bcd_to_7s_calc:
52
   mov dptr, #tabelle
53
   movc a, @a+dptr
54
   ret
55
56
check:
57
   cjne a, #9, check_less
58
   jmp bcd_to_7s_calc
59
60
check_less:
61
   jc bcd_to_7s_calc
62
   mov a, #0h
63
   jmp bcd_to_7s_calc
64
end

von Sebastian (Gast)


Lesenswert?

-5000, also eine negative Zahl, hat keinen Sinn, wenn man nicht gerade 
im Zweierkomplement rechnet. Der Mikro kennt keine negativen Zahlen.

von Tip (Gast)


Lesenswert?

Arthur schrieb:
> Mir wurde empfohlen den wert -5000 sowohl in der low als auch
> in den highteil einzugeben.

Wenn dir klar ist, was eine negative Zeit sein soll ??? Guter Tip: 
Schlage diese sinnfreie Empfehlung in den Wind.
Überlege dir, was ein Timer ist, welchen Zahlenbereich Low- und 
High-Byte vom Zähler abdecken und ob dann negative Werte dort überhaupt 
etwas zu suchen haben.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Arthur schrieb:
> Mir wurde empfohlen den wert -5000 sowohl in der low als auch in den
> highteil einzugeben.
Du hast GRUNDLEGENDE Probleme beim Verständnis der Assemblersyntax!
Hier wird das höherwertige Byte von -5000 = 65536-5000 = 60536 = 0xEC78 
--> 0xEC nach in das Timer-Highbyte eingetragen, und das untere Byte 
0x78 in das Timer-Lowbyte:
> mov th0, #high(-5000);
> mov tl0, #low(-5000);

Arthur schrieb:
> Nun war meine überleung 12MHz / 200 = 60000.
Falsch! Da fehlt irgendwas!
So wärs richtig: 12MHz / 200Hz = 60000
Oder so: 12MHz / 200Hz = 60000Hz

Arthur schrieb:
> Nun weiss ich leider nicht wie ich da vorgehen soll. Was muss ich
> am Programm ändern damit das ganze mit dem irq läuft?
Du mußt den Timerinterupt initialisieren und den passenden 
Interruptvektor dazu belegen.

EDIT:
> -5000, also eine negative Zahl, hat keinen Sinn, wenn man nicht gerade
> im Zweierkomplement rechnet. Der Mikro kennt keine negativen Zahlen.
Aber der 8051-Assembler kann gut damit rechnen...
Dort war und ist es üblich, die nötigen Zählschritte negativ anzugeben. 
Der Zähler zählt dann hoch und erzeugt beim Überlauf nach 0 einen 
Overflow/Interrupt.

von Peter D. (peda)


Lesenswert?

Arthur schrieb:
> Nun war meine überleung 12MHz / 200 = 60000. Mir
> wurde empfohlen den wert -5000 sowohl in der low als auch in den
> highteil einzugeben. Verstdanden habe ich es nicht.

Schau mal in das Datenblatt Deines 8051, die meisten teilen den Quarz / 
12.
Wie kommt man also von 60000 auf 5000?

Wie kommt man nun auf -5000?
Der Timerüberlauf wird gesetzt beim Zählen von 0FFFFh auf 0 oder im 
Zweierkomplement gesehen von -1 auf 0.
So und wie lange dauert nun das Zählen von -5000 auf 0?

Der Timer besteht aus 2 Registern und der 8051 kann keinen 
16Bit-Zugriff.
Also muß man die -5000 in Low- und High-Byte zerlegen und dann einzeln 
laden.
Vorzugsweise das High-Byte zuerst, da ja das Low-Byte gerade 
übergelaufen war, also nicht im nächsten Takt gleich wieder überlaufen 
wird.


Arthur schrieb:
> wait:
>    jbc tf0, _wait1     ; warte bis overflow
>    jmp main

Das hatte ich bestimmt nicht so geschrieben!


Peter

von Arthur (Gast)


Lesenswert?

Hallo Peter, vielen Dank das hat mir sehr geholfen. Also muss ich für 
Interrupt sowas wie eine ISR schreiben?

von skua (Gast)


Lesenswert?

[code]
org 000Bh
  ljmp t0int

...

toint:
; multiplexcode
  reti

....

[/code

von Peter D. (peda)


Lesenswert?

Arthur schrieb:
> Also muss ich für
> Interrupt sowas wie eine ISR schreiben?

Wozu willst Du einen Interrupt?


Peter

von Michael H. (michael_h45)


Lesenswert?

Peter Dannegger schrieb:
> Wozu willst Du einen Interrupt?
Vermutlich, weils so auf Seite 2 der Hausaufgaben-Angabe steht.

von Arthur (Gast)


Lesenswert?

Nein, es ist reine neugier. Ich wollte es mal eben auch mit interrrupt 
ausprobieren, ist halt eleganter. Ich habs hinbekommen. Vielen Dank.

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.