Go Down

Topic: Orologio 4 display bcd 7 segmenti (Read 2068 times) 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

#2
Jan 10, 2013, 10:41 pm Last Edit: Jan 10, 2013, 10:52 pm by PaoloP Reason: 1
Guarda qui --> http://arduino.cc/forum/index.php/topic,121433.0.html
e anche qui --> http://arduino.cc/forum/index.php/topic,104723.0.html

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ì
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

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);

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/

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
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

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.

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
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy