|
Хорошо, что я не модератор. Ух и посмаковал бы я, удаляя и корректируя некоторые посты этой темы... Как? Это достигается мысленной привязкой удаляемого поста с тем, кто его написал... Я всё равно это соберу... Даже начал всё с начала - нарисовал блок-схему (свою), и пишу код (свой)... Я всё равно выиграю! Не смотря на то, что в "мозгах" МК может "крутиться" один и тот-же код, результат зависит от того, что подключено к его портам - светодиоды или стартовые кнопки пусковых шахт... Жизнь неумолима... О ПЛИС уже все знают. Если и дальше так пойдёт, то скоро появятся логические микросхемы, в виде К155ЛА3, только логика будет определяться не буквами (ЛА), а кодом прошивки... И только от желания будет зависеть "кем" станет эта мс - ЛА3 или ИЕ5. Кстати, первый компьюте был собран в гараже, именно, как игрушка... |
|
|
Zandy, спасибо! Я попробую сам. Нужно же научиться... А то уже два серьёзных коммерческих проекта потерял из-за отсутствия программиста... Нашёл одного - взялся резво, но через месяц "пропал". Говорит, нет времени... А я то взялся из расчёта, что этот програмист выполнит часть работы, касаемой МК... Через несколько месяцев я и звонить ему перестал. Хорошо, что заказчики были из знакомых... Всё равно, приятного мало. Так что, если хочешь что-то сделать - делай сам... Вот и учусь... Хорошо, что этот проект "учебный" - не коммерческий, для знакомого и он не торопит... Вопросы, конечно, есть. Но они - текущие, и отыскиваются в инете или в доках. Пока отыскиваются... А задавать их здесь, как-то, не совсем по теме. По этому, вопросы задавать буду только при явной привязке к проекту подсветки. Правда, я боюсь, что загнал себя в угол, нарисовав свою блок-схему алгоритма. По этому, если у Вас есть желание посмотреть и покритиковать, то выложу её. Собственно - в аттаче... На данный момент нет эффектов и не полностью написан код опроса кнопок. В принципе, написал на одну кнопку и прогнал - работает. Но захотелось определять нажатие кнопок не по отдельности, а одним ходом. Пока с этим и разбираюсь. Трудности тут - чисто временнОго характера. Пока получается. Но если и не получится, то вернусь к уже имеющемуся варианту покнопочного опроса. Останутся только эффекты. А боюсь я того, что при таком алгоритме может оказаться сложным вывод эффектов . Простые - типа "Всё включено" и "Всё выключено" уже стоят и реализуются без проблем. А вывод изменяющихся эффектов я ещё не делал, и идей, практически, нет. Надеюсь, нет только по тому, что ещё не думал над ними... Но если это окажется тупиком, то придётся рисовать новый алгоритм и переписывать всё с нуля... 69644.djvu |
|
|
Zandy, я немного поторопился, выложив "сырец" блок схемы алгоритма. Сейчас выкладываю реальный алгоритм, скорректированный под уже написанный код. Думаю, теперь будет понятнее. В аттаче - на первой странице общий алгоритм, а на второй - блок-схема эффекта "Бегущий огонь" (в одну сторону). Естественно, словесное описание должно добавить "ясности", по этому прилагается ниже... Во первых, я хочу использовать режим работы PIC16F628 с внутренним генератором на 32КГц. Во вторых, использую таймер TMR1, так как по сравнению с TMR0 он 2-х байтный и организован как один 16-и разрадный счётчик, значит, позволит выставлять более точно коэффициенты для получения нужных задержек. При 2-байтном таймере и частоте 32КГц свободно получается пауза в 1 сек. Таймер используется только для счёта пауз. То есть, если задана частота переключения светодиодов 1Гц, то таймер формирует задержку в 1 сек. В общем, получается, что после инициализации МК программа сразу уходит на опрос кнопок и зацикливается на нём. Вывести МК из этого состояния можно только либо нажатием на кнопку, либо дождавшись прерывания от таймера. Вы, как-то, правильно заметили, сказав, что основная работа программы - отработка пауз, то есть, ожидание. По этому, я отработку пауз "поручил" таймеру, а программу заставил постоянно опрашивать кнопки. Это две независимых опреции, происходящих одновременно. Мне так показалось "красивше"... Если произойдёт прерывание по таймеру, то программа прекратит опрос кнопок, "зайдёт" в заранее выбранный ээфект и изменит там состояние портов, потушив одни светодиоды и зажигая другие. После этого, таймер начинает новый отсчёт. Обновление происходит довольно быстро, что-то около 30мс, по этому, думаю, на оперативность опроса кнопок это не повлияет. А увеличение времени легко кооректируется изменением коэффициентов для таймера, что бы частота соответствовала... При нажатии на кнопку, произойдёт смена коэффициентов. Например, при нажатии на кнопку увеличения частоты, увеличивается на 1 переменная, определяющая, какие коэффициенты нужно загружать в таймер, что бы прлучить увеличение частоты на 1 Гц. При нажатии на кнопку уменьшения частоты - наоборот. При нажатии кнопки эффекта, так же, меняется отдельная переменная. То есть, тип эффекта и его частота запоминаются в 2-х отдельных байтах в виде числа, соответсвующего порядковому номеру эффекта и значению частоты соответственно. Реальный адрес эффекта и коэффициентов для таймера читаются из адресов, получаемых как сумма начального адреса и порядкового номера эффекта - для эффекта, и сумма начального адреса и цифры частоты. Например, 3-й эффект получается суммированием текщего значения программного счётчика со значением 3. Этот способ и у Вас был реализован. Собственно, я его и взял с Вашей проги. А коэффициенты для таймера у меня расположены по адресам 0х20h-0x2Fh и 0х30h-0x3Fh для каждого байта таймера соответственно. Всего - 16 значений, значит, 16 значений частоты - от 1Гц до 16Гц. По этим адресам прописаны коэффициенты, загрузив которые в таймер, получим частоту прерываний, численно равным частоте переключения светодиодов. Для записи в таймер нужного значения, я складываю начальный адрес со значением частоты. Например, для частоты 10Гц, у меня запоминается число "10". Значит, адрес ячеек памяти, где прописаны коэффициенты для этой частоты равны 0х20h+d'10'=0x2Ah и 0х30h+d'10'=0x3Ah. Прочитав содержимое этих двух адресов, я получаю коэффициенты для загрузки таймера. Он отработает паузу длительностью 0,1сек (10Гц). В общем, для запуска нужного эффекта, требуется записать номер эффекта и значение частоты, что происходит при опросе кнопок. А после прерывания, программа считывает эти значения, тут же получая номер эффекта со значением частоты, и запускает эффект с этими параметрами. Кстати, кнопки я "опрашиваю" сразу все. То есть, после операции опроса я получаю состояние всех кнопок одновременно. Это позволит, при желании или необходимости, реализовать отработку нажатия комбинаций кнопок, например, одновременно нажатых кнопок увеличения и уменьшения частоты. 70376.djvu |
|
|
В общем, осталось написать эффекты. Пока есть следующие: 1) Все светодиоды включены. 2) Все светодиоды выключены (это будет режим "ВЫКЛ"). 3) "Бегущий огонь" - в одну сторону (по кругу). 4) "Бегущий огонь" - в другую сторону (по кругу). 5) "Бегущий огонь" - туда-сюда. Блок-схема алгритма "Бегущий огонь" приведена на второй странице аттача с предыдущего поста. При выборе этого эффекта, в память заносится таблица комбинаций состояния портов (видна на блок-схеме). Эта таблица - одна для всех трёх вариантов. Сам эффект только определяет, увеличивать или уменьшать счётчик текущей комбинации (эффекты №3 и №4), или делать это по очереди, меняя направление, при достижении крайнего значения, когда горит первый или последний светодиод (эффект №5). Выложу-ка я прогу для критики... (аттач). В MPLAB-е всё работает. Есть только небольшое несоответствие частоты при высоких её значениях. Самое большое - на 16Гц. Это понятно, так как частота МК очень низкая (32КГц) и один машинный цикл получается длительностью, аж 0,125мс. Когда рассчитал коэффициенты для таймера, то полученные значения дают погрешность в десятые доли Гц. То есть, вместо 16Гц получается 15,8Гц. При снижении частоты погрешность уменьшается. Частота 1Гц отрабатывается чётко. Потом, когда всё напишу, попробую оптимизировать это дело, что бы добиться, хотя бы, уменьшения зависимости длительности паузы от кода. Пока же, вышел из положения, скорректировав коэффициенты для таймера. Кстати, по прерыванию отрабатывается только одна команда - return... 70380.zip |
|