Pages: [1]   Go Down
Author Topic: Orologio 4 display bcd 7 segmenti  (Read 1434 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);
    }
   
  }
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vi prego aiutatemi perchè sono veramente in crisi!
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: January 10, 2013, 04:52:26 pm by PaoloP » Logged

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

Offline Offline
Newbie
*
Karma: 1
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3391
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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ì
« Last Edit: January 11, 2013, 09:56:09 am by pablos » Logged

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sbagliato!
Code:
(i % 2)==resto1;
(a % 2)==resto2;
(b % 2)==resto3;
(c % 2)==resto4;

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

Per la correzione che ti ha detto Pablos.
Sbagliato!
Code:
  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:
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);
« Last Edit: January 11, 2013, 10:15:12 am by PaoloP » Logged

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

Offline Offline
Newbie
*
Karma: 1
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);
    }
     
  }   
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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/
Logged

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

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3391
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: January 11, 2013, 12:54:58 pm by pablos » Logged

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: January 11, 2013, 04:44:46 pm by PaoloP » Logged

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

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3391
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Devi eliminate i delay presenti nel codice.
cosa vuoi che elimini non ha nemmeno letto
Quote
non sappiamo neanche che arduino ha
lool
Logged

no comment

Pages: [1]   Go Up
Jump to: