Forum: Mikrocontroller und Digitale Elektronik Lauflicht (hin und her) 14 LEDs Problem in asm


von Dennis B. (Gast)


Angehängte Dateien:

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Dennis B. (Gast)


Lesenswert?

Ja und das ganze dann mit PWM dabei????


Ich möchte auch ungern den Code komplett neu schreiben auch wenn es 
einfacher oder besser geht aber so kann ich nicht lernen mit Problemen 
um zu gehen bzw. sie überhaupt entdecken.

Es muss ja schließlich auch mit meiner Methode gehen.



Gruß

  Dennis

von Dennis B. (Gast)


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?

von Ben (Gast)


Lesenswert?

von PWM ist aber bei einem reinen lauflicht nicht die rede. das verlangt 
schon etwas mehr als ein anfänger in seinen ersten schritten versuchen 
sollte. da müßtest du dir mal klar werden was du von dem controller 
willst. und 14 PMW kanäle sind bei 8mhz in software gar nicht soooo 
einfach.

von Stefan B. (stefan) Benutzerseite


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.

von Dennis B. (Gast)


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

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.