Salve
ho acquistato un potenziometro digitali DS1267 che devo usare in un progetto. Dal datasheet leggo che questo pot.ha un registro a 17 bit che deve essere scritto per settare il potenziometro. Sempre dal datasheet leggo che questi 17 bit devono essere trasmessi con questa sequenza:
1 bit 8 bit 8 bit
il primo bit dei 17 seleziona lo stack ovvero il potenziometro da usare (il DS1267 ne ha due nel suo interno)
il primo byte seleziona la posizione del wiper1 (il centrale che in pot. classico e comandato dall'alberino)
il secondo byte seleziona la posizione del wiper0
leggendo sul sito ho trovato la funzione che fa al mio scopo: shiftout. Il problema che non riesco a risolvere è questo: la funzione shiftout invia un byte di dati ma come fa per trasmettere un solo bit?
Qui si trova il datasheet:http://datasheets.maximintegrated.com/en/ds/DS1267.pdf.
Questo è il codice che ho scritto ma che non funziona:
// esperienza con potenziometro digitale DS1267 010
int clock=12;
int rst = 11;
int dq = 10;
byte stackSelect=B0; //0 1 soltanto il LSB di questo byte serve
byte wiper1=B01000000; //Wiper1-data
byte wiper0=B01000000; // Wiper0-data
void setup(){
// questi sono i pin che servono
pinMode (clock, OUTPUT);
pinMode (rst, OUTPUT);
pinMode (dq, OUTPUT);
}
void loop(){
digitalWrite(clock,LOW);
digitalWrite(rst,HIGH); // attiva la seriale
// serializza i 17 bit. La squenza è obbligatoria anche se si usa un solo potenziometro dei due
shiftOut(dq,clock,MSBFIRST,stackSelect); // primo byte (conta solo il LSB di questo bit)
shiftOut(dq,clock,MSBFIRST,wiper1); // seleziona la posizione del wiper1
shiftOut(dq,clock,MSBFIRST,wiper0); // seleziona la posizione del wiper 0
//ora i dati vengono scritti sul registro del potenziometro
digitalWrite(rst,LOW);
digitalWrite(rst, HIGH);
}
Qualcuno può aiutarmi a capire perchè non funziona?
Transmission of data always begins with the stack select bit followed by the potentiometer-1 wiper position value and lastly the potentiometer-0 wiper position value
Se mandi 24 Bit e i primi 7 bit vengono persi percui dovrebbe funzionare.
alla fine
digitalWrite(rst, HIGH);
non é necessariao; metti un delay(2000);
Descrivi di preciso cosa non funziona.
Il primo bit non seleziona il potenziometro da usare, ma collega un pin a uno dei 2 contatti mobili (wiper) dei 2 Potenziometri.
Ogni potenziometro ha i contatti L0, H0 e W0 ed L1, H1 e W1. Sout si collega a W0 o W1 a secondo del Bit "stack select bit". per l' uso normale (L0, H0 e W0) ed (L1, H1 e W1) non serve.
const int clock = 12;
const int rst = 11;
const int dq = 10;
byte stackSelect = 1; //1 o 2
byte wiper1 = 64; //Wiper1-data
byte wiper0 = 64; // Wiper0-data
void setup() {
// questi sono i pin che servono
DS1267begin(dq, clock, rst);
DS1267write(dq, clock, rst, stackSelect, wiper0, wiper1);
}
void loop() {
}
void DS1267begin(int dqpin, int clockpin, int rstpin)
{
pinMode (clockpin, OUTPUT);
pinMode (rstpin, OUTPUT);
pinMode (dqpin, OUTPUT);
digitalWrite(rst, LOW);
digitalWrite(clock, LOW);
digitalWrite(clock, LOW);
}
void DS1267write(int dqpin, int clockpin, int rstpin, byte potn, byte pot1, byte pot2)
{
digitalWrite(rstpin, HIGH); // attiva la seriale
// serializza i 17 bit. La squenza è obbligatoria anche se si usa un solo potenziometro dei due
// primo byte (conta solo il LSB di questo bit)
if (potn == 1)
digitalWrite(dqpin, LOW);
else
digitalWrite(dqpin, HIGH);
digitalWrite(clockpin, HIGH);
digitalWrite(clockpin, LOW);
// seleziona la posizione del wiper1
shiftOut(dqpin, clockpin, MSBFIRST, pot2);
// seleziona la posizione del wiper 0
shiftOut(dqpin, clockpin, MSBFIRST, pot1);
//ora i dati vengono scritti sul registro del potenziometro
digitalWrite(rstpin, LOW);
// digitalWrite(rst, HIGH);
}
se funziona si può trasformare in classe e poi in libreria.
Per adesso vi ringrazio, ma non funziona e mi spiego.
Ho individuato tre pin di Arduino ai quali ho collegato, secondo il datasheet, tre piedini dell'integrato che corrispondono a RST, CLOCK, DQ. Una volta caricato il programma vado a leggere la resistenza.
Tra i piedini H1 e L1 o tra H0 e L0 leggo il valore di 10k che corrisponde alla resistenza dei due integrati. Ma se vado a leggere la resistenza tra W1 e L1 o tra W1 e H1 non mi legge nulla, come se i wiper non fossero collegati.
A mio parere, se ho letto bene il datasheet, il primo byte seleziona quale potenziometro è selezionato mentre gli altri due il valore della resistenza ovvero la posizione del "contatto" centrale che determina il valore della resistenza. Chiaramente i valori letti tra il centrale e i due estremi sono complementari.