еще может знаете почему прерывание иногда срабатывает если дотронуться до минуса?просто касаюсь и вырубает или врубает(
Код: Выделить всё
#define F_CPU 9600000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/sleep.h>
unsigned char e;
unsigned char state = 0;
void abc(unsigned char a, unsigned char b, unsigned char c, unsigned char status);
unsigned char pwm[3]={255,255,255};
unsigned char to[3]={255,255,255};
int main(void)
{
DDRB = 0b00011001;
PORTB = 0b00011011;
ACSR = (1<<ACD);
GIMSK = (1<<INT0);
TCCR0A = 0x00;
TCCR0B = (1<<CS00);
TIMSK0 = (1<<TOIE0);
sei();
while(1){
if (pwm[0]<to[0]) pwm[0]++;
if (pwm[0]>to[0]) pwm[0]--;
if (pwm[1]<to[1]) pwm[1]++;
if (pwm[1]>to[1]) pwm[1]--;
if (pwm[2]<to[2]) pwm[2]++;
if (pwm[2]>to[2]) pwm[2]--;
if(pwm[0]==to[0]&&pwm[1]==to[1]&&pwm[2]==to[2]){
to[0]=rand()%255;
to[1]=rand()%255;
to[2]=rand()%255;
}
_delay_ms(20); //задержка для заметности изменения цвета или скорость изменения цвета
if (state == 0){
sleep_disable();
} else {
PORTB |= 0b00011001;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
}
}
}
ISR(TIM0_OVF_vect)
{
if(++e == 0)
PORTB |= 0b00011001;
else {
if(pwm[0] == e)
PORTB &= ~(1<<3);
if(pwm[1] == e)
PORTB &= ~(1<<4);
if(pwm[2] == e)
PORTB &= ~(1<<0);
}
}
ISR(INT0_vect) {
state ^= 0x01;
while(!(PINB&0b00000010));
PORTB |= 0b00011001; //задержка в секунду чтобы убрать руку от кнопки + отключение светодиодов сразу по нажатию на кнопку
_delay_ms(1000);
}


