Hola buenas tardes. les quiero comentar un proyecto que estoy haciendo donde uso el Attiny85 como control de encendido en el cual me encontré con un problema al generar la interrupción ya que la interrupción la quiero hacer con un button de pulsador que se encuentre en el modo pulsado, y no que se sea solo un pulso.
La idea de esto es que el usuario mantenga pulsado unos segundos para detectar que el pulso es real y luego liberar energía hacia otro micro.
Probe varias formas pero no puedo hacerlo acá va el código.
#include <avr/sleep.h>
int PowerMicrosecundario = 0;
int led0 = 1;
int led1 = 3;
int led2 = 4;
int botondetect = 2;
boolean On = 1;
int Power __attribute__ ((section (".noinit")));
int contador = 0;
void PowerDown () {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
ADCSRA &= ~(1<<ADEN);
sleep_enable();
sleep_cpu();
}
void sleep() {
GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts
PCMSK |= _BV(PCINT2); // Use PB2 as interrupt pin
ADCSRA &= ~_BV(ADEN); // ADC off
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // replaces above statement
sleep_enable(); // Sets the Sleep Enable bit in the MCUCR Register (SE BIT)
sei(); // Enable interrupts
sleep_cpu(); // sleep
cli(); // Disable interrupts
PCMSK &= ~_BV(PCINT2); // Turn off PB2 as interrupt pin
sleep_disable(); // Clear SE bit
ADCSRA |= _BV(ADEN); // ADC on
sei(); // Enable interrupts
} // sleep
void setup() {
Power = !Power;
//if (!Power) PowerDown();
pinMode(botondetect, INPUT);
digitalWrite(botondetect, 1);
pinMode(led0, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(PowerMicrosecundario, OUTPUT);
sleep();
}
void loop() {
if(digitalRead(botondetect) == 0){
switch (contador) {
case 0:
digitalWrite(led0, On);
break;
case 1:
digitalWrite(led1, On);
break;
case 2:
digitalWrite(led2, On);
break;
case 3:
digitalWrite(PowerMicrosecundario, On);
contador =0;
break;
default:
break;
}
delay(2000);
contador++;
}
}