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
> 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 |
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
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 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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.