Pagina 1 di 5

Pic16f877A per cubo led

MessaggioInviato: 28 mag 2012, 15:16
da piccoli
salve mi chiamo Danilo e studio elettronica in un istituto tecnico industriale.
Io voglio programmare un PIC 16f877a per fare dei giochi di luce con un cubo fatto di led.
Il programma e stato fatto in c con MicroC Pro, nella compilazione nn mi dava errori ma quando l'ho collegato al programmatore non eseguiva il programma.
Se mi potete dire dove c'è l'errore lo modifico subito^^
Codice: Seleziona tutto
char z_fila;
char gioco;

void acc_Colonna(){
z_fila=1;
portb=0x01;
for (z_fila>0;z_fila<5;z_fila++){
if(z_fila=4){
portb<<1;}
if(portb=0x80){
portb=0x00, portd=0x01, portd<<1;}
if(portd=0x80){
portb=0xff,portd=0xff;}
}delay_ms(200);
}

void acc_RigheOriz(){
z_fila=1;
portb=0xff;
portd=0xff;
for (z_fila>0;z_fila<5;){
z_fila++;
if (z_fila=4)
--z_fila;
if (z_fila=1);
return;}delay_ms(250);
  }

void acc_RigheVert(){
portb=0x11,portd=0x11;
if(portb=0x11,portd=0x11){
portb<<1,portd<<1;}
if(portb=0x88,portd=0x88){
portb>>1,portd>>1;}
return;
delay_ms(250);
}

void acc_Completa(){
portb=0xff,portd=0xff;
if(portb=0xff,portd=0xff)
portb=~portb,portd=~portd;
return ;
delay_ms(100);
}


void Effet_Matrix(){
z_fila=rand()% 3+1;
for (z_fila>0;z_fila<5;z_fila--){
portb=rand()% 255+1,portd=rand()% 255+1;}
delay_ms(100);
return;}

void acc_Casuale(){
z_fila=rand()%3+1;
portb=rand()% 255+1;portd=rand()% 255+1;
return;
delay_ms(50);}


void main() {
portb=0;
trisb=0;
portc=0;
trisc=0;
portd=0;
trisd=0;

switch(z_fila){
case 1:
portc=0x01;
break;
case 2:
portc=0x02;
break;
case 3:
portc=0x04;
break;
case 4:
portc=0x08;
break;
}

switch(gioco){
case 1:
acc_Colonna();
break;
case 2:
acc_RigheOriz();
break;
case 3:
acc_RigheVert();
break;
case 4:
acc_Completa;
break;
case 5:
Effet_Matrix();
break;
case 6:
acc_Casuale();
break;
}
while(1){
for(gioco<7;gioco>0;){
gioco++;}
delay_ms(2000);
}
}

Portb e Portd sono collegati alle colonne del cubo invece Portc e collegata a 4 transistor che comandano i piani del cubo.

Re: Pic16f877A per cubo led

MessaggioInviato: 28 mag 2012, 16:38
da TardoFreak
Ehm ... dovresti sistemare il sorgente in modo ordinato altrimenti, così com' è, è illeggibile.

Qui ci sono informazioni e link per la formattazione di un sorgente.

Qui una disquisizione sulla posizione delle parentesi.

Re: Pic16f877A per cubo led

MessaggioInviato: 28 mag 2012, 19:03
da piccoli
ho modificato il programma mettendo le parentesi graffe in modo giusto anche se non ho capito come devo fare per indentarlo bene.
Codice: Seleziona tutto
char z_fila;
char gioco;

void acc_Colonna()
{
z_fila=1;
portb=0x01;
for (z_fila>0;z_fila<5;z_fila++)
{
if(z_fila=4)
{
portb<<1;
}
if(portb=0x80)
{
portb=0x00, portd=0x01, portd<<1;
}
if(portd=0x80)
{
portb=0xff,portd=0xff;}
}
delay_ms(200);
}

void acc_RigheOriz()
{
z_fila=1;
portb=0xff;
portd=0xff;
for (z_fila>0;z_fila<5;)
{
z_fila++;
if (z_fila=4)
--z_fila;
if (z_fila=1);
return;}delay_ms(250);
}

void acc_RigheVert()
{
portb=0x11,portd=0x11;
if(portb=0x11,portd=0x11)
{
portb<<1,portd<<1;
}
if(portb=0x88,portd=0x88)
{
portb>>1,portd>>1;
}
return;
delay_ms(250);
}

void acc_Completa()
{
portb=0xff, portd=0xff;
if(portb=0xff, portd=0xff)
portb=~portb, portd=~portd;
return ;
delay_ms(100);
}

void Effet_Matrix()
{
z_fila=rand()% 3+1;
for (z_fila>0; z_fila<5; z_fila--)
{
portb=rand()% 255+1, portd=rand()% 255+1;
}
delay_ms(100);
return;
}

void acc_Casuale()
{
z_fila=rand()%3+1;
portb=rand()% 255+1;
portd=rand()% 255+1;
return;
delay_ms(50);
}

void main()
{
portb=0;
trisb=0;
portc=0;
trisc=0;
portd=0;
trisd=0;

switch(z_fila)
{
case 1:
portc=0x01;
break;

case 2:
portc=0x02;
break;

case 3:
portc=0x04;
break;

case 4:
portc=0x08;
break;
}

switch(gioco)
{
case 1:
acc_Colonna();
break;

case 2:
acc_RigheOriz();
break;

case 3:
acc_RigheVert();
break;

case 4:
acc_Completa;
break;

case 5:
Effet_Matrix();
break;

case 6:
acc_Casuale();
break;
}
while(1)
{
for(gioco<7;gioco>0;)
{
gioco++;
}
delay_ms(2000);
}
}

se mi spiegate anche come modificare i messaggi che scrivo vi sarei grato, almeno evito di scriverlo in ogni messaggio :D

Re: Pic16f877A per cubo led

MessaggioInviato: 28 mag 2012, 19:22
da TardoFreak
Alura,
Ho preso solo la prima dichiarazione di variabili e la prima funzione.
Già solo mettendola in ordine ho trovato un alcuni errori veniali ma che è meglio non fare: usare l' operatore virgola per separare le istruzioni. L' operatore virgola si usa all' interno di espressioni o per il controllo dei loop. Al di fuori di questi casi è meglio non usarlo.
Comunque questo è un esempio di come deve essere scritto un programma in C in modo che sia leggibile (ti ho sostituito le virgole con i più canonici punto-virgola. Ogni volta che inizi un blocco ti sposti di due spazi (alcuni usano 4 spazi, io ne uso due, tu fai come credi :mrgreen: ).
Codice: Seleziona tutto
char z_fila;
char gioco;

void acc_Colonna()
{
  z_fila=1;
  portb=0x01;
  for (z_fila>0;z_fila<5;z_fila++)
  {
    if(z_fila=4)
    {
      portb<<1;
    }
    if(portb=0x80)
    {
      portb=0x00;
      portd=0x01;
      portd<<1;
    }
    if(portd=0x80)
    {
      portb=0xff;
      portd=0xff;
    }
  }
  delay_ms(200);
}


Se la funzione non ha parametri è meglio dichiararla così.
Codice: Seleziona tutto
void acc_Colonna(void)


Poi dovresti spiegarmi cosa vorresti ottenere scrivendo:
Codice: Seleziona tutto
portd<<1;

Perché portd non viene affatto modificata, semplicemente questa istruzione non fa un bel niente.
Io ho una teoria: volevi scrivere questo:
Codice: Seleziona tutto
portd<<=1;

O_/

Re: Pic16f877A per cubo led

MessaggioInviato: 28 mag 2012, 22:08
da piccoli
ok grazie mille per l'aiuto che mi dai ^^
comunque portb<<1 mi ha spiegato il prof che serve a spostare l'1 esempio: portb=001 con questo comando passa da 001 a 010,poi a 100 e cosi via.

Re: Pic16f877A per cubo led

MessaggioInviato: 28 mag 2012, 22:26
da Paolino
Non ho letto con estrema attenzione il tuo codice, ma ho visto una cosa che proprio non va [-X .

In C, l'assegnazione ed il confronto tra variabili impiegano il simbolo "uguale" (=) in modo differente: per l'assengnazione si usa:
Codice: Seleziona tutto
a = 57;


per il confronto:

Codice: Seleziona tutto
if (a==57) then
{ ... espressioni ...}



Pertanto, quando scrivi:

Codice: Seleziona tutto
if(z_fila=4)


stai in effetti eseguendo una assegnazione alla variabile z_fila e non un confronto!

Ciao.

Paolo.

Re: Pic16f877A per cubo led

MessaggioInviato: 28 mag 2012, 22:31
da simo85
Menomale che c'è indent.. :)
Codice: Seleziona tutto
char z_fila;
char gioco;

void acc_Colonna()
{
    z_fila = 1;
    portb = 0x01;
    for (z_fila > 0; z_fila < 5; z_fila++) {
   if (z_fila = 4) {
       portb << 1;
   }
   if (portb = 0x80) {
       portb = 0x00, portd = 0x01, portd << 1;
   }
   if (portd = 0x80) {
       portb = 0xff, portd = 0xff;
   }
    }
    delay_ms(200);
}

void acc_RigheOriz()
{
    z_fila = 1;
    portb = 0xff;
    portd = 0xff;
    for (z_fila > 0; z_fila < 5;) {
   z_fila++;
   if (z_fila = 4)
       --z_fila;
   if (z_fila = 1);
   return;
    }
    delay_ms(250);
}

void acc_RigheVert()
{
    portb = 0x11, portd = 0x11;
    if (portb = 0x11, portd = 0x11) {
   portb << 1, portd << 1;
    }
    if (portb = 0x88, portd = 0x88) {
   portb >> 1, portd >> 1;
    }
    return;
    delay_ms(250);
}

void acc_Completa()
{
    portb = 0xff, portd = 0xff;
    if (portb = 0xff, portd = 0xff)
   portb = ~portb, portd = ~portd;
    return;
    delay_ms(100);
}


void Effet_Matrix()
{
    z_fila = rand() % 3 + 1;
    for (z_fila > 0; z_fila < 5; z_fila--) {
   portb = rand() % 255 + 1, portd = rand() % 255 + 1;
    }
    delay_ms(100);
    return;
}

void acc_Casuale()
{
    z_fila = rand() % 3 + 1;
    portb = rand() % 255 + 1;
    portd = rand() % 255 + 1;
    return;
    delay_ms(50);
}


void main()
{
    portb = 0;
    trisb = 0;
    portc = 0;
    trisc = 0;
    portd = 0;
    trisd = 0;

    switch (z_fila) {
    case 1:
   portc = 0x01;
   break;
    case 2:
   portc = 0x02;
   break;
    case 3:
   portc = 0x04;
   break;
    case 4:
   portc = 0x08;
   break;
    }

    switch (gioco) {
    case 1:
   acc_Colonna();
   break;
    case 2:
   acc_RigheOriz();
   break;
    case 3:
   acc_RigheVert();
   break;
    case 4:
   acc_Completa;
   break;
    case 5:
   Effet_Matrix();
   break;
    case 6:
   acc_Casuale();
   break;
    }
    while (1) {
   for (gioco < 7; gioco > 0;) {
       gioco++;
   }
   delay_ms(2000);
    }
}

O_/

Re: Pic16f877A per cubo led

MessaggioInviato: 28 mag 2012, 22:37
da TardoFreak
Si, però questo "indent" mette le parentesi nel modo sbagliato. -:-

piccoli, portb<<1 è una espressione che da come risultato il suo valore spostato a sinistra di 1 bit. Ma è un' espressione non un' assegnazione.

Codice: Seleziona tutto
valore = portb << 1;

Assegna alla variabile valore il risultato dell' espressione.

Se invece vuoi effettuare un' operazione di shift su una variabile devi scrivere
Codice: Seleziona tutto
valore = valore << 1;

che si può semplificare in
Codice: Seleziona tutto
valore <<= 1;

Re: Pic16f877A per cubo led

MessaggioInviato: 28 mag 2012, 23:08
da piccoli
grazie modifico subito il programma ^^

Re: Pic16f877A per cubo led

MessaggioInviato: 30 mag 2012, 14:17
da piccoli
Ecco il programma modificato secondo le vostre direttive ^^
Codice: Seleziona tutto
char z_fila;
char gioco;

void acc_Colonna(void)
{
z_fila=1;
portb=0x01;
for (z_fila>0;z_fila<5;z_fila++)
{
if(z_fila==4)
{
portb=portb<<1;
}
if(portb==0x80)
{
portb=0x00;
portd=0x01;
portd=portd<<1;
}
if(portd==0x80)
{
portb=0xff;
portd=0xff;}
}
delay_ms(200);
}

void acc_RigheOriz(void)
{
z_fila=1;
portb=0xff;
portd=0xff;
for (z_fila>0;z_fila<5;)
{
z_fila++;
if (z_fila==4)
--z_fila;
if (z_fila==1);
return;
}
delay_ms(250);
}

void acc_RigheVert(void)
{
portb=0x11;
portd=0x11;
if(portb==0x11,portd==0x11)
{
portb=portb<<1;
portd=portd<<1;
}
if(portb==0x88,portd==0x88)
{
portb=portb>>1;
portd=portd>>1;
}
return;
delay_ms(250);
}

void acc_Completa(void)
{
portb=0xff;
portd=0xff;
if(portb==0xff, portd==0xff)
portb=~portb;
portd=~portd;
return ;
delay_ms(100);
}

void Effet_Matrix(void)
{
z_fila=rand()% 3+1;
for (z_fila>0; z_fila<5; z_fila--)
{
portb=rand()% 255+1;
portd=rand()% 255+1;
}
delay_ms(100);
return;
}

void acc_Casuale(void)
{
z_fila=rand()%3+1;
portb=rand()% 255+1;
portd=rand()% 255+1;
return;
delay_ms(50);
}

void main()
{
portb=0;
trisb=0;
portc=0;
trisc=0;
portd=0;
trisd=0;

switch(z_fila)
{
case 1:
portc=0x01;
break;

case 2:
portc=0x02;
break;

case 3:
portc=0x04;
break;

case 4:
portc=0x08;
break;
}

switch(gioco)
{
case 1:
acc_Colonna();
break;

case 2:
acc_RigheOriz();
break;

case 3:
acc_RigheVert();
break;

case 4:
acc_Completa;
break;

case 5:
Effet_Matrix();
break;

case 6:
acc_Casuale();
break;
}
while(1)
{
for(gioco<7;gioco>0;)
{
gioco++;
}
delay_ms(2000);
}
}