Дело было вечером, делать было нечего. А асик в ванну надо было погружать. 555 таймеров под рукой не было, а тинька была. Далее скрины и прошивка. Там все понятно. //#define F_CPU 9600000UL
#define BIGSUMM 1875000000
#define PREDDEL 18750000
#define PINF PB0 // пин частоты
volatile uint32_t ADDCOUNTER; // число + к счетчику
volatile uint32_t counter=0; // счетчик
uint16_t f=1510; // настраиваемая частота в попугаях. хотя по идее должно быть в Гц,
//но лень разбираться. в данном случае стоит 180гц, что соответствует примерно 5500 оборотов.
void f_change(uint16_t f) { ADDCOUNTER=(BIGSUMM/(PREDDEL/f))*1000; }
ISR(TIM0_OVF_vect) {
counter=counter+ADDCOUNTER;
if (counter >= BIGSUMM)
{
counter=counter-BIGSUMM;
PORTB^=(1<<PB0);
}
}
void setup() {
// настройка пинов
DDRB=1;
PORTB=6;
// настроим таймер
TCCR0B=1;// предделитель 1
TIMSK0=2;// прерывание по переполнению.
ADDCOUNTER=(BIGSUMM/(PREDDEL/f))*1000;
}
void loop() {
f_change(f);
}