Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Progettazione software per cubo led 4x4x4

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[51] Re: Progettazione software per cubo led 4x4x4

Messaggioda Foto Utenteposta10100 » 22 apr 2009, 17:44

Galaxi93 ha scritto:Luca (posso chiamarti per nome?),


Ovviamente!

Galaxi93 ha scritto:intendeva accendere tutto per fare una prova?


Galaxi93 ha scritto:Oggi ho provato a scrivere queste poche righe per accendere i led quando vengono memorizzati accesi (1)


Tu volevi accenderli e io ti ho ricordato di settare i bit nella mappa!

Sono proprio curioso di sapere se funziona!!!

Luca.
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.550 4 10 13
Master EY
Master EY
 
Messaggi: 4832
Iscritto il: 5 nov 2006, 0:09

0
voti

[52] Re: Progettazione software per cubo led 4x4x4

Messaggioda Foto UtenteGalaxi93 » 22 apr 2009, 19:39

posta10100 ha scritto:Tu volevi accenderli e io ti ho ricordato di settare i bit nella mappa!


Ah ecco perché!! No, quella funzione serve per accendere i led, se chiamata. Naturalmente avevo fatto un due righe nel main che prima memorizzava lo stato dei led, e poi richiamava il check_led e controllava quali led risultavano accesi e li accendeva e quali erano spenti per spegnerli.
Penso che stasera riuscirò a fare qualche prova, cavolo! non sono mai stato così occupato come in questo periodo!!!

Ciao,
Davide.
Galaxi93.

Visita il mio sito!! E' ancora in costruzione, ma anche tu puoi contribuire a farlo crescere e darmi dei consigli per migliorarlo! Dai prova, provare non costa nulla! Vieni!
Avatar utente
Foto UtenteGalaxi93
3.118 3 7 13
Master
Master
 
Messaggi: 617
Iscritto il: 15 apr 2009, 16:27

0
voti

[53] Re: Progettazione software per cubo led 4x4x4

Messaggioda Foto UtenteGalaxi93 » 26 apr 2009, 15:51

Finalmente oggi sono riuscito a fare qualche prova, e purtroppo non funziona niente. Ho provato a fare modifiche, cambiare, sostituire, ma niente... sempre lo stesso risultato (tutto spento). :cry:

Vi posto il programma completo, non si sa mai, magari ho sbagliato qualcosa io, e non me ne sono nemmeno accorto:
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,
unsigned char map[8];                     // Array che contiene lo stato dei led,
char tempo, tempo_effetto, gioco, effetto;
char random_4, random_15, i;

//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; }
        }
     }


//Questa funzione, date le coordinate x, y, z, restituisce l'indice del char
//da utilizzare.
unsigned char getIndex(unsigned char y, unsigned char z)
         {
         if (y < 2)
            {
            return z * 2;
            }
         return z * 2 + 1;
         }
//Questa funzione restituisce il l'indice del bit da modificare.
unsigned char getBitIndex(unsigned char x, unsigned char y)
         {
         if (y % 1)
            {
            return x + 4;
            }
         return x;
         }
//Questa funzione restituisce la maschera da applicare al char per settare o
//resettare un bit.
unsigned char getMaschera(unsigned char bitIndex, unsigned char stato)
         {
         unsigned char a = 1;
         unsigned char b;
         for (b = 0; b < bitIndex; b++) //Fino a quando b < bitIndex.
         {
         a << 1;                     //Sposta tutti i bit a sx di una posizione.
         }
         if (stato)
         {
         return a;  //Se devo accendere il led restituisco a ha tutti i bit a 0
         }           //tranne quello di indice bitIndex che è a 1.
         return !a;                  // altrimenti il suo negato,
         }                           //(mette i bit a 1 a 0 e viceversa).

//Questa funzione setta o resetta il bit corrispondente al led.
//Se stato = 1 --> led acceso, se stato = 0 --> led spento.
void cambiaStato(unsigned char x, unsigned char y, unsigned char z, unsigned char stato)
     {
     unsigned char index = getIndex(y, z);
     unsigned char bitIndex = getBitIndex(x, y);
     unsigned char maschera = getMaschera(bitIndex, stato);
     if (stato)             // Devo mettere a 1 il bit corrispondente.
        {        // Eseguo l'OR logico tra la maschera e il byte dell'array che
        map[index] |= maschera; // equivale a map[index] = map[index] | maschera.
        }
     else        // Devo mettere a 0 il bit corrispondente.
        {        // Eseguo l'AND logico tra la maschera e il byte dell'array.
        map[index] &= maschera; // equivale a map[index] = map[index] & maschera.
        }
    }
