cd4511 e 6 display

ciao a tutti, sembrava un programmino semplice e invece…
praticamente tramite un cd 4511 in configurazione classica piloto 6 display a 7 segmenti pero’ il risultato e’ alquanto strano
vi metto il linkl al video che faccio prima

video

il codice:

// Arduino pins connected to the 4511
const uint8_t LedA = 2;
const uint8_t LedB = 3;
const uint8_t LedC = 4;
const uint8_t LedD = 5;

// Arduino pins connected to the segment driver transistors
const uint8_t Led1 = 6;
const uint8_t Led2 = 7;
const uint8_t Led3 = 8;
const uint8_t Led4 = 9;
const uint8_t Led5 = 10;
const uint8_t Led6 = 11;

void setup()
{
  // Let the Arduino know which pins go where
  pinMode(LedA, OUTPUT);
  pinMode(LedB, OUTPUT);
  pinMode(LedC, OUTPUT);
  pinMode(LedD, OUTPUT);

  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Led3, OUTPUT);
  pinMode(Led4, OUTPUT);
  pinMode(Led5, OUTPUT);
  pinMode(Led6, OUTPUT);    

  digitalWrite(Led1, LOW);
  digitalWrite(Led2, LOW);
  digitalWrite(Led3, LOW);
  digitalWrite(Led4, LOW);
  digitalWrite(Led5, LOW);
  digitalWrite(Led6, LOW);    
}

void loop()
{
  print_number(012345);
}

void print_number(unsigned n) {
  static int d = 380;
  set_digit(Led1, d, n/100000);
  set_digit(Led2, d, n/10000);
  set_digit(Led3, d, n/1000);
  set_digit(Led4, d, n/100);
  set_digit(Led5, d, n/10);
  set_digit(Led6, d, n/1);
}

void set_digit(const uint8_t led, const unsigned d, const unsigned value) {
  set_number(value);
  digitalWrite(led, HIGH);
  delay(d);
  digitalWrite(led, LOW);
}

void set_number(const unsigned n) {
  static const struct number {
    uint8_t d;
    uint8_t c;
    uint8_t b;
    uint8_t a;
  } numbers[] = {
    { LOW,  LOW,  LOW,  LOW}, /* 0 */
    { LOW,  LOW,  LOW, HIGH}, /* 1 */
    { LOW,  LOW, HIGH,  LOW}, /* 2 */
    { LOW,  LOW, HIGH, HIGH}, /* 3 */
    { LOW, HIGH,  LOW,  LOW}, /* 4 */
    { LOW, HIGH,  LOW, HIGH}, /* 5 */
    { LOW, HIGH, HIGH,  LOW}, /* 6 */
    { LOW, HIGH, HIGH, HIGH}, /* 7 */
    {HIGH,  LOW,  LOW,  LOW}, /* 8 */
    {HIGH,  LOW,  LOW, HIGH}, /* 9 */
  };
  
  digitalWrite(LedA, numbers[n%10].a);
  digitalWrite(LedB, numbers[n%10].b);
  digitalWrite(LedC, numbers[n%10].c);
  digitalWrite(LedD, numbers[n%10].d);
}

mi rispondo da solo;

ho trovato il problema,

void set_digit(const uint8_t led, const unsigned d, const unsigned value) {
 set_number(value);

e' attraverso "const unsigned value" che arriva il valore segnato nel loop peccato che piu' di 65535 non accetta.....
idee come posso risolvere?
grazie

Usare long invece di unsignd int
.ma non sono sicuro che il problema sia li, non riesco a vedere il video

visto video. alcune cose non mi convincono nel tuo programma, ma non credo siano loro la causa
sicuro di aver cablato correttamente?
sicuro di usare i giusti display, mica che siano anodo comune?

forse ho trovato: inverti tutti i comandi dei led da 1 a 6, siccome sono a catodo comune sono accesi su LOW

scusa ma questa routine

void print_number(unsigned n) {
  static int d = 380;
  set_digit(Led1, d, n/100000);
  set_digit(Led2, d, n/10000);
  set_digit(Led3, d, n/1000);
  set_digit(Led4, d, n/100);
  set_digit(Led5, d, n/10);
  set_digit(Led6, d, n/1);
}

con dei print sul monitor seriale da come risultato di n:

0
0
5
53
534
5349

da qui a voler visualizzare sui dispaly le cifre 012345 proprio non capisco come dovrebbe avvenire!

[EDIT]

che poi ho notato che:

  unsigned n = 012345; 
  Serial.println(n);

da come risultato 5349 :o invece togliendo lo zero iniziale da correttamente 12345 perché?

-zef-:
da come risultato 5349 :o invece togliendo lo zero iniziale da correttamente 12345 perché?

Perché, come 0xnnnn indica un numero esadecimale, 0nnnn indica un numero OTTALE e quindi, quello che segue, viene interpretato in ottale (... ovvero, NON si deve mai mettere lo zero davanti, salvo non si vogli indicare la base OTTALE)

012345 = 5 + (48 ) + (364) + (2512) + (14096) = 5 + 32 + 192 + 1024 + 4096 = 5349 :smiley:

Guglielmo

-zef-:
scusa ma questa routine

void print_number(unsigned n) {

static int d = 380;
  set_digit(Led1, d, n/100000);
  set_digit(Led2, d, n/10000);
  set_digit(Led3, d, n/1000);
  set_digit(Led4, d, n/100);
  set_digit(Led5, d, n/10);
  set_digit(Led6, d, n/1);
}





con dei print sul monitor seriale da come risultato di n:

0
0
5
53
534
5349

da qui a voler visualizzare sui dispaly le cifre 012345 proprio non capisco come dovrebbe avvenire!


[EDIT] 

che poi ho notato che:


unsigned n = 012345;
  Serial.println(n);




da come risultato 5349 :o invece togliendo lo zero iniziale da correttamente 12345 perché?

Perché attraverso la variabile value posso passare un valore massimo di 65535

gpb01:
Perché, come 0xnnnn indica un numero esadecimale, 0nnnn indica un numero OTTALE e quindi, quello che segue, viene interpretato in ottale (… ovvero, NON si deve mai mettere lo zero davanti, salvo non si vogli indicare la base OTTALE)

012345 = 5 + (48 ) + (364) + (2512) + (14096) = 5 + 32 + 192 + 1024 + 4096 = 5349 :smiley:

Guglielmo

infatti alcune cose non mi convincevano.
riassumendo quindi: sbagliata la scrittura del numero, sbagliato il comando del display, sbagliata la routine di divisione delle cifre, poca chiarezza sull’uso dei tipi dati
vabbe’ Superciccio, hai indicazioni per rimediare, poi facci sapere

Ah, e inoltre, 380 ms per passare da una cifra all'altra sono troppi, abbassa, abbassa di brutto

Standardoil:
Ah, e inoltre, 380 ms per passare da una cifra all'altra sono troppi, abbassa, abbassa di brutto

Si certo quando devo capire cosa succede ogni soluzione è lecita.....
Generalmente uso 2ms.

Comunque domani posto il nuovo codice non che sia cambiato molto però adesso so che più di un valore di 65535 non va.....

la mia prima risposta, forse non la hai letta

Standardoil:
la mia prima risposta, forse non la hai letta

Usare long? Già fatto non cambia nulla

certo, perché non hai capito che il problema non era li, non stai ancora usando numeri troppo lunghi, in effetti hai tre problemi più importanti da risolvere prima di preoccuparti della dimensione dei numeri

gpb01:
Perché, come 0xnnnn indica un numero esadecimale, 0nnnn indica un numero OTTALE.....

Grazie Guglielmo, non ci sarei mai arrivato, ma proprio nemmeno lontanamente avevo pensato a qualcosa di simile. Un +1 karma più che meritato!! :smiley:

Standardoil:
certo, perché non hai capito che il problema non era li, non stai ancora usando numeri troppo lunghi, in effetti hai tre problemi più importanti da risolvere prima di preoccuparti della dimensione dei numeri

3 problemi?
IL cablaggio è ok
Uno sono i numeri troppo grandi.....
Quale sarebbe l'ultimo problema???
Grazie

Standardoil:
....riassumendo quindi: sbagliata la scrittura del numero, sbagliato il comando del display, sbagliata la routine di divisione delle cifre....

buon proseguimento

Standardoil:
buon proseguimento

Boh!!!!
Grazie per il prezioso aiuto.

metti il max 7219 se vuoi "armeggiare" con i led, fa "tutto" lui, liberi risorse
puoi modificare la luminosità con un semplice comando,

hai quasi tutti i pin liberi e tutto arduino per fare altro :slight_smile:
con un po di "studio" puoi fargli fare quello che vuoi a i led,

il driver led e indispensabile, senza stai solo perdendo tempo, anche se al momento sembra una sfida interessante poi fra un po comprendi che era meglio perdere tempo sulla programmazione del driver

elrospo:
metti il max 7219 se vuoi "armeggiare" con i led, fa "tutto" lui, liberi risorse
puoi modificare la luminosità con un semplice comando,

hai quasi tutti i pin liberi e tutto arduino per fare altro :slight_smile:
con un po di "studio" puoi fargli fare quello che vuoi a i led,

il driver led e indispensabile, senza stai solo perdendo tempo, anche se al momento sembra una sfida interessante poi fra un po comprendi che era meglio perdere tempo sulla programmazione del driver

si conosco, devo usare il 4511 perche' si interfaccia meglio al progetto che sto sviluppando, speriamo.
la partenza e' alquanto incerta.....