version 1.0.0
Stefan Schuermans authored 12 years ago
|
1) ; bulb - BlinkenArea ultimate logo board
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
2) ; version 1.1.0 date 2012-06-10
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
3) ; Copyright (C) 2011-2012 Stefan Schuermans <stefan@blinkenarea.org>
4) ; Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5)
6) ; ATtiny2313A, clock frequency: 8 MHz (internal oscillator)
7)
8) ; PA0: unused
9) ; PA1: unused
10) ; PA2: reset
11) ; PB0: column 0 output (output, low)
12) ; PB1: column 1 output (output, low)
13) ; PB2: column 2 output (output, low)
14) ; PB3: column 3 output (output, low)
15) ; PB4: column 4 output (output, low)
16) ; PB5: column 5 output (output, low)
17) ; PB6: column 6 output (output, low)
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
18) ; PB7: unused (input, pull-up enabled)
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
19) ; PD0: row 0 output (output, high)
20) ; PD1: row 1 output (output, high)
21) ; PD2: row 2 output (output, high)
22) ; PD3: row 3 output (output, high)
23) ; PD4: row 4 output (output, high)
24) ; PD5: row 5 output (output, high)
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
25) ; PD6: mode switch (input, pull-up enabled)
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
26)
27)
28)
29) .INCLUDE "tn2313def.inc"
30)
31)
32)
33) ; IO pins
34) .equ COL_PORT = PORTB ; column outputs
35) .equ ROW_PORT = PORTD ; row outputs
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
36) .equ MODE_SW_PIN = PIND
37) .equ MODE_SW_BIT = 6
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
38)
39)
40)
41) ; general purpose registers
42) .def TMP = r16
43) .def CNT = r17
44) .def DATA = r18
45)
|
remember animation number i...
Stefan Schuermans authored 12 years ago
|
46) ; current mode
47) .def MODE = r19
48) .equ MODE_ALL = 0 ; play all animations
49) .equ MODE_SINGLE = 1 ; play single animation only
50) .equ MODE_UNKNOWN = 0xFF ; unknown mode
51)
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
52)
53)
54) .DSEG
55) .ORG 0x060
56)
57)
58)
59) ; current frame
60) FRAME: .BYTE 42
61)
62)
63)
64) .MACRO breqx
65) brne NE
66) rjmp @0
67) NE:
68) .ENDM
69)
70)
71)
72) ; multiple rcalls in a row
73) ; parameters: label, N
74) .MACRO rcall_N
75) .IF @1 > 0
76) rcall @0
|
remember animation number i...
Stefan Schuermans authored 12 years ago
|
77) rcall_N @0,@1 - 1
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
78) .ENDIF
79) .ENDM
80)
81)
82)
83) ; check if to turn on pixel in subframe
84) ; parameter: grayscale value (1..15)
85) ; input: X = ptr to pixel data (0..7),
86) ; DATA[7-1] = other pixels
87) ; output: X = ptr to pixel data of next pixel,
88) ; DATA.7 = if _not_ to turn on pixel, DATA.[6-0] = old DATA[7-1]
89) ; changes: TMP, DATA, X
90) ; cycles: 4
91) .MACRO PIXEL
92) ld TMP,X+
93) cpi TMP,@0
94) ror DATA
95) .ENDM
96)
97)
98)
99) ; output row (black/white)
100) ; parameter: grayscale value (1..15)
101) ; input: X = ptr to pixel data (0..15)
102) ; output: -
103) ; changes: TMP, DATA
104) ; cycles: 32
105) .MACRO ROW_BW
106) PIXEL @0 ; pixel 0
107) PIXEL @0 ; pixel 1
108) PIXEL @0 ; pixel 2
109) PIXEL @0 ; pixel 3
110) PIXEL @0 ; pixel 4
111) PIXEL @0 ; pixel 5
112) PIXEL @0 ; pixel 6
113) subi XL,7 ; XH not there on ATtiny2313
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
114) lsr DATA ; ensure remaining bit stays high
115) ; (pull-up for unused pin)
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
116) com DATA
117) out COL_PORT,DATA
118) .ENDM
119)
120)
121)
122) ; wait n * 64 cycles
123) ; parameter: n
124) ; input: -
125) ; output: -
126) ; changes: TMP
127) ; cycles: n * 64
128) .MACRO WAIT64_N
129) .IF @0 > 0
130) rcall WAIT64
131) WAIT64_N @0 - 1
132) .ENDIF
133) .ENDM
134)
135)
136)
137) ; output row for grayscale (black/white) and wait
138) ; parameter: grayscale value (1..15)
139) ; input: X = ptr to pixel data (0..15)
140) ; output: -
141) ; changes: TMP, DATA
142) ; cycles: 32 + (grayscale - 1) * 64
143) .MACRO ROW_BW_WAIT
144) ROW_BW @0
145) WAIT64_N @0 - 1
146) .ENDM
147)
148)
149)
150) ; turn off row (with same timing as ROW_BW)
151) ; input: -
152) ; output: -
153) ; changes: TMP
154) ; cycles: 32
155) .MACRO ROW_OFF
156) ldi TMP,10
157) ROW_OFF_LOOP:
158) dec TMP
159) brne ROW_OFF_LOOP
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
160) ldi TMP,0x80 ; ensure remaining bit stays high
161) ; (pull-up for unused pin)
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
162) out COL_PORT,TMP
163) .ENDM
164)
165)
166)
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
167) ; play an animation N times (mode 0) or infinitely (mode 1)
|
remember animation number i...
Stefan Schuermans authored 12 years ago
|
168) ; parameters: animation function, N, animation number
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
169) .MACRO PL_ANIM
170) PL_ANIM_LOOP:
|
remember animation number i...
Stefan Schuermans authored 12 years ago
|
171) ; play animation N times
172) rcall_N @0,@1 - 1
173) ; read new mode
174) ldi CNT,@2
175) rcall MODE_READ
176) ; keep playing animation in mode 1
177) cpi MODE,MODE_SINGLE
178) breq PL_ANIM_LOOP
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
179) .ENDM
180)
181)
182)
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
183) .CSEG
184) .ORG 0x000
185) rjmp ENTRY ; RESET
186) reti ; INT0
187) reti ; INT1
188) reti ; TIMER1_CAPT
189) reti ; TIMER1_COMPA
190) reti ; TIMER1_OVF
191) reti ; TIMER0_OVF
192) reti ; USART0_RX
193) reti ; USART0_UDRE
194) reti ; USART0_TX
195) reti ; ANALOG_COMP
196) reti ; PC_INT0
197) reti ; TIMER1_COMPB
198) reti ; TIMER0_COMPA
199) reti ; TIMER0_COMPB
200) reti ; USI_START
201) reti ; USI_OVERFLOW
202) reti ; EE_READY
203) reti ; WDT
204) reti ; PC_INT1
205) reti ; PC_INT2
206)
207)
208)
209) ; code entry point
210) ENTRY:
211) ; set system clock prescaler to 1:1
212) ldi TMP,1<<CLKPCE
213) out CLKPR,TMP
214) ldi TMP,0
215) out CLKPR,TMP
216) ; initialize output ports
217) ldi TMP,0x00 ; PA[01] to output, low
218) out PORTA,TMP
219) ldi TMP,0x03
220) out DDRA,TMP
221) ldi TMP,0x80 ; PB[0-6] to output, low - PB7 to input, pull-up enabled
222) out PORTB,TMP
223) ldi TMP,0x7F
224) out DDRB,TMP
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
225) ldi TMP,0x7F ; PD[0-5] to output, high - PD6 to input, pull-up enabled
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
226) out PORTD,TMP
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
227) ldi TMP,0x3F
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
228) out DDRD,TMP
229) ; initialize stack pointer
230) ldi TMP,RAMEND
231) out SPL,TMP
232) ; enable watchdog (64ms)
233) wdr
234) ldi TMP,1<<WDCE|1<<WDE
235) out WDTCR,TMP
236) ldi TMP,1<<WDE|1<<WDP1
237) out WDTCR,TMP
238) wdr
239) ; disable analog comparator
240) ldi TMP,1<<ACD
241) out ACSR,TMP
242) ; jump to main program
243) rjmp MAIN
244)
245)
246)
247) ; wait 64 cycles
248) ; input: -
249) ; output: -
250) ; changes: TMP
251) ; cycles: 64 (including rcall and ret)
252) WAIT64:
253) ldi TMP,19
254) WAIT64_LOOP:
255) dec TMP
256) brne WAIT64_LOOP
257) ; done
258) ret
259)
260)
261)
262) ; output row (grayscales)
263) ; input: X = ptr to pixel data (0..15)
264) ; output: -
265) ; changes: TMP, DATA
266) ; cycles: 7269 (including rcall and ret)
267) ROW_GRAY:
268) ROW_BW_WAIT 1
269) ROW_BW_WAIT 2
270) ROW_BW_WAIT 3
271) ROW_BW_WAIT 4
272) ROW_BW_WAIT 5
273) ROW_BW_WAIT 6
274) ROW_BW_WAIT 7
275) ROW_BW_WAIT 8
276) ROW_BW_WAIT 9
277) ROW_BW_WAIT 10
278) ROW_BW_WAIT 11
279) ROW_BW_WAIT 12
280) ROW_BW_WAIT 13
281) ROW_BW_WAIT 14
282) ROW_BW_WAIT 15
283) ROW_OFF
284) ; done
285) ret
286)
287)
288)
289) ; output a frame
290) ; input: FRAME = pixel data (0..15)
291) ; output: -
292) ; changes: TMP, CNT, DATA, X
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
293) ; cycles: 43682 (including rcall and ret)
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
294) ; time: 5.5ms
295) OUT_FRAME:
296) wdr
297) ldi XL,low(FRAME) ; ptr to pixel data
298) ; XH not there on ATtiny2313
299) ldi CNT,0x01 ; bitmask loop over rows
300) OUT_FRAME_LOOP:
301) mov TMP,CNT ; select row
302) com TMP
303) andi TMP,0x3F
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
304) ori TMP,0x40 ; ensure bit 6 stays high
305) ; (pull-up for switch input)
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
306) out ROW_PORT,TMP
307) rcall ROW_GRAY ; display row
308) subi XL,-7 ; ptr to next row
309) ; XH not there on ATtiny2313
310) lsl CNT ; bitmask loop over rows
311) cpi CNT,0x40
312) brne OUT_FRAME_LOOP
313) ; done
314) ret
315)
316)
317)
318) ; output a frame for some time
319) ; input: FRAME = pixel data (0..15)
320) ; TMP = time to show frame (1..255, in 5.5 ms steps)
321) ; output: -
322) ; changes: X, TMP
323) ; time: TMP * 5.5 ms
324) OUT_FRAME_TIME:
325) ; output frame
326) push TMP
327) push CNT
328) push DATA
329) rcall OUT_FRAME ; 5.5 ms
330) pop DATA
331) pop CNT
332) pop TMP
333) ; loop
334) dec TMP
335) brne OUT_FRAME_TIME
336) ; done
337) ret
338)
339)
340)
341) ; clear frame
342) ; input: -
343) ; output: -
344) ; changes: X, FRAME, TMP
345) ; time: short
346) CLEAR:
347) ldi XL,low(FRAME) ; ptr to pixel data
348) ; XH not there on ATtiny2313
349) clr TMP
350) CLEAR_LOOP:
351) st X+,TMP ; clear pixel
352) cpi XL,low(FRAME)+42 ; bottom of loop
353) ; XH not there on ATtiny2313
354) brne CLEAR_LOOP
355) ; done
356) ret
357)
358)
359)
360) ; set frame to solid color
361) ; input: DATA = value (0..15)
362) ; output: -
363) ; changes: X, FRAME
364) ; time: short
365) SET_COLOR:
366) ldi XL,low(FRAME) ; ptr to pixel data
367) ; XH not there on ATtiny2313
368) SET_COLOR_LOOP:
369) st X+,DATA ; set pixel value
370) cpi XL,low(FRAME)+42 ; bottom of loop
371) ; XH not there on ATtiny2313
372) brne SET_COLOR_LOOP
373) ; done
374) ret
375)
376)
377)
378) ; set pixel
379) ; input: CNT = pixel number (0..41, nothing is done for 42..255)
380) ; DATA = value (0..15)
381) ; output: -
382) ; changes: X, FRAME, TMP
383) ; time: short
384) SET_PIXEL:
385) cpi CNT,42 ; invalid pixel number -> done
386) brsh SET_PIXEL_END
387) ldi XL,low(FRAME) ; ptr to pixel (base + offset)
388) add XL,CNT ; XH not there on ATtiny2313
389) st X,DATA ; set pixel
390) SET_PIXEL_END:
391) ; done
392) ret
393)
394)
395)
396) ; draw worm
397) ; input: CNT = head of worm (0..55)
398) ; output: -
399) ; changes: X, FRAME, TMP, DATA
400) ; time: short
401) DRAW_WORM:
402) cpi CNT,56 ; invalid head pos -> done
403) brsh DRAW_WORM_END
404) ldi XL,low(FRAME)+1 ; ptr to before head
405) add XL,CNT ; XH not there on ATtiny2313
406) ldi DATA,15 ; head is full on
407) cpi CNT,42 ; head pos in frame -> go
408) brlo DRAW_WORM_LOOP
409) mov TMP,CNT ; TMP := invisible pixels
410) subi TMP,41
411) sub XL,TMP ; skip invisible pixels
412) sub DATA,TMP ; XH not there on ATtiny2313
413) DRAW_WORM_LOOP:
414) st -X,DATA ; set pixel, go back
415) cpi XL,low(FRAME) ; 1st pixel -> done
416) breq DRAW_WORM_END ; XH not there on ATtiny2313
417) dec DATA ; next pixel darker
418) brne DRAW_WORM_LOOP ; loop
419) DRAW_WORM_END:
420) ; done
421) ret
422)
423)
424)
425) ; draw backwards worm
426) ; input: CNT = tail of worm (0..55)
427) ; output: -
428) ; changes: X, FRAME, TMP, DATA
429) ; time: short
430) DRAW_BW_WORM:
431) cpi CNT,56 ; invalid tail pos -> done
432) brsh DRAW_BW_WORM_END
433) ldi XL,low(FRAME)+1 ; ptr to before tail
434) add XL,CNT ; XH not there on ATtiny2313
435) ldi DATA,1 ; tail is minimum on
436) cpi CNT,42 ; tail pos in frame -> go
437) brlo DRAW_BW_WORM_LOOP
438) mov TMP,CNT ; TMP := invisible pixels
439) subi TMP,41
440) sub XL,TMP ; skip invisible pixels
441) add DATA,TMP ; XH not there on ATtiny2313
442) DRAW_BW_WORM_LOOP:
443) st -X,DATA ; set pixel, go back
444) cpi XL,low(FRAME) ; 1st pixel -> done
445) breq DRAW_BW_WORM_END ; XH not there on ATtiny2313
446) inc DATA ; next pixel brighter
447) cpi DATA,16 ; loop
448) brne DRAW_BW_WORM_LOOP
449) DRAW_BW_WORM_END:
450) ; done
451) ret
452)
453)
454)
455) ; blink animation
456) ; input: -
457) ; output: -
458) ; changes: X, FRAME, CNT, DATA, TMP
459) ANIM_BLINK:
460) ; off
461) ldi DATA,0 ; minimum color
462) rcall SET_COLOR ; paint
463) ldi TMP,100 ; show frame 550 ms
464) rcall OUT_FRAME_TIME
465) ; on
466) ldi DATA,15 ; maximum color
467) rcall SET_COLOR ; paint
468) ldi TMP,100 ; show frame 550 ms
469) rcall OUT_FRAME_TIME
470) ; done
471) ret
472)
473)
474)
475) ; fade up and down animation
476) ; input: -
477) ; output: -
478) ; changes: X, FRAME, CNT, DATA, TMP
479) ANIM_FADE:
480) ; fade up
481) ldi DATA,0 ; start dark
482) ANIM_FADE_UP:
483) rcall SET_COLOR ; paint
484) ldi TMP,10 ; show frame 55 ms
485) rcall OUT_FRAME_TIME
486) inc DATA ; fade up
487) cpi DATA,15 ; loop until almost full on
488) brne ANIM_FADE_UP
489) ; fade down
490) ANIM_FADE_DOWN:
491) rcall SET_COLOR ; paint
492) ldi TMP,10 ; show frame 55 ms
493) rcall OUT_FRAME_TIME
494) dec DATA ; fade up
495) cpi DATA,255 ; loop until full off
496) brne ANIM_FADE_DOWN
497) ; done
498) ret
499)
500)
501)
502) ; flicker animation
503) ; input: -
504) ; output: -
505) ; changes: X, FRAME, CNT, DATA, TMP
506) ANIM_FLICKER:
507) ; even pixels
508) rcall CLEAR ; clear
509) ldi DATA,15 ; even pixels to maximum
510) ldi CNT,0
511) ANIM_FLICKER_EVEN:
512) rcall SET_PIXEL
513) subi CNT,-2 ; move two pixels
514) cpi CNT,42 ; loop
515) brlo ANIM_FLICKER_EVEN
516) ldi TMP,40 ; show frame 220 ms
517) rcall OUT_FRAME_TIME
518) ; odd pixels
519) rcall CLEAR ; clear
520) ldi DATA,15 ; odd pixels to maximum
521) ldi CNT,1
522) ANIM_FLICKER_ODD:
523) rcall SET_PIXEL
524) subi CNT,-2 ; move two pixels
525) cpi CNT,42 ; loop
526) brlo ANIM_FLICKER_ODD
527) ldi TMP,40 ; show frame 220 ms
528) rcall OUT_FRAME_TIME
529) ; done
530) ret
531)
532)
533)
534) ; wobble animation
535) ; input: -
536) ; output: -
537) ; changes: X, FRAME, CNT, DATA, TMP
538) ANIM_WOBBLE:
539) ; even pixels up, odd pixels down
540) ldi DATA,0 ; even pixels start dark
541) ANIM_WOBBLE_UP:
542) ldi CNT,0
543) ANIM_WOBBLE_UP_DRAW:
544) rcall SET_PIXEL
545) inc CNT ; next pixel
546) ldi TMP,0x0F ; invert color
547) eor DATA,TMP
548) cpi CNT,42 ; loop
549) brlo ANIM_WOBBLE_UP_DRAW
550) ldi TMP,10 ; show frame 55 ms
551) rcall OUT_FRAME_TIME
552) inc DATA ; next color: brighter
553) cpi DATA,16
554) brlo ANIM_WOBBLE_UP
555) ; even pixels down, odd pixels up
556) ldi DATA,15 ; even pixels start full
557) ANIM_WOBBLE_DOWN:
558) ldi CNT,0
559) ANIM_WOBBLE_DOWN_DRAW:
560) rcall SET_PIXEL
561) inc CNT ; next pixel
562) ldi TMP,0x0F ; invert color
563) eor DATA,TMP
564) cpi CNT,42 ; loop
565) brlo ANIM_WOBBLE_DOWN_DRAW
566) ldi TMP,10 ; show frame 55 ms
567) rcall OUT_FRAME_TIME
568) dec DATA ; next color: darker
569) cpi DATA,16
570) brlo ANIM_WOBBLE_DOWN
571) ; done
572) ret
573)
574)
575)
576) ; run animation
577) ; input: -
578) ; output: -
579) ; changes: X, FRAME, CNT, DATA, TMP
580) ANIM_RUN:
581) ldi CNT,255 ; start before 1st pixel
582) ANIM_RUN_LOOP:
583) rcall CLEAR ; clear
584) ldi DATA,15 ; current pixel full on
585) rcall SET_PIXEL
586) ldi TMP,10 ; show frame 55 ms
587) rcall OUT_FRAME_TIME
588) inc CNT ; next pixel
589) cpi CNT,43 ; loop until after last pixel
590) brne ANIM_RUN_LOOP
591) ; done
592) ret
593)
594)
595)
596) ; backwards run animation
597) ; input: -
598) ; output: -
599) ; changes: X, FRAME, CNT, DATA, TMP
600) ANIM_BW_RUN:
601) ldi CNT,42 ; start after last pixel
602) ANIM_BW_RUN_LOOP:
603) rcall CLEAR ; clear
604) ldi DATA,15 ; current pixel full on
605) rcall SET_PIXEL
606) ldi TMP,10 ; show frame 55 ms
607) rcall OUT_FRAME_TIME
608) dec CNT ; previous pixel
609) cpi CNT,255 ; loop until before 1st pixel
610) brne ANIM_BW_RUN_LOOP
611) ; done
612) ret
613)
614)
615)
616) ; worm animation
617) ; input: -
618) ; output: -
619) ; changes: X, FRAME, CNT, DATA, TMP
620) ANIM_WORM:
621) ldi CNT,255 ; worm starts before 1st pixel
622) ANIM_WORM_LOOP:
623) rcall CLEAR ; draw worm
624) rcall DRAW_WORM
625) ldi TMP,10 ; show frame 55 ms
626) rcall OUT_FRAME_TIME
627) inc CNT ; advance worm
628) cpi CNT,57 ; loop until has exits
629) brne ANIM_WORM_LOOP
630) ; done
631) ret
632)
633)
634)
635) ; backwards worm animation
636) ; input: -
637) ; output: -
638) ; changes: X, FRAME, CNT, DATA, TMP
639) ANIM_BW_WORM:
640) ldi CNT,56 ; worm starts behind frame
641) ; head not yet visible
642) ANIM_BW_WORM_LOOP:
643) rcall CLEAR ; draw backwards worm
644) rcall DRAW_BW_WORM
645) ldi TMP,10 ; show frame 55 ms
646) rcall OUT_FRAME_TIME
647) dec CNT ; advance worm backwards
648) cpi CNT,254 ; loop until worm has exited
649) brne ANIM_BW_WORM_LOOP
650) ; done
651) ret
652)
653)
654)
|
remember animation number i...
Stefan Schuermans authored 12 years ago
|
655) ; read mode from switch and (store animation number)
656) ; input: MODE = old mode, CNT = animation number
657) ; output: MODE = new mode
658) ; changes: TMP, DATA
659) MODE_READ:
660) ; read new mode (into DATA)
661) ldi DATA,MODE_ALL
662) sbic MODE_SW_PIN,MODE_SW_BIT
663) ldi DATA,MODE_SINGLE
664) ; mode was changed from all to single -> save animation number
665) cpi MODE,MODE_ALL ; old mode not all -> do nothing
666) brne MODE_READ_NOT_0_TO_1
667) cpi DATA,MODE_SINGLE ; new mode not single -> do nothing
668) brne MODE_READ_NOT_0_TO_1
669) sbic EECR,EEPE ; EEPROM write ongoing -> do nothing
670) rjmp MODE_READ_NOT_0_TO_1
671) ldi TMP,0<<EEPM1|0<<EEPM0 ; set EEPROM programming mode
672) out EECR,TMP
673) ldi TMP,0 ; set EEPROM address
674) out EEARL,TMP
675) mov TMP,CNT ; set EEPROM data to animation number
676) com TMP ; with NOTed number in upper nibble
677) swap TMP
678) andi TMP,0xF0
679) or TMP,CNT
680) out EEDR,TMP
681) sbi EECR,EEMPE ; begin writing EEPROM
682) sbi EECR,EEPE
683) MODE_READ_NOT_0_TO_1:
684) ; remember new mode (in MODE)
685) mov MODE,DATA
686) ; done
687) ret
688)
689)
690)
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
691) ; main program
692) MAIN:
693) wdr
694)
695) ; initialization
|
remember animation number i...
Stefan Schuermans authored 12 years ago
|
696) ldi MODE,MODE_UNKNOWN ; unknown mode
697)
698) ; get number of fist animation from EEPROM (into CNT)
699) ldi TMP,0 ; set EEPROM address
700) out EEARL,TMP
701) sbi EECR,EERE ; start EEPROM read
702) in CNT,EEDR ; get read value
703) mov TMP,CNT ; check if high nibble contains NOTed
704) com TMP ; value
705) swap TMP
706) cp CNT,TMP
707) brne MAIN_FIRST_ANIM_END
708) andi CNT,0x0F ; throw away check value in high nibble
709) ; jump to first animation
710) cpi CNT,0
711) breq MAIN_FIRST_0
712) cpi CNT,1
713) breq MAIN_FIRST_1
714) cpi CNT,2
715) breq MAIN_FIRST_2
716) cpi CNT,3
717) breq MAIN_FIRST_3
718) cpi CNT,4
719) breq MAIN_FIRST_4
720) cpi CNT,5
721) breq MAIN_FIRST_5
722) cpi CNT,6
723) breq MAIN_FIRST_6
724) cpi CNT,7
725) breq MAIN_FIRST_7
726) MAIN_FIRST_ANIM_END:
727)
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
728)
729) MAIN_LOOP:
730) wdr
731)
732) ; main loop
733)
|
remember animation number i...
Stefan Schuermans authored 12 years ago
|
734) MAIN_FIRST_0:
735) PL_ANIM ANIM_BLINK,3,0
736) MAIN_FIRST_1:
737) PL_ANIM ANIM_WORM,3,1
738) MAIN_FIRST_2:
739) PL_ANIM ANIM_FLICKER,10,2
740) MAIN_FIRST_3:
741) PL_ANIM ANIM_BW_RUN,3,3
742) MAIN_FIRST_4:
743) PL_ANIM ANIM_FADE,2,4
744) MAIN_FIRST_5:
745) PL_ANIM ANIM_BW_WORM,3,5
746) MAIN_FIRST_6:
747) PL_ANIM ANIM_WOBBLE,5,6
748) MAIN_FIRST_7:
749) PL_ANIM ANIM_RUN,3,7
|
version 1.0.0
Stefan Schuermans authored 12 years ago
|
750)
751) ; bottom of main loop
|
change firmware to match ne...
Stefan Schuermans authored 12 years ago
|
752)
|