Changement input ADMUX non pris en compte

Bonjour à tous,

La situation est simple: j'utilise le comparateur de l'Arduino UNO, avec comme référence une tension externe, et en negative input les pins analogiques reliés au multiplexeur ADMUX.

Je souhaiterais qu'une interruption du comparateur ne se produise qu'une fois sur une entrée. Pour ce faire, j'attribue au multiplexeur l'entrée A0, et dans l'interruption je la change pour A1. Cela ne change rien, à chaque passage en dessous ou au dessus de la valeur de référence, l'entrée A0 me déclenche une interruption.

Idéalement, l'interruption ne serait déclenchée qu'une fois, l'entrée A0 étant après virtuellement désactivée et remplacée par A1.

Voici du code:

bool Triggered;

void setup(){

//comparator setup  
  ACSR = 0x10; // ACI -> 1  clear interrupt flag
  ADCSRA = (0<<ADEN); // ADC disabled
  ADCSRB = (1<<ACME); // enable MUX for negative input 

  //set MUX input to A0
  ADMUX = (0 << MUX0);
  ADMUX = (0 << MUX1);
  ADMUX = (0 << MUX2);
  ADMUX = (0 << MUX3);

  //comparator interrupt on toggle
  ACSR = (0 << ACIS0);
  ACSR = (0 << ACIS1);
  ACSR = (1 << ACIE);


  Serial.begin(9600);
  Serial.println("Start");
  
  Triggered = false;

}


ISR (ANALOG_COMP_vect){
  Triggered = true;
  //set MUX input to A1
  ADMUX = (1 << MUX0);
  ADMUX = (0 << MUX1);
  ADMUX = (0 << MUX2);
  ADMUX = (0 << MUX3);
}


void loop(){
  if(Triggered){
    Serial.println("Triggered");
    Triggered = false;
  }
}

Une idée de la procédure à suivre pour régler ce problème?

hello
ton code fonctionne chez moi
le voici un peu "allégé"", mais c'est bien le tiens

bool Triggered;
void setup(){
//comparator setup 
  ACSR   = 0x10; // ACI -> 1  clear interrupt flag
  ADCSRA = (0<<ADEN); // ADC disabled
  ADCSRB = (1<<ACME); // enable MUX for negative input
  ADMUX  = (0 << MUX0);//AIN1=>A0
  ACSR   = (0 << ACIS0);//toggle
  ACSR   = (0 << ACIS1);//toggle
  ACSR   = (1 << ACIE);
  Serial.begin(115200);Serial.println("Start");
  Triggered = false;
}
ISR (ANALOG_COMP_vect){
  Triggered = true;
  ADMUX = (1 << MUX0);//AIN1=>A1
}
void loop(){
  if(Triggered){
    Serial.println("Triggered");
    Triggered = false;
  }
}

le moniteur

TRIGGERED.PNG

TRIGGERED.PNG

Bonjour,

Il y a un problème ici:

  ADMUX = (1 << MUX0);
  ADMUX = (0 << MUX1);
  ADMUX = (0 << MUX2);
  ADMUX = (0 << MUX3);

Tu écris 1 dans ADMUX puis tu écris 3 fois 0 dans ADMUX écrasant ainsi le 1

Il faut tout simplement écrire

  ADMUX = (1 << MUX0);

Si tu veux vraiment préciser explicitement que les autres bits sont à 0 tu peux écrire

  ADMUX = (1 << MUX0) | (0 << MUX1) | (0 << MUX2) | (0 << MUX3);

Mais ça ne sert pas à grand chose.

Merci à dfgh pour la réécriture du code.

Et merci à kamill également, l'erreur venait bien de là, j'ai appris quelque chose aujourd'hui!

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