Forum: Mikrocontroller und Digitale Elektronik Loop mit Delay in Assembler


von chris (Gast)


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

von Stefan E. (sternst)


Lesenswert?

Die Warteschleife zerstört dir deinen Dim-Wert.

von Spess53 (Gast)


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

von chris (Gast)


Lesenswert?

Danke :) manchmal sieht man den Walt vor lauter Bäumen nicht mehr.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Warteschleifen in Asembler zu programmieren ist ne verdamt coole Sache, 
pfeilschnell. So kann man viel schneller warten, als wenn man ne 
Warteschleife in blödem C programmiert, was ja viel langsamer ist.

von Mr. Tom (Gast)


Lesenswert?

chris schrieb:
> ie 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.

Damit wird die Helligkeit der LED erst gaaanz langsam abnehmen und zu 
den letzten Stufen immer schneller werden.
http://de.wikipedia.org/wiki/Fechnersches_Gesetz

Beitrag #7521446 wurde vom Autor gelöscht.
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.