Comandare un PLL mb1502

Progetti Arduino
Rispondi
Avatar utente
iw3ims
Messaggi: 2
Iscritto il: mer 7 apr 2021, 19:13

Comandare un PLL mb1502

Messaggio da iw3ims »

Buon giorno
cerco aiuto per comandare un PLL mb1502 e relativo VCO con ARDUINO.
Io non sono molto esperto di programmazione e ho tentato con queste righe di programma.

SPI.begin ();

delay (5000);


digitalWrite(slaveSelectPin, LOW); // SS is pin 10
//const byte sequenza[35] ={0bS,R,R,R,R,R,R,R,R,R,R,R,R,R,R,C,N,N,N,N,N,N,N,N,N,N,N,A,A,A,A,A,A,A,0};
const byte sequenza[] = {0b1,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0};
for (int i=0; i<35; i++){
// SPI.transfer (sequenza);

// for (int i=35;i>=0; i--){
SPI.transfer (sequenza);
Serial.print (sequenza);
}
ho utilizzato le uscite 10,11,13
Ho provato anche la sequenza inversa manca mai!
il divisore R ,N ed A sono come da formula ma i risultati non arrivano.
Avatar utente
pgv
Messaggi: 393
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: Comandare un PLL mb1502

Messaggio da pgv »

Io non conosco la PLL in questione e non so a che serva la stringa di byte che si trova dentro sequenza, ma per trasferire quei byte uno alla volta sul bus SPI ci vuole qualcosina in piu'

Codice: Seleziona tutto

SPI.begin();
// La riga seguente seleziona un clock di 1MHz, la spedizione del bit piu' significativo per primo e "Modo 0" per il bus SPI
// Il "Modo 0" significa che il clock e' attivo alto e che la linea dati cambia sul fronte di discesa del clock mentre la "cattura" avviene sul fronte di salita
// Nei modi 1, 2 e 3 cambia o il livello attivo del clock o il fronte sul quale i dati cambiano e vengono catturati. Dipende dal dispositivo slave.
//  
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
Immagino che il pin slaveSelectPin sia stato dichiarato come output da qualche parte nel programma.

Quando vuoi spedire la sequenza di byte, puoi usare una variante di transfer():

Codice: Seleziona tutto

// Per trasferire un buffer offorre specificare il puntatore e la lunghezza
SPI.transfer(sequenza, 35);
oppure trasmettere un byte alla volta

Codice: Seleziona tutto

for (int i = 0; i < 35; i++) {
	returnByte = SPI.transfer(sequenza[i]);
}
Io pero' ho un dubbio amletico. Quelli che tu salvi come byte (e trasmetti come tali) a me sembrano tanto ma proprio tanto dei bit, ma i trasferimenti sul bus SPI sono sempre a multipli di 8 bit. Il fatto poi che non ce ne siano un multiplo intero di 8 mi induce a sospettare che il dispositivo NON abbia un bus SPI ma una semplice interfaccia seriale tipo uno shift register a ingreso seriale e uscita parallela internamente. In questo caso ti tocca fare un pochino di bit-banging, ossia manipolare le linee di clock e dati a mano:

Codice: Seleziona tutto

// Non so che modello di Arduino usi ne' che altro ci sia attaccato, quindi cambia opportunamente questi valori per favore...
#define slaveSelectPin 10
#define serialClockPin 11
#define serialDataPin 12

<omissis>

// Dichiariamo i tre pin come uscite
pinMode(slaveSelectPin , OUTPUT);
pinMode(serialClockPin , OUTPUT);
pinMode(serialDataPin , OUTPUT);

<omissis>

// Presumo che tu sappia quello che fai, e che la linea SS sia attiva bassa
digitalWrite(slaveSelectPin, LOW);
// Qui non ho idea ma spero che il clock sia attivo sul fronte di salita, altrimenti cambia...
digitalWrite(serialClockPin , LOW);

// E ora trasmettiamo un bit alla volta sulla linea dati, qualificandolo con un fronte di salita della linea clock
for (int i = 0; i < 35; i++) {
	digitalWrite(serialDataPin , sequenza[i]);	// Presentiamo sulla linea dati l'i-esimo bit
	digitalWrite(serialClockPin , HIGH);	// e presentiamo una sequenza ALTO-BASSO sulla linea clock per shiftare il bit
	delay(1);						// non ho idea di quanto tempo abbia bisogno il dispositivo, forse si puo' eliminare questa riga
	digitalWrite(serialClockPin , LOW);	// riportiamo il clock allo stato che spero sia inattivo
	delay(1);						// vedi sopra, magari non occorre dare tempo al PLL per "digerire" il bit precedente, magari si'
}
Prova un pochino a sostituire le chiamate a SPI con questo bit-banging, puo' richiedere aggiustaggi (il fronte del clock sul quale viene trasferito il livello della linea dati, il ritardo tra un fronte di selita e quello di discesa, il ritardo tra un bit e quello successivo...) ma sospetto che andra' meglio del codice che utilizza il bus SPI.
Avatar utente
iw3ims
Messaggi: 2
Iscritto il: mer 7 apr 2021, 19:13

Re: Comandare un PLL mb1502

Messaggio da iw3ims »

ti ringrazio degli spunti che mi hai dato e avanti con il motto che c'era scritto a caratteri cubitali su una scuola DI Bologna "PROVANDO E RIPROVANDO"
Avatar utente
pgv
Messaggi: 393
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: Comandare un PLL mb1502

Messaggio da pgv »

"Provando e riprovando" lo disse "per primo" Dante, e Galileo lo fece suo... Sei in buona compagnia!
Rispondi