Newsgroup: it.hobby.elettronica.digitale
Titolo: MCC18 problema con if else

Alla riga 5 imposto vf1=1 e giustamene il primo ciclo di for(i1...)  riga 6 
esegue riga 8, riga 11, riga 16 e riga 19.
Quando passa alla riga 34 al secondo passaggio vf1 dovrebbe valere 0 Giusto?
Perchè  non mi esegue mai le righe 24 e 27?
Mi sfugge qualcosa ma non capisco cosa
Grazie per consigli.
0001 void Sequenza19(unsigned char passo)
0002 { unsigned char i1,i2,i3,vf1;
0003  PORTA=0x00;
0004  PORTC=0x00;
0005  vf1=1;
0006  for(i1=0;i1<16;i1++)
0007  { if(i1<8)
0008    { PORTA=ac_av_singo[i1];   //Eseguita.
0009    }
0010    else
0011    { PORTC=ac_av_singo[i1-8]; //Eseguita.
0012    }
0013    for(i2=0;i2<16;i2++)
0014    { if(vf1==1)
0015      { if(i2<8)
0016        { PORTB=ac_av_singo[i2]; //Eseguita.
0017        }
0018        else
0019        { PORTD=ac_av_singo[i2-8]; //Eseguita.
0020        }
0021      }
0022      else
0023      { if(i2<8)
0024        { PORTD=ac_in_singo[i2]; //Non eseguita.
0025        }
0026        else
0027        { PORTB=ac_in_singo[i2-8]; //Non eseguita.
0028        }
0029      }
0030      Ritardo(500);
0031      PORTB=0;
0032      PORTD=0;
0033    }
0034    if(vf1==1)
0034    { vf1=0;
0035    }
0036    else
0037    { vf1=1;
0038    }
0039  }
0040 } 

 0038    }
Giusto per dire:
vf1 ^= 1;
fa la stessa cosa.
Marco

 Perchè  non mi esegue mai le righe 24 e 27?
C'è qualcosa che mi sfugge.
Sei sicuro sicuro che il flusso del programma sia quello da te 
descritto o che il codice corrisponda a quello postato?
Come fa ad eseguire entrambi i rami di un if (riga 6 e 8 per esempio)?
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org

 Come fa ad eseguire entrambi i rami di un if (riga 6 e 8 per esempio)?
Ci ho pensato anche io :)
Ma credo che intendesse dire che il primo for (quello che itera su i1) 
esegue - al momento giusto, ndr - i vari rami if.
Marco

 0005  vf1=1;
Se qui alla riga 0005 imposto vf1=0;
esegue le righe 24 e 27 e non esegue le righe 16 e 19.
Sembra che non esegua il codice dalla riga 34 alla 38
e quindi che non scambi vf1.
Ciao.


 0034    { vf1=0;
^^^^^^^^
Sicuro che sia il codice reale?
Non credo che un editor sbagli a contare....
Marco

 Marco
Questo è come l'ho postato.


Il mio progetto č una matrice di LED 16x16 LED totale 256
eseguita con 4 porte:
PORTA e PORTC = colonne
PORTB e PORTD = righe
Per far scorrere in un senso una colonna di 16 bit devo scorrere
prima le righe da 0 a 7 PORTB poi le righe da 8 a 15 PORTD.
Per scorrere in senso inverso eseguo prima PORTD e poi PORTB.
e lo scambio lo pensato con questo codice:
................
for(i2=0;i2<16;i2++)
    { if(vf1==1)         //vf1 NON SCAMBIA
      { if(i2<8)
        { PORTB=ac_av_singo[i2]; //Eseguita.
        }
        else
        { PORTD=ac_av_singo[i2-8]; //Eseguita.
        }
      }
      else
      { if(i2<8)
        { PORTD=ac_in_singo[i2]; //Non eseguita.
        }
        else
        { PORTB=ac_in_singo[i2-8]; //Non eseguita.
        }
      }
..............
    if(vf1==1)
    { vf1=0;
    }
    else
    { vf1=1;
    } 

 Questo è come l'ho postato.
Si, ma ti sei accorto che ha due righe 34 come ho evidenziato?
Significa che nell'editor che usi hai due volte il numero 34?
Verifica che probabilmente si è incasinato qualcosa.
Prova anche a vedere il codice asm generato, magari ti accorgi se il 
compilatore ha fatto qualche casino.
Marco

 Marco
Quei numeri di linea li ho aggiunti io.
Il programma è molto lungo, cosi ho copiato il codice che interessava
e ho aggiunto i numeri di linea come riferimenti per spiegare meglio
il problema.
Saluti 

 il problema.
Ah ok, come non detto.
Hai fatto la prova con un compilatore C per vedere se si comporta allo 
stesso modo?
Marco

PROBLEMA INESISTENTE!
Innanzi tutto mi scuso per aver esposto un problema
che credevo tale ma che non lo era.
Mi spiego:
Si tratta di un albero di Natale con 256 LED collegati
a matrice 16 colonne x 16 righe, ma per le prove in laboratorio
per ragioni pratiche me ne sono creato uno di 8 x 8 LED.
Cosi ho collegato solo le colonne e le righe pari per testare
tutte 4 le porte PORTA e PORTC per le colonne,
PORTB e PORTD per le righe.
Ecco perchè non vedevo eseguite quelle istruzioni che
elaborano le colonne e righe dispari.
Ringrazio Marco e Francesco per le loro risposte.
Ciao. 

      }
Queste righe fanno sì che vf1 valga alternativamente 0 o 1, a cicli 
alterni, è corretto?
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org/


Bene, meglio così :-)


 alterni, è corretto?
Si è proprio questo lo scopo.
Saluti 

 fa la stessa cosa.
secondo me
vf1 = ~vf1;
� pi� chiaro
ciao
CG 

 ï¿œ piï¿œ chiaro
Dipende dai punti di vista :)
Io preferisco la prima scrittura, anche perchï¿œ mi permette di usare la 
stessa variabile per 8 flag.
Marco

 Dipende dai punti di vista :)
In realtï¿œ, nel contesto indicato, se usi il not bit a bit (~) fai una 
cosa sbagliata.
vf1 all'inizio vale 1 e ~1 vale 0xFE, che ï¿œ sempre interpretato come vero.
Quando si lavora con i flag, secondo me, a meno di non volerne 
impaccare piï¿œ di uno in uno stesso byte, conviene usare gli operatori 
logici non binari e dichiararne il tipo come bool. E' semanticamente 
piï¿œ chiaro e il compilatore ottimizza meglio.
