исправил ошибки, все равно реле не включаетеся и не выключается при требуемых оборотах 1200 и меньше выкл /1250 и выше вкл, не у видете еще навскидку где я лохануться мог, прерывание по переполнению я в симуляторе могу прогнать, работает, а вот как с прерыванием по фронту импульса и с замером частоты быть?
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#define RELAY_PORT PORTB
#define RELAY_PORT_DIR DDRB
#define RELAY_PIN 5
#define HALL_PORT PORTB
#define HALL_PORT_DIR DDRB
#define HALL_PIN 0
#define HALL_STATE PINB
#define F_CPU 8000000UL // 8 MHz
unsigned char OVF_counter, zamer_1, zamer_T, zamer_t, duty;
unsigned long t, T, f;
unsigned int rising_1, rising_2, falling;
////прерывание захвата ICP1
ISR(TIMER1_CAPT_vect) {
switch(zamer_T)
{
case 0:
rising_1 = ICR1; // Запоминаем значение счётчика
OVF_counter = 0; // Обнуляем количество переполнений счётчика
zamer_T = 1; // Переходим к следующему вычислению
break;
case 1:
rising_2 = ICR1; // Запоминаем значение счётчика
// Приводим все переменные к одному типу и вычисляем период импульса
T = (unsigned long)rising_2 - (unsigned long)rising_1 + ((unsigned long)OVF_counter * 65536UL);
zamer_T = 0;
zamer_1 = 2; // Переходим к следующему вычислению периода и частоты
break;
}
}
//прерывание переполнения Т1
ISR(TIMER1_OVF_vect) {
OVF_counter++; // Увеличиваем счетчик переполнений
}
int main()
{
TCCR1B |= (1 << ICNC1)|(1 << CS11); // Активируем входной подавитель шума, предделитель на 8
TIMSK1 |= (1 << ICIE1)|(1 << TOIE1); // Разрешаем прерывание по захвату и переполнению
zamer_T=0;
//rpm_setup();
wdt_disable();
//RELAY_PORT_DIR |= 1 << RELAY_PIN; //relay control pin as output
//HALL_PORT_DIR &= ~(1 << HALL_PIN); //relay control pin as output
DDRB = 0b00100000;
RELAY_PORT &= 1 << RELAY_PIN; //relay off init
//while(1);{}
sei();
while(1)
{
wdt_disable();
if (zamer_1 == 2)
{
f = 1000000UL/T; // Вычисляем частоту сигнала в Гц}
if (f <1200)
{
RELAY_PORT &= 1 << RELAY_PIN; //relay off
}
if (f>1250)
{
RELAY_PORT |= 1 << RELAY_PIN; //relay on
}
zamer_1 = 0;
}
}
}