Bonjour,
J'ai récemment fait un petit projet à base d'un ATtiny 85 qui allume des LEDs après avoir été réveillé de son sleep mode à la suite d'un interrupt (PCINT4).
Le pin PB4 (qui correspond au PCINT4) n'est relié à rien il est flottant et l'appui sur un bouton le relie à la masse.
Le problème est que avec le modèle de bouton que j'utilise (un petit bouton tactile monté en surface (SMD)), le microcontrôleur ne sort pas de son sleep mode car l'interrupt n'est pas déclenché.
Cela fonctionne très bien en revanche avec d'autres boutons.
Je précise que le bouton n'est pas défectueux, il fonctionne bien comme prévu et le pin PB4 es bien relié à la masse quand le bouton est pressé. C'est le changement d'état à l'appui du bouton qui n'est pas détecté par le microcontrôleur.
Est-ce un problème de debouncing?
Merci de votre aide !
(Voici mon code (en C, compilé avec Atmel Studio) pour la fonction du sleep mode comprenant l'interrupt : )
Code:int main() { DDRB = 0b00001111; // PB0/PB1/PB2/PB3 as output, PB4/PB5 as input PORTB |= (1<<PB4); // internal pullup on PB4 while (1) { sleep(); /*Allume des LEDs*/ PORTB |= (1<<PB4); } } void sleep() { GIMSK |= (1<<PCIE); // Enable Pin Change Interrupts PCMSK |= (1<<PCINT4); // Use PB4 as interrupt pin ADCSRA &=~(1<<ADEN); // Disable ADC ACSR |= (1<<ACD); // Disable Analog comparator set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Power down mode sleep_enable(); // Sets the Sleep Enable bit in the MCUCR Register (SE BIT) sei(); // Enable interrupts sleep_cpu(); // sleep cli(); // Disable interrupts PCMSK &= ~(1<<PCINT4); // Turn off PB4 as interrupt pin sleep_disable(); // Clear SE bit sei(); // Enable interrupts }
-----