interruption soft avec un atmega2560

Bonjour, jusqu'à présent j'utilisais des ATMéga 328P et dans certains croquis je réalisais des interruptions "soft" en utilisant MsTimer2.H

Dans le setup j'initialisais:

// initialisation interruption Timer 2
MsTimer2::set(500, InterruptTimer2); // période 500ms

puis

void InterruptTimer2() { // debut de la fonction d'interruption Timer2
Clignotant =! Clignotant;
(Clignotant == true) ? digitalWrite(LEDR, HIGH ) : digitalWrite(LEDR, LOW );
}

/*********************************

  • Determinations des défauts *
    **********************************/
    if (Defaut >0 ) {
    MsTimer2::start(); // active Timer
    }else {
    MsTimer2::stop(); // stop Timer
    }

Cela fonctionne très bien avec le 328P mais pas sous l'ATMega 2560.
Ne décodant pas le grand breton je n'ai pas trouvé dans le datasheet...

Si quelqu'un peut me dire quoi faire pour le 2560 je lui en serais TRES reconnaissant.

Sur la toile jusqu'à présent je n'ai pas Encore trouvé...

Merci de votre aide.

Bonjour,

MsTimer2 fonctionne sans problème sur une Mega2560.

Mets ton programme en entier (entre balises).

bonsoir merci de ta réponse mon programme fait 28Ko demain je vais extraire la partie interruption pour faire clignoter ma led sur apparition d un défaut comme dans le “gros”. Puis je le ferai tourner sut un ATM328 et ensuite sur l’ATM2560 pour voir si ca tourne…il est vrai que lorsque je compile je n’ai pas d’erreur en 2560… pourtant la sortie LED est bien modifiée puisque je l’appelle dans le setup de la manière suivante:
for (byte i = 0; i <= 5; i++)// 5 clignotements pour dire que le µP a démarré.
{
digitalWrite(LEDR, 1);
delay(100);
digitalWrite(LEDR, 0);
delay(100);

merci et à demain.

Bonsoir, pouvez vous me dire dans quelles projet et conditions peut on utiliser interrpTimer2. Je ne connaît pas cette fonction ? ::slight_smile:

bonjour lorsque je charge:

//essai timer2
#include <MsTimer2.h> // inclusion de la librairie Timer2

const int LED1= 13; //declaration constante de broche 

int Clignotant           = 0;


void setup() {
pinMode(LED1, OUTPUT); //met la broche en sortie 

// initialisation interruption Timer 2
  MsTimer2::set(500, InterruptTimer2); // période 500ms 
  MsTimer2::start(); // active Timer 2 
}


void InterruptTimer2() { // debut de la fonction d'interruption Timer2
Clignotant =!Clignotant;
  digitalWrite(LED1, Clignotant);
  }
void loop() {
  // put your main code here, to run repeatedly:

}

ca fonctionne.
Lorsque je charge

//essai timer2
#include <MsTimer2.h> // inclusion de la librairie Timer2

const int LED1= 13; //declaration constante de broche 
#define BPLCDON                       A0//PE5
int Clignotant           = 0;


void setup() {
pinMode(LED1, OUTPUT); //met la broche en sortie 
pinMode(BPLCDON, INPUT_PULLUP);
// initialisation interruption Timer 2
  MsTimer2::set(500, InterruptTimer2); // période 500ms 
  
}


void InterruptTimer2() { // debut de la fonction d'interruption Timer2
Clignotant =!Clignotant;
  (Clignotant == true) ? digitalWrite(LED1, HIGH )  : digitalWrite(LED1, LOW );
  }
void loop() {
  if (digitalRead(BPLCDON)== LOW) {
  
    MsTimer2::start(); // active Timer
  }else {
   
    MsTimer2::stop(); // stop Timer
  }

}

ca ne fonctionne pas alors qu’avec la même philosophie dans mon “gros” programme de 28Ko sous 328 ca fonctionne.
Je ne comprends pas.
Merci de l’aide.

Quand tu appuies sur le bouton tu réinitialise le timer en permanence avec start() -> le timer n'avance pas.

Il ne faut démarrer le timer que si celui ci n'est pas déjà démarré

void loop() {
  static bool isStarted = false;
  if (digitalRead(BPLCDON) == LOW) {
    if (!isStarted)
    {
      MsTimer2::start(); // active Timer
      isStarted = true;
    }
  } else {
    if (isStarted)
    {
      MsTimer2::stop(); // stop Timer
    }
    isStarted = false;
  }
}

ok je regarde mais bizarre dans mon croquis 328 je fais

  if (Defaut >0 ) {
    MsTimer2::start(); // active Timer
  }else {
    MsTimer2::stop(); // stop Timer
  }

et ca fonctionne alors?..
merci je te dis le résultat

Oui, ça fonctionne, mais il ne faut démarrer le timer que si celui ci n'est pas déjà démarré.

Il faut faire quelque-chose du genre

  static bool isStarted = false;
  if (Defaut > 0 ) {
    if (!isStarted)
    {
      MsTimer2::start(); // active Timer
      isStarted = true;
    }
  } else {
    if (isStarted)
    {
      MsTimer2::stop(); // stop Timer
      isStarted = false;
    }
  }

OK j’ai fais la modif:

#include <MsTimer2.h> // inclusion de la librairie Timer2
#define BPLCDON                       3//PE5          
#define LEDR                           13//PH3            
boolean MemoireBPON      = 0;   // mémoriser l'appui sur BP.
int Clignotant           = 0;


void setup() {
  Serial.begin(115200);
 pinMode(BPLCDON, INPUT_PULLUP);
 pinMode(LEDR, OUTPUT); digitalWrite(LEDR, LOW);
  for (byte i = 0; i <= 5; i++)// 5 clignotements pour dire que le µP a démarré.
  {
   digitalWrite(LEDR, 1);
   delay(100);
    digitalWrite(LEDR, 0);
    delay(100);
  }
  // initialisation interruption Timer 2
  MsTimer2::set(500, InterruptTimer2); // période 500ms 

}

void InterruptTimer2() { // debut de la fonction d'interruption Timer2
 Clignotant =! Clignotant;
 (Clignotant == true) ? digitalWrite(LEDR, HIGH )  : digitalWrite(LEDR, LOW ); 
  }

  void Gestiondesdefauts()
{
/*********************************
*   Determinations  des défauts  *
**********************************/
  if (MemoireBPON ==1 ) {
    MsTimer2::start(); // active Timer
  }else {
    MsTimer2::stop(); // stop Timer
  }
}



void loop() {
   if (digitalRead(BPLCDON)== LOW)  {        
              MemoireBPON  = 1;
   }else{
    MemoireBPON =0;
   }
  Serial.print("MemoireBPON   "); Serial.println(MemoireBPON); 
  Gestiondesdefauts();

}

ce code fonctionne dans un ATM328 mais pas dans le MEGA2560…

Confirmé par la modif dans mon prog de 28Ko qui ne fonctionne pas.
Mais je ne comprends toujours pas pourquoi ca fonctionne dans le 28Ko dans mon 328P.
Merci

Heu... je ne vois pas de modif. start() est toujours appelé si le timer est déjà démarré.

tu dois faire allusion à:

 void Gestiondesdefauts()
{
/*********************************
*   Determinations  des défauts  *
**********************************/
  if (MemoireBPON ==1 ) {
    MsTimer2::start(); // active Timer
  }else {
    MsTimer2::stop(); // stop Timer
  }
}

mais il n’est pas appelé (erreur de transcription).

voici le dernier cru qui fonctionne sur 328P mais toujours pas sur mega2560 pourtant MsTimer2::Start(); s’execute bien une seule fois dans le 2560 mais n’allume pas la LED

#include <MsTimer2.h> // inclusion de la librairie Timer2
#define BPLCDON                       3//PE5          
#define LEDR                           13//PH3            
boolean MemoireBPON      = 0;   // mémoriser l'appui sur BP.
int Clignotant           = 0;


void setup() {
  Serial.begin(115200);
 pinMode(BPLCDON, INPUT_PULLUP);
 pinMode(LEDR, OUTPUT); digitalWrite(LEDR, LOW);
  for (byte i = 0; i <= 5; i++)// 5 clignotements pour dire que le µP a démarré.
  {
   digitalWrite(LEDR, 1);
   delay(100);
    digitalWrite(LEDR, 0);
    delay(100);
  }
  // initialisation interruption Timer 2
  MsTimer2::set(500, InterruptTimer2); // période 500ms 

}

void InterruptTimer2() { // debut de la fonction d'interruption Timer2
 Clignotant =! Clignotant;
 (Clignotant == true) ? digitalWrite(LEDR, HIGH )  : digitalWrite(LEDR, LOW ); 
  }



void loop() {
  static bool isStarted = false;
  if (digitalRead(BPLCDON) == LOW) {
    if (!isStarted)
    {
      MsTimer2::start(); // active Timer
      isStarted = true;
    }
  } else {
    if (isStarted)
    {
      MsTimer2::stop(); // stop Timer
    }
    isStarted = false;
  }
}

Chez moi ça fonctionne sans problème sur une mega2560.

tu as "grimpé" mon programme dans un 2560??.
Moi je viens de le faire sur une carte MEGA2560 (mon prog 28Ko est sur un MEGA 2560 PROMINI de chez robotdyn)....
et ca ne fonctionne pas ilmanque peut être une commande dans le setup pour "débloquer" le timer??

J'ai testé le 2eme programme de ton post #10, c'est ok sur une carte mega2560.

OK JE NE COMPRENDS PAS Lorsque je charge ce croquis dans ma carte ATM2560 le setup s’execute bien ( 5 flashs comme programmé) ensuite que je mette l’entrée 3 a 1 ou 0 ca ne fonctionne pas.
quelle carte utilises tu?..

voici la photo de la mienne

mega2560.JPG

en revanche celui-ci fonctionne…

/*
 * Clignotement d'une DEL (LED en anglais) à 1 Hz par timer 2.
 */
const byte Led = 13; // Pour utiliser la LED du module
#define LedToggle digitalWrite (Led, !digitalRead(Led))
#define BPLCDON                       3//PE5 

  
void setup ()
{
  pinMode (Led, OUTPUT);
  bitClear (TCCR2A, WGM20); // WGM20 = 0
  bitClear (TCCR2A, WGM21); // WGM21 = 0 
  TCCR2B = 0b00000110;      // Clock / 256 soit 16 micro-s et WGM22 = 0
  TIFR2 = 0b00000001;       // TOV2
  TCNT2 = 256 - 250;        // Chargement du timer à 6
 for (byte i = 0; i <= 5; i++)// 5 clignotements pour dire que le µP a démarré.
  {
   digitalWrite(Led, 1);
   delay(100);
    digitalWrite(Led, 0);
    delay(100);
  }
  
}
 
byte varCompteur = 0; // La variable compteur
 
void loop () {
  if (digitalRead(BPLCDON)== LOW)  {    
  if (bitRead (TIFR2, 0) == 1) {       // Flag TOV2 mis à 1 ?
    TCNT2 = 256 - 250;         // Rechargement du timer à 6
    bitSet (TIFR2, TOV2);      // Remise à zéro du flag TOV2 (voir texte)
    if (varCompteur++ > 64) { // Incrémentation et a atteint 125 ?
      varCompteur = 0;         // On recommence un nouveau cycle
      LedToggle;             // Inversion de la LED
    }
  }
  }
  
}

J’en perds mon latin…
t’as une idée?.
Merci de ton aide!;

Une photo de ma carte
mega.jpg

mega.jpg

c'est la même alors je ne comprend pas....

Quand je teste ton programme en #15, la led clignote environ toutes les secondes quand je n'appuie pas sur le poussoir et clignote plus vite quand j'appuie sur le poussoir.

AIRPOPCIE:
c'est la même alors je ne comprend pas....

Ce n'est pas tout à fait la même, il n'y a pas le même interface usb-serie, mais ça n'a vraiment rien à voir.