ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
885955 Топик полностью
avrdude (02.12.2018 19:33, просмотров: 1) ответил Nikolay_Po на Это что такое?
исправил ошибки, все равно реле не включаетеся и не выключается при требуемых оборотах 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; } } }