change firmware to match new switch in schematic, use mode switch to lock current animation
Stefan Schuermans

Stefan Schuermans commited on 2012-06-10 10:55:19
Showing 1 changed files, with 33 additions and 110 deletions.

... ...
@@ -1,5 +1,5 @@
1 1
 ; bulb - BlinkenArea ultimate logo board
2
-; version 1.0.0 date 2011-07-30
2
+; version 1.1.0 date 2012-06-10
3 3
 ; Copyright (C) 2011-2012 Stefan Schuermans <stefan@blinkenarea.org>
4 4
 ; Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
 
... ...
@@ -15,14 +15,14 @@
15 15
 ; PB4: column 4 output (output, low)
16 16
 ; PB5: column 5 output (output, low)
17 17
 ; PB6: column 6 output (output, low)
18
-; PB7: push button input (input, pull-up enabled)
18
+; PB7: unused (input, pull-up enabled)
19 19
 ; PD0: row 0 output (output, high)
20 20
 ; PD1: row 1 output (output, high)
21 21
 ; PD2: row 2 output (output, high)
22 22
 ; PD3: row 3 output (output, high)
23 23
 ; PD4: row 4 output (output, high)
24 24
 ; PD5: row 5 output (output, high)
25
-; PD6: unused (output, low)
25
+; PD6: mode switch (input, pull-up enabled)
26 26
 
27 27
 
28 28
 
... ...
@@ -33,8 +33,8 @@
33 33
 ; IO pins
34 34
 .equ    COL_PORT                =       PORTB   ; column outputs
35 35
 .equ    ROW_PORT                =       PORTD   ; row outputs
36
-.equ    BTN_PIN                 =       PINB
37
-.equ    BTN_BIT                 =       7
36
+.equ    MODE_SW_PIN             =       PIND
37
+.equ    MODE_SW_BIT             =       6
38 38
 
39 39
 
40 40
 
... ...
@@ -105,8 +105,8 @@ NE:
105 105
         PIXEL   @0                      ; pixel 5
106 106
         PIXEL   @0                      ; pixel 6
107 107
         subi    XL,7                    ;   XH not there on ATtiny2313
108
-        lsr     DATA                    ; ensure remaining bit stays
109
-                                        ;   high (pull-up for button)
108
+        lsr     DATA                    ; ensure remaining bit stays high
109
+                                        ;   (pull-up for unused pin)
110 110
         com     DATA
111 111
         out     COL_PORT,DATA
112 112
 .ENDM
... ...
@@ -151,13 +151,24 @@ NE:
151 151
 ROW_OFF_LOOP:
152 152
         dec     TMP
153 153
         brne    ROW_OFF_LOOP
154
-        ldi     TMP,0x80                ; ensure remaining bit stays
155
-                                        ;   high (pull-up for button)
154
+        ldi     TMP,0x80                ; ensure remaining bit stays high
155
+                                        ;   (pull-up for unused pin)
156 156
         out     COL_PORT,TMP
157 157
 .ENDM
158 158
 
159 159
 
160 160
 
161
+; play an animation N times (mode 0) or infinitely (mode 1)
162
+; parameters: animation function, N
163
+.MACRO PL_ANIM
164
+PL_ANIM_LOOP:
165
+        rcall_N @0, @1 - 1
166
+        sbic    MODE_SW_PIN,MODE_SW_BIT
167
+        rjmp    PL_ANIM_LOOP
168
+.ENDM
169
+
170
+
171
+
161 172
 .CSEG
162 173
 .ORG    0x000
163 174
         rjmp    ENTRY                   ; RESET
... ...
@@ -200,9 +211,9 @@ ENTRY:
200 211
         out     PORTB,TMP
201 212
         ldi     TMP,0x7F
202 213
         out     DDRB,TMP
203
-        ldi     TMP,0x3F                ; PD[0-5] to output, high - PD6 to output, low
214
+        ldi     TMP,0x7F                ; PD[0-5] to output, high - PD6 to input, pull-up enabled
204 215
         out     PORTD,TMP
205
-        ldi     TMP,0x7F
216
+        ldi     TMP,0x3F
206 217
         out     DDRD,TMP
207 218
 ; initialize stack pointer
208 219
         ldi     TMP,RAMEND
... ...
@@ -217,13 +228,6 @@ ENTRY:
217 228
 ; disable analog comparator
218 229
         ldi     TMP,1<<ACD
219 230
         out     ACSR,TMP
220
-; enable pin change interrupt for button
221
-;   to wake up from sleep
222
-        in      TMP,GIMSK
223
-        ori     TMP,1<<PCIE
224
-        out     GIMSK,TMP
225
-        ldi     TMP,1<<PCINT7
226
-        out     PCMSK,TMP
227 231
 ; jump to main program
228 232
         rjmp    MAIN
229 233
 
... ...
@@ -275,7 +279,7 @@ ROW_GRAY:
275 279
 ; input: FRAME = pixel data (0..15)
276 280
 ; output: -
277 281
 ; changes: TMP, CNT, DATA, X
278
-; cycles: 43676 (including rcall and ret)
282
+; cycles: 43682 (including rcall and ret)
279 283
 ; time: 5.5ms
280 284
 OUT_FRAME:
281 285
         wdr
... ...
@@ -286,6 +290,8 @@ OUT_FRAME_LOOP:
286 290
         mov     TMP,CNT                 ; select row
287 291
         com     TMP
288 292
         andi    TMP,0x3F
