Invio 17 bit a PLL

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 :smiley:
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 :smiley: però il tutto funziona, ora chiedo spunto a voi per farlo con un codice più pratico :smiley:
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 :grimacing:
grazie, dopo lo provo subito, proprio non mi era venuto in mente... A volte ci si impalla :smiley:

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 :wink:

Ovviamente 17 bit non entrano in una variabile a 16, ma il decimale 34400 sì... :smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.