Sviluppo sketch per PLL 2,4Ghz

Save a tutti,

Vorrei interfacciare Arduino uno affinche a mezzo della libreria Wire utilizzando il protocollo IIC imposti il divisore programmabile di detto PLL che in questo caso è un TSA5055 con un fattore di divisione di 19600 (DEC) corrispondente 4C90 in HEX, ho cercato di scrivere qualcosa ma al risultato pratico l’oscillatore del PLL rimane inerte, sicuramente vi è qualche sbaglio nell’interpretare la modalita’ di inviare detta informazione a mezzo il codice, premetto che sono inesperto in programmazione ed aggiungo che detto PLL pilotatolo con un’altra scheda che utilizza un PIC16F84 ed il protocollo IIC funziona.

Grazie a tutti e scusate se la forma del post non è corretta.

p.s. in allegato il datashet di detto modulo.

FM2400TSIMB.PDF (68.7 KB)

Ho cercato su Google “TSA5055 Arduino”.
Questo è il primo risultato → http://pe1br.nl/?page_id=178
Non so se ti possa essere utile.

Gia’ testato in passato ma non funziona perche’ ci sono alcuni errori di sintassi nel listato, e poi a me serviva solo impostare il fattore divisore programabile e basta, credo 3-4 righe di codice.

Grazie

Mah … la logica è banale ed è sempre quella :

 Wire.beginTransmission(<< Indirizzo_device_I2C>>);
Wire.write(<< indirizzo_memoria_da_dove_iniziare_a_scrivere>>);
Wire.write(<<primo_byte_da_scrivere>>);
Wire.write(<<secondo_byte_da_scrivere>>);
.....
.....
Wire.endTransmission();

… quindi devi avere fondamentalmente chiare due cose :

  1. << Indirizzo_device_I2C>> : l’indirizzo I2C del tuo device (che vedo può essere anche programmato)
  2. << indirizzo_memoria_da_dove_iniziare_a_scrivere>> : il numero del byte da cui cominciare a scrivere nella memoria del chip. Normalmente si parte a contare da 0x00.

Se hai queste info … non dovresti avere problemi a parlare con quel chip ed ha programmarlo.

Guglielmo

Ciao Guglielmo e grazie per la tua preziosa collaborazione,
dunque il mio problema e che non so’ interpretare la lista degli indirizzi del mio device :*
volevo innanzi tutto capire come iniziare ad impostarla riferendosi al precedente datasheet,
io avevo iniziato dapprima a scarabocchiare qualcosa del genere ma ovviamente errata e non funziona

#include <Wire.h>

void setup()
{
  Wire.begin();
}



void loop()
{
  Wire.beginTransmission(0xC2); // indirizzo del device
                              
  Wire.write(ox4C90);             // fattore di divisione del divisore programmabile in decimale è 19600
      
       
   Wire.endTransmission();   

  delay(500);  
}

ovvio che manca qualcosa .

Grazie

Dunque ... devi esaminare il datasheet a pagina 4 per i dati da fornire e a pagina 5 per come questi vanno trasmessi ...

Giustamente indirizzi il chip (sicuro dell'indirizzo ?) ...

Wire.beginTransmission(0xC2); // indirizzo del device

... poi, se guardi a pagina 5 il formato scrittura dei dati, dopo l'indirizzo devi spedire 4 bytes :

  1. MSB del Programmable Divider
  2. LSB del Programmable Divider
  3. Charge pump and test bits
  4. I/O port control bits

questo lo fai mandando BYTE a BYTE (... e non come hai fatto tu) con la Wire.write() :

Wire.write(0x4C); // MSB del Programmable Divider
Wire.write(0x90); // LSB del Programmable Divider
Wire.write(0x??); // qui devi calcolare il valore per il byte Charge pump and test bits
Wire.write(0x??); // qui devi calcolare il valore per il I/O port control bits

... dopo di che, puoi chiudere la trasmissione :

Wire.endTransmission();

Guglielmo

Guglielmo,
ti allego il listato che funziona su pic16f84 in IIC dove li’ sono riportate delle preziose info che forse ti aiuteranno a farmici capire qualcosa, in questo listato che non è C ne C++ forse microBasic vengono utilizzati anche dei pulsanti ed un display LCD che a me non servono per il momento.
l’indirizzo del device è giusto è riportato anche nel detto allegato.

Grazie

ctech11t.bas.txt (5.59 KB)

L'indirizzo può essere cambiato per cui ... che sia in un listato non significa nulla ...

Per il resto ... c'è solo da capire se è obbligatorio trasmettere tutti e 4 i bytes di programmazione o, se già dopo i primi due (che sono quelli che ti interessano), si può chiudere la trasmissione.

L'unica è che fai una prova e vedi come va ...

Guglielmo

P.S. : Eventualmente usa I2CScanner per verificare che veramente risponda a quell'indirizzo ;)

Guglielmo,

il monitor seriale mi restituisce cio'

Scanning... I2C device found at address 0x60 ! I2C device found at address 0x61 ! done

Che significa?

Cosa hai collegato al bus I2C ??? Perché stanno rispondendo due diversi devices …

Guglielmo

Edit: Per inciso, QUI trovi più dettagli sul funzionamento di quel chip … :roll_eyes:

Guglielmo ho solo collegato detto modulo e lo scanner che mi hai fatto scaricare mi rileva 2 device il 60 e il 61 come è possibile?

pero' anche se come dici tu il suo indirizzo è modificabile nel datasheet del modulo a pagina 4 dice C2 (on write date format),

che significa tutto cio'?

Allora,

impostando come indirizzo del device 0x60 oppure 0x61 come gia’ rilevato dallo scanner IIC il PLL si aggancia e funziona! :fearful:
Allego lo sketch

#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
}



void loop()
{
  Wire.beginTransmission(0x60); // device address
                              
     
  Wire.write(byte(0x4C));  // MSB del Programmable Divider
  
  Wire.write(byte(0x90));  // LSB del Programmable Divider
  
  
  
  Wire.endTransmission();   

  delay(500);  
}

Grazie A te Guglielmo,

adesso comincero’ a studiare come implementarci un display LCD e qualche tasto per settare la frequenza di Lavoro voluta.

Grazie ancora. :grin:

Prova a guardare il datasheet che ti ho linkato io ... è molto più dettagliato e ti spiega come usare i 3 possibili indirizzi in più che può assumere quel chip.

Guarda in particolare pagina 6 ... dove, in funzione del valore su P3 (pin 10) puoi cambiare i bit MA0 e MA1 dell'indirizzo.

Buon lavoro !

Guglielmo

o.k. Grazie :D