slava_q9 Опубликовано 23 февраля Поделиться Опубликовано 23 февраля Возникли проблемы с реализацией цикличного мигания светодиодов с переключением скорости и направления по кнопке. Схема не реагирует на нажатие кнопки на PD7 (изменение скорости), изменение направления (на PD6) происходит только тогда, когда не горит ни один диод. Обязательно нужно применить прерывания по таймеру-счетчику, Преподаватель рекомендовал библиотеку axlib/timers.h. Задание: 8 светодиодов сделать сквозное переключение (циклично). Введем несколько режимов скорости (3 режима). Взять в 2 раза увеличивающий период (использовать библиотеку по таймерам) При работе с таймер счетчиком использовать прерывание Подключить семисегментый индикатор (будут отображаться только режимы скорости). 2 кнопки (одна меняет скорость, другая направление). Схема: Код программы: #define DEBOUNCE_DELAY_MS 100 #define F_CPU 1000000UL // Определение частоты процессора для функций задержки #include <avr/io.h> // AVR стандартные функции ввода-вывода #include <util/delay.h> // Функции задержки #include <main_init.h> #include <axlib/timers.h> #include <axlib/ports.h> // Глобальные переменные volatile uint8_t speedMode = 50; // Текущий режим скорости volatile uint8_t ledState = 0; // Состояние светодиодов volatile uint8_t direction = 1; // Направление сдвига светодиодов volatile uint32_t lastDebounceTime = 0; // Функция для изменения режима скорости void changeSpeedMode() { speedMode=speedMode * 10; if (speedMode > 2000) { speedMode = 50; } } // Глобальные переменные volatile uint8_t lastButtonState = 0; // Последнее состояние кнопки volatile uint8_t debounceDelay = 50; // Задержка для отсеивания дребезга (в миллисекундах) // Функция для изменения направления сдвига светодиодов с защитой от дребезга void changeDirection() { uint8_t currentButtonState = ~PIND & (1<<6); // Текущее состояние кнопки if (currentButtonState != lastButtonState && currentButtonState == 0) { // Если состояние кнопки изменилось и она нажата _delay_ms(250); // Задержка для фильтрации дребезга // Проверка, что кнопка все еще нажата после задержки direction = !direction; // Изменение направления, если состояние кнопки стабильно } lastButtonState = currentButtonState; // Обновление последнего состояния кнопки } int main(void) { DDRA = 0b11111111; MCUCR = 0b00000010; // Конфигурация управления сенсором прерывания для INT0 //sei (); DDRD &= ~((1<<2)) | ((1<<6)) | ((1<<7)); // Настройка PD2, PD6, PD7 как входы PORTD |= ((1<<2)) | ((1<<6)) | ((1<<7)); // Установка 2, 6 и 7 пинов в состояние логическая единица DDRC = 0b11111111; // Настройка порта C на выходы PORTC = 0b00000000; // Инициализация PORTC для отображения всех светодиодов выключенными timers_init(); // Проинициализировали таймер Т2 timer(TIMER_7, speedMode, ON); //PORTC_OUT(0,1,2,3,4,5,6,7); while(1) { changeDirection(); PORTA = 0b00000000; // Сдвиг светодиодов if (direction) { PORTA |= (1 << 7); // Установка бита PA7 PORTC = 0b10000000; // Установка PORTC для отображения двоичного счетчика 10000000 _delay_ms(250); // Задержка 250 миллисекунд PORTC = 0b01000000; _delay_ms(250); PORTC = 0b00100000; _delay_ms(250); PORTC = 0b00010000; _delay_ms(250); PORTC = 0b00001000; _delay_ms(250); PORTC = 0b00000100; _delay_ms(250); PORTC = 0b00000010; _delay_ms(250); PORTC = 0b00000001; _delay_ms(250); PORTC = 0b00000000; } else { PORTA &= ~(1 << 7); // Последовательность мигания в произвольном порядке PORTC = 0b00000000; _delay_ms(250); PORTC = 0b00000001; _delay_ms(250); PORTC = 0b00000100; _delay_ms(250); PORTC = 0b00010000; _delay_ms(250); PORTC = 0b01000000; _delay_ms(250); PORTC = 0b10000000; _delay_ms(250); PORTC = 0b00100000; _delay_ms(250); PORTC = 0b00001000; _delay_ms(250); PORTC = 0b00000010; _delay_ms(250); PORTC = 0b00000000; } if (!(PIND & (1<<7))) { _delay_ms(200); PORTA |= (1 << 2); changeSpeedMode(); } } } Сам проект прикреплен. project_Code_sxema.zip 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Piotr__1 Опубликовано 23 февраля Поделиться Опубликовано 23 февраля О, Delay подъехал... А вы про него почитайте по разным статьям, узнаете насколько он вытесняющий... 0 Жизнь не белая или чёрная, а в мелкую серенькую полосочку... Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
asng60 Опубликовано 24 февраля Поделиться Опубликовано 24 февраля 12 часов назад, slava_q9 сказал: Схема не реагирует на нажатие кнопки на PD7 (изменение скорости), изменение направления (на PD6) происходит только тогда, когда не горит ни один диод. Вот как написали программу, так оно и работает. Посмотрите тему "Конечные автоматы". Одна из реализаций Вашей задачи с помощью конечного автомата: состояние - это сочетание скорости и направления; состояние изменяется, если нажата кнопка; опрос кнопок в прерывании от таймера; скорость переключения регулируется переменной, отслеживающей количество прерываний от таймера. Устранение дребезга - несколько опросов подряд с частотой МК порта кнопок; если все опросы одинаковы и не равны, условно, 0, то кнопка нажата. Такой подход позволит исключить использование "delay" и всегда реагировать на кнопки . 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.