Warteschleife

Gast #1893485
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
#1893508
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.
Gast #1893817
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren