Lauflicht (hin und her) 14 LEDs Problem in asm

Gast #1466370
Lesenswert?

Hallo,

vorab ich bin ein absoluter Neuling ja habe aber schon seid Wochen 
dieses Forum und auch viele andere durchforstet.

Ich versuche mich gerade so ein bisschen in ASM ein zu finden.


Mein derzeitiges Problem liegt bei dem richtigen shiften.


Im Anhang habe ich eine abgeänderte Rotary.asm ich schalte 14 LED's mit 
einem Atemga8515@ 8mHz davon immer 2 gleichzeitig.

Funktioniert so auch super ja ich weiß Lauflichter ist auch die perfekte 
Übung für einen Anfänger aber irgendwie verstehe ich es anscheinend 
nicht richtig und komme nicht weiter.

Stand:

Im Moment schalte ich nacheinander die LED's von außen nach innen ein
dabei zähle ich jeden shift bin ich bei 7 angekommen schalte ich alle 
aus und es geht in den Bereich um die LED's wieder zurück laufen zu 
lassen nur genau das will nicht funktionieren.

Ist wahrscheinlich für jeden hier total einfach aber ich habe jetzt 2 
Wochen dran gefummelt und immer wieder gelesen und gegoogelt da ich 
nicht nach dem Motto frag ich mal die die Ahnung haben die machen mir 
das handeln wollte.

Wäre nett wenn man mir Tipps geben könnte.


Gruß

  Dennis
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1466389
Lesenswert?

> zähle ich jeden shift
Du musst deine Shifts nicht mitzählen. Du kannst einfach direkt den 
Shiftwert vergleichen. Pseudocode mit 8 LEDs:
1
init:
2
led  = 0b00000001
3
richtung = links
4

5
zeit500ms:
6
wenn richtung==links 
7
dann
8
   wenn led != 0b1000000 
9
   dann led linksschieben
10
   sonst richtung = rechts
11
sonst
12
   wenn led != 0b0000001 
13
   dann led rechtsschieben
14
   sonst richtung = links
Gast #1466527
Lesenswert?

1
.include "m8515def.inc"
2

3
.def TEMP   = r16
4
.def STORE  = r17     ; Port Value für die aktive LED
5
.def STORE2 = r18     ; Port Value für die nächste LED
6
.def OUTER  = r19     ; Fading counter
7
.def INNER  = r20     ; PWM counter
8
.def ZAEHLER = r21    ;led ZAEHLER
9
.def ZAEHLER2 = r24    ;led ZAEHLER2
10
.def STORE1 = r22
11

12
.equ DELAY = 150
13

14
    ; I/O setup
15
    ; =========
16
    ldi TEMP, 255     ;Original 31 switch PB0..PB5 to output
17
    out DDRA, TEMP
18
  out DDRC, TEMP
19

20
    ldi STORE,  255    ; orig 30 load start value (LED0 on)
21
    ldi STORE2, 29    ; load next value (LED1 on)
22
    ldi STORE1, 1    ; load next value (LED1 on)
23

24
LOOP:
25
    inc  INNER         ; increment the inner counter
26
    cpi  INNER, DELAY  ; have we reached the maximum value?
27
    brne GO_ON         ; if yes, increment the outer one
28

29
    clr  INNER         ; reset inner counterDDRA 7 26
30
    inc  OUTER         ; increment outer counter
31
    cpi  OUTER, DELAY
32
    breq NEXT_PHASE    ; if it overflows, go to the next LED
33

34
GO_ON:
35
    cp   INNER, OUTER   ; inner > outer?
36
    brsh THIS_LED       ; if yes, the current LED needs to be on
37

38
    out  PORTA, STORE2  ; else the next one
39
  out  PORTC, STORE2
40
    rjmp LOOP           ; and start over
41

42
THIS_LED:
43
    cp   OUTER, INNER
44
    out  PORTA, STORE   ; switch on current LED
45
  out  PORTC, STORE
46
    rjmp LOOP           ; and start over
47

48

49
NEXT_PHASE:
50
    clr  OUTER          ; reset counter
51
    mov  STORE, STORE2  ; next LED
52
    lsr  STORE2         ; shift current value
53
    ori  STORE2, 1      ; the lsl makes the lsb 0, we need a 1
54
    sbrs STORE2, 7      ; orig 5 do we need to wrap around?
55
    ldi  STORE2, 255     ; orig 30 if yes, load the initial value
56
    andi STORE2, 254     ; orig 31 mask bit 5 to 7
57
    inc ZAEHLER
58
    clr ZAEHLER2
59
    rjmp zeahler_pruefen           ; and start over
60

61
zeahler_pruefen:
62
    CPI ZAEHLER,7     ; springe wenn zeahler kleiner wie 1
63
    BRGE Storesetzen        ; springe zu loop2 
64

65
    rjmp LOOP         ; ansonsten springe zu loop
66

67
Storesetzen:
68
    sbi  PORTA, PB7
69
    sbi  PORTC, PB7
70
  ldi  STORE1, 128
71
    LSR  STORE1
72
    rjmp test2
73

74

75
test2:
76
    out PORTA, STORE1
77
    out PORTC, STORE1
78
    inc ZAEHLER2
79
    rjmp test3
80
  
81

82
test3:
83

84
    LSR STORE1
85

86
  CPI ZAEHLER2, 7
87
  BRGE zuruck
88

89
  rjmp test2
90

91
zuruck:
92

93
    CLR ZAEHLER
94
  rjmp LOOP

Was ich nicht verstehe ab LOOP2 leuchten nur die LEDS an PA0 und PC0 
obwohl ich jeweils den Pin 6 aktiviert habe naja denke ich zumindest 
kann mir niemand helfen?
Persönliche Seite #1466916
Lesenswert?

Dennis B. schrieb:

>     inc ZAEHLER
>     clr ZAEHLER2
>     rjmp zeahler_pruefen           ; and start over
>
> zeahler_pruefen:
>     CPI ZAEHLER,7     ; springe wenn zeahler kleiner wie 1

Ich vermute bei den englischsprachigen Kommentaren, vereinzelten 
deutschsprachigen Labels und dem Programmierstil, dass du einen 
Quellcode "aus dem Netz" an dein Projekt angepasst hast.

Und dabei den Fehler eingeschleppt hast.

Die Fehlersuche wäre sicher einfacher, wenn man den Originalcode kennen 
würde und was du Abändern willst.
Gast #1467191
Lesenswert?

Genau das Original war nen recht einfaches Lauflicht bei dem auch imemr 
nur eine LED High war.


Habe es jetzt aber auch fast hin bekommen und komplett von neu 
geschrieben mit einem Code zur Hilfe aus irgendeinem Forum blicke da 
selbst nicht emhr durch.


Dieser ist jetzt fehler frei nur würde ich gerne statt imemr 3 LED's an 
5 LED's an haben muss ich mal weiter fummeln.


Wenn jemand mir helfen kann bei dem eigentlich recht kleinen Problem 
dann kann er sich ja vielleicht noch mal äußern.
1
;
2
; Knight Rider 2008 Light
3
;
4
; 
5
;
6
; Programm von Dennis Bassy Hagen, 01 November 2009
7
;
8
;
9
; 16 LEDs verbunden mit PORTA und PORTC
10
; Mit jeweils 3 LED's 2 (gedimmt per PWM)
11
; um einen schleier Effekt zu erzielen 
12

13

14
    .include  "8515def.inc"
15

16
    .equ  FADEDELAY=50    
17
    .equ  MOVETIME=10    
18
    
19
    .def  FadeCounter=r11    
20
    .def  MoveCounter=r9    
21
    .def  PWM=r10      ; Aktueller PWM Schritt
22
    .def  LedStep=r12    ; Aktueller LED Schritt
23
    .def  Dir=r13      
24

25
    ;
26

27
    .org  $0000      
28
    rjmp  reset
29

30
    .org  INT0addr    
31
    reti
32

33
    .org  INT1addr    
34
    reti
35

36
    .org  ICP1addr     
37
    reti
38

39
    .org  OC1Aaddr     
40
    reti
41

42
    .org  OC1Baddr     
43
    reti
44

45
    .org  OVF1addr     
46
    reti
47

48
    .org  OVF0addr     
49
    rjmp  timer0
50

51
    .org  SPIaddr      
52
    reti
53

54
    .org  URXCaddr    
55
    reti
56

57
    .org  UDREaddr      
58
    reti
59

60
    .org  UTXCaddr    
61
    reti
62

63
    .org  ACIaddr     
64
    reti
65

66

67

68
reset:    ldi  r16,high(RAMEND)  
69
    out  SPH,r16
70

71
    ldi  r16,low(RAMEND)
72
    out  SPL,r16
73

74
    ldi  r16,4      
75
    out  TCCR0,r16
76

77
    ldi  r16,1<<TOIE0    
78
    out  TIMSK,r16
79

80
    ldi  r16,255      ; Alle Ports auf Output
81
    out  DDRA,r16
82
        out  DDRC,r16
83

84
    ldi  r16,14    ;Alle LED's auf High setzen
85
    mov  r0,r16
86
    mov  r1,r16
87
    mov  r2,r16
88
    mov  r3,r16
89
    mov  r4,r16
90
    mov  r5,r16
91
    mov  r6,r16
92
    mov  r7,r16
93

94
    clr  LedStep      
95

96
    ldi  r16,1
97
    mov  Dir,r16
98

99
    ldi  r16,16
100
    mov  MoveCounter,r16
101

102
    ldi  r16,FADEDELAY
103
    mov  fadeCounter,r16    
104

105
    sei        
106

107
mainloop:  tst  FadeCounter    
108
    brne  mainloop    
109

110
    ldi  r16,FADEDELAY
111
    mov  fadeCounter,r16    
112

113
    clr  ZL
114
    clr  ZH
115
    ldi  r16,8    
116
mainloop5:  ld  r17,Z    
117
    cpi  r17,15    
118
    breq  mainloop6  
119
    tst  r17
120
    breq  mainloop6  
121
    dec  r17
122
mainloop6:  st  Z+,r17    ; Intensität für nächste LED setzen
123
    dec  r16
124
    brne  mainloop5
125

126

127

128
mainloop1:  dec  MoveCounter  ; Zeit für nächsten schritt
129
    brne  mainloop  ; Kein LOOP, Zurück
130

131
    ldi  r16,MOVETIME
132
    mov  MoveCounter,r16
133
    
134
    mov  ZL,LedStep  ; Aktuelle LED LOW schalten
135
    clr  ZH
136
    ldi  r16,10        
137
    st  Z,r16    
138
  
139
    add  LedStep,Dir
140
    mov  r16,LedStep
141
    
142
    cpi  r16,7    
143
    breq  mainloop3
144
    cpi  r16,0
145
    brne  mainloop4
146

147
mainloop3:  neg  Dir        
148

149
mainloop4:  mov  ZL,LedStep  ; nächste LED an
150
    clr  ZH
151
    ldi  r16,15    
152
    st  Z,r16    
153

154
    rjmp  mainloop
155

156

157
timer0:    push  r16
158
    push  r17
159
    push  r18  
160
    push  ZH
161
    push  ZL
162

163
    in  r16,SREG
164
    push  r16  
165
  
166
    ldi  r16,255-10  ; Counter Neu laden
167
    out  TCNT0,r16
168

169
    tst  FadeCounter
170
    breq  timer0_2
171
    dec  FadeCounter  
172

173
timer0_2:  dec  PWM    
174
    ldi  r16,15
175
    and  PWM,r16    ; Nur 16 stufen
176

177
    clr  ZL    ; Loop alle LED intensität's stufen
178
    clr  ZH
179
    
180
    ldi  r17,1    ; Bit maske
181
    clr  r18    ; momentaner status aller LED's
182

183
timer0_0:  ld  r16,Z+    ; Setzen der Intensität der LED
184

185
    tst  r16
186
    breq  timer0_1  
187

188
    cp  r16,PWM     
189
    brlo  timer0_1   
190
    or  r18,r17
191

192
timer0_1:  lsl  r17    ; schiebe bit maske
193
    brne  timer0_0  ; Wenn bit maske eine 0 bekommt, alle LEDs durchgelaufen
194
    
195
    com  r18
196
    out  PORTA,r18  ; Update PORT
197
    out  PORTC,r18  ; Update PORT
198

199
    pop  r16
200
    out  SREG,r16
201

202
    pop  ZL
203
    pop  ZH    
204
    pop  r18
205
    pop  r17
206
    pop  r16
207

208
    reti

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