//Questa funzione restituisce lo stato del led alle coordinate x, y, z.
//Ritorna 0 se led spento, numero diverso da 0 se led acceso.
unsigned char getStato(unsigned char x, unsigned char y, unsigned char z)
         {
         unsigned char index = getIndex(y, z);
         unsigned char bitIndex = getBitIndex(x, y);
         unsigned char maschera = getMaschera(bitIndex, 1);
         // ottiene la maschera come se dovesse accendere il led.
         return (map[index] & maschera);
         // equivale a una AND logico tra map[index] e maschera.
         }

//Questa funzione controlla quali led sono stati memorizzati come alti (1) e li
//li accende, oppure li spegne dove sono posti a basso (0).
void check_led(char tempo_effetto)
     {
     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
           { for (y_led=1; y_led<5; y_led++)     //i led in maniera velocissima.
             { for (x_led=1; x_led<5; x_led++)
               {
               char stato_led = getStato(x_led-1,y_led-1,z_led-1); //Controlla lo stato
               if (stato_led!=0)  //dei led e se è diverso da 0 (quindi acceso),
                  {
                  acc_led(x_led,y_led,z_led); //accende i led alla coordinata
                  }                           //corrispondente.
               else                      //Altrimenti (quindi 0, ovvero spento,
                   {
                   acc_led(0,0,0);       //lo spegne.
                   }
               }
             }
           }
         }
     }

         
void main(void)
     {
     tempo_effetto=200;
     gioco=0;
     x_led=0;
     y_led=0;
     x_led=0;
     while(1)
             {
             for (i = 0; i < 8; i++)
                 { map[i] = 255; }
             check_led(600);
             for (i = 8; i > 0; --i)
                 { map[i] = 255; }
             check_led(600);
             }
     }


Ditemi se trovate l'errore!!

Ciao,

Davide.
Galaxi93.

Visita il mio sito!! E' ancora in costruzione, ma anche tu puoi contribuire a farlo crescere e darmi dei consigli per migliorarlo! Dai prova, provare non costa nulla! Vieni!
Avatar utente
Foto UtenteGalaxi93
3.118 3 7 13
Master
Master
 
Messaggi: 617
Iscritto il: 15 apr 2009, 16:27

0
voti

[54] Re: Progettazione software per cubo led 4x4x4

Messaggioda Foto Utentec1b8 » 26 apr 2009, 16:07

Da una prima lettura velocissima non vedo errori ma una cosa è strana:
Codice: Seleziona tutto
             for (i = 0; i < 8; i++)
                 { map[i] = 255; }
             check_led(600);
             for (i = 8; i > 0; --i)
                 { map[i] = 255; }
             check_led(600);
             }

Questi due cicli, presenti nel main, fanno la stessa cosa: accendono tutti i led.
Inoltre il secondo non può partire da 8, deve partire da 7 ed essere confrontato con >= a 0.

Prova in questo modo, dovresti vedere tutti i led lampeggiare.
Codice: Seleziona tutto
             for (i = 0; i < 8; i++)
                 { map[i] = 255; }
             check_led(600);
             for (i = 7; i >= 0; --i)
                 { map[i] = 0; }
             check_led(600);
             }


Continuo a guardare il codice per capire cercare qualche altro problema.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[55] Re: Progettazione software per cubo led 4x4x4

Messaggioda Foto UtenteGalaxi93 » 26 apr 2009, 17:25

si è vero, ho scambiato una cosa per un'altra...
comunque non penso ke funzionerà, perché anche nel mio codice, almeno una volta si doveva accendere...
Avatar utente
Foto UtenteGalaxi93
3.118 3 7 13
Master
Master
 
Messaggi: 617
Iscritto il: 15 apr 2009, 16:27

0
voti

[56] Re: Progettazione software per cubo led 4x4x4

Messaggioda Foto Utentephylum » 26 apr 2009, 17:53

faresti un esperimento ? ... togli tutto e nel main chiama solo acc_led per accenderne 1 solo e vedi se funziona...

i?
\int_{}tella
Immagine
Avatar utente
Foto Utentephylum
6.191 5 7 12
G.Master EY
G.Master EY
 
Messaggi: 3217
Iscritto il: 9 ott 2007, 12:40

0
voti

[57] Re: Progettazione software per cubo led 4x4x4

Messaggioda Foto UtenteGalaxi93 » 26 apr 2009, 18:53

phylum ha scritto:faresti un esperimento ?


Tutto quello che vuoi! ;)

phylum ha scritto:togli tutto e nel main chiama solo acc_led per accenderne 1 solo e vedi se funziona...


Vuoi testare il funzionamento della funzione acc_led?? Quella funziona benissimo, quarda qui:
[youtube] http://www.youtube.com/watch?v=kt_AHgWuRfc [/youtube]
Galaxi93.

Visita il mio sito!! E' ancora in costruzione, ma anche tu puoi contribuire a farlo crescere e darmi dei consigli per migliorarlo! Dai prova, provare non costa nulla! Vieni!
Avatar utente
Foto UtenteGalaxi93
3.118 3 7 13
Master
Master
 
Messaggi: 617
Iscritto il: 15 apr 2009, 16:27

0
voti

[58] Re: Progettazione software per cubo led 4x4x4

Messaggioda Foto Utentephylum » 26 apr 2009, 20:59

nn e' che voglio IO
serve per sapere come sta il tuo circuito

se acc_led @ 1 funziona allora l'errore e' nella routine che hai chiamato,
intanto i nn l'ho visto definito da nessuna parte ed e' gia un regalo del compilatore se nn ti ha dato errore per questo.

Quindi riassumento SE acc_led e le coord qualsiasi di uno funziona --- 1 LED si accende allora o c'e' qualche errore in check_led o nella maschera che dai a map :P
\int_{}tella
Immagine
Avatar utente
Foto Utentephylum
6.191 5 7 12
G.Master EY
G.Master EY
 
Messaggi: 3217
Iscritto il: 9 ott 2007, 12:40

0
voti

[59] Re: Progettazione software per cubo led 4x4x4

Messaggioda Foto UtenteGalaxi93 » 26 apr 2009, 21:07

phylum ha scritto:intanto i nn l'ho visto definito da nessuna parte ed e' gia un regalo del compilatore se nn ti ha dato errore per questo.


"i" è definito, guarda bene (il compilatore non fa regali a nessuno :D )

phylum ha scritto:Quindi riassumento SE acc_led e le coord qualsiasi di uno funziona --- 1 LED si accende allora o c'e' qualche errore in check_led o nella maschera che dai a map :P


bè, questo mi pare ovvio...

Ciao,

Davide.
Galaxi93.

Visita il mio sito!! E' ancora in costruzione, ma anche tu puoi contribuire a farlo crescere e darmi dei consigli per migliorarlo! Dai prova, provare non costa nulla! Vieni!
Avatar utente
Foto UtenteGalaxi93
3.118 3 7 13
Master
Master
 
Messaggi: 617
Iscritto il: 15 apr 2009, 16:27

0
voti

[60] Re: Progettazione software per cubo led 4x4x4

Messaggioda Foto Utentephylum » 26 apr 2009, 21:13

ops :P sry

comunque
1. provalo senza getStato e l'if corrispondente e vedi se si accendono
in pratica
Codice: Seleziona tutto
for (x_led=1; x_led<5; x_led++)
               {
               
                  acc_led(x_led-1,y_led-1,z_led-1); //accende i led alla coordinata
               }

anche perche leggevi lo stato su x_led-1 etc ma settavi x_led


2. come mai tieni tempo_effetto sia globale che locale ?
3. non-zero lo puoi semplificare a if (variabile)
4. poi comunque perche' doversi preoccupare di sottrarre ogni volta quando puoi fare il ciclo da 0 a <4 {0,1,2,3}

bè, questo mi pare ovvio...

behh fino a 10 min fa nn sapevo nemmeno che avevi scritto tu check_led :P nn e' che mi "posso" leggere sempre tutto
\int_{}tella
Immagine
Avatar utente
Foto Utentephylum
6.191 5 7 12
G.Master EY
G.Master EY
 
Messaggi: 3217
Iscritto il: 9 ott 2007, 12:40

PrecedenteProssimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti