Arduino mega, TLC5940 e bus SPI

Ciao a tutti.
Ho un dubbio/problema: ho la necessità di utilizzare due integrati TLC5940 con Arduino Mega, ma non ho capito dove dovrei collegare gli integrati e se, come penso, utilizzano i pin SPI dell'arduino Mega.
Se non erro, visto che ho già uno schematico parecchio grande con diversi dispositivi SPI collegati, i pin dovrebbero essere:
MISO: D50
MOSI: D51
SCK: D52
CS: D53

Al bus SPI io ho già collegato:

  • la shield per una scheda microSD
  • un terminale SPI libero per un eventuale modulo

Sia per la SD, sia per il terminale, io ho mantenuto in comune i pin MISO, MOSI ed SCK, ma ho differenziato i pin CS utilizzando 2 differenti pin digitali classici, e NON il pin CS (D53) in nessuno dei due casi.
Quindi, prima domandina: è corretto? Oppure ho sbagliato qualcosa?
Nota: ad arduino ho inoltre in gioco la comunicazione I2C per display, modulo rtc ed ESP32: posso farlo giusto?
C'è poi anche una comunicazione seriale tra Arduino Mega ed un Arduino Nano ausiliario

La seconda domanda, quindi, viene da sè: come faccio a collegare i TCL5940 sapendo della situazione attuale? Non capisco più che altro come comportarmi con il pin di selezione del chip, potete darmi una mano?
Grazie in anticipo a tutti

Se la libreria prevede che puoi passare quale pin di CS stai usando, allora puoi usare un qualsiasi pin di I/O digitale di Arduino MEGA, 53 è sollo quello di default, ma qualunque pin può indicare se voglio usare lo specifico device o meno (che è il compito del pin CS).

Guglielmo

P.S.: Tutorial sul bus SPI

Ma per l'integrato, quale sarebbe il pin di Cs? Perché non l'ho ancora capito io, proverò di nuovo a leggere il datasheet

Quell'integrato NON ha un vero bus SPI e NON si può connettere sul SPI assieme ad altre cose ... va connesso su dei pin digitali e la cosa va gestita via software (bit banging).

Se si devono connettere più TCL5940 lo si può fare connttendoli in cascata (pin SOUT del antecedente connesso al pin SIN del successivo).

Fai riferimento alle pagine 13 e 14 del datasheet.

Guglielmo

P.S.: Se con Google cerchi "Arduino software SPI" trovi degli esempi di come simulare la SPI su altri pin ... comunque è cosa piuttosto semplice.

Quel che hai detto è purtroppo oltre le mie conoscenze..
Per cambiare i pin, visto che non utilizza un vero bus SPI, come dovrei fare?
Nella libreria "classica" (TLC5940) nel file configurazione non si possono cambiare tutti i pin, viene detto di poterne cambiare solo alcuni.
Per caso, riesci a darmi una mano per modificarla, oppure meglio ancora sai se c'è una libreria in cui è possibile dichiarare i pin utilizzati?
Ti ringrazio in anticipo

Si, questo lo sapevo ed era già in preventivo, perchè ne ho due di integrati da utilizzare

Ci sarebbe comunque il problema con la libreria però, no?

Mah ... sono andato a guardare i sorgenti della libreria e vedo che è già previsto un file di configurazione in cui indicare:

  1. che NON si usa il bus SPI, ma si usano altri pin di Arduino per il bit banging

  2. quali pin di Arduino si utilizzano per il collegamento

... quindi ... devi solo studiarti bene la libreria, in particolare il file tlc_config.h e decidere a quali pin del tuo Arduino collegarlo.

Guglielmo

Stavo per scrivere questo... dal file configurazione ho modificato queste righe, in questo modo:

#ifndef NUM_TLCS
#define NUM_TLCS    2
#endif

/** Determines how data should be transfered to the TLCs.  Bit-banging can use
    any two i/o pins, but the hardware SPI is faster.
    - Bit-Bang = TLC_BITBANG
    - Hardware SPI = TLC_SPI (default) */
#define DATA_TRANSFER_MODE    TLC_BITBANG

/* This include is down here because the files it includes needs the data
   transfer mode */
#include "pinouts/chip_includes.h"

/* Set DATA_TRANSFER_MODE to TLC_BITBANG and change the pins below if you need
   to use different pins for sin and sclk.  The defaults are defined in
   pinouts/ATmega_xx8.h for most Arduino's. */

#if DATA_TRANSFER_MODE == TLC_BITBANG
/** SIN (TLC pin 26) */
#define SIN_PIN        DEFAULT_BB_SIN_PIN
#define SIN_PORT       DEFAULT_BB_SIN_PORT
#define SIN_DDR        DEFAULT_BB_SIN_DDR
/** SCLK (TLC pin 25) */
#define SCLK_PIN       DEFAULT_BB_SCLK_PIN
#define SCLK_PORT      DEFAULT_BB_SCLK_PORT
#define SCLK_DDR       DEFAULT_BB_SCLK_DDR
#endif

Ho un problema però: nella libreria dà come indicazione i valori per PIN, PORT e DDR solo per i pin dell'UNO, mentre io lavoro con il MEGA.
Come devo fare in tal caso? Dove posso trovare le corrispondenze di questi parametri per l'arduino Mega?
Stessa cosa per i pin VPRG ed GSCK

/** Enables/disables XERR (TLC pin 16) functionality to check for shorted/broken
    LEDs
    - 0 XERR is not connected (default)
    - 1 XERR is connected
    \note XERR is active low */
#define XERR_ENABLED    0

/*  You can change the VPRG and XERR pins freely.  The defaults are defined in
    the chip-specific pinouts:  see pinouts/ATmega_xx8.h for most Arduino's. */

#if     VPRG_ENABLED
/** VPRG (TLC pin 27) */
#define VPRG_PIN        DEFAULT_VPRG_PIN
#define VPRG_PORT       DEFAULT_VPRG_PORT
#define VPRG_DDR        DEFAULT_VPRG_DDR
#endif

#if     XERR_ENABLED
/** XERR (TLC pin 16) */
#define XERR_PIN        DEFAULT_XERR_PIN
#define XERR_PORT       DEFAULT_XERR_PORT
#define XERR_DDR        DEFAULT_XERR_DDR
#define XERR_PINS       DEFAULT_XERR_PINS
#endif

Poi non capisco.. i pin da collegare ad arduino son 5: il pin 26, pin 25, pin 24, pin 23, pin 18 (seguendo questo instructables)

Nella libreria sul file config, però, mi fa modificare i pin di arduino a cui vanno connessi i pin 27, 26, 25, 16

Penso di star facendo una confusione altissima

... ovviamente nel datasheet del ATmega2560 e, alcune indicazioni, nell'immagine che segue:

Guglielmo

...si, ma quale corrisponde al valore PORT? quale al PIN? quale al DDR?
e poi, resta il dubbio: nell'instructables vengono utilizzati alcuni pin, mentre nella libreria tali pin neanche ci sono

... probabilmente usano un'altra libreria ... lascia stare instructables e usa la tua testa ed un tuo schema di collegamento che i copia/incolla NON portano da nessuna parte.

C'è scritto ... PA0 è il pin 0 di PORTA e così via ... ogni porta ha i suoi DDR ... ripeto, tocca studiare il datasheet del ATmega2560 ...

Ti lascio un documento che parla dell'uso diretto delle porte da cui puoi capire il significato di certo termini: Manipoliamo direttamente le porte logiche di una MCU.pdf (226.4 KB)

Guglielmo

L'instructables mi serviva più che altro solo ed esclusivamente per il circuito..
Comunque, smanettando nella libreria (e leggendo i commenti del file configuration), ho scoperto che tutti i pin vengono dichiarati nella cartella "pinouts" in base alle schede utilizzate.
Ho quindi aperto il file "Arduino_Mega.h" ed ho modificato i pin nel seguente modo:

/*  Copyright (c) 2009 by Alex Leone <acleone ~AT~ gmail.com>

    This file is part of the Arduino TLC5940 Library.

    The Arduino TLC5940 Library is free software: you can redistribute it
    and/or modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    The Arduino TLC5940 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 General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with The Arduino TLC5940 Library.  If not, see
    <http://www.gnu.org/licenses/>. */

#ifndef ARDUINO_MEGA_H
#define ARDUINO_MEGA_H

/** \file
    SPI and timer pins for the Arduino Mega.  Don't edit these.  All
    changeable pins are defined in tlc_config.h */

