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.
Comandare un PLL mb1502
Re: Comandare un PLL mb1502
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'
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():
oppure trasmettere un byte alla volta
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:
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.
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));
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);
Codice: Seleziona tutto
for (int i = 0; i < 35; i++) {
returnByte = SPI.transfer(sequenza[i]);
}
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'
}
Re: Comandare un PLL mb1502
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"
Re: Comandare un PLL mb1502
"Provando e riprovando" lo disse "per primo" Dante, e Galileo lo fece suo... Sei in buona compagnia!
Re: Comandare un PLL mb1502
Ciao, nel 2001 ho realizzato la radio per la mia macchina e nel sintonizzatore ho usato l'MB1502, ho usato un Pic16F84 per la completa gestione e se occorre posso fornire parte del software per dialogare/gestire il PLL ma l'ho scritto in asm.
Ross
Ross