Problema PCINT

Sezione dedicata ai Microcontrollori e ai Sistemi Embedded

Problema PCINT

Postby Barone » 10 Oct 2013, 17:07

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.
Barone
 
Posts: 13
Joined: 24 Aug 2013, 00:50

Re: Problema PCINT

Postby deluca » 10 Oct 2013, 17:14

conosci l'effetto del rimbalzo generato dai pulsanti?
debounce.png
debounce.png (80.66 KiB) Viewed 3705 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 3704 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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Problema PCINT

Postby Barone » 10 Oct 2013, 17:41

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?
Barone
 
Posts: 13
Joined: 24 Aug 2013, 00:50

Re: Problema PCINT

Postby Barone » 10 Oct 2013, 17:59

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); ?
Barone
 
Posts: 13
Joined: 24 Aug 2013, 00:50

Re: Problema PCINT

Postby deluca » 10 Oct 2013, 18:05

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...)
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Problema PCINT

Postby Barone » 10 Oct 2013, 18:08

Perfetto, grazie mille.
Barone
 
Posts: 13
Joined: 24 Aug 2013, 00:50

Re: Problema PCINT

Postby Barone » 15 Oct 2013, 18:48

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?
Barone
 
Posts: 13
Joined: 24 Aug 2013, 00:50


Return to Microcontrollori e microprocessori

Who is online

Users browsing this forum: No registered users and 10 guests

cron