#include <avr/interrupt.h>
#include <avr/io.h>
char gsIsOpen = 0;
int gsCounter = 0;
int gsOpenCounter = 0;
int gsOpenTime = 3;
int gsRPM = 0;
int main(void)
{
DDRB = (1 << PB0);
TCCR0B = 0x02;//предделителя таймера - деление на 8
TIMSK0 = 0x04;//счетчика по совпадению с OCR0A
TCNT0=0x00;
OCR0A=120;
OCR0B=0;
ADCSRA |= (1 << ADEN)|(1 << ADPS1)|(1 << ADPS0);
sei();
while(1)
{
ADMUX = (0 << REFS0) | (1 << MUX1);
ADCSRA |= (1 << ADSC);
while ((ADCSRA&(1 << ADIF))== 0);
gsRPM = ADC / 20 + 13;
ADMUX = (0 << REFS0) | (1 << MUX0) | (1 << MUX1);
ADCSRA |= (1 << ADSC);
while ((ADCSRA&(1 << ADIF))== 0);
gsOpenTime = ADC / 80 + 2;
}
}
void Open()
{
gsIsOpen = 1;
gsOpenCounter = 0;
PORTB |= (1<<PB0);
}
void Close()
{
gsIsOpen = 0;
PORTB &= ~(1<<PB0);
}
ISR(TIM0_COMPA_vect)
{
if (++gsCounter>(10000 / gsRPM))
{
gsCounter = 0;
if (0==gsIsOpen)
Open();
else
Close();
}
if (gsIsOpen==1)
{
if (++gsOpenCounter > (10*gsOpenTime))
Close();
}
TCNT0=0x00;
}
[свернуть]