Go Down

Topic: (Résolu) Interruption + Serial.write () --> Problème (Read 761 times) previous topic - next topic

kevo

Feb 23, 2013, 03:12 pm Last Edit: Feb 23, 2013, 05:22 pm by kevo Reason: 1
Bonjour à tous,

Me revoilà avec un nouveau problème  :smiley-mr-green:

J'ai un programme qui doit envoyer des données en série à un certain moment dans le loop. J'ai programmé un bouton poussoir en mode switch (on/off) avec une interruption pour que l'état puisse être lu à n'importe-quel moment.

Le but est d'envoyer par le port série, l'état du switch (on ou off) et en même temps d'allumer une LED si l'état est sur ON (pour vérifier le bon fonctionnement de l'interruption). Mais il se trouve que l'interruption ne fonctionne pas quand il y a un Serial.write qui traine dans le programme... Rien ne se passe. Si je retire le Serial.write, la LED s'allume et s'éteint comme il faut.

J'ai lu que l'interruption pouvait perturber le fonctionnement de la lecture en série, mais je n'ai rien vu à propos de l'écriture. Quelqu'un aurait une idée ? Je mettrai le programme si nécessaire.

Merci ;)

barbudor

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

kevo

#2
Feb 23, 2013, 03:32 pm Last Edit: Feb 23, 2013, 03:51 pm by kevo Reason: 1
Bon ben apparemment c'est nécessaire :p


Code: [Select]

const int BP = 5;
const int LED = 6;

// switch on/off

int reading_BP;
int state_BP = HIGH;
int previous_BP = HIGH;


void setup () {

pinMode (BP, INPUT);
pinMode (LED, OUTPUT);

digitalWrite (BP, HIGH); // actication pull-up
digitalWrite (LED, HIGH);

Serial1.begin (9600);

attachInterrupt (2, interrupt, LOW);

}

void loop () {

if (state_BP == LOW) {
digitalWrite (LED, LOW);
}
else {
digitalWrite (LED, HIGH); }

Serial1.write (state_BP);

}

void interrupt () {

 // switch on/off
 
reading_BP = digitalRead (BP);

if (reading_BP == LOW && previous_BP == HIGH) {
   if (state_BP == HIGH)
   state_BP = LOW;
   else
   state_BP = HIGH;
 }
 previous_BP = reading_BP;
 
}

barbudor

Beaucoup de code inutile qui pourrait être simplifié.

Si je comprend bien tu échantillonnes la valeur du bouton poussoir à chaque interruption.
Quand tu détectes un front descendant, tu inverses l'état de la variable state_BP.

Il est préférable de ne pas oublier les pinMode( ); c'est plus fiable.

Pour l'instant je ne vois aucune raison pour laquelle le Serial1.write() devrait changer le fonctionnement du code.

Mega ou Leonardo ?

Qu'est-ce qui génère l'interruption ?


Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

kevo

#4
Feb 23, 2013, 03:50 pm Last Edit: Feb 23, 2013, 03:52 pm by kevo Reason: 1
J'ai oublié de copier les pinMode, mais elles sont bien dans le programme, au temps pour moi ;)

C'est bien ça pour le bouton poussoir, oui.

C'est la Mega et c'est le bouton poussoir qui génère l'interruption.

Par contre, comment je pourrais plus simplifier le code ?

Go Up