DAC8512

Olá a todos!

Estou tentando mandar dados para o dac, numero a numero de dois contadores de 0 a 4088, para cada dac. Inicialmente, estava com problema porque a rampa estava quebrando no meio, o que acontecia era que quando eu usava o digitalWrite com Chip select do arduino, ele interpretava como clock(vi isso no ‘‘FUNCTIONAL BLOCK DIAGRAM’’ no datasheet do arduino(link aqui embaixo)),e isso deslocava os bits, como se multiplicasse por dois, mas o dac não suporta um numero maior que 4095,quebrando a rampa. Tirado o Chipselect(CSE-chip select da rampa externa), tudo ficou ok. Até que tive que passar da rampa externa para interna(onde uso o chipselect). E advinha só! o mesmo probleminha a me atormentar… Alguém teria alguma ideia de como contornar isso?

Segue abaixo o codigo e o datasheet:

int MAX=4088, MIN=0, n=0, ld=12 , clk=11 , data=10, cse=8, csi=9,clr=13, pulse= 7, cursor1 = A0 , cursor2=A1,  P1, P2,  minimum=20,button=6,statebutton,maximo=0,i=0;
boolean  E=0,C;
/*'E' é uma variavel qualquer:
E=0, indica que a rampa esta subindo;
E=1, indica que a rampa esta descendo;
ld= latchpin;
clk=clockpin;
data=datapin;
cse=chipselect da rampa externa;
csi=chipselect da rampa interna;
clr=clear;
C=condição para o pulso;
i= número que indica a medida(que vai de 0 à 39)
M= pino em que são realizadas as medidas
medida[40]=vetor com o total de medidas*/

void setup() {
  // put your setup code here, to run once:
  pinMode(ld, OUTPUT);
  pinMode(clk, OUTPUT);
  pinMode(data, OUTPUT);
  pinMode(csi,OUTPUT);
  pinMode(cse,OUTPUT);
  pinMode(cursor1, INPUT);
  pinMode(cursor2, INPUT);
  pinMode(pulse, OUTPUT);
  pinMode(button,INPUT_PULLUP);
  digitalWrite(clr, LOW);
  digitalWrite(clr, HIGH);
  digitalWrite(ld, HIGH);
  digitalWrite(cse,LOW);
  digitalWrite(csi,HIGH);
  
}

void loop() {
rampe();//entra na rampa externa
statebutton=digitalRead(button);//lê botão
if(statebutton==LOW){//se botão é pressionado, manda P1 e entra na rampa interna
  shiftOut(data, clk, MSBFIRST, (P1 >> 8));  
  shiftOut(data, clk, MSBFIRST, P1);
  digitalWrite(ld, LOW);
  digitalWrite(ld, HIGH);
  digitalWrite(cse,HIGH);
  digitalWrite(csi,LOW);
  rampi();
}
}

void rampe(){
P1 = 4*analogRead(cursor1);
P2 = analogRead(cursor2);//leitura dos indicadores de posição e largura
if(P2 <= minimum){//verifica uma largura mínima para P2
  
P2 = minimum;

}

if(P1-P2/2<=MIN){//Posição mínima para P1

  P1 = P2/2;
  
}

if(P1+P2/2>=MAX){//posição máxima para P1

  P1 = MAX-P2/2;

}

C = n>=P1-P2/2 && n<=P1+P2/2 && E==0;//condição de existencia do cursor

  if(C==1){//se cursor existe, manda um pulso
    digitalWrite(pulse, HIGH);
  }
  if(C==0){
    digitalWrite(pulse, LOW);
  }
  if(E==0){
    n=n+8;
    }
  else{
    n=n-8;
    }
  if(n==MAX){
    E = 1;
    }
  if(n==MIN){
    E = 0;
    }//contador (se E=1, rampa desce, se E=0 ela sobe)
    
  shiftOut(data, clk, MSBFIRST, (n >> 8));  
  shiftOut(data, clk, MSBFIRST, n);
  digitalWrite(ld, LOW);
  digitalWrite(ld, HIGH);
  //manda os dados para o DAC
  
}
void rampi(){
  while(statebutton==LOW){
    statebutton=digitalRead(button);
  }
  delay(10);
  while(statebutton==HIGH){
  if(E==0){
    n=n+100; 
    }
  else{
    n=n-100;
    }
  if(n>=MAX){
    E = 1;
    }
  if(n==MIN){
    E = 0;
    }//mesmo contador da rampa externa
  shiftOut(data, clk, MSBFIRST, (n >> 8));  
  shiftOut(data, clk, MSBFIRST, n);
  digitalWrite(ld, LOW);
  digitalWrite(ld, HIGH);//mandando dados
}
  while(statebutton==LOW){
    statebutton=digitalRead(button);
  }
  digitalWrite(csi,HIGH);
  digitalWrite(cse,LOW);
}

e aqui está o datasheet do DAC:

Não percebo o problema... parece que já o resolveste uma vez, logo o que te impede de resolver agora?