# define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
volatile unsigned int s=0;
unsigned int ADCdata=0;
volatile unsigned int t=0;
ISR (TIM0_COMPA_vect)
{
if (s>30) s=0;
if (t>30) t=0;
s++;
t++;
}
void volt (void)
{
ADCdata = 0;
ADCSRA|=(1<<ADSC);
while ((ADCSRA&_BV(ADIF))==0x00);
ADCdata=(ADCL|ADCH<<8);
}
void day (void);
void night (void)
{
s=0;
t=0;
s=30;
while (1)
{
volt ();
if (s == 5) PORTB &= ~_BV(PB3);
if (s == 30 ) PORTB |= _BV(PB3);
if (s > 30) s=0;
if (ADCdata >= 200 ) t=0;
if (ADCdata < 200 && t>=30) day();
if (t > 30) t=0;
if (ADCdata >= 200 ) PORTB &= ~_BV(PB0);
if (ADCdata < 200 ) PORTB |= _BV(PB0);
}
}
void day (void)
{
t=0;
s=1;
PORTB &= ~_BV(PB3);
while (1)
{
volt();
if (s > 1) s=0;
if (ADCdata < 200 ) t=0;
if (ADCdata >=200 && t>=30) night();
if (t > 30) t=0;
if (ADCdata >= 200 ) PORTB &= ~_BV(PB0);
if (ADCdata < 200 ) PORTB |= _BV(PB0);
}
}
int main(void)
{
ADCSRA=(1<<ADEN)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS2)|(1<<ADSC);
ADMUX=(0<<REFS0)|(0<<ADLAR)|(1<<MUX1)|(0<<MUX0);
ADCSRB=(0<<ADTS2)|(1<<ADTS1)|(1<<ADTS0);
TCCR0A = (1 << WGM01)|(0 << WGM00); // прерывание по совпадению
TCCR0B = (0 << WGM02)|(1 << CS02)|(0 << CS01)|(1 << CS00); //делитель на 1024
TIMSK0 =(1<<OCIE0A); // устанавливаем бит разрешения прерывания счетчика по совпадению с OCR0A
OCR0A = 110; // запись в регистр число для сравнения 1 = приблизительно 1 мс
DDRB = 0b101111;
sei();
PORTB |= _BV(PB3);
_delay_ms(3000);
volt();
if(ADCdata >= 200) night();
if(ADCdata < 200) day();
Добрый день. может кто подскажет, что с кодом не так. при переходе с функции day на функцию night и обратно после двенадцатого перехода мк зависает. вроде бы все правильно... (мк attiny 13)