Vero che quando il giochino sarà finito (e la scuola anche) scriverai un bell'articolo da mettere in ElectroYou?????
Progettazione software per cubo led 4x4x4
Moderatore:
Paolino
0
voti
Almeno i metodi utilizzati nel main... alla fine tra guardare avanti e indietro tra le pagine si rischia di far scappare qualcosa... poi magari il tuo codice è leggermente diverso da quello che vediamo noi e l'errore non salta più fuori...
Vero che quando il giochino sarà finito (e la scuola anche) scriverai un bell'articolo da mettere in ElectroYou?????
Vero che quando il giochino sarà finito (e la scuola anche) scriverai un bell'articolo da mettere in ElectroYou?????
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
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
-

posta10100
5.550 4 10 13 - Master EY

- Messaggi: 4832
- Iscritto il: 5 nov 2006, 0:09
0
voti
phylum ha scritto:beh se ti viene complicato farlo qui puoi sare pastebin.com
No era solo una domanda, eccolo:
- Codice: Seleziona tutto
//Versione finale del firmware da inserire nel PIC che comtrolla 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;
char random_4, random_16;
//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-1, z-1);
unsigned char bitIndex = getBitIndex(x-1, y-1);
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)
{
tempo_effetto=tempo_effetto/5; //Serve a convertire i ms in,
//cicli di for (200cicli=1sec).
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.
}
}
}
}
}
}
//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 0 a 3.
char random()
{
random_16=rand()% 15; //Crea un numero casuale compreso tra 0 e 16.
random_4=random_16/4; //Per risparmiare prezioso spazio.
return(random_16, random_4); //Ritorna le due variabili.
}
//Funzione che date le coordinate x, y, z, ne cambia lo stato solo se è diverso
//dallo stato dato alla funzione e se lo cambia, restituisce 1 altrimenti 0.
char cambia_if(char x, char y, char z, char stato)
{
char stato_led =getStato(x,y,z);
if (stato_led) {
stato_led = 1;
}
if (stato != stato_led) { // se lo stato è diverso
cambiaStato(x, y, z, stato); //lo cambio
return 1; // e restituisco 1
}
return 0; // altrimenti restituisco 0
}
//Funzione che accende (stato=1) o spegne (stato=0) tutti i led del cubo
//casualmente.
void fill_empty_led(char stato, char tempo)
{
char gioco=0, i;
for (i = 0; i < 8; i++) {
if (stato == 0) {
map[i] = 255;
} else {
map[i] = 0;
}
// map[i] = !stato*255; così non fa quello che vuoi
}
while (gioco<=64)
{
random();
x_led=random_4;
random();
y_led=random_4;
random();
z_led=random_4;
if (cambia_if(x_led,y_led,z_led,stato)) { // non è necessario specificare == 1,
//in C è falso se == 0 e vero in tutti gli altri casi
gioco++;
check_led(tempo);
}
}
}
void main(void)
{
porta=0;
portb=0;
trisa=0;
trisb=0;
while (1)
{
fill_empty_led(1,200);
fill_empty_led(0,200);
}
}
posta10100 ha scritto:Vero che quando il giochino sarà finito (e la scuola anche) scriverai un bell'articolo da mettere in ElectroYou?????
Si certo, mi dovrò informare su come funziona il tutto, ma lo posterò (sia qui che su un altro sito, che non so se posso fare il nome).
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!
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!
0
voti
Giusto una domanda: se accendi un solo led per volta funziona?
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
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
-

posta10100
5.550 4 10 13 - Master EY

- Messaggi: 4832
- Iscritto il: 5 nov 2006, 0:09
0
voti
Utilizzando tutta la zolfa di funzioni? Non ho provato, ora provo.
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!
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!
0
voti
usando la acc_led
voglio andare per esclusione... almeno sui comandi per l'hw
voglio andare per esclusione... almeno sui comandi per l'hw
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
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
-

posta10100
5.550 4 10 13 - Master EY

- Messaggi: 4832
- Iscritto il: 5 nov 2006, 0:09
0
voti
La prima cosa che noto è una confusione nell'uso dei vari x, y, z e led_x, led_y, led_z.
Alcune volte vanno da 0 a 3 altre da 1 a 4.
perché nella cambiaStato fai getIndex(y-1, z-1)?
mentre sembra che gli si passino già valori da 0 a 3? altrimenti sono sbagliati gli altri richiami.
Alcune volte vanno da 0 a 3 altre da 1 a 4.
perché nella cambiaStato fai getIndex(y-1, z-1)?
mentre sembra che gli si passino già valori da 0 a 3? altrimenti sono sbagliati gli altri richiami.
Fabio
0
voti
La mia impressione è che il codice sta iniziando ad accartocciarsi...
Quando fa così è bene fermarsi e riguardare TUTTI i metodi dall'inizio, indentandoli correttamente e cercando di semplificare dove si può.
Anche dividere il codice in più file può essere d'aiuto...
Quando fa così è bene fermarsi e riguardare TUTTI i metodi dall'inizio, indentandoli correttamente e cercando di semplificare dove si può.
Anche dividere il codice in più file può essere d'aiuto...
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
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
-

posta10100
5.550 4 10 13 - Master EY

- Messaggi: 4832
- Iscritto il: 5 nov 2006, 0:09
0
voti
posta10100 ha scritto:La mia impressione è che il codice sta iniziando ad accartocciarsi...
Quando fa così è bene fermarsi e riguardare TUTTI i metodi dall'inizio, indentandoli correttamente e cercando di semplificare dove si può.
Anche dividere il codice in più file può essere d'aiuto...
Cavolo!!! E' un bel casino!
Me ne sono completamente dimenticato. Quella di cambia stato è una mia follia che mi sono dimenticato di togliere!
Ora vi posto il codice corretto, e ditemi se è tutto corretto:
- Codice: Seleziona tutto
//Versione finale del firmware da inserire nel PIC che comtrolla 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;
char random_4, random_16;
//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)
{
tempo_effetto=tempo_effetto/5; //Serve a convertire i ms in,
//cicli di for (200cicli=1sec).
for (tempo=1; tempo<tempo_effetto; tempo++) //Questi cicli for servono per
{ for (z_led=0; z_led<4; z_led++) //far lampeggiare in sequenza tutti
{ for (y_led=0; y_led<4; y_led++) //i led in maniera velocissima.
{ for (x_led=0; x_led<4; x_led++)
{
char stato_led = getStato(x_led,y_led,z_led); //Controlla lo stato
if (stato_led!=0) //dei led e se è diverso da 0 (quindi acceso),
{
acc_led(x_led+1,y_led+1,z_led+1); //accende i led alla coordinata
} //corrispondente.
else //Altrimenti (quindi 0, ovvero spento,
{
acc_led(0,0,0); //lo spegne.
}
}
}
}
}
}
//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 0 a 3.
char random()
{
random_16=rand()% 15; //Crea un numero casuale compreso tra 0 e 16.
random_4=random_16/4; //Per risparmiare prezioso spazio.
return(random_16, random_4); //Ritorna le due variabili.
}
//Funzione che date le coordinate x, y, z, ne cambia lo stato solo se è diverso
//dallo stato dato alla funzione e se lo cambia, restituisce 1 altrimenti 0.
char cambia_if(char x, char y, char z, char stato)
{
char stato_led =getStato(x,y,z);
if (stato_led) {
stato_led = 1;
}
if (stato != stato_led) { // se lo stato è diverso
cambiaStato(x, y, z, stato); //lo cambio
return 1; // e restituisco 1
}
return 0; // altrimenti restituisco 0
}
//Funzione che accende (stato=1) o spegne (stato=0) tutti i led del cubo
//casualmente.
void fill_empty_led(char stato, char tempo)
{
char gioco=0, i;
for (i = 0; i < 8; i++) {
if (stato == 0) {
map[i] = 255;
} else {
map[i] = 0;
}
// map[i] = !stato*255; così non fa quello che vuoi
}
while (gioco<=64)
{
random();
x_led=random_4;
random();
y_led=random_4;
random();
z_led=random_4;
if (cambia_if(x_led,y_led,z_led,stato)) { // non è necessario specificare == 1,
//in C è falso se == 0 e vero in tutti gli altri casi
gioco++;
check_led(tempo);
}
}
}
void main(void)
{
porta=0;
portb=0;
trisa=0;
trisb=0;
while (1)
{
fill_empty_led(1,200);
fill_empty_led(1,200);
}
}
Alla fine l'unico errore era nella cambiastato...
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!
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!
0
voti
Nel main chiami 2 volte
Non dovrebbe essere una volta con stato=1 e una volta con stato = 0 ?
- Codice: Seleziona tutto
fill_empty_led(1,200);
Non dovrebbe essere una volta con stato=1 e una volta con stato = 0 ?
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
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
-

posta10100
5.550 4 10 13 - Master EY

- Messaggi: 4832
- Iscritto il: 5 nov 2006, 0:09
Torna a Realizzazioni, interfacciamento e nozioni generali.
Chi c’è in linea
Visitano il forum: Nessuno e 7 ospiti

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)





