Go Down

Topic: MCP4922 arduino et signal clock (Read 1 time) previous topic - next topic

Artouste

Bonjour
pour un ami qui veut retrofiter souplement et simplement  des équipements commandés en 0/10V
je suis parti sur mes fonds de tiroirs , j'ai des MCP4922 à la pelle et c'est toujours suivi
Pour l'amplification 0-->5 vers 0--->10 je sais (encore) faire  :smiley-mr-green:

n'ayant pas voulu réinventer la "poudre" , je suis parti à la recherche et je suis tombé
là dessus

http://stevewoodward.posterous.com/using-a-mcp4922-dac-with-an-arduino-to-contro

et sur ça
http://mrbook.org/downloads/arduinosx150/SX150Driverarduino.pde

au moins pour test :
pas de lib et du facilement "tripotable"  8)


ça fonctionne bien , qq test de vitesse/récurrence  à faire avec le code derivé en bas de page
Mais par curiosité et tres humblement, je ne vois pas où dans ce code simple la clock (transition) SPI est gérée ?
ça doit etre parfaitement trivial, mais si un des petits genies du code veulent bien m'eclairer, j'accepte toutes lumieres  8)
J'imagine du bitwise , mais je ne vois pas où ?

Pour info : j'ai testé pour levée de doute en déconnectant pin13 = "çamarchpu"  :D

Code: [Select]
#define DATAOUT 11//MOSI
//#define DATAIN 12//MISO - not used, but part of builtin SPI
#define SPICLOCK  13//sck
#define SLAVESELECT 10//ss

void setup()
{
  byte clr;
  pinMode(DATAOUT, OUTPUT);
// pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
  digitalWrite(SLAVESELECT,HIGH); //disable device
 
  SPCR = (1<<SPE)|(1<<MSTR);
  clr=SPSR;
  clr=SPDR;
  //delay(10);


}

void write_value(uint16_t sample)
{
  uint8_t dacSPI0 = 0;
  uint8_t dacSPI1 = 0;
  dacSPI0 = (sample >> 8) & 0x00FF;
  dacSPI0 |= 0x10;
  dacSPI1 = sample & 0x00FF;
  digitalWrite(SLAVESELECT,LOW);
  SPDR = dacSPI0;                    // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
 
  SPDR = dacSPI1;
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  }; 
  digitalWrite(SLAVESELECT,HIGH);
  //delay(5);
}

void playNote(int incomingByte)
{
  int diff = 0;
 
 
  //---------
  for (diff=0; diff <= 4095; diff++){
   // write_value (405) ; // 0 --->4095 12 bits  405=1.00V 
   write_value (diff) ; // 0 --->4095 12 bits  405=1.00V 
      //delay(1); run OK avec Voltmetre ana et num , signal à tester à l'oscillo
      delayMicroseconds(200); //run ok mais met les Voltmetres ana et digital dans les choux, pas etonnant = oscillo a faire
   }


}
//void noteOff()
//{
//  write_value(0);
//}
int incomingByte = 0;

void loop()
{
 
         playNote(incomingByte);
   
}





Gaxil

Bonjour,

La clock SPI sur la pin 13 est active à partir du moment où le SPI Control Register a le bit MSTR à 1, c'est à dire là :

Code: [Select]
SPCR = (1<<SPE)|(1<<MSTR);


Artouste


Bonjour,

La clock SPI sur la pin 13 est active à partir du moment où le SPI Control Register a le bit MSTR à 1, c'est à dire là :

Code: [Select]
SPCR = (1<<SPE)|(1<<MSTR);



hé bien voilà ! , merci , je me doutais bien qu'il y avait du bitwise qq part  :smiley-mr-green:

mais qu'est ce que l'on perd comme temps en formalités  :smiley-mr-green:
[HUM]
à 2.30"
http://www.youtube.com/watch?v=WoTNn1fMVAA

Go Up