Pagina 1 di 2

Problema a rilevare il secondo MCP4728

MessaggioInviato: 30 dic 2021, 17:26
da alien75
In riferimento a https://www.electroyou.it/forum/viewtopic.php?f=56&t=85110&start=150
ho inserito il secondo MCP4728 con lo scopo di comandare gli altri TDA.
Se inserisco il seguente codice:
Codice: Seleziona tutto
#include <Wire.h>

int num=0;

void setup()
{
  Wire.begin(0x60);
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      delay(500);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }   
  }
  if (nDevices == 0)
  {
    Serial.println("No I2C devices found\n");
    Serial.println(num);
    ++num;
  }
  else
    Serial.println("done\n");
}


Facendo una scansione di un solo MCP (quello nuovo appena arrivato) senza collegare l'altro mi da come risultato che lo rileva senza problemi, quindi funziona.
Se inserisco il secondo MCP e carico il seguente codice:
Codice: Seleziona tutto
#include <MD_AD9833.h>
#include <SPI.h>
#include <Adafruit_MCP4728.h>
#include <Wire.h>
#include <Adafruit_BusIO_Register.h>
#include <TimerOne.h>

Adafruit_MCP4728 mcp;
Adafruit_MCP4728 mcp2;


void play(float fO, int volA, char ta, float fA, int volB, char tb, float fB, int volC,  char tc);
void read_USB();

// Pins for SPI comm with the AD9833 IC
#define DATA  11  ///< SPI Data pin number
#define CLK   7  ///< SPI Clock pin number
#define FSYNC 6  //(FSYNC in AD9833 usage)
#define FSYNC1 5
#define FSYNC2 2
#define FSYNC3 3
#define FSYNC4 1
#define FSYNC5 0

int x;
int vol=2100;

float att=0;
float sustain=1000;
float decay=1;
int volmaster=4000;

#define MAX_BUFFER 64
char buffer[MAX_BUFFER];
int elemento_buffer;

MD_AD9833  O(DATA, CLK, FSYNC);
MD_AD9833  A(DATA, CLK, FSYNC1);
MD_AD9833  B(DATA, CLK, FSYNC2);
MD_AD9833  C(DATA, CLK, FSYNC3);
MD_AD9833  D(DATA, CLK, FSYNC4);
MD_AD9833  E(DATA, CLK, FSYNC5);

void setup(void)
{
  O.begin();
  A.begin();
  B.begin();
  C.begin();
  D.begin();
  E.begin();
  Serial.begin(115200);
  while (!Serial)
    delay(10); // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("OK!");

  // Try to initialize!
  if (!mcp.begin(0x60)) {
    Serial.println("Failed to find MCP4728 chip1");
    while (1) {
      delay(10);
    }
  }
  // Try to initialize!
  if (!mcp2.begin(0x61)) {
    Serial.println("Failed to find MCP4728 chip2");
    while (1) {
      delay(10);
    }
  }
  mcp.begin(0x60);
  mcp2.begin(0x61);
  //Timer1.initialize(2000000);     //testa se ci sono comandi sulla USB ogni 1msec
  //Timer1.attachInterrupt(read_USB); // read USB to run every 0.15 seconds
}

void loop()
{

}


ottengo il seguente messaggio:
Codice: Seleziona tutto
OK!
Failed to find MCP4728 chip2


Nessuno mi puo' aiutarea capire perché succede questo?
Evidentemente devo configurare il secondo MCP in modo che risponda sulla porta 0x61, ma non so come fare.

Re: Problema a rilevare il secondo MCP4728

MessaggioInviato: 30 dic 2021, 20:11
da GioArca67
alien75 ha scritto:Se inserisco il secondo MCP e carico il seguente codice:


Mi sono fermato qui a leggere...

Non si fa così: cambia una cosa per volta, altrimenti non ci capirai mai nulla... o con un certo HW cambi il SW oppure mantieni il SW e cambi l'HW.

alien75 ha scritto:Facendo una scansione di un solo MCP (quello nuovo appena arrivato) senza collegare l'altro mi da come risultato che lo rileva senza problemi, quindi funziona.

Bene...
ma insieme funzionano?
Se cambi il SW come lo capisci?

Sul manuale c'è scritto come modificare l'indirizzo.
Prova a guardare, poi ne riparliamo.

Re: Problema a rilevare il secondo MCP4728

MessaggioInviato: 1 gen 2022, 17:18
da lelerelele
hai provato a mettere prima uno e poi l'altro, senza cambiare niente?

Re: Problema a rilevare il secondo MCP4728

MessaggioInviato: 1 gen 2022, 18:39
da boiler
alien75 ha scritto:Evidentemente devo configurare il secondo MCP in modo che risponda sulla porta 0x61, ma non so come fare.


Il datasheet, questo acerrimo nemico...

MCP4728_addr.PNG


Boiler

Re: Problema a rilevare il secondo MCP4728

MessaggioInviato: 2 gen 2022, 15:26
da lelerelele
A me sembra chiaro il datasheets, gli ultimi tre bit dello slave address identificano il device corretto.
vero Foto Utentealien75?

saluti.

Re: Problema a rilevare il secondo MCP4728

MessaggioInviato: 27 giu 2022, 19:54
da alien75
Bene grazie, ho letto il datasheet.
Ora ho capito che byte inviare al dispositivo tramite I2C ma non capisco il come inviare questi byte,
nel senso che non capisco che libreria usare e che codice usare per fare questo: in internet non trovo nessun tutorial che parla di questo ne su youtube e ne tutorial scritto.
Ci vogliono forse le funzioni di wire.h?
Aiutatemi in questo senso per favore.

Re: Problema a rilevare il secondo MCP4728

MessaggioInviato: 27 giu 2022, 21:15
da rugweri
alien75 ha scritto: in internet non trovo nessun tutorial che parla di questo ne su youtube e ne tutorial scritto.


Un giorno di questi io mi sparo.

Re: Problema a rilevare il secondo MCP4728

MessaggioInviato: 27 giu 2022, 22:41
da Etemenanki
rugweri ha scritto:Un giorno di questi io mi sparo.

No, dai, abbi pieta' di Admin, che dovra' poi pulire tutto ... perche tirare via il sangue dallo sfondo bianco della chat e' di un difficile, che neppure te lo immagini :-P

(scusa, non ho resistito ;-) )

Re: Problema a rilevare il secondo MCP4728

MessaggioInviato: 28 giu 2022, 8:23
da lelerelele
alien75 ha scritto:Bene grazie, ho letto il datasheet.
Ora ho capito che byte inviare al dispositivo tramite I2C ma non capisco il come inviare questi byte,
Pensa che io ho controllato sensori I2C con un micro che non la prevedeva.... scrivendomi le librerie ed implementando l'hardware, il segreto è imparare il protocollo.

A parte questo, che è stata una provocazione, devi comunque impararti il protocollo I2C, (è sempre buona cosa conoscere cio che si ha in mano), poi tramite il microcontrolore che usi, vai a leggere il datasheets, (che hai gia letto, pare), e sopra c'è scritto come implementare la porta I2C.

non ci credo che non si trovi nulla di I2C sul web, link, link, link ,eccc.

(Senza fatica e tanto studio non si fa niente).

saluti.

Re: Problema a rilevare il secondo MCP4728

MessaggioInviato: 28 giu 2022, 10:32
da WALTERmwp
Foto Utentealien75, non so gli altri ma io ho qualche problema a stabilire l'associazione tra codice, numero di MPC4728 collegati e riscontri ottenuti.
Come già stato osservato è importante procedere con ordine.

Specifico che la discussione della quale riporti il link non l'ho letta quindi potrei scrivere delle ovvietà o peggio; inoltre ho dato un'occhiata veloce al datasheet, quindi potrei aver scritto qualcosa di errato, nel caso auspico che altri mi rettifichino.

Ti pongo qualche domanda per capire cosa hai capito.
Il primo codice del primo post di questo thread che cosa dovrebbe fare ?
Il secondo codice invece ?
Quando scrivi
Codice: Seleziona tutto
mcp2.begin(0x61)
cosa pensi di ottenere da questa funzione ?

Tieni presente che comunicando su un bus(o su una linea seriale come la I2C) occorre, in generale, che ogni device ad esso collegato(in tal caso i tuoi MPC) abbia un indirizzo univoco; per averlo, l'indirizzo deve essere assegnato.
Questo, nel caso dello MPC, viene scritto nella EEPROM dello stesso MPC tramite una istruzione che il master(un microcontrollore, un Arduino, ...) può inviare tramite linea seriale(la I2C), rispettando il protocollo(le regole) di comunicazione previste per questi "aggeggi".
Il master può farlo controllando anche lo stato di un "filo" dedicato(LDAC, pin 4), che da lui è connesso ad ogni MPC(non è la linea seriale I2C).
Se non è stata fatta questa inizializzazione(scrittura nello MPC dell'indirizzo, diverso per ogni MPC che si vuole gestire ...) gli MPC che utilizzi(forse per come hai testato i chip usando il primo codice) probabilmente hanno tutti lo stesso indirizzo.

Saluti