Loop mit Delay in Assembler

Gast #3159879
Lesenswert?

Hallo

Ich bin zurzeit dabei eine PWM für LED's mit einem Atmega32 und einem 
16.000MHz takt zu basteln. Die PWM Rutine funktioniert auch ohne 
Probleme, nun will ich mittels einer Schleife alle 255 werte hochlaufen 
lassen und die LED so Dimmen, bis sie schließlich aus ist. Hierzu habe 
ich eine Schleife eingebaut und lasse mittels inc mein Register (r17) 
nach oben zählen. Die delay Funktion habe ich mit dem AVR Warteschleifen 
Generator erstellt. Jedoch genau hier liegt das Problem scheinbar wird 
die Warte schleife nicht ausgeführt und somit ist kein dimm Effekt an 
den LEDs zu sehen.

So sieht mein bisheriger Code aus:


1
 .include "m32def.inc"
2

3
 .def temp       = r17
4

5
 ;stack initialisierung 
6
 ldi temp, LOW(RAMEND) 
7
 out SPL, temp 
8
 ldi temp, HIGH(RAMEND)
9
 out SPH, temp
10

11
 ldi temp, 0x00;
12

13
 ldi r16, 0x69      ;hilfsregister beschreiben
14
 out TCCR0, r16      ;8bit Counter
15
 out TCCR2, r16
16

17
 ldi r16, 0xA1      ;16bit counter definition
18
 out TCCR1A, r16    
19

20
 ldi r16, 0x09
21
 out TCCR1B, r16
22

23
 ldi r16, 0x08      
24
 out DDRB, r16      ;set PB3 as output
25

26
 ldi r16, 0xB0
27
 out DDRD, r16      ;set PD4,5,7 as output
28

29

30
 
31
 loop:
32
  inc temp      ;zählen
33
  
34
  rcall write
35
  rcall delay
36
  
37
  rjmp loop
38
  
39

40
  
41
write:
42
  out OCR0, temp    ;werte an pwm ausgänge schicken
43
  out OCR2, temp
44
  out OCR1AH, temp
45
  out OCR1BH, temp
46
  out OCR1AL, temp
47
  out OCR1BL, temp
48

49
  ret
50

51
delay: ;0.1 Sekunden warten
52
  ; ============================= 
53
  ;   Warteschleifen-Generator 
54
  ;     1600000 Zyklen:
55
  ; ----------------------------- 
56
  ; warte 1599999 Zyklen:
57
        ldi  R17, $F1
58
  WGLOOP0:  ldi  R18, $0E
59
  WGLOOP1:  ldi  R19, $9D
60
  WGLOOP2:  dec  R19
61
        brne WGLOOP2
62
        dec  R18
63
        brne WGLOOP1
64
        dec  R17
65
        brne WGLOOP0
66
  ; ----------------------------- 
67
  ; warte 1 Zyklus:
68
        nop
69
  ; ============================= 
70

71
  ret

Vielen Dank für eure Hilfe!

chris
Gast #3159894
Lesenswert?

Hi

>.def temp       = r17

> loop:
>  inc temp      ;zählen

>write:
>  out OCR0, temp    ;werte an pwm ausgänge schicken
>  out OCR2, temp
>  out OCR1AH, temp

>       dec  R17
>        brne WGLOOP0

Fällt dir etwas auf?

Du must dich entscheiden. Entweder dieses .def-Gedödel oder 
Registernamen. Alles andere ist tödlich.

mfG Spess
(Firma: matzetronics) #3159900
Lesenswert?

Und hier wieder mal eine universelle Warteroutine, die enorm weite Delay 
Bereiche abdeckt und nur ein einziges Register braucht:
1
.def  del  = r17  ; delay counter
2
; steve wozniak's wait routine - this time for AVR 
3
; this is the extended routine with del^3 
4
; this wait routine is ingenious and handles wide ranges of delay 
5
; as a hommage to steve i port it to all my embedded systems. 
6
; call it with a value in 'del'
7
wozwait:  
8
  push  del
9
wwait2:  push  del
10
wwait1:  subi  del,1  
11
  brne  wwait1
12
  pop  del
13
  subi  del,1
14
  brne  wwait2
15
  pop  del
16
  subi  del,1
17
  brne  wozwait
18
  ret
Der Dank gebührt Steve Wozniak, die Routine ist aus dem Apple ][ ROM.
Beitrag #7521446 wurde von einem Moderator gelöscht.

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