MAX7219 + 3 display a 7 segmenti

Ciao a tutti,
mi sono arrivati finalmente i max7219 che avevo ordinato e mi sono subito messo all'opera per comandare 3 display a 7 segmenti.

ho effettuato i collegamenti come indicato in questi due schiemi

il risultato? si accendono tutti i segmenti ma quando vado a comandarli con la libreria, non succede nulla.

/**************************************************************************//**
 * \brief MAX7219 library for Arduino - Demo program
 * \author Copyright (C) 2011  Julien Le Sech - www.idreammicro.com
 * \version 1.0
 * \date 20110801
 *
 * This file is part of the MAX7219 library for Arduino.
 *
 * This library is free software: you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation, either version 3 of the License, or (at your option) any
 * later version.
 * 
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program. If not, see http://www.gnu.org/licenses/
 ******************************************************************************/

/**************************************************************************//**
 * \file MAX7219.pde
 ******************************************************************************/

/******************************************************************************
 * Header file inclusions.
 ******************************************************************************/

#include <WProgram.h>

#include <SPI.h>

#include <MAX7219.h>

/******************************************************************************
 * Private variable declaration.
 ******************************************************************************/

static MAX7219 max7219(10);

/******************************************************************************
 * Public function definitions.
 ******************************************************************************/

/**************************************************************************//**
 * \fn void setup()
 ******************************************************************************/
void setup()
{
    // Initiliaze MAX7219.
    max7219.initialize();
    // Set scan limit.
    max7219.setScanLimit(MAX7219::ScanLimit_Digit0To7);
     // Set decode mode.
    max7219.setDecodeMode(MAX7219::DecodeMode_AllDigits);
    // Set intensity.
    max7219.setIntensity(MAX7219::Intensity_Level15);
    // Set shutdown mode.
    max7219.setShutdownMode(MAX7219::ShutdownMode_NormalOperation);
}

/**************************************************************************//**
 * \fn void loop()
 ******************************************************************************/
void loop()
{
    // To write digit values, a loop may be more elegant but a bit more
    // complicated for this example.

    // Write digit 0 value.
    max7219.writeDigit(MAX7219::Digit_0, MAX7219::Character_Zero);
    // Write digit 1 value.
    max7219.writeDigit(MAX7219::Digit_1, MAX7219::Character_One);
    // Write digit 2 value.
    max7219.writeDigit(MAX7219::Digit_2, MAX7219::Character_Two);
    // Write digit 3 value.
    max7219.writeDigit(MAX7219::Digit_3, MAX7219::Character_Three);
    // Write digit 4 value.
    max7219.writeDigit(MAX7219::Digit_4, MAX7219::Character_Four);
    // Write digit 5 value.
    max7219.writeDigit(MAX7219::Digit_5, MAX7219::Character_Five);
    // Write digit 6 value.
    max7219.writeDigit(MAX7219::Digit_6, MAX7219::Character_Six);
    // Write digit 7 value.
    max7219.writeDigit(MAX7219::Digit_7, MAX7219::Character_Seven);

    // Wait a little before next loop.
    delay(1000);
}

ho trovato questo playground sul sto di arduino Arduino Playground - MAX72XXHardware che parla di 2 condensatori e di una resistenza, secondo voi sono la causa del fatto che non mi spenge i segmenti non necessari?

grazie in anticipo

  • gnd e' connesso a gnd arduino ?
  • i display sono catodo comune ?

i due condensatori male non fanno, e fai bene a metterli, ma non credo sia questo il problema attuale.
la resistenza invece gia' e' presente, sarebbe quella che tu hai creato con le 3 in serie (30KOhm)

lo scketch che hai postato invece non mi convince, secondo me lui accende in sequenza tutti i numeri, ma a velocita' massima non essendoci delay, quindi a te sembra che siano accesi tutti 8 (otto)

metti un delay tra ogni cifra

si massa e 5v vengono da Arduino

e i 7 segmenti sono ad anodo comune.

per quanto riguarda il codice c'era il delay alla fine della valorizzazione di tutti i digit, cmq ho provato anche con questo, ma nulla si muove, resta tutto acceso

//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=1000;

void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}


/*
 This method will display the characters for the
 word "Arduino" one after the other on digit 0. 
 */
void writeArduinoOn7Segment() {
  lc.setChar(0,0,'a',false);
  delay(delaytime);
  lc.setRow(0,0,0x05);
  delay(delaytime);
  lc.setChar(0,0,'d',false);
  delay(delaytime);
  lc.setRow(0,0,0x1c);
  delay(delaytime);
  lc.setRow(0,0,B00010000);
  delay(delaytime);
  lc.setRow(0,0,0x15);
  delay(delaytime);
  lc.setRow(0,0,0x1D);
  delay(delaytime);
  lc.clearDisplay(0);
  delay(delaytime);
} 

/*
  This method will scroll all the hexa-decimal
 numbers and letters on the display. You will need at least
 four 7-Segment digits. otherwise it won't really look that good.
 */
void scrollDigits() {
  for(int i=0;i<13;i++) {
    lc.setDigit(0,3,i,false);
    lc.setDigit(0,2,i+1,false);
    lc.setDigit(0,1,i+2,false);
    lc.setDigit(0,0,i+3,false);
    delay(delaytime);
  }
  lc.clearDisplay(0);
  delay(delaytime);
}

void loop() { 
  writeArduinoOn7Segment();
  scrollDigits();
}

ho avuto il tuo stesso problema (tutto acceso) con una matrice 8x8, ho dovuto invertire colonne e righe e poi andava (avevo una matrice strana diversa dalle 8x8 standard) quindi prova anche a invertire, non si brucia nulla.

ero arrivato a pensare di avere dei max7219 farlocchi... invece erano solo sbagliati i collegamenti ai led

reizel:
ho avuto il tuo stesso problema (tutto acceso) con una matrice 8x8, ho dovuto invertire colonne e righe e poi andava (avevo una matrice strana diversa dalle 8x8 standard) quindi prova anche a invertire, non si brucia nulla.

ero arrivato a pensare di avere dei max7219 farlocchi... invece erano solo sbagliati i collegamenti ai led

come faccio ad invertire con il display a 7 segmenti?
ho collegato i piedini con la dicitura SEGx ai vari segmenti ed ho collegato i DIGx ai catodi (uno per ogni digit)

non saprei come invertire il tutto

i display di base sarebbero 7 segmenti con un punto, quindi 8 seg * 8 catodi, tutto e' riconducibile ad una matrice 8*8, nel mio caso ho dovuto invertire righe e colonne, quindi tu prova ad invertirli, nel max7219 su un lato (pin da 1 a 12) ci son solo le righe (o colonne, non ricordo) dal lato opposto (dal pin 13 a 24) le colonne

anche a me rimaneva tutto accesso e non me lo spiegavo, poi a tentativi ne son venuto fuori e funzionava benissimo

e i 7 segmenti sono ad anodo comune.

Ma il MAX7219 non vuole display a Catodo comune ?

brunello:
Ma il MAX7219 non vuole display a Catodo comune ?

+1

I condensatori da 10uF e 100nF in parallelo all'alimentazione e vicini al 7219 sono particolarmente consigliati.

nsalnet:
e i 7 segmenti sono ad anodo comune.

e non va bene :slight_smile:

non e' nemmeno facile invertire per adattarli, fai prima a comprare i catodo comune

come faccio a capire se sono ad anodo o a catodo comune?

dalubar:

brunello:
Ma il MAX7219 non vuole display a Catodo comune ?

+1

I condensatori da 10uF e 100nF in parallelo all'alimentazione e vicini al 7219 sono particolarmente consigliati.

consigliati per?

Testato:

nsalnet:
e i 7 segmenti sono ad anodo comune.

e non va bene :slight_smile:

non e' nemmeno facile invertire per adattarli, fai prima a comprare i catodo comune

confermo ad anodo comune

http://www.us.kingbright.com/images/catalog/SPEC/SA56-11EWA.pdf

Per gli anodo comune puoi provare con i TLC5940, c'è una lib ma è un po' "acerba":
http://arduino.cc/playground/Learning/TLC5940

nsalnet:
consigliati per?

Questi IC hanno una elevata frequenza di multiplexing. I condensatori servono ad eliminare il rumore introdotto attraverso la linea di alimentazione e, come dice il playground (Arduino Playground - HomePage), essi non dovrebbero essere omessi in nessun caso, pena malfunzionamenti sporadici o permanenti. Inoltre i condensatori devono essere piazzati il più vicino possibile all'IC.

Per i display ti consiglio gli ELF-511 ELF-511SURWA/S530-A3 pdf, ELF-511SURWA/S530-A3 Description, ELF-511SURWA/S530-A3 Datasheet, ELF-511SURWA/S530-A3 view ::: ALLDATASHEET :::.

ho sostituito i digit ad anodo comune con uno che ho trovato a catodo comune, ed effettivamente ora va, fa ancora i capricci, ma credo sia colpa del digit, appena possibile ne prenderò un paio nuovi.

grazie a tutti per l'aiuto!