293
+        ori     TMP,0x40                ; ensure bit 6 stays high
294
+                                        ;   (pull-up for switch input)
289 295
         out     ROW_PORT,TMP
290 296
         rcall   ROW_GRAY                ; display row
291 297
         subi    XL,-7                   ; ptr to next row
... ...
@@ -298,86 +304,7 @@ OUT_FRAME_LOOP:
298 304
 
299 305
 
300 306
 
301
-; handle on/off button
302
-; input: -
303
-; output: -
304
-; changes: TMP, CNT
305
-; time: usually very short, but may suspend execution
306
-BUTTON:
307
-; exit if button not pressed
308
-;   require stable press for about 50 ms
309
-        clr     CNT                     ; loop 65536 times
310
-        clr     TMP
311
-BUTTON_CHECK_PRESS_LOOP:
312
-        wdr
313
-        sbic    BTN_PIN,BTN_BIT         ; not pressed -> leave
314
-        ret
315
-        dec     TMP
316
-        brne    BUTTON_CHECK_PRESS_LOOP
317
-        dec     CNT
318
-        brne    BUTTON_CHECK_PRESS_LOOP
319
-; wait for button to be released
320
-;   require stable release for about 50 ms
321
-BUTTON_WAIT_RELEASE:
322
-        clr     CNT                     ; loop 65536 times
323
-        clr     TMP
324
-BUTTON_WAIT_RELEASE_LOOP:
325
-        wdr
326
-        sbis    BTN_PIN,BTN_BIT         ; pressed -> start over
327
-        rjmp    BUTTON_WAIT_RELEASE
328
-        dec     TMP
329
-        brne    BUTTON_WAIT_RELEASE_LOOP
330
-        dec     CNT
331
-        brne    BUTTON_WAIT_RELEASE_LOOP
332
-; disable watchdog
333
-        cli
334
-        wdr
335
-        in      TMP,WDTCR
336
-        ori     TMP,1<<WDCE|1<<WDE
337
-        out     WDTCR,TMP
338
-        andi    TMP,~(1<<WDCE|1<<WDE)
339
-        out     WDTCR,TMP
340
-        wdr
341
-        sei
342
-; sleep
343
-        in      TMP,MCUCR               ; configure power-down sleep
344
-        andi    TMP,~(1<<SM1)
345
-        ori     TMP,1<<SE|1<<SM0
346
-        out     MCUCR,TMP
347
-        sleep                           ; go to sleep
348
-        in      TMP,MCUCR               ; configure no sleep mode
349
-        andi    TMP,~(1<<SE)
350
-        out     MCUCR,TMP
351
-; enable watchdog
352
-        cli
353
-        wdr
354
-        in      TMP,WDTCR
355
-        ori     TMP,1<<WDCE|1<<WDE
356
-        out     WDTCR,TMP
357
-        andi    TMP,~(1<<WDCE)
358
-        out     WDTCR,TMP
359
-        wdr
360
-        sei
361
-; wait for button to be released
362
-;   require stable release for about 50 ms
363
-BUTTON_WAIT2_RELEASE:
364
-        clr     CNT                     ; loop 65536 times
365
-        clr     TMP
366
-BUTTON_WAIT2_RELEASE_LOOP:
367
-        wdr
368
-        sbis    BTN_PIN,BTN_BIT         ; pressed -> start over
369
-        rjmp    BUTTON_WAIT2_RELEASE
370
-        dec     TMP
371
-        brne    BUTTON_WAIT2_RELEASE_LOOP
372
-        dec     CNT
373
-        brne    BUTTON_WAIT2_RELEASE_LOOP
374
-; done
375
-        ret
376
-
377
-
378
-
379 307
 ; output a frame for some time
380
-;   also handles on/off button
381 308
 ; input: FRAME = pixel data (0..15)
382 309
 ;        TMP = time to show frame (1..255, in 5.5 ms steps)
383 310
 ; output: -
... ...
@@ -389,7 +316,6 @@ OUT_FRAME_TIME:
389 316
         push    CNT
390 317
         push    DATA
391 318
         rcall   OUT_FRAME               ; 5.5 ms
392
-        rcall   BUTTON
393 319
         pop     DATA
394 320
         pop     CNT
395 321
         pop     TMP
... ...
@@ -721,22 +647,19 @@ MAIN:
721 647
 
722 648
 ; initialization
723 649
 
724
-; enable interrupts
725
-        sei
726
-
727 650
 MAIN_LOOP:
728 651
         wdr
729 652
 
730 653
 ; main loop
731 654
 
732
-        rcall_N ANIM_BLINK,3
733
-        rcall_N ANIM_WORM,3
734
-        rcall_N ANIM_FLICKER,10
735
-        rcall_N ANIM_BW_RUN,3
736
-        rcall_N ANIM_FADE,2
737
-        rcall_N ANIM_BW_WORM,3
738
-        rcall_N ANIM_WOBBLE,5
739
-        rcall_N ANIM_RUN,3
655
+        PL_ANIM ANIM_BLINK,3
656
+        PL_ANIM ANIM_WORM,3
657
+        PL_ANIM ANIM_FLICKER,10
658
+        PL_ANIM ANIM_BW_RUN,3
659
+        PL_ANIM ANIM_FADE,2
660
+        PL_ANIM ANIM_BW_WORM,3
661
+        PL_ANIM ANIM_WOBBLE,5
662
+        PL_ANIM ANIM_RUN,3
740 663
 
741 664
 ; bottom of main loop
742 665
 
743 666