Go Down

Topic: [RISOLTO] Multiplexing 4x 7 segmenti con 74595: LED con "background" strano (Read 692 times) previous topic - next topic

antony96

Salve,
già al secondo mio post, un bel problema!
Ho costruito in breadboard un circuito formato da 4x 7 segmenti e un CD74HC595E, per poter creare uno schermetto usando pochi pin dell'Arduino.
[Scusate se non ho un diagramma, ma vi spiego lo stesso le connessioni]
I 7 segmenti sono connessi in parallelo tra loro, con 8 resistori in serie (1 per ciascun LED) al 74595. Ho scritto un [bel] codice che funziona a meraviglia, se non per il fatto che ciascun 7 segmenti soffre di uno strano effetto dove riproduce con minore intensità il pattern della cifra precedente...

Il "background" è praticamente shiftato a destra di 1.
Così appare se lascio fluttuare il pin Output Enable, cioè sfilandolo dalla breadboard (quindi non è pullato LOW):

Non ho proprio idea sul perché questo possa succedere, essendo ancora non sceso molto nei dettagli dell'elettronica.
Se avete idee voi, sarei grato di ascoltarle. In ogni caso vi lascio il codice, compilato su Arduino 1.0.3:
Code: [Select]
// Segment pins - HIGH to select
#define SEG1 8
#define SEG2 9
#define SEG3 10
#define SEG4 11
#define DATAPIN 2
#define CLOCKPIN 4
#define LATCHPIN 3
#define OUTPUTENABLE 5

// Matrix of digit configs -  A is the leftmost
const byte digitsArray[10] = {
 B00000011, // 0
 B10011111, // 1
 B00100101, // 2
 B00001101, // 3
 B10011001, // 4
 B01001001, // 5
 B01000001, // 6
 B00011111, // 7
 B00000001, // 8
 B00001001 // 9
};

void setup(){
 DDRB = B00001111; //LEDs Pins - 8 to 11
 DDRD = B00111110; //595 Pins - 2 to 5 + TX
 digitalWrite(OUTPUTENABLE, LOW);
}

void loop(){
 digitalWrite(SEG1, HIGH);
 setPins(4);
 delay(1);
 digitalWrite(SEG1, LOW);
 digitalWrite(SEG2, HIGH);
 setPins(3);
 delay(1);
 digitalWrite(SEG2, LOW);
 digitalWrite(SEG3, HIGH);
 setPins(2);
 delay(1);
 digitalWrite(SEG3, LOW);
 digitalWrite(SEG4, HIGH);
 setPins(1);
 delay(1);
 digitalWrite(SEG4, LOW);
}

// Set pins based on the digits matrix
void setPins(uint8_t digit){
 digitalWrite(LATCHPIN, LOW);
 shiftOut(DATAPIN, CLOCKPIN, LSBFIRST, digitsArray[digit]);
 digitalWrite(LATCHPIN, HIGH);
}


Grazie e ciao!

uwefed

#1
Jan 08, 2013, 08:58 pm Last Edit: Jan 08, 2013, 09:01 pm by uwefed Reason: 1
Devi prima settare i segmenti e poi attivare il segmento aspettare e disattivare il segmento non viceverso:

non:
Code: [Select]
digitalWrite(SEG1, HIGH);
 setPins(4);
 delay(1);
 digitalWrite(SEG1, LOW);
 digitalWrite(SEG2, HIGH);
 setPins(3);
 delay(1);
 digitalWrite(SEG2, LOW);

ma:  
Code: [Select]
setPins(4);
 digitalWrite(SEG1, HIGH);
 delay(1);
 digitalWrite(SEG1, LOW);  
 setPins(3);
 digitalWrite(SEG2, HIGH);
 delay(1);
 digitalWrite(SEG2, LOW);

antony96

#2
Jan 08, 2013, 09:37 pm Last Edit: Jan 08, 2013, 09:54 pm by antony96 Reason: 1
Grande! Grazie, funziona perfettamente!
Non so come ho fatto a non pensare al discorso della sequenza di aggiornamento...

OT: C'è un modo di ringraziare esplicitamente in questo forum?

uwefed


Grande! Grazie, funziona perfettamente!
Non so come ho fatto a non pensare al discorso della sequenza di aggiornamento...

OT: C'è un modo di ringraziare esplicitamente in questo forum?

Un GRAZIE e la conferma che hai risolto il problema e come normalmente bastano.
Senó c'é la possibilitá di dare un KARMA schiacciando il + verde vicino ai Karma del utente.
Ciao Uwe

Go Up