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
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
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 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.
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.
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