Page 1 of 1

Problema PCINT

PostPosted: 10 Oct 2013, 17:07
by Barone
Salve,

sto lavorando su una scheda STK500 con ATmega1284P e non riesco a gestire gli interrupt PCINT.
Voglio fare in modo che alla pressione degli switch della scheda stessa, venga generato un interrupt.
Da quello che ho capito, questo tipo di interrupt viene generato ogni volta che il pin cambia di stato, quindi sia quando lo switch è premuto, sia quando è rilasciato.
Ma tra le varie prove ho eseguito questo semplice programmino:
Code: Select all
#include <asf.h>
#include <stdbool.h>
#include <util/delay.h>
unsigned char cnt = 0;
int main (void)
{
       DDRC = 0xff;
       PORTC = 0x00;
       PCICR = (1<<PCIE1);
       PCMSK1 = 0xff;
       sei();
       while(1);
}

ISR(PCINT1_vect){
   cnt++;
   
   PORTC = cnt;
}
}


Il risultato aspettato dovrebbe essere 2, ma in realtà varia tra 2 e 3.
Come mai accade questa cosa? Cosa sbaglio?
Saluti.

Re: Problema PCINT

PostPosted: 10 Oct 2013, 17:14
by deluca
conosci l'effetto del rimbalzo generato dai pulsanti?
debounce.png
debounce.png (80.66 KiB) Viewed 3011 times

il tuo switch come è collegato al pin del micro?
Per eliminare l'effetto indesiderato devi implementare un filtro software di "debouncer" e applicare almeno un filtro RC sul segnale proveniente dal pulsante.
debounce1.jpg
debounce1.jpg (23.1 KiB) Viewed 3010 times


Inserisci un piccolo delay nell' handler dell'interrupt prima del return e vedrai che il problema scomparirà.
Non è il metodo migliore in assoluto, ma tante volte ti risolve il prb.

Il miglior modo per eliminare l'effetto del debounce e non bloccare il micro durante il delay è quello di gestire il controllo del "delay-debouncer" utilizzando opportunamente uno dei timer....
se hai un timer libero ti consiglio di seguire questa strada.

Re: Problema PCINT

PostPosted: 10 Oct 2013, 17:41
by Barone
Ho effettuato il collegamento collegando i jumper della porta (PORTB nel mio caso) ai jumper degli switch sulla scheda stessa.
Sono ancora abbastanza ignorante in materia: il filtro RC è un componente hardware, giusto? Non si potrebbe fare a meno e compensare con una soluzione puramente software?

Re: Problema PCINT

PostPosted: 10 Oct 2013, 17:59
by Barone
Utilizzando _delay_ms(200); sembra di aver risolto.
Non ho capito per cosa dovrei utilizzare il timer. Per creare il delay al posto della funzione _delay_ms(200); ?

Re: Problema PCINT

PostPosted: 10 Oct 2013, 18:05
by deluca
se usi la funzione _delay_ms(200); introduci un ritardo di 200 msec ma blocchi il micro per la stessa durata.

Utilizzando i timer potrai gestire i ritardi senza bloccare il micro.... (in parole povere per farti capire...)

Re: Problema PCINT

PostPosted: 10 Oct 2013, 18:08
by Barone
Perfetto, grazie mille.

Re: Problema PCINT

PostPosted: 15 Oct 2013, 18:48
by Barone
Salve,

c'è ancora un piccolo problema.
Per quanto riguarda il funzionamento normale ho risolto, ma quando premo velocemente 2 volte uno stesso switch ho gli stessi problemi di cui sopra.
Ho cercato di risolvere in questo modo (il codice è un po' diverso):

Code: Select all
ISR(PCINT1_vect){
   
   PCICR = 0x00;
   PCMSK1 = 0x00;
   _delay_ms(500);
   
   esegui();
   _delay_ms(200);
   PCICR = (1<<PCIE1);
   PCMSK1 = 0xff;
   
}


In questo modo il problema si verifica un po' meno frequentemente ma è sempre presente.
E' ancora dovuto a debouncing?