Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Pic16f877A per cubo led

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Pic16f877A per cubo led

Messaggioda Foto Utentepiccoli » 28 mag 2012, 15:16

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.
Avatar utente
Foto Utentepiccoli
5 1 4
New entry
New entry
 
Messaggi: 89
Iscritto il: 27 mag 2012, 17:37

0
voti

[2] Re: Pic16f877A per cubo led

Messaggioda Foto UtenteTardoFreak » 28 mag 2012, 16:38

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.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[3] Re: Pic16f877A per cubo led

Messaggioda Foto Utentepiccoli » 28 mag 2012, 19:03

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
Avatar utente
Foto Utentepiccoli
5 1 4
New entry
New entry
 
Messaggi: 89
Iscritto il: 27 mag 2012, 17:37

0
voti

[4] Re: Pic16f877A per cubo led

Messaggioda Foto UtenteTardoFreak » 28 mag 2012, 19:22

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_/
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[5] Re: Pic16f877A per cubo led

Messaggioda Foto Utentepiccoli » 28 mag 2012, 22:08

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.
Avatar utente
Foto Utentepiccoli
5 1 4
New entry
New entry
 
Messaggi: 89
Iscritto il: 27 mag 2012, 17:37

1
voti

[6] Re: Pic16f877A per cubo led

Messaggioda Foto UtentePaolino » 28 mag 2012, 22:26

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.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[7] Re: Pic16f877A per cubo led

Messaggioda Foto Utentesimo85 » 28 mag 2012, 22:31

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_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[8] Re: Pic16f877A per cubo led

Messaggioda Foto UtenteTardoFreak » 28 mag 2012, 22:37

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;
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[9] Re: Pic16f877A per cubo led

Messaggioda Foto Utentepiccoli » 28 mag 2012, 23:08

grazie modifico subito il programma ^^
Avatar utente
Foto Utentepiccoli
5 1 4
New entry
New entry
 
Messaggi: 89
Iscritto il: 27 mag 2012, 17:37

0
voti

[10] Re: Pic16f877A per cubo led

Messaggioda Foto Utentepiccoli » 30 mag 2012, 14:17

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);
}
}
Avatar utente
Foto Utentepiccoli
5 1 4
New entry
New entry
 
Messaggi: 89
Iscritto il: 27 mag 2012, 17:37

Prossimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti