Ciao a tutti, descrivo il mio problema reale, ignorate il messaggio precedente.
Ho due stadi, uno ricevente ed uno emittente, ciascuno pilotato da un pic16f84. Per prova, lo stadio emittente spedisce 8 bit sequenzialmente con un'onda quadra di periodo 1 ms (1khz frequenza). Se il bit da spedire è un 1, allora il semi-periodo basso dell'onda dura 0.25 ms, mentre il semiperiodo alto dura 0.750 ms. Se il bit da spedire è uno zero, allora il semiperiodo basso dura 0.750 ms, mentre quello alto 0.250 ms. L'onda quadra la ottengo con una call del genere :
BitHigh bcf PORTB,OUT; 0 per 0.250 ms Call Wait250 bsf PORTB,OUT; 1 per 0.750 ms Call Wait750
bcf PORTB,OUT return ;
BitLow bcf PORTB,OUT ;0 per 0.750 ms Call Wait750 bsf PORTB,OUT ; 1 per 0.250 ms Call Wait250 ; bcf PORTB,OUT return
Dove Wait250 è una routine di ritardo creata con Picloops 2.1 che appunto crea un ritardo di 0.250 ms, mentre wait750 ne crea uno di 0.750 ms , e OUT è la linea della portaB alla quale è collegato il pin IN dello stadio Tx.
Lo stadio ricevente è basato sugli interrupt generati da un cambiamento di stato sulla linea RB0, alla quale è collegato il pin di uscita del modulo RX. In uscita al modulo dovrei avere la stessa onda quadra che ho spedito, per cui misuro la durata di ogni periodo alto con il timer TMR0 (con opportuno prescaler) e la confronto: se la durata del periodo alto è maggiore di un certo valore allora ho ricevuto un 1, altrimenti uno 0. Non ho ancora avuto la possibilità di vedere se la gestione del timer è corretta, perchè il problema che sorge è un altro.
Il problema è che vengono generati centinaia di interrupt, invece che solo
16 (8 per le salite e 8 per le discese dell'onda)! Questo accade anche se il trasmettitore è scollegato: cioè, stacco del tutto lo stadio emittente, mentre accendo lo stadio ricevente, e ottengo sempre centinaia di interrupt nel giro di un paio di secondi. Per misurare quanti interrupt ho ricevuto, ho aggiunto un contatore che viene incrementato ogni volta che la routine di interrupt è richiamata, e alla fine del mainloop, che dura appunto un paio di secondi, scrivo il valore del contatore sulla eeprom interna. Se stacco anche il ricevitore RX e creo gli intterupt "manualmente" con un filo il numero di int generati è corretto.A cosa è dovuto e come posso risolvere? Forse ad un "bouncing" creato dal modulo rx?
Grazie, Nick