Pages: [1]   Go Down
Author Topic: Uno Chrono Interupt  (Read 482 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,
je suis sur un problème.  Un uno avec un LCD03 (i2c), 2BP, 1led

Pour le cablage tout est ok.  J'aimerai faire un chronomètre qui démarre avec le BP0 (en I2) et qui se termine avec le BP1(en I3).  Le tout géré par des interruptions.

Code:
#include <MsTimer2.h> // inclusion de la librairie Timer2
#include <Wire.h>
#define adresseLcd 0x63               //adresse lcd03

const int LED=4; //declaration de la led
const int BtStart = 0; // Interrupt 0 est sur la pin 2
const int BtStop = 1; // Interrupt 0 est sur la pin 3
int Timer1, Timer2, TimerVal = 0;

void setup() 
 {
  Serial.begin(9600);
 
  pinMode(LED, OUTPUT); //met la broche en sortie
  MsTimer2::set(1000, InterruptTimer2); // période 1000ms
  MsTimer2::start(); // active Timer 2

  attachInterrupt(BtStart, vStart, RISING); // attache l'interruption externe n°0 à la fonction vStart
  attachInterrupt(BtStop, vStop, RISING); // attache l'interruption externe n°1 à la fonction vStart

  Wire.begin();
  Wire.beginTransmission(adresseLcd);
  Wire.write((byte)(0x00)); //null
  Wire.write((byte)(0x01)); //go home
  Wire.write((byte)(0x13)); //turn on backlight
  Wire.write((byte)(0x0C)); //clear screen
  Wire.write("En attente...");
  Wire.endTransmission();
//c' est uniquement cela qui restera affiché...
}
void loop(){ // debut de la fonction loop()


}
void write2i2c ( )
{
  Serial.println("1er Passage");
  //Wire.begin();
  Wire.beginTransmission(adresseLcd);
  Wire.write((byte)(0x00)); //null
  Wire.write((byte)(0x01)); //go home
  //Wire.write((byte)(0x0C)); //clear screen
  Wire.write("1er Passage");
  Wire.endTransmission();
 
}

void InterruptTimer2() { // debut de la fonction d'interruption Timer2
  digitalWrite(LED, HIGH);
  delayMicroseconds(10000); // la fonction delayMicroseconds ne bloque pas les interruptions
  digitalWrite(LED, LOW);
  TimerVal +=1;
  Serial.println(TimerVal);
//dans mon com j'ai bien les valeurs
}

void vStart() // la fonction appelée par l'interruption externe n°0   BP start
{
  TimerVal =0;
  write2i2c();
}
void vStop() // la fonction appelée par l'interruption externe n°1  BP stop
{
  Timer1 = TimerVal;
  Serial.println(Timer1);
}

Sauf que quand j'appuie sur le BP0, le programme se fige.  Ou est le problème?  Faudrait-il mettre les interruptions en disable?

Merci
Maxmax
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

delayMicrosecond ne bloque peut être pas les interruptions mais comme tu es déjà dans une routine de traitement d'interruption elles sont masquées.
Il serait largement préférable de lever un drapeau et de le traiter le comportement de la LED dans loop.
Même chose pour le write2i2c qui est exécuté sous interruption
De manière générale sous interruption on positionne des drapeaux, on initialise des variables. Les traitements plus long, les communications sont gérées à temps perdu dans la boucle principale lorsqu'un drapeau particulier est détecté.
Penser à déclarer volatile les variables modifiées dans les routines de traitement d'interruption
« Last Edit: December 18, 2012, 02:29:00 am by fdufnews » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok,
je vois le principe.  Je devrais donc surtout déclarer les flags comme volatiles.
Je vais un peu me renseigner la dessus.

Merci pour la réponse

Max
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3171
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

De mémoire l'i2c ne fonctionne tout simplement pas pendant une interruption.
Logged


France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

De mémoire l'i2c ne fonctionne tout simplement pas pendant une interruption.
La librairie Wire (qui cache en réalité la librairie Twi) travaille en utilisant des interruptions et des buffers, donc pas d'I2C dans une interruption.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui je m'en suis rendu compte
mais fdufnews m'a rappelé les vieux principes des ucontroleurs
trop pris l'habitude avec les languages haut niveau ;-)

2 problèmes et 2 solutions avec le forum

Merci
Logged

Pages: [1]   Go Up
Jump to: