Deuligne et interruptions

Forum spécifique au shield Deuligne

Deuligne et interruptions

Message non lude john_lenfr » Ven 25 Jan 2013 08:54

J'ai un problème de fonctionnement de mon programme quand j'essaie d'utiliser les interruptions avec le Deuligne.

Ci joint mon code :
Code: Tout sélectionner
#include "Wire.h"
#include <Deuligne.h>
#include <Button.h>

#define SWI 2 // Intr 0 = Pin 2
#define CHA 6
#define CHB 7
#define REDLED 13

// initialize the library with the numbers of the interface pins
Deuligne lcd;

// valeur determinee par la rotation de l'encodeur
int encoderPos = 0;
// precedente position de A
int previousStatus = LOW;
// etat actuel de A
int currentStatus = LOW;
// etat actuel de S
int S = HIGH;
// position du servomoteur (angle)
int servoPos = 90;

//create a SWI object at pin 2
/*
|| Wiring:
|| GND -----/ ------ pin 2
*/
Button button = Button(SWI,PULLUP);

void setup()
{
  pinMode(CHA, INPUT);
  pinMode(CHB, INPUT);
  pinMode(SWI, INPUT);
  pinMode(REDLED,OUTPUT); //debug to led 13
 
  Wire.begin(); // join i2c bus (address optional for master)
  lcd.init(); // initialisation du panneau LCD (obligatoire)
 
  // print a welcome message
  lcd.clear();
  lcd.print("*** WELCOME! ***");
  lcd.setCursor(0,1);
  lcd.print("Initializing");
 
  attachInterrupt(0, menu, FALLING);
 
}

void loop()
{
 
  lcd.setCursor(0, 0);
  checkValue();
  lcd.print(encoderPos);
 
  /*if(button.isPressed()){
   digitalWrite(13,HIGH);
  }else{
   digitalWrite(13,LOW);
  }*/
}

void checkValue()
{
  // on regarde ce qu'on recoit sur la pin A de l'encodeur
  currentStatus = digitalRead(CHA);
  // si on a un front montant (passage de LOW a HIGH)
  if ((previousStatus == LOW) && (currentStatus == HIGH))
  {
    // on regarde l'etat de B pour connaitre le sens :
    if (digitalRead(CHB) == HIGH)
    {
      encoderPos++;
    }
    else
    {
      encoderPos--;
    }
  }
  // on reinitialise prevA pour le prochain tour
  previousStatus = currentStatus;
}


void menu() {
  /*int selected = 3;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Turn the knob to");
  lcd.setCursor(0,1);
  lcd.print("select an option");*/
  digitalWrite(13,HIGH);
 
  lcd.clear();
  delay(2000);
  // display options
  /*while (!button.isPressed()) {
    selected += encoderPos;
    if (selected<0) selected=3;
    if (selected>3) selected=0;
    if (moved) {
      lcd.clear();
      lcd.setCursor(0,0);
      switch(selected) {
        case 0:
          lcd.print("Change Units    ");
          break;
        case 1:
          lcd.print("Backlight On/Off");
          break;
        case 2:
          lcd.print("Logging On/Off  ");
          break;
        case 3:
          lcd.print("Exit Settings   ");
          break;
      }
    }
  }
  // when button is pressed...
  lcd.clear();
  switch(selected) {
    case 0:
      settingsChangeUnits();
      break;
    case 1:
      settingsChangeBacklight();
      break;
    case 2:
      settingsChangeLogging();
  }*/
}


Quand le programme commence en bougeant le rotatif j'ai bien la valeur de encoderPos qui change sur le LCD.
Mais quand j'appuie sur le bouton de l'encodeur (SWI), j'ai l'impression que le programme se fige, soit il ne fait rien, soit il est dans une boucle infinie mais quoi que je fasse il ne se passe rien.
Je suis obligé de faire un reset pour récupérer la main.

Quelqu'un aurait une idée?

Windows XP SP3
IDE 0.22 ou 1.0
Arduino Uno/Mini v4/Mini Pro/Nano
Deuligne/Mémoire/XBee/Ethernet/Stalker/Sablier/Rotoshield
john_lenfr
 
Messages: 32
Inscription: Jeu 3 Jan 2013 19:36

Re: Deuligne et interruptions

Message non lude john_lenfr » Ven 25 Jan 2013 19:30


Windows XP SP3
IDE 0.22 ou 1.0
Arduino Uno/Mini v4/Mini Pro/Nano
Deuligne/Mémoire/XBee/Ethernet/Stalker/Sablier/Rotoshield
john_lenfr
 
Messages: 32
Inscription: Jeu 3 Jan 2013 19:36


Retourner vers Deuligne

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron