Mi dicono che c'è un errore se risponde a 0x50, ma non capisco quale?
Se per assurdo provassi a comunicare con l'MCP tramite lo 0x50 che succede?
Vorrei provare a comunicare sullo 0x50 e vediamo per assurdo che succede.
Che dite?
Problema a far funzionare l'MCP4728
0
voti
Ho trovato in rete questo codice:
In teoria questo sopra avendo inserito la porta 0x50 su Wire.begin(0x50); dovrebbe darmi 4V sul canale B
ma in realtà mi da 0V.
Cosa c'è che non funziona?
- Codice: Seleziona tutto
#include <Wire.h>
#include <MCP4728.h>
MCP4728 dac;
int minutes = 60;
int analogPin = A1;
void setup()
{
Serial.begin(115200); // initialize serial interface for print()
Wire.begin(0x50);
dac.attach(Wire, 14);
dac.readRegisters();
dac.selectVref(MCP4728::VREF::VDD, MCP4728::VREF::VDD, MCP4728::VREF::INTERNAL_2_8V, MCP4728::VREF::INTERNAL_2_8V);
dac.selectPowerDown(MCP4728::PWR_DOWN::GND_100KOHM, MCP4728::PWR_DOWN::GND_100KOHM, MCP4728::PWR_DOWN::GND_500KOHM, MCP4728::PWR_DOWN::GND_500KOHM);
dac.selectGain(MCP4728::GAIN::X1, MCP4728::GAIN::X1, MCP4728::GAIN::X2, MCP4728::GAIN::X2);
dac.analogWrite(MCP4728::DAC_CH::A, 0);
dac.analogWrite(MCP4728::DAC_CH::B, 4000);
dac.analogWrite(MCP4728::DAC_CH::C, 0);
dac.analogWrite(MCP4728::DAC_CH::D, 0);
dac.enable(true);
dac.readRegisters();
delay(5000);
dac.analogWrite(MCP4728::DAC_CH::B, 4000);
delay(10000);
}
int cur = 4000;
void loop()
{
dac.analogWrite(MCP4728::DAC_CH::B,(cur));
}
In teoria questo sopra avendo inserito la porta 0x50 su Wire.begin(0x50); dovrebbe darmi 4V sul canale B
ma in realtà mi da 0V.
Cosa c'è che non funziona?
0
voti
Ho aggiunto 0x50 a wire.begin() del codice dello scanner ed ottengo:
Incomincio a capire che se inizializzo a 0x50 trovo una porta in 0x60, dico giusto?
Correggetemi se sbaglio.
- Codice: Seleziona tutto
I2C device found at address 0x60
Incomincio a capire che se inizializzo a 0x50 trovo una porta in 0x60, dico giusto?
Correggetemi se sbaglio.
0
voti
Specificando un indirizzo nella begin di Wire, hai impostato lo YUN come slave sul bus I2C...
Io intendevo di specificarlo nella begin di mcp....
Hai i pull-up verso i 5V sulle linee del bus?
Io intendevo di specificarlo nella begin di mcp....
Hai i pull-up verso i 5V sulle linee del bus?
0
voti
Ma stai usando la libreria Adafruit?
Cioè questo codice?
Altrimenti se cambi le carte in tavola come si fa a seguirti?
Cioè questo codice?
- Codice: Seleziona tutto
// Basic demo for configuring the MCP4728 4-Channel 12-bit I2C DAC
#include <Adafruit_MCP4728.h>
#include <Wire.h>
Adafruit_MCP4728 mcp;
void setup(void) {
Serial.begin(115200);
while (!Serial)
delay(10); // will pause Zero, Leonardo, etc until serial console opens
Serial.println("Adafruit MCP4728 test!");
// Try to initialize!
if (!mcp.begin(0x60)) { //indirizzo del MCP4728, da 0x60 a 0x68, default se omesso a 0x60
Serial.println("Failed to find MCP4728 chip");
while (1) {
delay(10);
}
}
Serial.println("MCP4728 chip found");
mcp.setChannelValue(MCP4728_CHANNEL_A, 4095);
mcp.setChannelValue(MCP4728_CHANNEL_B, 2048);
mcp.setChannelValue(MCP4728_CHANNEL_C, 1024);
mcp.setChannelValue(MCP4728_CHANNEL_D, 0);
}
void loop() { delay(1000); }
Altrimenti se cambi le carte in tavola come si fa a seguirti?
1
voti
Se cerchi su GitHub la libreria che usavi (non la Adafruit, ma quella del post [63]) e la esamini ti accorgi che:
1) non c'è un metodo begin() quindi il compilatore giustamente segnala l'errore
2) usa come base l'indirizzo 0x60, infatti in fondo inizializza così
e dove deve parlare col DAC fa, ad es.
Quindi usa beginTransmission() di Wire, la quale prende in input l'indirizzo del dispositivo col quale vuole parlare.
3) È inutile che provi a casaccio. Usa un codice non troppo complesso ed esaminalo in dettaglio per capire come fa cosa.
1) non c'è un metodo begin() quindi il compilatore giustamente segnala l'errore
2) usa come base l'indirizzo 0x60, infatti in fondo inizializza così
- Codice: Seleziona tutto
const uint8_t I2C_ADDR {0x60};
uint8_t addr_ {I2C_ADDR};
uint8_t pin_ldac_;
e dove deve parlare col DAC fa, ad es.
- Codice: Seleziona tutto
uint8_t singleWrite(uint8_t ch)
{
wire_->beginTransmission(addr_);
wire_->write((uint8_t)CMD::SINGLE_WRITE | (ch << 1));
wire_->write(((uint8_t)eep_[ch].vref << 7) | ((uint8_t)eep_[ch].pd << 5) | ((uint8_t)eep_[ch].gain << 4) | highByte(eep_[ch].data));
wire_->write(lowByte(eep_[ch].data));
return wire_->endTransmission();
}
Quindi usa beginTransmission() di Wire, la quale prende in input l'indirizzo del dispositivo col quale vuole parlare.
3) È inutile che provi a casaccio. Usa un codice non troppo complesso ed esaminalo in dettaglio per capire come fa cosa.
0
voti
GioArca67 ha scritto:È inutile che provi a casaccio. Usa un codice non troppo complesso ed esaminalo in dettaglio per capire come fa cosa.
Ma questo è totalmente contrario alla filosofia arduinista.
Chiunque può scrivere codice per microcontrollore e realizzare schede embedded. 1 vale 1

Chi c’è in linea
Visitano il forum: Nessuno e 5 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)





