Problemi comunicazione WIRE e DS1077

Ciao a tutti , oggi mi si è presentato un nuovo problema , volevo usare l’oscillatore DS1077 e non ho mai usato la libreria WIRE , cercando ho trovato questo esempio:

/*
* Ben LeMasurier 2k9'
*
* I2C SDA (data line) = analog pin 4
* I2C SDC (clock line) = analog pin 5
*/
 
 
#include <Wire.h>
 
#define DS1077_ADDRESS 0b1011000
 
// command sets
#define DIV 0x01 // operating frequency
#define MUX 0x02 // mode of operation
#define BUS 0x0D // bus settings
#define E2 0x3F // EEPROM

void setup() {
    Wire.begin(); // We're I2C-Bus Master
 
    // enable DIV, set both prescalars to their
    // maximum values (P0/1 = 8)
    ds1077_write(MUX, 0b00001111, 0x00);

    // set DIV to the maximum value
    set_n_divisor(1025);
}
 
void loop() {
}
 
void set_n_divisor(int n) {
    int msb, lsb;
 
    // DIV (n) = N + 2, lets keep it simple.
    n -= 2;
 
    ds1077_write(DIV, highByte(n), lowByte(n));
}
 
void ds1077_write(int command, int msb, int lsb) {
    Wire.beginTransmission(DS1077_ADDRESS);
    Wire.send(command);
 
    // MSB then LSB
    Wire.send(msb);
    Wire.send(lsb);
    Wire.endTransmission();
}

Il problema è che cosi non mi funziona , per cercare di capire il motivo ho abilitato la seriale a 9600 e mandavo in stampa i valori di command , msb e lsb
il programma si è messo a funzionare , qualcuno mi puo’ spiegare il motivo ?

Ciao IMer

Dipende da cosa intendi che "il programma si è messo a funzionare".

Mi pare funzionasse anche prima, però non ti mandava informazioni a video. Con la seriale vedi cosa sta facendo lo sketch.

Se noti, il codice che hai postato non contiene nulla nel loop, quindi non fa assolutamente niente, una volta avviato e settato l'oscillatore dal setup. Però l'oscillatore doveva funzionare, giusto?

Scusa mi rendo solo conto ora che la mia spiegazione é troppo pasticciata , ci riprovo.
Con il programma postato prima , non riesco a cambiare le impostazioni dell’oscillatore , quindi l’oscillatore funziona con una frequenza che
presumo settata di fabbrica per i loro test.
Ho provato a cambiare i valori del divisore e del prescaler per variare la frequenza ma nulla da fare , quando per capire il problema ho abilitato la seriale misteriosamente é cambiata anche la frequenza dell’oscillatore e non ne capisco il motivo , inoltre mi sono accorto che i 3 valori che richiedo la stampa me li stampa 2 volte ma con valori diversi , perché mi fa questo ?

Ciao IMer

Potresti pubblicare anche il codice che hai usato per stampare sulla seriale e che ti avrebbe "risvegliato" l'oscillatore?

Domani mattina lo posto , adesso non posso perchè il tutto è su un'altro PC nel mio SKylab.

Ciao IMer

Ecco lo sketch come é stato modificato da mé per poterci capire qualcosa , visto che WIRE non lo mai usato e volevo capire cosa faceva , ho scoperto che mi basta mettere un solo comando di Serial.print per farlo funzionare , ho ritardato ad inviare lo sketch perché questa mattina ho fatto diverse prove e questa é la mia conclusione.

1 Se non attivo la seriale ogni tanto arduino riesce a passare i dati al DS1077 ma raramente e non capisco con quale “Logica” funzioni o no.
2 Se attivo una sola riga come nello sketch invece i comandi vengono sempre passati senza alcun problema , ma altra cosa strana vengono passati 2 volte come potete vedere la prima volta passa
il valore 10 in binario e la seconda 1 é giusto ?

Scusatemi per come allego lo skecth ma non mi ricordo come si fa a metterlo in “code:”
Ciao Imer

/*

  • Ben LeMasurier 2k9’
  • I2C SDA (data line) = analog pin 4
  • I2C SDC (clock line) = analog pin 5
    */

#include <Wire.h>

#define DS1077_ADDRESS 0b1011000

// command sets
#define DIV 0x01 // operating frequency
#define MUX 0x02 // mode of operation
#define BUS 0x0D // bus settings
#define E2 0x3F // EEPROM

void setup() {
Serial.begin(9600);// Riga aggiunta per farlo funzionare ???
Serial.println (" inizio "); // Riga aggiunta per farlo funzionare ???

Wire.begin(); // We’re I2C-Bus Master
// enable DIV, set both prescalars to their
// maximum values (P0/1 = 8)
ds1077_write(MUX, 0b00001111, 0x00);

// set DIV to the maximum value
set_n_divisor(500);
}

void loop() {
}

void set_n_divisor(int n) {
int msb, lsb;

// DIV (n) = N + 2, lets keep it simple.
n -= 2;

ds1077_write(DIV, highByte(n), lowByte(n));
}

void ds1077_write(int command, int msb, int lsb) {
Wire.beginTransmission(DS1077_ADDRESS);

Serial.print ("command ");Serial.println( command,BIN);// Riga aggiunta per farlo funzionare ??? se la elimino non funziona.

Wire.send(command);
// MSB then LSB
Wire.send(msb);
Wire.send(lsb);
Wire.endTransmission();
}