Condizionamento pick up magnetico

Andiamo per gradi:

  1. I problemi di prima li ho risolti mettendo dei gran 100nF ovunque, ovvero, sull'ingresso del comparatore dove arriva il segnale di pick up ora c'è un R_L_C che lascia passare i segnali fino a 300Hz circa e tutto il resto viene attenuato per frequenze maggiori. Poi ho messo dei 100nF su tutti i piedini digitali che uso e qualche zener per limitare un pò gli spike.

  2. io dichiaro tutte queste variabili prima del setup:

#include <EEPROM.h>
#include "FreqPeriodCounter.h"
#include <avr/io.h>
#include <avr/interrupt.h>

#define NEXT_RST 2
#define PUIN 3
#define PUOUT 4
#define ledRun 5
#define led1 6
#define led2 7
#define led3 8
#define SELF 9
#define SWITCH1 10
#define SWITCH2 11
#define SWITCH3 12
#define SWITCH4 13

boolean CONFIGURED=LOW;
boolean writed=LOW;
boolean STEP=LOW;
boolean RUN=LOW;
boolean CREA=LOW;
volatile boolean val=HIGH;
volatile boolean flag=LOW;
boolean config=HIGH;
boolean OK=HIGH;
boolean prec=LOW;
boolean s[4]; // stati degli switch
int count_step=1;
int step_rimasti;
float alpha_max; 
float alpha_step; 
float alpha[6]={0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
float m[6]={0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; 
float q[6]={0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; 
float tick=0.5;
int i=0;
int k=0;
int wait=1000; 
int wait_canc=4000; 
unsigned long last=0;
int pulse_width=200; 
volatile unsigned long width=0;
int delta_t; // in microsecondi
int delta_t_step;
int delta_t_opt[6]={0, 0, 0, 0, 0, 0}; 
int delta_t_tab[251];
int freq;
int freq_soglia;
int freq_step;
int freq_max[6]={0, 0, 0, 0, 0, 0}; 
int RPM[6];
volatile int dt;
volatile int NotRun=0;
int stato_config[8]={0,0,0,0,0,0,0,0};

e nel setup:

 // initialize Timer1
    cli();          // disable global interrupts
    TCCR1A = 0;     // set entire TCCR1A register to 0
    TCCR1B = 0;     // same for TCCR1B
 
    // set compare match register to desired timer count:
    // turn on CTC mode:
    TCCR1B |= (1 << WGM12);
    TCCR1B &= ~(1 << WGM10);
    TCCR1B &= ~(1 << WGM11);
    // Set for prescaler 8:
    TCCR1B |= (1 << CS11);
    TCCR1B  &= ~(1 << CS12);
    TCCR1B  &= ~(1 << CS10);
    // enable timer compare interrupt:
    TIMSK1 |= (1 << OCIE1A);
    // enable global interrupts:
    sei();
  1. Io uso un regolatore 7805 ben filtrato prima del uP, non c'è bisogno di altri filtri; infatti vi sto dicendo che mi succedono cose strane se lo provo a banco quindi in assenza di disturbi, ma mi metto a spingere velocemente i due pulsanti che ho collegato un al digital pin3 e uno a d.p. 9.

Il bello come dicevo prima è che se spingo questi pulsanti ripetutamente e velocemente, anche quando il codice non dovrebbe nemmeno accorgersi di loro perchè c'è un IF che precede la loro lettura (e la sua condizione di entrata è FALSA), il micro inizia a fare cose strane tipo accende dei led che non dovrebbe, poi si pianta in un certo punto (che non si capisce come ci sia entrato).
Ho paura che siano abilitati degli interrupt per questi pin e che lui vada ad eseguire qualcosa che non ho dichiarato, ma come? boh non ne ho idea.
Aiutatemi voi.

Grazie