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 |