Go Down

Topic: Orologio 4 display bcd 7 segmenti (Read 1 time) previous topic - next topic

ivancise

Ciao a tutti sto realizzando un orologio con 4 display bcd 7 segm(2 per i minuti e 2 per i secondi)..
utilizzo display a catodo comune e dei decoder hcf4511...con lo strobe sui decoder collegato ad arduino scelgo se attivare o meno il display...intanto ho realizzato questo codice ma non capisco perchè non va...potete aiutarmi?

Code: [Select]

int i;
int resto1;
int resto2;
int resto3;
int resto4;
int a;
int b;
int c;
int d;
void setup() {
 
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(4,OUTPUT);
}
 
  void loop() {
    digitalWrite(12,HIGH);
    digitalWrite(7,LOW);
    digitalWrite(6,HIGH);
    digitalWrite(5,HIGH);
    digitalWrite(4,HIGH);
   
   
   
   
    for(i=0;i<=9;i++)
    {(i/2)==a;
     (a/2)==b;
     (b/2)==c;
     (c/2)==d;
     (i % 2)==resto1;
     (a % 2)==resto2;
     (b % 2)==resto3;
     (c % 2)==resto4;
   
    if(resto1=1) digitalWrite(8,HIGH);
    else   digitalWrite(8,LOW);
    if(resto2=1) digitalWrite(8,HIGH);
    else digitalWrite(9,LOW);
    if(resto3=1) digitalWrite(8,HIGH);
    else digitalWrite(10,LOW);
    if(resto4=1) digitalWrite(8,HIGH);
    else digitalWrite(11,LOW);
    delay(1000);
    }
   
  }

ivancise

Vi prego aiutatemi perchè sono veramente in crisi!

PaoloP

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

ivancise

Ma quelli sono ad anodo comune,i miei a catodo comune!

pablos

#4
Jan 11, 2013, 03:47 pm Last Edit: Jan 11, 2013, 03:56 pm by pablos Reason: 1
Code: [Select]
if(resto1=1) digitalWrite(8,HIGH);
   else   digitalWrite(8,LOW);
   if(resto2=1) digitalWrite(8,HIGH);
   else digitalWrite(9,LOW);
   if(resto3=1) digitalWrite(8,HIGH);
   else digitalWrite(10,LOW);
   if(resto4=1) digitalWrite(8,HIGH);
   else digitalWrite(11,LOW);


il confronto si fa con == ... quindi if(resto1==1)

poi

C++: l'operatore %, chiamato operatore MODULO restituisce il resto di una divisione.

5 % 2 = 1;
Perché 5 diviso 2 è 2 con il resto di 1.

byte modulo = a % b; <<<<< si dovrebbe scrivere così
no comment

ivancise

Ma non l'avevo fatto giusto il modulo per i resti? avevo messo % tra la 4 divisioni in modo da ottenere tutti i resti no?

PaoloP

#6
Jan 11, 2013, 04:10 pm Last Edit: Jan 11, 2013, 04:15 pm by PaoloP Reason: 1
Sbagliato!
Code: [Select]
(i % 2)==resto1;
(a % 2)==resto2;
(b % 2)==resto3;
(c % 2)==resto4;


Giusto!
Code: [Select]
resto1 = i % 2;
resto2 = a % 2;
resto3 = b % 2;
resto4 = c % 2;


Per la correzione che ti ha detto Pablos.
Sbagliato!
Code: [Select]
  if(resto1=1) digitalWrite(8,HIGH);
    else   digitalWrite(8,LOW);
    if(resto2=1) digitalWrite(8,HIGH);
    else digitalWrite(9,LOW);
    if(resto3=1) digitalWrite(8,HIGH);
    else digitalWrite(10,LOW);
    if(resto4=1) digitalWrite(8,HIGH);
    else digitalWrite(11,LOW);


Giusto!
Code: [Select]
if(resto1 == 1) digitalWrite(8,HIGH);
else
  digitalWrite(8,LOW);
if(resto2 == 1) digitalWrite(8,HIGH);
else
  digitalWrite(9,LOW);
if(resto3 == 1) digitalWrite(8,HIGH);
else
  digitalWrite(10,LOW);
if(resto4 == 1) digitalWrite(8,HIGH);
else
  digitalWrite(11,LOW);
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

ivancise

SISI grazie ho sistemato e funziona...ade sono al secondo display e sono riuscito a farli andare tutti e due...solo che quando arrivo a 59 riparte da 50 poi arriva ancora a 59 e riparte da 10...non riesco assolutamente a capire il perchè di cio...dove legge arduino questo codice?? grazie intanto per l'aiuto

Code: [Select]

void loop() {
    digitalWrite(12,HIGH);
    digitalWrite(7,LOW);
    digitalWrite(6,HIGH);
    digitalWrite(5,HIGH);
    digitalWrite(4,HIGH);
   
     for(i=0;i<=9;i++)
    {
      a=i/2;
     b=a/2;
     c=b/2;
     d=c/2;
     resto1=i % 2;
     resto2=a % 2;
     resto3=b % 2;
     resto4=c % 2;
   
    if(resto1==1) digitalWrite(8,HIGH);
    else   digitalWrite(8,LOW);
    if(resto2==1) digitalWrite(9,HIGH);
    else digitalWrite(9,LOW);
    if(resto3==1) digitalWrite(10,HIGH);
    else digitalWrite(10,LOW);
    if(resto4==1) digitalWrite(11,HIGH);
    else digitalWrite(11,LOW);
    delay(250);
    }
   
    digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
   
    digitalWrite(8,HIGH);
    digitalWrite(9,LOW);
    digitalWrite(10,LOW);
    digitalWrite(11,LOW);
   
    digitalWrite(6,HIGH);
    digitalWrite(7,LOW);
   
for(i=0;i<=9;i++)
    {
      a=i/2;
     b=a/2;
     c=b/2;
     d=c/2;
     resto1=i % 2;
     resto2=a % 2;
     resto3=b % 2;
     resto4=c % 2;
   
    if(resto1==1) digitalWrite(8,HIGH);
    else   digitalWrite(8,LOW);
    if(resto2==1) digitalWrite(9,HIGH);
    else digitalWrite(9,LOW);
    if(resto3==1) digitalWrite(10,HIGH);
    else digitalWrite(10,LOW);
    if(resto4==1) digitalWrite(11,HIGH);
    else digitalWrite(11,LOW);
    delay(250);
    }

     digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
   
    digitalWrite(8,LOW);
    digitalWrite(9,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(11,LOW);
   
    digitalWrite(6,HIGH);
    digitalWrite(7,LOW);
   
   
     for(i=0;i<=9;i++)
    {
      a=i/2;
     b=a/2;
     c=b/2;
     d=c/2;
     resto1=i % 2;
     resto2=a % 2;
     resto3=b % 2;
     resto4=c % 2;
   
    if(resto1==1) digitalWrite(8,HIGH);
    else   digitalWrite(8,LOW);
    if(resto2==1) digitalWrite(9,HIGH);
    else digitalWrite(9,LOW);
    if(resto3==1) digitalWrite(10,HIGH);
    else digitalWrite(10,LOW);
    if(resto4==1) digitalWrite(11,HIGH);
    else digitalWrite(11,LOW);
    delay(250);
    }
   
     digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
   
     digitalWrite(8,HIGH);
    digitalWrite(9,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(11,LOW);
   
    digitalWrite(6,HIGH);
    digitalWrite(7,LOW);
   
    for(i=0;i<=9;i++)
    {
      a=i/2;
     b=a/2;
     c=b/2;
     d=c/2;
     resto1=i % 2;
     resto2=a % 2;
     resto3=b % 2;
     resto4=c % 2;
   
    if(resto1==1) digitalWrite(8,HIGH);
    else   digitalWrite(8,LOW);
    if(resto2==1) digitalWrite(9,HIGH);
    else digitalWrite(9,LOW);
    if(resto3==1) digitalWrite(10,HIGH);
    else digitalWrite(10,LOW);
    if(resto4==1) digitalWrite(11,HIGH);
    else digitalWrite(11,LOW);
    delay(250);
    }
   
    digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
   
     digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(11,LOW);
   
    digitalWrite(6,HIGH);
    digitalWrite(7,LOW);
   
    for(i=0;i<=9;i++)
    {
      a=i/2;
     b=a/2;
     c=b/2;
     d=c/2;
     resto1=i % 2;
     resto2=a % 2;
     resto3=b % 2;
     resto4=c % 2;
   
    if(resto1==1) digitalWrite(8,HIGH);
    else   digitalWrite(8,LOW);
    if(resto2==1) digitalWrite(9,HIGH);
    else digitalWrite(9,LOW);
    if(resto3==1) digitalWrite(10,HIGH);
    else digitalWrite(10,LOW);
    if(resto4==1) digitalWrite(11,HIGH);
    else digitalWrite(11,LOW);
    delay(250);
    }
   
     digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
   
     digitalWrite(8,HIGH);
    digitalWrite(9,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(11,LOW);
   
    digitalWrite(6,HIGH);
    digitalWrite(7,LOW);
   
      for(i=0;i<=9;i++)
    {
      a=i/2;
     b=a/2;
     c=b/2;
     d=c/2;
     resto1=i % 2;
     resto2=a % 2;
     resto3=b % 2;
     resto4=c % 2;
   
    if(resto1==1) digitalWrite(8,HIGH);
    else   digitalWrite(8,LOW);
    if(resto2==1) digitalWrite(9,HIGH);
    else digitalWrite(9,LOW);
    if(resto3==1) digitalWrite(10,HIGH);
    else digitalWrite(10,LOW);
    if(resto4==1) digitalWrite(11,HIGH);
    else digitalWrite(11,LOW);
    delay(250);
    }
     
  }   

PaoloP

Potresti spiegarci lo schema di collegamento?
Dal codice leggo solo pin che si attivano e disattivano  :smiley-roll-blue: ma non ho idea di quale segmento attivino e di quale display.
Inoltre ti conviene creare una funzione di decodifica dei dati da visualizzare.
Per le funzioni in c --> http://www.html.it/pag/15409/le-funzioni/
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

pablos

#9
Jan 11, 2013, 06:52 pm Last Edit: Jan 11, 2013, 06:54 pm by pablos Reason: 1
Potrebbe usare anche il

PINx =0 //0000
PINx =1 //0001
PINx =2 //0010
PINx =3 //0011
PINx =4 //0100
PINx =5 //0101
PINx =6 //0110
PINx =7 //0111
PINx =8 //1000
PINx =9 //1001

Manderebbe direttamente la codifica Decimale/Binaria sui 4 pin contemporaneamente con una riga solo
x sarebbe A o B o C o D ... ecc non sappiamo neanche che arduino ha
no comment

ivancise

Ragazzi scusate ho risolto...sono finalmente riuscito a finirlo...volevo chiedervi ma come faccio per fare lampeggiare due led all'infinito mentre scorre l'orologio sui display? Due azioni contemporanee per capirci

PaoloP

#11
Jan 11, 2013, 10:28 pm Last Edit: Jan 11, 2013, 10:44 pm by PaoloP Reason: 1
Creati 2 funzioni nel loop, una per il led e l'altra per l'orologio, le chiami in base al valore della funzione millis.
Devi eliminare i delay presenti nel codice.
Dai uno sguardo all'esempio dell'IDe: Blink without delay.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

pablos

Quote
Devi eliminate i delay presenti nel codice.

cosa vuoi che elimini non ha nemmeno letto
Quote
non sappiamo neanche che arduino ha

lool
no comment

Go Up