|
LEDCube 3x3x3 con microfono incorporato |
|
Identificazione progetto
progetto |
autore |
|
note |
LEDcube 3x3x3 con microfono incorporato |
Gianluca Ghettini |
|
Assembler, MPLAB8 e pickit3 |
Premessa
I LED cube sono matrici LED a tre dimensioni in grado di illuminarsi nelle più complesse animazioni; ne esistono di numerosi tipi tra cui 3x3x3, 4x4x4 e addirittura 8x8x8. Alcuni sono comandati via PC, altri sono provvisti di microcontrollore e quindi completamente autonomi.
Nel mio caso ho dotato il cubo di microfono e amplificatore per lampeggiare a tempo di musica (una specie di VU meter tridimensionale). L’ho realizzato con un semplice PIC micro 16F84, un amplificatore MAX9812, microfono e pochi altri componenti
Multiplexing
La griglia LED è composta da 3 piani di 9 LED ciascuno per un totale di 27 LED (3x3x3). Il micro prevede solo 13 GPIO, ovviamente non sufficienti a pilotare tutti e 27 i LED singolarmente; ho quindi realizzato un indirizzamento del singolo LED secondo la coppia piano/colonna. In questo modo per accendere un LED e’ sufficiente specificare il piano (uno di tre, quindi 3 GPIO) e la colonna di afferenza (una di nove, quindi altri 9 GPIO) per un totale di 12 GPIO. Elettricamente cio’ si traduce nel collegare tra loro i catodi dei LED di ogni piano e tutti gli anodi secondo le colonne.
Questa particolare configurazione purtroppo ci costringe ad accendere un solo piano alla volta: abilitare piu’ di un piano contemporaneamente comporterebbe l’accensione di LED non desiderati. E’ comunque possibile risolvere il problema avvicendando i 3 piani molto velocemente tra loro (tecnica display multiplexing): in sostanza il micro seleziona il primo piano, ne accende opportunatamente i nove LED, spegne il primo piano, accende il secondo, accende i nove LED del secondo piano, spenge il secondo piano, accende il terzo e cosi’ via in loop il più velocemente possibile. L’occhio umano non e’ in grado di percepire questo veloce cambiamento e la percezione finale e’ quella di avere tutti i LED accesi contemporaneamente. Nel mio caso ho programmato il multiplexing ad una frequenza di circa 100Hz ottenendo cosi’ un frame rate dell’intero pattern LED di circa 33,3Hz. Nell’immagine qui sotto mostro i collegamenti tra i GPIO del micro con alla griglia LED 3x3x3.
Luminosita’ variabile dei LED
In aggiunta al multiplex, il micro alimenta i LED tramite PWM cosi’ da poterne modificare la luminosità. Il pic 16F84 non prevede hardware dedicato per il PWM ma e’ comunque possibile realizzarlo via software togglando molto velocemente on/off i GPIO opportuni.
Animazioni
Il cubo e’ in grado di mostrare fino ad 8 animazioni differenti, ognuna composta da un certo numero di frame (un frame è semplicemente una configurazione ON/OFF dei 27 LED). Le animazioni sono codificate nella flash del micro come semplici tabelle retwl di lookup.
Sincronizzazione con musica esterna
Ho dotato il cubo di un microfono amplificatore integrati. In questo modo e’ in grado di mostrare le animazioni LED andando piu’ o meno a tempo di musica. Il segnale analogico captato dal microfono viene amplificato, filtrato da un filtro RC passa basso e poi squadrato in un segnale TTL 0-5V. Il segnale cosi’ ottenuto passa al piedino RB0/INT del micro. Il filtro RC è dimensionato per far in modo che passino solo le basse frequenze ad esempio la batteria di una musica o simili. Ogni volta che il microfono capta un segnale a bassa frequenza il piedino RB0 viene portato a livello logico alto il che scatena un interrupt nel microcontrollore. Il micro quindi seleziona casualmente una animazione (dalle 8 disponibili) e la sulla griglia LED, un frame dopo l’altro (e’ possibile impostare da software la velocita’ delle animazioni).
Schema elettrico con descrizione
Il pic 16F84 è nella sua classica configurazione con oscillatore esterno da 4MHz e circuito di reset. I pin da RB1 a RB7 e RA2,RA3 indirizzano le 9 colonne LED tramite apposite resistenze limitatrici, i pin RA0,RA1 e RA4 attivano rispettivamente il piano alto, di mezzo e il basso tramite i 3 FET di potenza (2N7000). La sezione audio analogica è composta da microfono, integrato amplificatore MAX9812, filtro passa basso (R17,C7) e squadratore di segnale (i due BC547 a valle). Notare il pullup di 4.7K per il pin RA4: RA4 e’ l’unico pin del 16F84 ad essere open-collector, occorre quindi il pull-up.
Circuito stampato descrizione
Il circuito è stato realizzato su breadboard sperimentale.
Il MAX9812 non viene commercializzato nel classico package DIL ma solo su TSOP: essendo un package estremamente miniaturizzato ho dovuto realizzare una basetta adapter apposita (vedi foto) sulla quale saldare a parte l’integrato.
Descrizione del firmware
Il codice sorgente è scritto interamente in assembler in quanto sia per il multiplexing dei 3 layer che per il PWM occorre un timing particolarmente accurato, dell’ordine dei microsecondi. Il codice si compone di tre sezioni principali:
Inizializzazione
Idle routine
ISR (Interrupt Service Routine)
Al power on viene eseguita l’inizializzazione delle varie parti del micro (direzioni dei GPIO, timer interno, variabili di programma etc…). Immediatamente dopo il cubo entra nella idle routine nella quale parte la modalità glowing (tutti e 27 i LED rimangono accesi e si aumenta e diminuisce ciclicamente la luminosità. Il cubo permane in questa modalità fino a che non subentra un interrupt esterno (dal pin RB0) corrispondente ad un beat del segnale sonoro captato dal microfono (una musica, un battito di mani, etc…). L’interrupt viene immediatamente servito dalla routine ISR: viene impostata la luminosità massima e viene scelta una animazione casuale (fra 8 disponibili) che viene mostrata sulla griglia led. L’animazione è mostrata sulla griglia LED un frame dopo l’altro, cicliclamente. Ad ogni giro viene decrementata la luminosità di un fattore 1. Quando la luminosità raggiunge lo zero il micro esce dalla ISR e si riporta in modalità attesa (cubo glowing).
Ecco il flowchart completo del programma
Il sorgente si compone di un singolo file .asm. Per la compilazione e programmazione del micro e’ sufficiente l’ambiente MPLab e apposito programmatore, ad esempio il pickit 3
;directives
PROCESSOR 16F57
RADIX HEX
;defs
PCL EQU 0x02
OPTREG EQU 0x01
TMR EQU 0x01
INTCON EQU 0x0B
TMR0 EQU 0x01
PORTA EQU 0x05
PORTB EQU 0x06
PORTC EQU 0x07
STATUS EQU 0x03
FSR EQU 0x04
INDF EQU 0x00
Z EQU 2 ; Z flags
GIE EQU 7 ; GIE bit
INTF EQU 1 ; INTF flag
LOWL EQU 0x20 ; bottom layer (8 bit pattern)
MIDL EQU 0x21 ; middle layer (8 bit pattern)
HIGL EQU 0x22 ; upper layer (8 bit pattern)
EXTL EQU 0x23 ; extra layer (9th led for each layer)
TIME EQU 0x24 ; current frame speed
TCONT EQU 0x25 ; frame speed counter
LSEL EQU 0x26 ; layer selector
BCONT EQU 0x27 ; brightness counter
BRIG EQU 0x28 ; brightness
CURL EQU 0x29 ; current layer
;program start
ORG 0x0000 ; start from address 0x0000
goto Init
ORG 0x0004
Interrupt: ; interrupt service routine
bcf INTCON,INTF
bsf INTCON,GIE ; enabling the interrupt service
movf TMR,0 ; pick a pattern at random
andlw 0x07
addwf PCL,1 ; jump into jump table
goto Pattern_treble
goto Pattern_updown
goto Pattern_twobars
goto Pattern_buildframe
goto Pattern_rotplane
goto Pattern_rlplane
goto Pattern_snake
goto Pattern_fourface
Init: ; initialization
bsf STATUS,5 ; select RAM bank 1
movlw b'00000001'
tris PORTB
movlw b'00000000'
tris PORTA
bcf OPTREG,5 ; start the TMR module in counter mode
bcf STATUS,5 ; select RAM bank 0
movlw 0x00 ; all leds off
movwf PORTA
movwf PORTB
clrf LSEL ; no layer selected
call IdleCube
;******** ShowLayer **********************************
;
; Shows the layer encoded in W and EXTL for x msec.
; (BRIG/255)% of the time the layer is ON, the
; remaining (255-BRIG)/255)% of the time the layer
; is OFF. (this is a PWM controlled brightness)
;
;*****************************************************
ShowLayer:
; layer on for (255/BRIG)*x msec
; layer off for (255/(255-BRIG))*x msec
; where x depends on the osc used
; set the first seven leds (bit0 of PORTB is used to receive interrupts!)
movwf PORTB ; PORTB <- W
; set/clear the 8th led
btfsc CURL,0
bsf PORTA,2
; test the 9th bit of the current layer and set
; the 9th led accordingly (9th led = bit3 of PORTA)
movf EXTL,0
andwf LSEL,0 ; W <- EXTL & LSEL
btfss STATUS,Z ; is the 9th bit clear (9th led off)?
bsf PORTA,3 ; no, set the 9th bit
; set the 9th bit of the current layer and turn on
; the entire layer
movf LSEL,0
xorwf PORTA,1 ; PORTA <- W ^ LSEL
; wait (BRIG/255)%
movf BRIG,0
movwf BCONT
ShowLayer_loop_layeron:
decfsz BCONT
goto ShowLayer_loop_layeron
; turn off the entire layer
clrf PORTA
; wait ((255-BRIG)/255)%
movf BRIG,0
movwf BCONT
decf BCONT,1
ShowLayer_loop_layeroff:
incfsz BCONT
goto ShowLayer_loop_layeroff
return
;******** ShowCube ***********************************
;
; Shows the cube pattern for 0.01 * TIME sec using
; brightness level BRIG. The refresh rate is 100Hz.
;
;*****************************************************
ShowCube:
; setup counter
movf TIME,0
movwf TCONT ; TCONT <- TIME
ShowCube_loop:
; upper layer
movlw b'00010000'
movwf LSEL ; LSEL = b00010000;
movf HIGL,0
movwf CURL ; loads upper layer
call ShowLayer ; shows upper layer
; mid layer
movlw b'00000010'
movwf LSEL ; LSEL = b00000010;
movf MIDL,0
movwf CURL ; loads mid layer
call ShowLayer ; shows mid layer
; bottom layer
movlw b'00000001'
movwf LSEL ; LSEL = b00000001;
movf LOWL,0
movwf CURL ; loads bottom layer
call ShowLayer ; shows bottom layer
; repeat until TCONT>0
decfsz TCONT,1
goto ShowCube_loop
return
;******** IDLECUBE ***********************************
;
; The cube is glowing and ready to trigger...
;
;*****************************************************
IdleCube:
movlw b'11111111'
movwf LOWL
movlw b'11111111'
movwf MIDL
movlw b'11111111'
movwf HIGL
movlw b'00010011'
movwf EXTL
movlw 0x01
movwf BRIG ; smallest brightness
movlw 0x02
movwf TIME ; smallest pattern duration
bcf INTCON,INTF
bsf INTCON,4 ; enabling the interrupt from the RB0/INT pin
bsf INTCON,GIE ; enabling the interrupt service
IdleCube_fadein: ; fade in loop
call ShowCube
incfsz BRIG
goto IdleCube_fadein
IdleCube_fadeout: ; fade out loop
call ShowCube
decfsz BRIG
goto IdleCube_fadeout
incf BRIG,1
goto IdleCube_fadein
;******** PATTERN BUILDFRAME ************************
;
; Shows a self-building cube frame
;
;*****************************************************
Pattern_buildframe
movlw 0x00
movwf BRIG
movlw 0x40
movwf TIME
Pattern_buildframe_loop:
movlw b'00000000'
movwf HIGL
movlw b'10000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'10010001'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00010001'
movwf HIGL
movlw b'10010001'
movwf MIDL
movlw b'00010001'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00010001'
movwf HIGL
movlw b'00010001'
movwf MIDL
movlw b'00010001'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'01110101'
movwf HIGL
movlw b'00010001'
movwf MIDL
movlw b'01110101'
movwf LOWL
movlw b'00010001'
movwf EXTL
call ShowCube
movlw b'01110101'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'01110101'
movwf LOWL
movlw b'00010001'
movwf EXTL
call ShowCube
movlw b'01110101'
movwf HIGL
movlw b'01100100'
movwf MIDL
movlw b'01110101'
movwf LOWL
movlw b'00010011'
movwf EXTL
call ShowCube
movlw b'01111111'
movwf HIGL
movlw b'01100100'
movwf MIDL
movlw b'01111111'
movwf LOWL
movlw b'00010011'
movwf EXTL
call ShowCube
movlw b'01111111'
movwf HIGL
movlw b'01100100'
movwf MIDL
movlw b'01111111'
movwf LOWL
movlw b'00010011'
movwf EXTL
call ShowCube
movlw b'01111111'
movwf HIGL
movlw b'01100100'
movwf MIDL
movlw b'01111111'
movwf LOWL
movlw b'00010011'
movwf EXTL
call ShowCube
decfsz BRIG
goto Pattern_buildframe_loop
goto IdleCube
;******** PATTERN TWO BARS ***************************
;
; Shows two spinning bars
;
;*****************************************************
Pattern_twobars
movlw 0x00
movwf BRIG
movlw 0x20
movwf TIME
Pattern_twobars_loop:
movlw b'01000000'
movwf HIGL
movwf MIDL
movwf LOWL
movlw b'00010011'
movwf EXTL
call ShowCube
movlw b'00001010'
movwf HIGL
movwf MIDL
movwf LOWL
clrf EXTL
call ShowCube
movlw b'00100100'
movwf HIGL
movwf MIDL
movwf LOWL
clrf EXTL
call ShowCube
movlw b'00010001'
movwf HIGL
movwf MIDL
movwf LOWL
clrf EXTL
call ShowCube
decfsz BRIG
goto Pattern_twobars_loop
goto IdleCube
;******** PATTERN UPDOWN *****************************
;
; Shows a layer moving up and down.
;
;*****************************************************
Pattern_updown:
movlw 0x00
movwf BRIG
movlw 0x50
movwf TIME
goto Pattern_treble_loop
;******** PATTERN TREBLE *****************************
;
; Shows a fast flickering cube
;
;*****************************************************
Pattern_treble:
movlw 0x00
movwf BRIG
movlw 0x10
movwf TIME
Pattern_treble_loop:
movlw b'11111111'
movwf HIGL
clrf MIDL
clrf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
clrf HIGL
movlw b'11111111'
movwf MIDL
clrf LOWL
movlw b'00000010'
movwf EXTL
call ShowCube
clrf HIGL
clrf MIDL
movlw b'11111111'
movwf LOWL
movlw b'00000001'
movwf EXTL
call ShowCube
decfsz BRIG
goto Pattern_treble_loop
goto IdleCube
;******** PATTERN SNAKE *****************************
;
; Shows a snake running across the cube
;
;*****************************************************
Pattern_snake
movlw 0x00
movwf BRIG
movlw 0x30
movwf TIME
Pattern_snake_loop:
movlw b'10100010'
movwf HIGL
clrf MIDL
clrf LOWL
clrf EXTL
call ShowCube
movlw b'00110010'
movwf HIGL
clrf MIDL
clrf LOWL
clrf EXTL
call ShowCube
movlw b'01110000'
movwf HIGL
clrf MIDL
clrf LOWL
clrf EXTL
call ShowCube
movlw b'01011000'
movwf HIGL
clrf MIDL
clrf LOWL
clrf EXTL
call ShowCube
movlw b'01001100'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00001101'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000101'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'00000011'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'00100010'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'00100010'
movwf HIGL
movlw b'00100000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00100000'
movwf HIGL
movlw b'00100000'
movwf MIDL
movlw b'00100000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00100000'
movwf MIDL
movlw b'00110000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'01110000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'01011000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'01001100'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00001101'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000001'
movwf MIDL
movlw b'00000101'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000001'
movwf MIDL
movlw b'00000001'
movwf LOWL
movlw b'00000010'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000011'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000010'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00100010'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000010'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00110010'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'01110000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'01011000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'01001100'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000100'
movwf HIGL
movlw b'00001100'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000101'
movwf HIGL
movlw b'00000100'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000101'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'00000011'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'00100010'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'00100010'
movwf HIGL
movlw b'00100000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00100000'
movwf HIGL
movlw b'00100000'
movwf MIDL
movlw b'00100000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00100000'
movwf MIDL
movlw b'00110000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'01110000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'01000000'
movwf MIDL
movlw b'01010000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'01000000'
movwf HIGL
movlw b'01000000'
movwf MIDL
movlw b'01000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'01010000'
movwf HIGL
movlw b'01000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'01110000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00110010'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00100010'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'00000010'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010010'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010011'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000001'
movwf LOWL
movlw b'00000011'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000101'
movwf LOWL
movlw b'00000001'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00001101'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'01001100'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'01000000'
movwf MIDL
movlw b'01001000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'01000000'
movwf HIGL
movlw b'01000000'
movwf MIDL
movlw b'01000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'01001000'
movwf HIGL
movlw b'01000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'11001000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'10001010'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
decfsz BRIG
goto Pattern_snake_loop
goto IdleCube
;******** PATTERN FOURFACE ******}********************
;
; Shows four faces of the cube
;
;*****************************************************
Pattern_fourface
movlw 0x00
movwf BRIG
movlw 0x30
movwf TIME
Pattern_fourface_loop:
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'11111111'
movwf LOWL
movlw b'00000001'
movwf EXTL
call ShowCube
movlw b'01001100'
movwf HIGL
movlw b'01001100'
movwf MIDL
movlw b'01001100'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'11111111'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'00100010'
movwf HIGL
movlw b'00100010'
movwf MIDL
movlw b'00100010'
movwf LOWL
movlw b'00010011'
movwf EXTL
call ShowCube
decfsz BRIG
goto Pattern_fourface_loop
goto IdleCube
;******** PATTERN RLPLANE ***}************************
;
; Shows a raising-lowering horizontal plane
;
;*****************************************************
Pattern_rlplane
movlw 0x00
movwf BRIG
movlw 0x40
movwf TIME
Pattern_rlplane_loop:
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'11111111'
movwf LOWL
movlw b'00000001'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'01001100'
movwf MIDL
movlw b'10110011'
movwf LOWL
movlw b'00000001'
movwf EXTL
call ShowCube
movlw b'01001100'
movwf HIGL
movlw b'10010001'
movwf MIDL
movlw b'00100010'
movwf LOWL
movlw b'00000001'
movwf EXTL
call ShowCube
movlw b'11011101'
movwf HIGL
movlw b'00100010'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000010'
movwf EXTL
call ShowCube
movlw b'11111111'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'10110011'
movwf HIGL
movlw b'01001100'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'00100010'
movwf HIGL
movlw b'10010001'
movwf MIDL
movlw b'01001100'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00100010'
movwf MIDL
movlw b'11011101'
movwf LOWL
movlw b'00000010'
movwf EXTL
call ShowCube
movlw b'00000000'
movwf HIGL
movlw b'00000000'
movwf MIDL
movlw b'11111111'
movwf LOWL
movlw b'00000001'
movwf EXTL
call ShowCube
decfsz BRIG
goto Pattern_rlplane_loop
goto IdleCube
;******** PATTERN ROTATEPLANE ************************
;
; Shows a rotating plane
;
;*****************************************************
Pattern_rotplane
movlw 0x00
movwf BRIG
movlw 0x30
movwf TIME
Pattern_rotplane_loop:
movlw b'00000000'
movwf HIGL
movlw b'11111111'
movwf MIDL
movlw b'00000000'
movwf LOWL
movlw b'00000010'
movwf EXTL
call ShowCube
movlw b'00100010'
movwf HIGL
movlw b'10010001'
movwf MIDL
movlw b'01001100'
movwf LOWL
movlw b'00010000'
movwf EXTL
call ShowCube
movlw b'10010001'
movwf HIGL
movlw b'10010001'
movwf MIDL
movlw b'10010001'
movwf LOWL
movlw b'00000000'
movwf EXTL
call ShowCube
movlw b'01001100'
movwf HIGL
movlw b'10010001'
movwf MIDL
movlw b'00100010'
movwf LOWL
movlw b'00000001'
movwf EXTL
call ShowCube
decfsz BRIG
goto Pattern_rotplane_loop
goto IdleCube
END
qui potete scaricare il firmware completo: source.asm
per ulteriori dettagli sul sorgente e alcuni video del LEDCube potete visitare il mio blog : http://www.gianlucaghettini.net/led-cube-3x3x3-pic16f84-con-microfono-incorporato/
Questo progetto è ridistribuibile secondo i termini di licenzaCreative Commons Attribuzione-Condividi allo stesso modo 3.0 Italia
Note aggiuntive
Gianluca Ghettini
Software Engineer, freelance sviluppatore software (Windows / Linux / web) e progetti embedded
website: www.gianlucaghettini.net
mail: gianluca.ghettini@gmail.com
linkedin: it.linkedin.com/in/gianlucaghettini/