// >>>>>>>>>>>>>>>>>>>>>> ATtiny45 Pouziti Timeru IV a ISR od BUTTON II <<<<<<<<<<<<<<<<<<<<<<<<<<
// Achtung,achtung - aby fungovalo millis a micros a delay,
// musi byt povolen overflow timer0, proto masku oruj pro nastaven9
// a anduj pro vymazani
// Vse funkcni

// Dalsi pokusy - on/off blikac
// ATMEL ATTINY 25/45/85 / ARDUINO
//
// +-\/-+
// Ain0 (D 5) PB5 1| |8 Vcc
// Ain3 (D 3) PB3 2| |7 PB2 (D 2) Ain1
// Ain2 (D 4) PB4 3| |6 PB1 (D 1) pwm1
// GND 4| |5 PB0 (D 0) pwm0
// +----+
// Aktualni zapojeni
// _____
// +-\/-+ +------o o-------------+--- Vcc
// PB5 1| |8 Vcc | |
// Vcc---XXXXXX----|>|-----2| |7 PB2 ---+ 220R |
// 220R PB4 3| |6 PB1 ---|---|<|-------XXXXXX-----+
// + GND 4| |5 PB0 ---|---|<|-------XXXXXX-----+
// | +----+ | 220R
// +-------XXXXXX----------+
// 5k
/* LED1 LOW, LED2 HIGH, LED4 LOW ovladana (OCR1A), LED2 LOW, LED4 HIGH ovladana (OCR1B) a LED1 LOW ovladana
od timeru 1 */
#define DEBOUNCE_DELAY 300
const byte LED1 = 0;
const byte LED2 = 1;
const byte LED4 = 3;
const byte BUTTON = 2;
volatile unsigned char state = 0;
ISR(TIMER1_COMPA_vect)
{
digitalWrite (LED2, HIGH);
digitalWrite (LED4, LOW);
}
ISR(TIMER1_COMPB_vect)
{
digitalWrite (LED2, LOW);
digitalWrite (LED4, HIGH);
OCR1B>=255?OCR1B=0:++OCR1B;
}
ISR(INT0_vect)
{
static unsigned long last_millis = 0;
unsigned long m = millis();
if (m - last_millis > DEBOUNCE_DELAY ) // ignoruj preruseni
{
cli();
state=!state;
digitalWrite (LED1, state);
sei();
}
last_millis = m;
GIFR = bit (INTF0); // clear flag for interrupt 0
}
void setup ()
{
pinMode (LED1, OUTPUT);
pinMode (LED2, OUTPUT);
pinMode (LED4, OUTPUT);
pinMode (BUTTON, INPUT);
// set up ISR
MCUCR &= ~3; // clear existing flags// sense 0-low, 1- change, 2-falling, 3-rising
MCUCR |= 3; // set wanted flags (falling level interrupt)
//GIMSK = bit (6);//| bit(5); // enable it bit 6 INT0, bit 5 PCIE
GIMSK= 0b01000000;
// PCMSK; bit 0 az 6 / maska na change, pokud povoleno GIMSK PCIE bit 5
// GIFR = bit (INTF0); // clear flag for interrupt 0
// set up Timer 1
TCCR1 = 0b00001111; // normal operation, delicka 8
GTCCR = 0b00000000; // reset prescaler
OCR1A = 0b00000001; // compare A register value (1000 * clock speed)
OCR1B = 0b00000001;
OCR1C = 0b01111111;
TIMSK |= 0b01100000; /* ORuj !!! Jinak nefunguje millis, micros a delay, ktere
pouzivaji Timer0 a jeho overflow interupt
interrupt on Compare A Match BIT 6 1A, 5 JE 1B, 2 JE 1C*/
GIFR = bit (INTF0); // clear flag for interrupt 0
sei();
} // end of setup
void loop ()
{
if(state)
{
digitalWrite (LED1, HIGH);
delay(500);
digitalWrite (LED1, LOW);
delay(500);
digitalWrite (LED1, HIGH);
}
}