/** VPRG (Mega pin 12) -> VPRG (TLC pin 27) */
#define DEFAULT_VPRG_PIN    PB6
#define DEFAULT_VPRG_PORT   PORTB
#define DEFAULT_VPRG_DDR    DDRB

/** XERR (Mega pin 13) -> XERR (TLC pin 16) */
#define DEFAULT_XERR_PIN    PB7
#define DEFAULT_XERR_PORT   PORTB
#define DEFAULT_XERR_DDR    DDRB
#define DEFAULT_XERR_PINS   PINB

/** SIN (Mega pin 11) -> SIN (TLC pin 26) */
#define DEFAULT_BB_SIN_PIN      PB5
#define DEFAULT_BB_SIN_PORT     PORTB
#define DEFAULT_BB_SIN_DDR      DDRB
/** SCLK (Mega pin 10) -> SCLK (TLC pin 25) */
#define DEFAULT_BB_SCLK_PIN     PB4
#define DEFAULT_BB_SCLK_PORT    PORTB
#define DEFAULT_BB_SCLK_DDR     DDRB

/** MOSI (Mega pin 11) -> SIN (TLC pin 26) */
#define TLC_MOSI_PIN     PB5
#define TLC_MOSI_PORT    PORTB
#define TLC_MOSI_DDR     DDRB

/** SCK (Mega pin 10) -> SCLK (TLC pin 25) */
#define TLC_SCK_PIN      PB4
#define TLC_SCK_PORT     PORTB
#define TLC_SCK_DDR      DDRB

// SS (Mega pin 53)
/** SS will be set to output as to not interfere with SPI master operation.
    If you have changed the pin-outs and the library doesn't seem to work
    or works intermittently, make sure this pin is set correctly.  This pin
    will not be used by the library other than setting its direction to
    output. */
#define TLC_SS_PIN       PB0
#define TLC_SS_DDR       DDRB

/** OC1A (Mega pin 9) -> XLAT (TLC pin 24) */
#define XLAT_PIN     PH6
#define XLAT_PORT    PORTH
#define XLAT_DDR     DDRH

/** OC1B (Mega pin 8) -> BLANK (TLC pin 23) */
#define BLANK_PIN    PH5
#define BLANK_PORT   PORTH
#define BLANK_DDR    DDRH

/** OC2B (Mega pin 7) -> GSCLK (TLC pin 18) */
#define GSCLK_PIN    PH4
#define GSCLK_PORT   PORTH
#define GSCLK_DDR    DDRH

#endif

Son quindi tornato nel file configuration e, seguendo i valori inseriti nel file Arduino_Mega.h, ho modificato di conseguenza i seguenti valori:

/* ------------------------ START EDITING HERE ----------------------------- */

/** Number of TLCs daisy-chained.  To daisy-chain, attach the SOUT (TLC pin 17)
    of the first TLC to the SIN (TLC pin 26) of the next.  The rest of the pins
    are attached normally.
    \note Each TLC needs it's own IREF resistor */
#ifndef NUM_TLCS
#define NUM_TLCS    2
#endif

/** Determines how data should be transfered to the TLCs.  Bit-banging can use
    any two i/o pins, but the hardware SPI is faster.
    - Bit-Bang = TLC_BITBANG
    - Hardware SPI = TLC_SPI (default) */
#define DATA_TRANSFER_MODE    TLC_BITBANG

/* This include is down here because the files it includes needs the data
   transfer mode */
#include "pinouts/chip_includes.h"

/* Set DATA_TRANSFER_MODE to TLC_BITBANG and change the pins below if you need
   to use different pins for sin and sclk.  The defaults are defined in
   pinouts/ATmega_xx8.h for most Arduino's. */

#if DATA_TRANSFER_MODE == TLC_BITBANG
/** SIN (TLC pin 26) */
#define SIN_PIN        DEFAULT_BB_SIN_PIN
#define SIN_PORT       DEFAULT_BB_SIN_PORT
#define SIN_DDR        DEFAULT_BB_SIN_DDR
/** SCLK (TLC pin 25) */
#define SCLK_PIN       DEFAULT_BB_SCLK_PIN
#define SCLK_PORT      DEFAULT_BB_SCLK_PORT
#define SCLK_DDR       DEFAULT_BB_SCLK_DDR
#endif


/** If more than 16 TLCs are daisy-chained, the channel type has to be uint16_t.
    Default is uint8_t, which supports up to 16 TLCs. */
#define TLC_CHANNEL_TYPE    uint8_t

/** Determines how long each PWM period should be, in clocks.
    \f$\displaystyle f_{PWM} = \frac{f_{osc}}{2 * TLC\_PWM\_PERIOD} Hz \f$
    \f$\displaystyle TLC\_PWM\_PERIOD = \frac{f_{osc}}{2 * f_{PWM}} \f$
    This is related to TLC_GSCLK_PERIOD:
    \f$\displaystyle TLC\_PWM\_PERIOD =
       \frac{(TLC\_GSCLK\_PERIOD + 1) * 4096}{2} \f$
    \note The default of 8192 means the PWM frequency is 976.5625Hz */
#define TLC_PWM_PERIOD    8192

/** Determines how long each period GSCLK is.
    This is related to TLC_PWM_PERIOD:
    \f$\displaystyle TLC\_GSCLK\_PERIOD =
       \frac{2 * TLC\_PWM\_PERIOD}{4096} - 1 \f$
    \note Default is 3 */
#define TLC_GSCLK_PERIOD    3

/** Enables/disables VPRG (TLC pin 27) functionality.  If you need to set dot
    correction data, this needs to be enabled.
    - 0 VPRG is not connected.  <em>TLC pin 27 must be grounded!</em> (default)
    - 1 VPRG is connected
    \note VPRG to GND inputs grayscale data, VPRG to Vcc inputs dot-correction
          data */
#define VPRG_ENABLED    0

/** Enables/disables XERR (TLC pin 16) functionality to check for shorted/broken
    LEDs
    - 0 XERR is not connected (default)
    - 1 XERR is connected
    \note XERR is active low */
#define XERR_ENABLED    0

/*  You can change the VPRG and XERR pins freely.  The defaults are defined in
    the chip-specific pinouts:  see pinouts/ATmega_xx8.h for most Arduino's. */

#if     VPRG_ENABLED
/** VPRG (TLC pin 27) */
#define VPRG_PIN        DEFAULT_VPRG_PIN
#define VPRG_PORT       DEFAULT_VPRG_PORT
#define VPRG_DDR        DEFAULT_VPRG_DDR
#endif

#if     XERR_ENABLED
/** XERR (TLC pin 16) */
#define XERR_PIN        DEFAULT_XERR_PIN
#define XERR_PORT       DEFAULT_XERR_PORT
#define XERR_DDR        DEFAULT_XERR_DDR
#define XERR_PINS       DEFAULT_XERR_PINS
#endif

/* ------------------------- STOP EDITING HERE ----------------------------- */

Essendoci come "valore" dei pin la dicitura "DEFAULT_XXX_PINS", che corrisponde esattamente alla dichiarazione define nel file Arduino_Mega.h, nel quale ho già modificato i pin a mio piacimento, nel file configuration ho lasciato invariate queste voci perchè deduco che, quando andrò a selezionare nell'IDE la scheda da programmare, la libreria andrà direttamente a "pescare" i pin dal file modificato nella cartella pinouts.
Mi son quindi limitato ad:

  • Indicare il numero di integrati;
  • cambiare la comunicazione da SPI a BITBANG

inoltre, avendo mantenuto disabilitati i pin VPRG (che va messo a massa) ed il pin 16, significa che i pin PWM 12 e 13 di Arduino saranno comunque utilizzabili dal codice.

Che ne pensi di quel che ho fatto?

... che c'è solo da provare e vedere se compila e poi funziona :grin:

Guglielmo

La compilazione è andata, per il test bisogna aspettare che rientri a casa lunedì
Quando provo ti faccio sapere

Test fatto solo oggi ormai, ma niente: non funziona

Qualcuno che ha idea di cosa poter provare per risolvere il problema?
Ad esempio, anche solo iniziare a verificare se i pin che ho scritto sono corretti per Arduino Mega

Prendi il datasheet del ATmega2560 e controlli l'utilizzo e l'associazione dei vari pin. Magari ti può essere utili anche il segunete pdf: mega.pdf (765.7 KB)

Guglielmo

Ho usato quelli scritti li, puoi controllare il codice che avevo postato per vedere se corrispondono e sono corretti?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.