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

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

Messaggioda Foto Utentec1b8 » 26 apr 2009, 22:52

Riguardando con calma il codice credo che ci sia un errore nella funzione getMaschera.
Più precisamente viene eseguita l'istruzione
Codice: Seleziona tutto
a << 1;

che a mio avviso dovrebbe invece essere
Codice: Seleziona tutto
a <<= 1;

oppure (che equivale ma più lenta)
Codice: Seleziona tutto
a *= 2;


Ti riporto quindi la funzione corretta:
Codice: Seleziona tutto
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).


Senza questo correzione getMaschera torna sempre 0 e quindi non accendi mai i led.

Fammi sapere.
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

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

Messaggioda Foto Utenteposta10100 » 27 apr 2009, 8:56

c1b8 ha scritto:
Codice: Seleziona tutto
    a << 1;



Ops... scappato!!! Sorry!
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

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

Messaggioda Foto UtenteGalaxi93 » 27 apr 2009, 16:06

Ho provato con la modifica, ma niente...
Si dovrebbe iniziare ad isolare l'errore ma a parte la funzione acc_led e check_led, non so come separare le altre. Se ci riuscissimo, sarebbe più facile trovare l'errore, o almeno ci sarebbe una zona ridotta da controllare. Idee a riguardo??



P.S: Fabio, o chiunque lo sappia, mi sapresti consigliare un buon libro (preferirei su internet, però va bene anche cartaceo) di programmazione in C? Perché sono molto ignorante in materia (non so che differenza c'è tra a<<1 e a<<=1, e altre cose).
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

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

Messaggioda Foto Utentephylum » 27 apr 2009, 16:08

beh e' semplice senza = nn assegni :P calcoli lo shift e stop ;)
\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

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

Messaggioda Foto Utentec1b8 » 27 apr 2009, 17:09

Il codice che inserisco a me funziona bene.

Confrontalo con il tuo perché ho apportato qualche leggera modifica.

Fammi sapere.
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
unsigned char map[8];
char 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;
      }
   }
}


        /*
         * Divido il cubo in 4 piani orizzontali per z che va da 0 a 3
         * Ogni piano contiene 16 led, rappresentabili con 16 bit, 2 char
         * z quindi seleziona la coppia di char dell'array per ogni piano
         * z = 0, char di indice 0 e char di indice 1
         * z = 1, char di indice 2 e char di indice 3
         * in definitiva gli indici sono (z * 2) e (z * 2 + 1)
         * Ogni piano lo divido in 2 semipiani, uno associato al char
         * di indice più basso, uno a quello di indice più alto.
         * Su questo piano considero le coordinate x e y cha vanno da 0 a 3
         * Decido che se y < 2 (quindi per y == 0 e y == 1) memorizzo nel
         * char di indice minore, se y >= 2 nel char di indice maggiore
         * Ogni semipiano quindi ha 2 file di 4 led. Se y è dispari
         * memorizzo nei 4 bit più significativi del char, se pari in quelli
         * meno significativi.
        */

        /* Questa funzione, in funzione delle 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
                                             // 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
                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
         * Ristorna 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++) {
      for (z_led=1; z_led<5; z_led++) {
         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) {
                  acc_led(x_led,y_led,z_led); //accende i led alla coordinata
               } else {                           //corrispondente.
                  acc_led(0,0,0);       //lo spegne.
               }
            }
         }
      }
   }
}


//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.
   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 = 0; i < 8; i++) {
         map[i] = 0;
      }
      check_led(600);
   }
}



Cerchi un libro per il C dei PIC o un libro per la programmazione in C generico (quindi per PC)?
Sono un po' diversi, non moltissimo per la verità.
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

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

Messaggioda Foto Utenteposta10100 » 27 apr 2009, 18:38

Prova a dare un occhio a questo.
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

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

Messaggioda Foto Utenteposta10100 » 27 apr 2009, 18:42

c1b8 ha scritto:Confrontalo con il tuo perché ho apportato qualche leggera modifica.

Cosa hai modificato? Mi risparmi la fatica del diff? :mrgreen:
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

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

Messaggioda Foto UtenteGalaxi93 » 27 apr 2009, 19:04

No no no, non ci siamo proprio...
Ditemi dove abitate che vengo a casa vostra per farmi frustare!!
Come si fa a dimenticare di dichiarare le uscite e le entrate del PIC!!! Sono senza speranze... :(

Infatti ora funziona benissimo (alla fine, le uniche cose che non andavano erano quel a<<= 1 e le porte...).
Stasera o domani, provo a fare il gioco di riempimento e svuotamento.
E ora che mi viene in mente, come faccio a rifare i giochini dell'inizio (quelli che accendevano un piano alla volta)???

c1b8 ha scritto:Cerchi un libro per il C dei PIC o un libro per la programmazione in C generico (quindi per PC)?
Sono un po' diversi, non moltissimo per la verità.


E infatti, non c'è molta differenza, vanno bene entrambi, dimmi quelli più completi e facili da comprendere.

posta10100 ha scritto:Prova a dare un occhio a questo.


Mi sono dimenticato di un piccolo particolare...emh, l'inglese, diciamo, non è la materia che preferisco e non lo capisco moltissimo (nonostante la media dell' otto a scuola...), quindi li preferirei in inglese, perché se già faccio fatica a comprendere quelli in italiano, figuriamoci in inglese! :o
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

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

Messaggioda Foto Utenteposta10100 » 27 apr 2009, 19:12

Galaxi93 ha scritto:...quindi li preferirei in inglese...


Infatti quello è in inglese! :mrgreen:
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

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

Messaggioda Foto Utenteposta10100 » 27 apr 2009, 19:18

Galaxi93 ha scritto:E ora che mi viene in mente, come faccio a rifare i giochini dell'inizio (quelli che accendevano un piano alla volta)???


Se guardi il codice chiama varie funzioni che alla fine non fanno altro che settare o resettare lo stato dei led nell'array.
Dai provaci tu, se ti diciamo cosa devi fare non impari niente!

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

PrecedenteProssimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti