Jump to content

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


Dimko1983
 Share

Go to solution Solved by Алексей Еремеев,

Recommended Posts

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

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

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

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

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

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

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

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

 

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

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

 

Код1.txt kn2-proteus.pdsprj

Link to comment
Share on other sites

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

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

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

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

 

Link to comment
Share on other sites

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

Требуется:

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

Link to comment
Share on other sites

Секреты депассивации литиевых батареек FANSO EVE Energy

Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>>

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

Первые в мире сигнальные реле 5-го поколения от Hongfa

Компания Hongfa разработала и предлагает три новых семейства сигнальных реле 5-го поколения: HFD5, HFD5-K и HFD5-H. На данный момент Hongfa является единственным в мире производителем таких реле.  Высокие максимально допустимые значения коммутируемого напряжения, повышенное быстродействие и уменьшенная мощность для срабатывания реле при небольшом размере отличают реле нового поколения Hongfa. Новые реле подходят для систем автоматики, измерительной техники, телекоммуникационного оборудования, а также являются хорошим решением для малогабаритных портативных устройств. Подробнее>>

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

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

 

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

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

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

Link to comment
Share on other sites

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. EVE является поставщиком аккумуляторных элементов круглого формата для электрических моделей автомобилей.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

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

Edited by Огонёк
Link to comment
Share on other sites

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

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

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

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

Edited by Dimko1983
Описка
Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

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

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

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

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

1.jpg.826eb41bd9c6d0adb16c4746f10b828e.jpg

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

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

Edited by valentinovich
Link to comment
Share on other sites

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

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

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

           _delay_ms(500);

           PORTB = 0b00000000;
         }
        

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

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

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

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

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

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

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

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

Edited by Guaho
Link to comment
Share on other sites

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

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

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

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

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

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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

А зачем?

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

Edited by г0сть
Link to comment
Share on other sites

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

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

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

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

Edited by Guaho
Link to comment
Share on other sites

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

Edited by v1ct0r

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

Link to comment
Share on other sites

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.
×
×
  • Create New...