Pages: [1]   Go Down
Author Topic: Problema Interrupt + Serial.println  (Read 86 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve ragazzi!!!!
Stavo sviluppando un progetto abbastanza semplice ( una versione del Cat Feeder ormai famoso sul sito) con degli interrupt.
In pratica un sensore luminoso genera un interrupt quando c'è molta luce ( e la resistenza LDR si abbassa, tipo FALLING) , e questo evento aziona un servomotore che ,dalla posizione di riposo impostata nel loop, si apre per 5 secondi e poi si richiude.
Fino a qui tutto bene. Poi ho cominciato a "ricamare il software", e ho inserito qualche Serial.print per tenere d'occhio alcune cose, ad esempio, quante volte era stato azionato il meccanismo. ( Gli interrupt vengono disabilitati dopo 5 eventi) .
Ebbene, da quando ho inserito i println , il codice si blocca spesso e volentieri. Nella console vengono visualizzate scritte come

"Evento Rilevato: pasto numero 1"
"Evento Rilevato: pasto numero 2"
"Ev"

E poi si blocca. Non riesco a capire perchè, e la cosa è molto fastidiosa. Qualcuno può darmi una mano?
Senza le stampe a video invece funziona perfettamente.
P.S Inoltre, se mando piu impulsi luminosi mentre il motorino è "aperto", lui li legge come interrupt e li scala dal totale. Ho provato a giocare con NoInterrupts(), interrupts() e detachInterrupt(0) ma niente...
Vi riporto qui sotto il codice:
Code:
// Servo in posizione =33 gradi.

#include <Servo.h>

Servo myServo;            

volatile int apri,intcount=0;

void setup() {
  attachInterrupt(0,open_gate,FALLING);
  myServo.attach(9);      
  Serial.begin(9600);    
    myServo.write(33);  
}

void loop() {
  if(intcount==5){
    detachInterrupt(0);
  }
  if (apri==1){
  apriti();}
   myServo.write(33);
 }

void open_gate(){
  apri=1;
  intcount++;
  //Serial.print("Evento Rilevato: Pasto numero ");
  //Serial.print(intcount,1);
  //Serial.println(" ");
 }

void apriti(){
myServo.write(123);
delay(5000);
apri=0;
}
« Last Edit: March 25, 2014, 07:11:49 pm by nicostak » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Togli i serial.print da dentro gli interrupt.
Siccome anche la stampa su seriale è gestita da interrupt, nel momento in cui disattivi l'interrupt blocchi anche l'invio di dati sulla seriale.

Logged


Switzerland
Online Online
Faraday Member
**
Karma: 82
Posts: 4193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

... aggiungo ... le ISR devono essere il più possibile brevi e veloci ... senza tanti fronzoli e chiamate inutili che vanno invece fatte da dentro il codice del programma.

Tipicamente aggiorni/incrementi variabili dichiarate "voliatili" e poco altro ... smiley-wink

Guglielmo
« Last Edit: March 26, 2014, 04:13:35 am by gpb01 » Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Intanto grazie a entrambi per questa delucidazione sugli interrupt ( se non si era capito, è la prima volta che li uso smiley-grin ) .
Ora invece mi resta il secondo problema, ovvero quello della ricezione degli interrupt anche quando non dovrebbe riceverne.
Io l'avevo pensata cosi: appena arriva l'interrupt parte la funzione open_gate(), dentro a questa io disabilito gli interrupts con noInterrupts(), aggiorno le variabili ecc , poi torna al loop, che chiama la funzione apriti(), la quale mi aziona il motorino, poi finisce, ritorna al loop, e qui ho provato a riabilitare gli interrupts con interrupts (). Secondo la mia logica dovrebbe funzionare, ma in pratica non lo fa . vi posto anche questa parte di codice.
Quote
#include <Servo.h>

Servo myServo;           

volatile int apri,intcount=0;

void setup() {
  attachInterrupt(0,open_gate,FALLING);  //pin2
  myServo.attach(9);     
  Serial.begin(9600);     
    myServo.write(33);
    
}

void loop() {
  if(intcount==5){
    detachInterrupt(0); 
  }
  if (apri==1){
  apriti();
  interrupts();
  }
   myServo.write(33);
 }

void open_gate(){
  noInterrupts();
  apri=1;
  intcount++;
 }

void apriti(){
myServo.write(123);
delay(5000);
apri=0;
}

Logged

Pages: [1]   Go Up
Jump to: