Jump to content

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


Recommended Posts

Возникли проблемы с реализацией цикличного мигания светодиодов с переключением скорости и направления по кнопке. Схема не реагирует на нажатие кнопки на 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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

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

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Сообщения

    • Благодарю всех за помощь! Буду заказывать подвесы И ещё уточнить забыл. Вместо ацетона что можно ещё использовать?
    • Для игрушек батарея не нужна, но это только вам решать... Если там есть последовательный и параллельный порт, тоже сейчас не найдешь на ноутах. Кстати, на бизнес ноутах последовательный порт встречается часто, по крайней мере такие ноуты все еще можно найти (могу даже дать перечень моделей).
    • А где  @Falconist? Почему тема неинформативно называется? Почему она в разделе "Школьникам и студентам", а вопросов в посте нет, одно только ТЗ на работу?
    • Старые игрушки без эмуляторов)  С чего бы не подойти ? На такие же 3,7в. Подключал просто 3шт банки 18650 вместо батареи штатных дохлых, (нормально коробку акб было не закрыть, на скотче держалась) ноут завёлся. После подключения бп спокойно дозарядил аккумы, всё как обычно. Контроллер акб здорового человека, без мракобесия и изврщ. Почему полимерники - батарея штатных банок выйдет в адские деньжищи. перешёл на корпоратов, Thinkpad там, Dell Precision
    • @korsaj к сожалению ссылка не открывается,. либо открывается битая страница с кодом.. По сигналу что думаю - если у источника будет сопротивление 75 ом, то всё будет норм, но 75 это очень низкое сопротивление и оно применяется в ВЧ и СВЧ, а у меня-то НЧ камера, у которой нет 75 ом, там полюбому несколько килоом или даже десятки ком. Наводка верная. Если подключить к высококилоомному источнику делитель у которого 75, то все сигналы практически заглушаться... Помню был случай я со звуком работал и как-то вместо 10 кОм впаял резистор 10 ом и звук пропал, тут аналогично будет, согласен... не всё так просто.. Если интересно, то  вот какая камера едет, читал перечитал 5 раз на неё описание, самое полезное что возможно пригодиться нашел - Формат изображения: NTSC и питание 12 В. Что ещё нужно смотреть? 
    • Скорее всего там стояли такие же 17670, в ту эпоху их довольно часто использовали, на 1мм тоньше чем 18650.  Кстати, в ширпотребовских ноутах Acer One 725, Aspire V5 серии и Хромбуках C710, C720 одно время использовались батареи AL12B32 и подобные AL12X32. Если только попадутся оригинальные, в оригинальных стояли аккумуляторы 16650 Sanyo 2500mah. Выглядели вот так (фото из Интернета), фиолетового цвета как на фото, соответственно, на 2мм тоньше чем 18650 при той же длине (что и следует из их типоразмера). Эти батареи имели одно неприятное свойство - часто от долгого хранения разряжались в полный ноль, и потом их в родном ноуте никакими силами нельзя было зарядить. По тестам - вполне нормальные, но даже абсолютно новые, они до 2500мач не дотягивали, в лучшем случае я с них вытягивал 2300-2400. Китайцы их научились клепать, и поэтому сейчас скорее можно найти китайские клоны, чем родные батареи. Но в китайских клонах емкость едва 1800-2000мач на банку (даже если они пишут на корпусе батареи 2500 - это скорее "выдача желаемого за действительное", чтобы не сказать жестче).  А какой смысл восстанавливать такой древний ноут? туда кстати, полимерник может и не подойдет.
  • Similar Content

×
×
  • Create New...