Ciao,
stavo cercando di impostare su un chip PLL la frequenza, per fare ciò si usa invio seriale con clk, so e strobe, dal datasheet del chip (uPD2834C) sembrerebbe dover inviare 17 bit (non è tanto chiaro il datasheet)
So come inviare byte, ma o ne invio 2 o 3, e naturalmente non funziona, penso che voglia precisi 17 bit prima del comando strobe...
C'è un modo per inviare 17 bit? Oppure mi sono incartato ![]()
Allego il semplice programma di test
TEST_RADIO_U200.ino (1.2 KB)
Per cortesia, metti il programma nel messaggio, racchiudendolo in <CODE/>.
Ciao DATman,
è corto, posso anche metterlo quà esteso...
Comunque ho un aggiornamento, ho inviato bit per bit con un metodo abbastanza ortodosso
però il tutto funziona, ora chiedo spunto a voi per farlo con un codice più pratico ![]()
Ecco il codice funzionante:
#define OUT_Clock A0 // definisco pin chip uscite clock
#define OUT_ST A2 // definisco pin chip uscite strobe
#define OUT_Data A1 // definisco pin chip uscite dati
unsigned int DATO = 34400; // ci memorizzo dato da inviare
void setup()
{
Serial.begin(9600); // attiva la seriale arduino
pinMode(OUT_ST, OUTPUT); // imposto il pin come uscita
pinMode(OUT_Data, OUTPUT); // imposto il pin come uscita
pinMode(OUT_Clock, OUTPUT); // imposto il pin come uscita
digitalWrite(OUT_ST, LOW);
digitalWrite(OUT_Data, LOW);
digitalWrite(OUT_Clock, LOW);
Serial.println("comando PLL IC-U200T");
delay(1000);
InviaDato(); // chiama funzione invio dati
Serial.println("inviato");
}
void loop()
{
}
//************************** FUNZIONE INVIA DATO *************************
void InviaDato()
{
if (bitRead (DATO, 16) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 15) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 14) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 13) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 12) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 11) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 10) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 9) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 8) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 7) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 6) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 5) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 4) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 3) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 2) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 1) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
if (bitRead (DATO, 0) == 1) // se il bit 17 è 1
{
digitalWrite(OUT_Data, HIGH);
}
else // se il bit 17 è 0
{
digitalWrite(OUT_Data, LOW);
}
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
delayMicroseconds(12);
digitalWrite(OUT_ST, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_ST, LOW);
}
//************************************************************************
Sicuramente, solo per cominciare:
#define OUT_Clock A0 // definisco pin chip uscite clock
#define OUT_ST A2 // definisco pin chip uscite strobe
#define OUT_Data A1 // definisco pin chip uscite dati
unsigned int DATO = 34400; // ci memorizzo dato da inviare
void setup()
{
Serial.begin(9600); // attiva la seriale arduino
pinMode(OUT_ST, OUTPUT); // imposto il pin come uscita
pinMode(OUT_Data, OUTPUT); // imposto il pin come uscita
pinMode(OUT_Clock, OUTPUT); // imposto il pin come uscita
digitalWrite(OUT_ST, LOW);
digitalWrite(OUT_Data, LOW);
digitalWrite(OUT_Clock, LOW);
Serial.println("comando PLL IC-U200T");
delay(1000);
InviaDato(); // chiama funzione invio dati
Serial.println("inviato");
}
void loop()
{
}
void clock()
{
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
}
void InviaDato()
{
digitalWrite(OUT_Data, bitRead (DATO, 16));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 15));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 14));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 13));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 12));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 11));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 10));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 9));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 8));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 7));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 6));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 5);
clock();
digitalWrite(OUT_Data, bitRead (DATO, 4));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 3));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 2));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 1));
clock();
digitalWrite(OUT_Data, bitRead (DATO, 0));
clock();
delayMicroseconds(12);
digitalWrite(OUT_ST, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_ST, LOW);
}
Di conseguenza:
#define OUT_Clock A0 // definisco pin chip uscite clock
#define OUT_ST A2 // definisco pin chip uscite strobe
#define OUT_Data A1 // definisco pin chip uscite dati
unsigned int DATO = 34400; // ci memorizzo dato da inviare
void setup()
{
Serial.begin(9600); // attiva la seriale arduino
pinMode(OUT_ST, OUTPUT); // imposto il pin come uscita
pinMode(OUT_Data, OUTPUT); // imposto il pin come uscita
pinMode(OUT_Clock, OUTPUT); // imposto il pin come uscita
digitalWrite(OUT_ST, LOW);
digitalWrite(OUT_Data, LOW);
digitalWrite(OUT_Clock, LOW);
Serial.println("comando PLL IC-U200T");
delay(1000);
InviaDato(); // chiama funzione invio dati
Serial.println("inviato");
}
void loop()
{
}
void clock()
{
delayMicroseconds(12);
digitalWrite(OUT_Clock, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_Clock, LOW);
}
void InviaDato()
{
for(int8_t i=16; i>-1; i--)
{
digitalWrite(OUT_Data, bitRead (DATO, i));
clock();
}
delayMicroseconds(12);
digitalWrite(OUT_ST, HIGH);
delayMicroseconds(12);
digitalWrite(OUT_ST, LOW);
}
Già, il for ![]()
grazie, dopo lo provo subito, proprio non mi era venuto in mente... A volte ci si impalla ![]()
DATO però deve essere un long, o un unsigned long.
Perché? Unsigned int non usa 4 byte?
Dipende dall'architettura del micro. Per quello sarebbe meglio non usare unsigned int/long, ma uint16_t o unint32_t che sono uguali su ogni architettura. E int16_t o int32_t al posto di int e long.
Giusto, grazie ![]()
Ovviamente 17 bit non entrano in una variabile a 16, ma il decimale 34400 sì... ![]()
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.