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

Помогите с программированием микроконтроллера


Dimko1983
Перейти к решению Решено Алексей Еремеев,

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

Здравствуйте, форумчане!

Помогите пожалуйста с решением следующей задачи:

На базе Атмега 8 нужно сделать штуку с таким функционалом:

Дано -Атмега, три светодиода (через резистор), одна кнопка.

Требуется: 1) при включении загорается Первый диод на 3 секунды и гаснет. Микроконтроллер ждет нажатия кнопки.

2) нажимаем на кнопку - загорается Второй диод на 1.5 секунды и гаснет. Ожидание следующего нажатия.

3) нажимаем на кнопку - загорается Третий диод на 1.5 секунды и гаснет. Ожидание следующего нажатия.

4) нажимаем на кнопку - Первый диод загорается на 3 секунды и гаснет. Таким образом цикл должен замкнуться и все повторится по алгоритму с начала. 

 

Сфера программирования не совсем моя стихия. Но так вышло, что мне повстречалась такая задача, которую я не могу победить. Пытался честно смотреть материал, искать, качать, пробовать. Что-то похожее нашел, но не то. Видоизменил скачанный файл прошивки - но там при нажатии кнопки диоды горят постоянно. Файл прикреплю. Люди добрые! Помогите кто чем может!

Всем заранее спасибо! Всем добра!

 

Код1.txt kn2-proteus.pdsprj

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

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

На форуме есть специальный раздел: Вакансии и разовая работа

Напишите туда тех задание, можно оставить то, что есть, только дописать, что должно происходить, если кнопку нажали пока светодиод не погас.

Если хочется побыстрее, предложите цену, которая заинтересует желающих. Либо ждите предложений.

 

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

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

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

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

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

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

13 минут назад, Dimko1983 сказал:

Требуется:

Без внятного ТЗ результат всегда ХЗ.
Кнопку надо удерживать пока светит СД или не?
а если еше раз нажали пока светит СД?
а если еше раз нажали и не отпустили?
а если два,три раза ?
и тд и тп....

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

Все относительно просто. Нажал/отпустил - сработала фаза. Следующий раз… и так далее. Если зажал и всё такое - это проблема оператора. По крайней мере передо мной тоже такие задачи никто не ставил

 

2 часа назад, Огонёк сказал:

С гигантским избытком камешек. Достаточно тринадцатой или десятой тиньки.

Возможно. Но работаем с тем что есть:-)))

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

Если заказчик хочет именно на ATmega8, то это его право.
Может, у него ещё куча устройств на таких же МК и ему проще использовать один тип.

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

пример опроса кнопок здесь https://forum.cxem.net/index.php?/topic/222979-опросы-кнопок-на-mega8-и-mega16/&do=findComment&comment=3514038

пример конечного автомата для переключения СД здесь http://easyelectronics.ru/avr-uchebnyj-kurs-konechnyj-avtomat.html

 

 

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

7 минут назад, ChePay сказал:

Может, у него ещё куча устройств на таких же МК

О, да. Целая линейка устройств. Какие-то мигают двумя светодиодами, какие-то - четырьмя, какие-то пищат зуммером, и вот теперь потребовался прибор, мигающий тремя светодиодами. Нужно разработать программу.

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

12 минут назад, Огонёк сказал:

О, да. Целая линейка устройств. Какие-то мигают двумя светодиодами, какие-то - четырьмя, какие-то пищат зуммером, и вот теперь потребовался прибор, мигающий тремя светодиодами. Нужно разработать программу.

О да! Для вас это будет неожиданностью, но вы правы! Я работаю художником по свету. И у меня куча светодиодиков, которые моргают тут и там. Правда в составе полноценных световых приборов. Возникла задача сделать кое-какую приблуду. Светодиоды в данной схеме - только индикация выходов. Дабы не усложнять - решил сначала диоды засветить с микрухи. Этот момент у меня единственный проблемный. Дальше допилю сам. А атмега 8 как раз стоит в уйме светодиодных ПАРов, которые у нас в Туле умельцы делали. Многие приборы умерли электрически, но мозги целы. Поэтому и используем то, что есть. Сарказм ваш ясен, но цели не достигнул:-)

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

1 час назад, Dimko1983 сказал:

Дабы не усложнять - решил сначала диоды засветить с микрухи. Этот момент у меня единственный проблемный. Дальше допилю сам.

И снова в точку! В програмировании микроконтроллеров именно работа со светодиодами составляет самую большую трудность. Работа с памятью, различными протоколами, хитрые танцы с таймерами - это всё плёвое дело. А вот светодиодиками помигать - тут не каждый справится.

Если без шуток, то программа по заявленному описанию весьма проста, вместе с инициализацией пара десятков строк на ассемблере, пожалуй. Если не торопишься и не найдёшь решение раньше, то в выходные постараюсь найти для этого дела время.

Изменено пользователем Огонёк
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Огонёк сказал:

И снова в точку! В програмировании микроконтроллеров именно работа со светодиодами составляет самую большую трудность. Работа с памятью, различными протоколами, хитрые танцы с таймерами - это всё плёвое дело. А вот светодиодиками помигать - тут не каждый справится.

Если без шуток, то программа по заявленному описанию весьма проста, вместе с инициализацией пара десятков строк на ассемблере, пожалуй. Если не торопишься и не найдёшь решение раньше, то в выходные постараюсь найти для этого дела время.

Я разумом понимаю, что программа должна быть как 2 пальца об асфальт. И возможно что дело в одной / двух функциях, которые я неправильно или по незнанию использую. А может и не использую вовсе. После некоторого времени копаний решил обратиться на профильный форум за помощью. Ведь тут наверняка есть профи, которые подобные задачи перед сном на салфетке решают. Мне же не удалось пока. Буду рад любой помощи - советом ли, делом ли. Спасибо огромное за отзывчивость. Разгребусь с эти делом - сяду изучать микроконтроллеры основательно. Обещаю:-))

Изменено пользователем Dimko1983
Описка
Ссылка на комментарий
Поделиться на другие сайты

44 минуты назад, Dimko1983 сказал:

Буду рад любой помощи - советом ли, делом ли.

Так Вам выше ссылки дали, Вы хоть по одной перешли? судя по всему - нет. А там 90% кода для вашей хотелки, приложите усилие и напишите оставшееся 10, причем никто не запрещает задавать правильные вопросы в этой теме ... Нет желания напрягать свой мозг , где искать исполнителя Вам тоже указали.

ЗЫ  А песню про "сами мы не местные, от поезда отстали, деньги украли, документы потеряли, помогите , не проходите мимо", здесь на форуме, исполняют по десятку раз на неделе. :)

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

8 минут назад, IMXO сказал:

Так Вам выше ссылки дали, Вы хоть по одной перешли? судя по всему - нет. А там 90% кода для вашей хотелки, приложите усилие и напишите оставшееся 10, причем никто не запрещает задавать правильные вопросы в этой теме ... Нет желания напрягать свой мозг , где искать исполнителя Вам тоже указали.

ЗЫ  А песню про "сами мы не местные, от поезда отстали, деньги украли, документы потеряли, помогите , не проходите мимо", здесь на форуме, исполняют по десятку раз на неделе. :)

Нет, нет, уважаемый Имхо! За ссылки отдельное спасибо! Перешел, пробежал глазами. Сегодня мероприятие работаю допоздна. Поэтому ответить на сообщение быстрее, чем изучить материал. Но конечно я воспользуюсь всем, что посоветовали.

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

2 часа назад, Dimko1983 сказал:

За ссылки отдельное спасибо! Перешел, пробежал глазами. Сегодня мероприятие работаю допоздна. Поэтому ответить на сообщение быстрее, чем изучить материал

Ннндаааа! Оно конечно вежливо отмазался, но всё же вполне справедливо замечено -

2 часа назад, IMXO сказал:

Нет желания напрягать свой мозг , где искать исполнителя Вам тоже указали.

И только ув. Огонёк почему-то решил потакать.  

1.jpg.826eb41bd9c6d0adb16c4746f10b828e.jpg

и даже можно только за доброе слово. :)

Да, здесь профильный форум, но только для помощи, кому она нужна в освоении материала, а не для исполнения любых желаний. Причём совершенно независимо от сколькими пальцами надо об асфальт.

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

Готов к забрасыванию помидорами, но снова повторю - в деле совсем мало волоку. Поэтому и писал первый пост в песочницу. Ну как бы с детства начать))

Вопрос в следующем. Вот есть код (ссылка выше), есть  в нем в принципе всё, что нужно кроме выключения светодиода и ожидания следующего нажатия. Делюсь мыслями последовательно. Насколько я выяснил, задержку пишем функцией _delay_. То есть по идее имеем следующую последовательность команд: 

if (clik==0)
        {
            PORTB = puls [0]; //Пока не нажата кнопка, работает диод1.

           _delay_ms(500);

           PORTB = 0b00000000;
         }
        

Но не гаснет светодиод после задержки. 

Как засветить светодиод - знаю. Как погасить его в рамках бесконечного цикла - моргать светодиодом постоянно - изучил в материалах для чайников. Умею. Как заставить светодиод погаснуть и ждать команды не умею. 

Методом тыка пытался использовать функцию break. Пытался через if/else. Не работает. Правда подставлял все эти функции в этот код с прерываниями. а может надо было иначе пойти?..

Посмотрел ссылки от уважаемого Имхо. Задачи описаны верно. Язык непонятен мне. Ассемблер? Вообще не волоку в нем. Ни бельмесо:-)

А может есть какие-нибудь инструкции что-ли? Ну типа как книга рецептов - возьми стакан муки и три яйца. И ты смотришь и повторяешь. Раз, другой, третий.. потом сам. И не говорят тебе - вон там курица ходит, а в поле пшеница. Так и здесь - возможно узнать сам рецепт? Чтоб например: Есть такая-то и такая-то функция, используй ее. Или  - реализовать проект можно иначе, обрати внимание на вот такое и такое... Не прошу сделать работу за меня. Прошу помочь максимально возможно. Сидит неандерталец и пытается саморез плоскогубцами выкрутить. Вы проходите мимо и говорите: "Нафига ж ты плоскогубцами крутишь? Отвертку возьми!" - и он берет и Сам выкручивает. Сделал сам, но помощь весьма и весьма! Помогите неандертальцу микроконтроллерного мира))))

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

38 минут назад, Dimko1983 сказал:

Ну как бы с детства начать))

Для начала разберись с обработкой кнопок (без прерываний)

https://vpayaem.ru/Atmega8_knopka.html

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

4 часа назад, Dimko1983 сказал:

Язык непонятен мне. Ассемблер? Вообще не волоку в нем. Ни бельмесо:-)

В какой из ссылок Вы увидели Ассемблер???
Вы свой код в первом посте на каком языке писали?

 

3 часа назад, skripach сказал:

Для начала разберись с обработкой кнопок (без прерываний)

где-то я это уже видел... :D 
https://forum.cxem.net/index.php?/topic/208526-программа-управления-светодиодами/&do=findComment&comment=3135620

Ну и ТСу
https://forum.cxem.net/index.php?/topic/183908-как-подружить-attiny-2313-и-биполярный-шаговый-двигатель/&do=findComment&comment=2690436

 

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

9 часов назад, Dimko1983 сказал:

Как заставить светодиод погаснуть и ждать команды не умею. 

Сейчас перед Вами - типовая задача, возникающая при программировании контроллеров: нужно одновременно обрабатывать быстрые процессы (контроль состояния кнопки, где реакция системы должны быть максимально быстрой) и медленные (светодиод, горящий 3 секунды), и так, чтобы эти процессы не мешали друг другу. Однако, может в Вашем случае всё проще? ТЗ написано расплывчато, и можно только гадать о требуемой логике. Но если предположить, что нужно следующее - пока горит светодиод, состояние кнопки игнорируется, то тогда действительно можно сильно упростить код.

Тогда код состоит из трёх блоков "Ожидание нажатия кнопки - включение светодиода на заданное время". Эти блоки почти идентичны по коду и идут один за другим в бесконечном цикле:

1) - ожидание нажатия кнопки (крутится мини-цикл до тех пор, пока состояние кнопки не изменится на нужное).

- если нажали - включаем светодиод и ждём, когда закончится задержка (delay), во время которой светодиод горит. Задержка закончилась - погасили.

2) - снова ожидаем нажатие кнопки.

- если нажали - включаем другой светодиод на другое время. Задержка закончилась - погасили.

.... - третий блок идентичен.

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

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

2 часа назад, Guaho сказал:

1) - ожидание нажатия кнопки (крутится мини-цикл до тех пор, пока состояние кнопки не изменится на нужное).

- если нажали - включаем светодиод и ждём, когда закончится задержка (delay), во время которой светодиод горит. Задержка закончилась - погасили.

2) - снова ожидаем нажатие кнопки.

Что-то тут одни нажатия. А проверять отпускание кнопки Пушкин будет?

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

Настраиваете любой таймер, чтобы он переполнялся до 85 раз в секунду, можно реже, но чем чаще, чем точнее будут значения времени.

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

Основной цикл делаете "вечным". В нём в конце делаете sleep, чтобы микроконтроллер приостанавливал работу до прерывания, это снизит энергопотребление.

Заводите переменную СОСТОЯНИЕ, которая будет от 0 до 5. 

  • 0 - ожидание вкл первого светодиода
  • 1 - первый светодиод горит
  • 2 - ожидание вкл второго светодиода
  • 3 - второй светодиод горит
  • 4 - ожидание вкл третьего светодиода
  • 5 - третий светодиод горит

Если кнопка нажата и состояние 0, 2 или 4 (достаточно проверить младший бит, если он 0), то просто увеличиваете состояние на 1 и в счётчик для таймера загружаете нужное число, чтобы счётчик уменьшился до 0 за 3 или 1,5 сек

Следующим шагом смотрите, чему равен счётчик, сразу он будет не ноль, но в следующих проходах цикла обнулится. Если обнулился, то увеличиваете состояние на 1. Если состояние стало 6, то делаете состояние 0

Если счётчик не ноль, то в зависимости от состояния включаете нужный светодиод.

Если состояние чётное, выключаете светодиоды.

sleep и переход к началу цикла, где проверка состояния кнопки.


P.S.
В такой реализации следующее нажатие кнопки будет обработано только после погасания светодиода. 

 

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

7 минут назад, IMXO сказал:

А зачем?

Как МК поймет что это именно следующее нажатие, а не до сих пор прижатая кирпичом кнопка? Если, конечно, не использовать предложенный @ChePay алгоритм.

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

1 час назад, г0сть сказал:

Что-то тут одни нажатия. А проверять отпускание кнопки Пушкин будет?

Согласен, в этом я ошибся. После delay, когда нужно гасить светодиод, проверяем отжатие. Однако, здесь придётся уже учесть дребезг, т.к. из-за него отжатие может внезапно "превратиться" в нажатие. Поэтому после гашения светодиода ждём отжатие, и если оно зафиксировано, ждём ещё 20 - 40 миллисекунд, и вновь проверяем состояние. Если отжато (по идее, раз всё возлагается на оператора, как сказал ТС, то так оно и будет), тогда отжатие считается устойчивым; переходим к ожиданию нажатия в следующем блоке.

Если же оператор будет удерживать кнопку слишком долго, автомат не будет менять своё состояние до тех пор, пока кнопка не будет отпущена и не произойдёт новое нажатие.

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

@Dimko1983 я попробую вам помочь, только у меня код будет для ардуино IDE с АТМЕГА 328, но думаю это не должно быть критично, т.к. функционально 8 и 328 атмеги в принципе отличаются только объемом памяти

Изменено пользователем v1ct0r

все гениальное просто. чем проще тем надежнее.

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

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

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

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

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

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

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

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

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

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

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