Pages: [1]   Go Down
Author Topic: I2C & MsTimer2 BUG or not Bug ?  (Read 543 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 21
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

BOnjour,

Je viens de rencontrer un problème dont la raison m'échappe .
Je suis avec un Arduino Duemilanove ATmega328 et j'ai un bus I2C qui y est connecté.
Mon but est d'avoir des interruptions qui vont lire mes valeur sur le bus de façon régulière.

Pb, mon appli gèle des que j'utilise la fonction, dans l'interruption, Wire.endTransmissionde la lib Wire.h.

Pourriez vous me dire pourquoi ? Est un problème de timer qui utilisé par la gestion d'interruption et la gestion du bus I²C ? (juste une hypothèse donc je n'ai pas moyen de vérifier par faute de savoir où chercher)

Merci par avance,

Code:
#include <Wire.h>
#include <MsTimer2.h>
int ID_pcf=0;
int Id_an=0;
int Id_in=0;
int tmps=0;

int mesure[8];  // tab des dernieres mesures
int id_an=0;    // num entrée ana à lire

 
void setup()
{
 Wire.begin();
 Serial.begin(9600);
 Serial.println("Start Calibration");
 MsTimer2::set(400, myinterupt); // 500ms period
 MsTimer2::start();
}
void loop() {
 Serial.print(ID_pcf);
 Serial.print("\t id an= ");
 Serial.print(id_an);
 Serial.print(" \tmesure= ");
Serial.println(tmps);
 }

void myinterupt(){
 MsTimer2::stop() ;
 if  (id_an<4) ID_pcf= B1001001;
   else ID_pcf=B1001011;

 int Id_in=id_an%4;
 Wire.beginTransmission(ID_pcf);
 Wire.send(Id_in);
 // Wire.endTransmission();
 //Wire.requestFrom(ID_pcf, 8);
 //tmps++=Wire.receive();
 // mesure[id_an]=tmps;

if  (id_an==7) { id_an= 0;tmps++;}
   else {id_an ++;tmps++;}
MsTimer2::start();  
}
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 21
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai trouvé ca : "You can't use the I2C routines inside an interrupt service routine(ISR). This is because they use a timer that requires the interrupts to be running and inside an ISR interrupts are disabled."

Il semble que je suis obligé d'utiliser la lecture de mon I²C dans la boucle principale, non ?

Il y a combien de timer dans cet Atmega328 ?
Logged

Pages: [1]   Go Up
Jump to: