Перейти к содержанию

Мигание светодиодов с разной скоростью и направлением


Рекомендуемые сообщения

Возникли проблемы с реализацией цикличного мигания светодиодов с переключением скорости и направления по кнопке. Схема не реагирует на нажатие кнопки на PD7 (изменение скорости), изменение направления (на PD6) происходит только тогда, когда не горит ни один диод.
Обязательно нужно применить прерывания по таймеру-счетчику, Преподаватель рекомендовал библиотеку axlib/timers.h.

Задание:
8 светодиодов сделать сквозное переключение (циклично).
Введем несколько режимов скорости (3 режима).
Взять в 2 раза увеличивающий период (использовать библиотеку по таймерам)
При работе с таймер счетчиком использовать прерывание
Подключить семисегментый индикатор (будут отображаться только режимы скорости).
2 кнопки (одна меняет скорость, другая направление).

Схема: image.png.55d9da491772c5db5806554f81b23ac9.png

Код программы:

#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

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

О, Delay подъехал... А вы про него почитайте по разным статьям, узнаете насколько он вытесняющий...

Жизнь не белая или чёрная, а в мелкую серенькую полосочку...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

12 часов назад, slava_q9 сказал:

Схема не реагирует на нажатие кнопки на PD7 (изменение скорости), изменение направления (на PD6) происходит только тогда, когда не горит ни один диод.

Вот как написали программу, так оно и работает.

Посмотрите тему "Конечные автоматы". Одна из реализаций Вашей задачи с помощью конечного автомата: состояние - это сочетание скорости и направления; состояние изменяется, если нажата кнопка; опрос кнопок в прерывании от таймера; скорость переключения регулируется переменной, отслеживающей количество прерываний от таймера. Устранение дребезга - несколько опросов подряд с частотой МК порта кнопок; если все опросы одинаковы и не равны, условно, 0, то кнопка нажата.

Такой подход позволит исключить использование "delay" и всегда реагировать на кнопки .

Ссылка на комментарий
Поделиться на другие сайты

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Ребят ,подскажите пожалуйста, как дребезг контактов победить кроме как функцией delay_ms. Кнопка без фиксации, если  использовать "делей" задержку, то при нажатой и удержанной кнопке ,светодиод начинает мигать ,а нужно чтобы нажал-светодиод загорелся и не тух до следующего нажатия. Опыта пока нет ,начал изучать пока базовый синтаксис.
    • Где они причилные и качественные ? Дерьмовый аэрокул 4 рубля стоит  Возможно для кого то это приличный. Про уровни качества не знаем ? Ну тогда о чем спорить то ? Всё что с оной надписью - качественное 
    • Здраствуйте интересует такой вопрос можно ли на основе сварочного липина сделать полуавтомат,вопрос в том плане если завести обратную связь по напряжению с выхода преобразователя на второй усилитель ошибки, он в схеме не задействован,вывести регулятор напряжения ,а ток установить на максимум получится ли что то стоющее,хочу просто обойтись без микроконтроллеров(пока, в дальнейшем думаю попробовать полуавтомат от Олега) Ещё мысль, если мы допустим с регулятора опорного напряжения для усилителя ошибки по напряжению тлки494,подадим это напряжение на повторитель на оу и с него на ШИМ регулятор двигателя протяжки то есть мы меняем напряжение на выходе и параллельно этому меняется скорость протяжки,после повторителя поставить наверное подстрочник чтобы все это настроить(ну это так мысли в слух)
    • Dynamic DC - это анализ по ПОСТОЯННОМУ току, глупо требовать в этом режиме значений ПЕРЕМЕННОГО тока.
    • Местные ограничения. Как и на любом техногенно - катастрофоопасном производстве, из соображений возможного влияния радиосигнала на работу электроники / телеметрии, видимо.  У нас (химзавод) тоже разрешается пользоваться строго конкретными, сертифицированными Р/С, и то, по согласованию на каждый случай применения. Личными мобилами в установках вообще запрещено пользоваться, только у оперативного персонала и нач. смены служебные, искро/взрывобезопасные аппараты.
    • Этот эффект называется "акустическое короткое замыкание". Закрытый ящик должен быть акустически герметичным. Заполнения ящика поглотителем нет? Без него и будет звучание динамика как в пустом ящике. Вернее без "как". Вы же на слух сразу отличаете по разнице в звуке, даже с закрытыми глазами, если покричать, например, в глубоком колодце, в туннеле, в пещере, в большом пустом зале, в пустой маленькой комнате. Здесь то же самое.
    • STK402-070.lay6 Переваривать оригинал с его расстояниями м/выводов и ужиманием не получается, как то противоестественно всё. Бессмысленно. Ещё эти вырезание на общем полигоне, кто это так массово использует ? Только сбивает с толку и мешает.  - В итоге так и не вышло до конца довести процесс.   
  • Похожий контент

×
×
  • Создать...