Sehr geehrtes Forum,
ich habe einen Atmega32, an den extern ein 20 MhZ Quarz
angeschlossen ist. Ich habe die Fuses auf
gestellt.
Nun habe ich versucht ein Warteschleifenprogramm mit
Assembler zu schreiben, sodass eine LED jede Sekunde an bzw.
ausgehen soll, aber egal was ich auch versuche, ich bekomm es einfach
nicht hin. Kann mir jemand helfen und mir einen Code mit einer
Warteroutine von 1s
geben, bzw. sagen was mit meinem nicht stimmt und diesen somit
modifizieren?
Ich will nämlich wissen ob mein MC wirklich 20MHz hat oder nicht, er
muss auch sehr präzise laufen, deshalb will ich diesen Test machen.
1 | .include "m32def.inc" ; Definitionsdatei für den Prozessortyp einbinden
|
2 |
|
3 | .equ c1 = 49 ; Anzahl Durchläufe der Schleife
|
4 |
|
5 | ; 20.000.000 Hz
|
6 | ; 1 Takt = 0.00000005
|
7 | ldi r16, 0xFF ; lade Arbeitsregister r16 mit der Konstanten 0xFF
|
8 | out DDRB, r16 ; Inhalt von r16 ins IO-Register DDRB ausgeben
|
9 |
|
10 | .def temp = r16
|
11 | LDI R16, low(RAMEND)
|
12 | OUT SPL, R16
|
13 | LDI R16, high(RAMEND)
|
14 | OUT SPH, R16
|
15 |
|
16 | loop:
|
17 | ldi r17, 0b00000001 ; 0b11111100 in r16 laden
|
18 | out PORTB, r17 ; r16 ins IO-Register PORTB ausgeben
|
19 | rcall wait
|
20 |
|
21 | ldi r17, 0b00000000 ; 0b11111100 in r16 laden
|
22 | out PORTB, r17 ; r16 ins IO-Register PORTB ausgeben
|
23 | rcall wait
|
24 |
|
25 | rjmp loop
|
26 |
|
27 |
|
28 | wait:
|
29 | rcall wait3
|
30 | rcall wait3
|
31 | rcall wait3
|
32 | rcall wait3
|
33 | rcall wait3
|
34 | rcall wait3
|
35 | rcall wait3
|
36 | rcall wait3
|
37 | rcall wait3
|
38 | rcall wait3
|
39 | ret
|
40 |
|
41 | wait1:
|
42 | ldi R18,c1 ; Lade Register mit Schleifenwert
|
43 | Loops: ; Schleifenbeginn
|
44 | dec R18 ; Registerwert um Eins verringern
|
45 | brne Loops ; wenn nicht Null dann Schleifenbeginn
|
46 | ret
|
47 |
|
48 | wait2:
|
49 | ldi R19,c1 ; Lade Register mit Schleifenwert
|
50 | Loopss: ; Schleifenbeginn
|
51 | rcall wait1
|
52 | dec R19 ; Registerwert um Eins verringern
|
53 | brne Loopss ; wenn nicht Null dann Schleifenbeginn
|
54 | ret
|
55 |
|
56 | wait3:
|
57 | ldi R20,c1 ; Lade Register mit Schleifenwert
|
58 | Loopsss: ; Schleifenbeginn
|
59 | rcall wait2
|
60 | dec R20 ; Registerwert um Eins verringern
|
61 | brne Loopsss ; wenn nicht Null dann Schleifenbeginn
|
62 | ret
|
Ich bekomm es einfach nicht gebacken das Programm im AVR Studio zu
simulieren, ob nach einem wait aufruf tatsächlich 20.000.000 Takte
vergangen sind, da ja die Simulation sonst zu lange dauern würde, die
LED blinkt aber nicht gerade im Sekundentakt.
Kann mir da vielleicht jemand einen Code geben bzw. diesen hier
verbessern`?
Danke,
m.f.G.: Developer_X