Forum: Mikrocontroller und Digitale Elektronik Warteschleife


von blutengel (Gast)


Lesenswert?

Hi!

Habe mal ein kleines Programm zu meinem Verständniss geschrieben.
Dieses Programm lässt eine Led an PortC.0 blinken.Jetzt habe ich den 
Warteschleifengenerator von Tjabo Kloppenburg genutzt. Da ich einen 
externen Quarz von 12 MHZ verwenden, bedeutet dies ja das ich pro 
Sekunde 12000000 Zyklen habe. Da der Befehl RCALL ja 3 Zyclen und der 
Rücksprungbefehl RET 4 Zyklen benötigt muss ich ja nur noch 11999993 
Zyklen "Verbraten" sehe ich das so richtig oder habe ich in meiner 
Annahme einen Denkfehler?

Hier mal der Code:
1
.include "m32def.inc"  
2
3
.def temp = r16
4
5
 
6
       
7
        ldi temp, HIGH(RAMEND) ; HIGH-Byte 
8
        out SPH, temp        
9
        ldi temp, LOW(RAMEND)  ; LOW-Byte 
10
        out SPL, temp
11
 
12
13
14
ldi r16,0xff
15
out ddrc,r16
16
17
loop:
18
ldi r16,0b11110001;pin c.0 ein
19
out portc,r16 
20
rcall wait;warteschleife 1 sec aufrufen
21
22
ldi r16,0b11111111;pinc.0 aus
23
out portc,r16
24
rcall wait
25
rjmp loop 
26
27
28
wait:
29
; ============================= 
30
;    delay loop generator 
31
;     11999993 cycles: weil lcall = 3 zyclen und ret = 4 ==> 12000000 Zyklen = 1 sec
32
; ----------------------------- 
33
; delaying 11999988 cycles:
34
          ldi  R17, $6C
35
WGLOOP0:  ldi  R18, $BC
36
WGLOOP1:  ldi  R19, $C4
37
WGLOOP2:  dec  R19
38
          brne WGLOOP2
39
          dec  R18
40
          brne WGLOOP1
41
          dec  R17
42
          brne WGLOOP0
43
; ----------------------------- 
44
; delaying 3 cycles:
45
          ldi  R17, $01
46
WGLOOP3:  dec  R17
47
          brne WGLOOP3
48
; ----------------------------- 
49
; delaying 2 cycles:
50
          nop
51
          nop
52
; ============================= 
53
 
54
ret

von Karl H. (kbuchegg)


Lesenswert?

blutengel schrieb:

> externen Quarz von 12 MHZ verwenden, bedeutet dies ja das ich pro
> Sekunde 12000000 Zyklen habe.
Yep.
Mehr oder weniger.
Du wirst kaum einen Quarz finden, der exakt 12000000 Schwingungen in der 
Sekunde macht.

> Da der Befehl RCALL ja 3 Zyclen und der
> Rücksprungbefehl RET 4 Zyklen benötigt muss ich ja nur noch 11999993
> Zyklen "Verbraten" sehe ich das so richtig oder habe ich in meiner
> Annahme einen Denkfehler?

Ähm.
Wodurch unterscheidet sich jetzt deine Annahme von dem Kommentar, den 
dir der Generator bei der Funktion hinterlassen hat?
1
 ;     11999993 cycles: weil lcall = 3 zyclen und ret = 4 ==> 12000000 Zyklen = 1 sec

das steht genau dasselbe. Nur halt in Denglisch.

von blutengel (Gast)


Lesenswert?

weil lcall = 3 zyclen und
>       ret = 4 ==> 12000000 Zyklen = 1 sec


Dieser Teil ist von mir Ergänzt worden.

MFG

blutengel

von Karl H. (kbuchegg)


Lesenswert?

blutengel schrieb:
> weil lcall = 3 zyclen und
>>       ret = 4 ==> 12000000 Zyklen = 1 sec
>
>
> Dieser Teil ist von mir Ergänzt worden.

ok.
In dem Fall: Die Überlegung sieht stichhaltig aus (ohne jetzt die 
Schleifen nachgerechnet zu haben)

von blutengel (Gast)


Lesenswert?

Was wäre denn wenn ich an dieser Stelle ein Uhrenquarz verwenden würde. 
ISt der denn genau?


MFG

blutengel

von Karl H. (kbuchegg)


Lesenswert?

blutengel schrieb:
> Was wäre denn wenn ich an dieser Stelle ein Uhrenquarz verwenden würde.
> ISt der denn genau?

Was willst du machen?

Im AVR-Tutorial ist eine Uhr enthalten und wie man die einigermassen 
genau kriegt. Die dort benutzte Technik eines Timers mit CTC ist der 
Weg, wie man genaue Timings macht.

von Ralli (Gast)


Lesenswert?

Wenn ich schon einen µC nehme, um einen Sekundentakt aus der
Quarzfrequenz des Taktgenerators zu erhalten, sind doch
"ZEITVERSCHWENDUNGS-SCHLEIFEN" so ziemlich das hässlichste, was
man dem µC antun kann.

Wozu hat er eingebaute Timer, Counter, Interrupts etc.?

Hat man die richtig programmiert, ist die Sekunde quarzgenau,
also mit Trimm-C dauerhaft für Temperaturen von 10°..40° C
auf +/-10 ppm abgleichbar. - Weniger als 1 s Fehler pro Tag.

Und soll der µC noch irgendwas anderes machen, z.B. auf eine Taste
reagieren, muss NICHTS geändert werden!

Also: TUTORIAL LESEN!

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.