io sono nuovo nel forum (appena iscritto) e quindi, prima di esporre il mio problema, vorrei fare una breve presentazione:
Mi chiamo Davide, ho 16 anni e frequento il liceo scientifico tecnologico, abito in provincia di Milano e ho alcuni hobbies tra cui l’elettronica e l’informatica.
Bene, è da tempo che desidero realizzare un cubo di led 4x4x4 controllato da un PIC che controlla i vari led e fa eseguire a loro dei giochi di luce. Per la parte elettronica, ho scelto di non utilizzare un PIC di “grosse dimensioni”, ovvero con molti pin, ma un semplice 16F84 o, in alternativa un 16F648A che ha sempre 18pin. Siccome il cubo per funzionare ha bisogno di 20 ingressi, e i PIC in questione ne hanno solo 13, ho risolto il problema utilizzando un demultiplexer che mi controlla l’asse x e y del cubo, mentre l’asse z è comandato da 4 transistor collegati direttamente alle porte b del PIC. Insieme ad un mio amico, che mi ha aiutato molto, ho realizzato un programma di base per il controllo dei vari led. Il programma è in C ed è stato scritto con MikroC. Premetto che non sono un esperto in programmazione, ma so qualcosa.
- Codice: Seleziona tutto
//Versione finale del firmware da inserire nel PIC che controlla il cubo di led
// 4x4x4 con demultiplexer.
char x_led, y_led, z_led; //Dichiarazione delle coordinate,
char tempo_effetto, tempo, gioco; //dei tempi e del numero di gioco e
char effetto_4, effetto_8; //del numero di effetti.
char random_16, random_4;
//Funzione fondamentale che serve ad accendere i led date le coordinate x, y, z.
void acc_led(char x, char y, char z)
{
if (x==0, y==0, z==0) //Se sono tutti 0,
{
porta=0x10; //Mette alto G1+G2 e
portb=0; //spegne tutti i z.
}
else //altrimanti:
{
char valore_demux=y*4+x-5;
porta=valore_demux; //accende il led
switch(z) //prende in considerazione la variabile z.
{
case 1: //Se è 1
portb=0x01; //mette alto la porta RB0.
break; //fine primo caso.
case 2: //Se è 2
portb=0x02; //mette alto la porta RB1.
break;
case 3: //Se è 3
portb=0x04; //mette alto la porta RB2.
break;
case 4: //Se è 4
portb=0x08; //mette alto la porta RB3.
break; }
}
}
//Funzione per accendere, uno alla volta, tutti gli assi verticali x.
void piano_vert_x()
{
if (x_led == effetto_4) //Se y è uguale a effetto,
acc_led(x_led, y_led, z_led); //accende i led.
else
acc_led(0, 0, 0); //altrimente li spegne.
}
//Funzione per accendere, uno alla volta, tutti gli assi verticali x in senso opposto.
void piano_inv_x()
{
effetto_4=5-effetto_4;
piano_vert_x();
effetto_4=5-effetto_4;
}
//Funzione per accendere, uno alla volta, tutti gli assi verticali y.
void piano_vert_y()
{
if (y_led == effetto_4) //Se y è uguale a effetto,
acc_led(x_led, y_led, z_led); //accende i led.
else
acc_led(0, 0, 0); //altrimente li spegne.
}
//Funzione per accendere, uno alla volta, tutti gli assi verticali x in senso opposto.
void piano_inv_y()
{
effetto_4=5-effetto_4;
piano_vert_y();
effetto_4=5-effetto_4;
}
//Funzione per accendere, uno alla volta, tutti gli assi orizzontali.
void piano_oriz()
{
if (z_led == effetto_4) //Se z è uguale a effetto,
acc_led(x_led, y_led, z_led); //accende i led.
else
acc_led(0, 0, 0); //altrimente li spegne.
}
//Funzione per accendere, uno alla volta, tutti gli assi verticali x in senso opposto.
void piano_inv_z()
{
effetto_4=5-effetto_4;
piano_oriz();
effetto_4=5-effetto_4;
}
//Funzione per generare un seme di partenza per il rand.
unsigned getseme(void) //Crea una funzione,
{ return; } //che ritorna un numero casuale.
//Genera un numero casuale da 0 a 15 e da 1 a 4.
char random()
{
random_16=rand()% 15;
random_4=random_16/4+1;
return(random_16, random_4);
}
//Funzione per accendere casualmente i led del piano x e y e li fa scorrere
//verso il basso.
void led_rand(void)
{
random(); //Richiama la funzione random.
for (z_led=4; z_led>0; --z_led) //Ciclo che diminuisce z_led finché
{ //diventa 1.
acc_led(x_led,y_led,z_led);
porta=random_16; //Il numero random viene messo su portA.
delay_ms(100);
portb=0;
delay_ms(10); }
porta=0;
}
//Il main principale, dove viene coordinato tutto lo svolgimento del programma e
//quindi dei giochi di luce.
void main(void)
{
porta=0; //Porte A a 0.
trisa=0; //Porte A impostate su uscite.
portb=0; //Porte B a 0.
trisb=0; //Porte B impostate su uscite.
srand(getseme()); //Serve ad dare il seme a rand.
effetto_4=1; //Mette 1 ad effetto_4.
while(1) //Inizio del primo ciclo infinito
{ //incondizionato.
gioco=0; //Mette a 0 il numero di gioco.
while(gioco!=6) //Inizio del secondo ciclo infinito,
{ //che termina quando gioco==3.
tempo_effetto =100; //Il tempo dell'effetto(200 = 1sec circa).
for (tempo=1; tempo<tempo_effetto; tempo++) //Questi cicli for servono per
{ for (z_led=1; z_led<5; z_led++) //far lampeggiare in sequenza tutti i
{ for (y_led=1; y_led<5; y_led++) //led in maniera velocissima.
{ for (x_led=1; x_led<5; x_led++)
{
switch(gioco) //Scegli che gioco di luce svolgere.
{
case 0:
piano_vert_x();
break;
case 1:
piano_inv_x();
break;
case 2:
piano_vert_y();
break;
case 3:
piano_inv_y();
break;
case 4:
piano_oriz();
break;
case 5:
piano_inv_z();
break;
}}}}
acc_led(0, 0, 0); }
effetto_4++; //Aumenta effetto_4.
if (effetto_4==5) //Se effetto_4 è uguale a 5,
{ effetto_4=1; //lo rimette ad 1 e
gioco++; } //aumenta gioco.
}
for(gioco=1; gioco<60; gioco++) //Ripete led_rand per 60 volte.
{ led_rand(); }
}
}
Questo è il programma di base che per adesso, mi permette di accendere i piani x, y e z uno alla volta e poi mi accende in modalità random dei led per poi farli “scorrere” in basso.
Il mio problema è realizzare dei giochi di luce. Navigando su google ho trovato un sito dove spiegava come realizzare questo cubo utilizzando un Atmel al posto di un PIC e quindi senza l’uso del demux. Sul sito c’è anche il programma scritto in C e vorrei prendere spunto da quello. Il problema è che non ci capisco un H (diciamo neanche una C
Quindi chiedo a voi, se potete aiutarmi nel “decifrare” il programma e aiutarmi ad adattarlo alle mie esigenze e se è migliorabile il mio di programma.
Questo è il link per scaricare i file del cubo realizzato su quel sito:
http://www.instructables.com/files/orig/FEM/AJUM/FJ1I6COK/FEMAJUMFJ1I6COK.zip
Saluti,
Galaxi93.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)







