Variáveis supostamente pegando valores aleatórios não intencionalmente

Olá a todos do fórum. Estou criando um código com dois contadores, indo de 0 à 4088, criando uma função triangular no osciloscópio. Neles, há o ponteiro(que no código é a variavel P1) e sua largura(variável P2). Inicialmente aparece apenas um dos contadores e o ponteiro. Ao clicar o botão, aparece o próximo contador e o ponteiro deveria estar no mesmo lugar, o que não acontece. O ponteiro lê o valor determinado pelo potenciômetro, mas mesmo quando eu coloquei um valor fixo, ele altera sua posição aleatoriamente, como se mudasse de valor repentinamente. Segue o código:

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, C, minimum=20,button=6,statebutton;
boolean E=0;
/*'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;*/

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);
  
}

void loop() {
  digitalWrite(cse,LOW);
  digitalWrite(csi,HIGH);//o dac da ''rampa externa'' recebe os valores de n 
rampe();
statebutton=digitalRead(button);
if(statebutton==LOW){
  digitalWrite(cse,HIGH);
  digitalWrite(csi,LOW);//o dac da ''rampa interna'' recebe os valores de n
  rampi();
}
}

void rampe(){
P1 = 4*analogRead(cursor1);
P2 = analogRead(cursor2);//ambos ponteiros leem o valor dos potenciômetros
if(P2 <= minimum){
P2 = minimum;
}

if(P1-P2/2<=MIN){
  P1 = P2/2;  
}

if(P1+P2/2>=MAX){
  P1 = MAX-P2/2;
}

C = n>=P1-P2/2 && n<=P1+P2/2 && E==0;

  if(C==1){
    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;
    }
    
  shiftOut(data, clk, MSBFIRST,(n>>8));  
  shiftOut(data, clk, MSBFIRST, n);
  digitalWrite(ld, LOW);
  digitalWrite(ld, HIGH);
}
void rampi(){
  E=0;
  n=0;
  boolean CB=0; //CB=condição do botão.
  while(CB==0){
    //até aqui, ao meu entender, P1 e P2 não mudaram seu valor e consequentemente o cursor deveria estar na mesma posição
C = n>=P1-P2/2 && n<=P1+P2/2 && E==0;

  if(C==1){
    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;
    }
    
  shiftOut(data, clk, MSBFIRST, (n >> 8));  
  shiftOut(data, clk, MSBFIRST, n);
  digitalWrite(ld, LOW);
  digitalWrite(ld, HIGH);
  statebutton=digitalRead(button);
    if(statebutton==LOW){
      CB=1;
    }
  }
  }

P1 e P2 não são ponteiros… são variáveis do tipo int.

Estes pedaços devem sempre ser colocados com parentesis…

if((P1-P2)/2<=MIN){ // ou if(P1-(P2/2)<=MIN)
  P1 = P2/2; 
}

if((P1+P2)/2>=MAX){// ou if(P1+(P2/2)>=MAX)
  P1 = MAX-P2/2;
}

Outra coisa a ter em atenção é que o conversor analógico digital raramente te dá o mesmo valor. Vai sempre variar entre um ou dois pontos ou por vezes até mais. Uma maneira para dar a volta a isso seria fazeres uma média dos valores em vez de apenas uma leitura.

O que eu acho ser o teu problema é que tu tens duas funções a escrever na mesma variável mas apenas seleccionas uma… ou seja:

  digitalWrite(cse,LOW);
  digitalWrite(csi,HIGH);//o dac da ''rampa externa'' recebe os valores de n
rampe();  //Esta função é chamada sempre, quer tu tenhas seleccionado a rampa interna ou externa. 
statebutton=digitalRead(button);
if(statebutton==LOW){
  digitalWrite(cse,HIGH);
  digitalWrite(csi,LOW);//o dac da ''rampa interna'' recebe os valores de n
  rampi();  // esta é chamada apenas se o botão tiver sido accionado, mas a função rampe() é sempre chamada na mesma. 
}

Eu havia colocado um ‘‘while’’ dentro da função ‘‘rampi’’ para evitar que a rampa externa fosse chamada quando eu entrasse na rampa interna. Quanto ao dac me dar valores diferentes, eu não sabia disso. kkk Quer dizer que quando eu vou de uma função à outra os valores das variáveis são alterados no outro dac? Não entendi o que você quis dizer com fazer a média dos valores. Obrigado pela atenção!

Não seria melhor fazer algo como:

if(statebutton==LOW){
  digitalWrite(cse,HIGH);
  digitalWrite(csi,LOW);//o dac da ''rampa interna'' recebe os valores de n
  rampi();  // esta é chamada apenas se o botão tiver sido accionado, mas a função rampe() é sempre chamada na mesma.
} else {
  rampe(); 
}

Assim garantes que apenas uma função “mexe” com essas variáveis.

Sim, o conversor analógico tanto pode dar 700, como 696, como 704. Isto depende de muitas coisas sobre as quais não me vou estender, e tu podes ver isso por ti próprio também.

Se fizeres algo como:

unsigned int count = 0; 
int average = 0; 
unsigned char i = 0; 

for (i = 0; i < 10 ; i++)
   count += analogRead(pino); 

average = count/10; 

// a variável average contém uma média de 10 leituras do pino analógico "pino". Este valor será mais estável do que apenas um valor lido.

Podes experimentar isto com um sketch e comparar os resultados… Diz se pretendeste e se resolveu o problema.