Pages: [1]   Go Down
Author Topic: [RISOLTO] Multiplexing 4x 7 segmenti con 74595: LED con "background" strano  (Read 513 times)
0 Members and 1 Guest are viewing this topic.
Veneto - Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino Tinkerer!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
// 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!
« Last Edit: January 08, 2013, 03:53:18 pm by antony96 » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Devi prima settare i segmenti e poi attivare il segmento aspettare e disattivare il segmento non viceverso:

non:
Code:
digitalWrite(SEG1, HIGH);
  setPins(4);
  delay(1);
  digitalWrite(SEG1, LOW);
  digitalWrite(SEG2, HIGH);
  setPins(3);
  delay(1);
  digitalWrite(SEG2, LOW);
ma:  
Code:
setPins(4);
  digitalWrite(SEG1, HIGH);
  delay(1);
  digitalWrite(SEG1, LOW);  
  setPins(3);
  digitalWrite(SEG2, HIGH);
  delay(1);
  digitalWrite(SEG2, LOW);
« Last Edit: January 08, 2013, 03:01:53 pm by uwefed » Logged

Veneto - Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino Tinkerer!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
« Last Edit: January 08, 2013, 03:54:24 pm by antony96 » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: