|
|
|
|
Zandy, спасибо, вечером посмотрю, наглотавшись предварительно валерьянки... Достаёт меня этот Протеус - не по детски... своими зависаниями и глючной работой... По Вашей программе. Вскользь проглянул листинг проги - в основном добавления. Значит, "глюки" должны остаться прежними. В Протеусе смотреть - это уже когда всё готово, а работу проги лучше просматривать в MPLAB. У меня - MPLAB FULL v5.70.40 Так вот, не могу понять, почему не меняется значение рагистра PORTA? Видно, что команды идут - запись в аккумулятор и потом в этот регистр. Порт "В" меняется, а "А" - нет. Это по ходу программы. По команде TRISA - изменения происходят... В то же время, Протеус, работая по этой же прошивке, мигает светодиодами как положено... Ещё. В протеусе указано конфигурационное слово 3F30, а в листинге проги - 3F70. Чему верить? Дальше. На сколько "удобен" опрос кнопок по прерываниям таймера? Мне, почему-то кажется, что лучше было бы организовать опрос в цикле ... По крайней мере, изучение проги было бы нагляднее... для меня... А так получается, что прерывание по таймеру для перехода к опросу кнопок происходит через каждые 5 циклов прохода одного эффекта. Если не ошибаюсь... При высокой частоте мигания светодиодов это, может быть, и не существенно, а при низкой - будут трудности с "нажатием". Придётся нажать и держать, дожидаясь, пока прога "соизволит" проверить это нажатие. Кстати, как вы просчитывали временные интервалы, выбирая те или иные значения констант задержек в паузе и значение числа для таймера? |
|
|
DWD: почему не меняется значение рагистра PORTA Видимо порт A настроен на вход. Поэтому, в МПЛАБе вы его поменять не сможете. Для этого можно использовать всякие уловки. Например, временно заменив в тексте регистр PORTA на, скажем DEBUG1 (не забыв прописать его в шапке). DWD: прерывание по таймеру для перехода к опросу кнопок происходит через каждые 5 циклов прохода Я не смотрел данной программы, но опрос по таймеру (если я правильно понял, имеется ввиду обработка прерывания по переполнению таймера), как-раз и отличается стабильным временным интервалом. Это, разумеется, когда в регистр таймера записывается одно и то же число. В противном случае, если интервал таймера меняется, целесообразно, для опроса клавиатуры использовать другой таймер, или прерывания по изменению уровней на входах порта B. Если необходимо отсчитывать числа не равные 255, то у в/у ПИК628, есть очень хороший TMR2, который позволяет загружать необходимый коэффициент только один раз. |
|
|
Gregory: Видимо порт A настроен на вход. Поэтому, в МПЛАБе вы его поменять не сможете. Дело в том, что половина порта А настроена на выход (на светодиоды), а другая половина - на вход (кнопки). В процессе работы та часть, которая управляет светодиодами, должна меняться, а она не меняется... не мелялась... Последняя версия проги от Zandy теперь "работает" не только в Протецусе, но и MPLAB-е - значение битов стало меняться... Gregory: ...обработка прерывания по переполнению таймера), как-раз и отличается стабильным временным интервалом. Это, разумеется, когда в регистр таймера записывается одно и то же число. Так и есть - при инициализации записывается число и таймер его "считает"... Я имел в виду не стабильность, а вообще. Правда, теперь я понял, что таймер-то, управляется от главного генератора и его время не зависит от циклов переключения эффектов. Хотя и синхронно им. В последней версии Zandy что-то изменил, и появился какой-то опрос кнопок во время отработки паузы в эфектах. А может, это совпадение - таймер сработал в момент паузы... Тут только Zandy поможет, или куча моего времени... может быть... |
|
|
Я тут долгое время в отлучке был. Отвечу на все ваши вопросы в ближайшее время. |
|
|
DWD: Дело в том, что половина порта А настроена на выход (на светодиоды), а другая половина - на вход (кнопки). В процессе работы та часть, которая управляет светодиодами, должна меняться, а она не меняется... не мелялась... Последняя версия проги от Zandy теперь "работает" не только в Протецусе, но и MPLAB-е - значение битов стало меняться... Да, в первой версии глючок был. В последней исправлено. DWD: Я имел в виду не стабильность, а вообще. Правда, теперь я понял, что таймер-то, управляется от главного генератора и его время не зависит от циклов переключения эффектов. Хотя и синхронно им. Прерывание происходит по переполнению таймера и в данной программе выставлено равным 20 мс (можно изменить, меняя константы). Время обработки прерывания составляет примерно (не считал, можете сами посчитать) 15 - 25 мксек, т. е. крайне мало, чтобы оказывать какое-то влияние на работу мигалок. DWD: В последней версии Zandy что-то изменил, и появился какой-то опрос кнопок во время отработки паузы в эфектах. Да, я запретил прерывания во все время, кроме нахождения программного вектора в паузе, т. к. микроконтроллер в этой задаче только тем и занимается, что обрабатывает паузу. Это связано с желанием сделать "подзвучку" нажатия кнопок, т. к. туда же сунул "звучок". Просто, когда программа дорабатывается, не охота переписывать ее заново, ну и получаются такие, может не совсем оптимальные штуки. Конечно, оптимальнее всего, с точки зрения производительности микроконтроллера, формирование паузы засунуть тоже в прерывания, но задача настолько примитивна, что нет никаких проблем с производительностью. Что касается оптимальности самого кода (в смысле, покороче), тоже особо не оптимизировал. Запас - жуткий. Что касается обсуждения всяких программных штучек, милости просим в ликбез по пикам. Там мы этим занимаемся. Тем более, что сейчас там затишье. |
|
|
Я бы поставил 4 8-битных регистра с отдельной блокировкой входов и выходов. Их на шину, и из контроллера выдавать данные. Ну, и через резисторы прямо к светодиодам подключить. Дешево и сердито. |
|
|
По началу я так и собирался делать. Но потом выяснилось, что количество светодиодов будет равно 11 шт. В этом случае проще задействовать дополнительно 11-8=3 вывода другого порта. У Zandy получилось даже 12 светодиодов... Так что, нет смысла ставить регистры. Zandy, есть вопрос. Я так и смог вычислить время по константам - 50 для таймера и, например, 200+160 для паузы. Как привязать эти цифры к периоду тактового генератра? По доке на МК получается, что при занесении в предделитель таймера числа 50, получается 128 отсчётов. При периоде генератора 1мкс (частота 4МГц) получится время между прерываниями 128мкс. Вы же указываете время 20мс. Zandy: ...запретил прерывания во все время, кроме нахождения программного вектора в паузе... Разумно. У меня был вопрос на этот счёт (по алгоритму проги), но теперь всё стало понятно... надеюсь... Собираюсь, всё таки, ставить ещё одну кнопку - для регулировки частоты. То есть, одна кнопка - перебор эфектов (пока эффектов мало, хватит и одной), и две - для увеличения или уменьшения частоты мигания. Надеюсь (пока) самостоятельно это сделать... Вдруг получится... Ещё есть задумка запоминать последний выбранный эффект. Что бы после выключения и повторного включения не клацать кнопкой для поиска понравившегося эффекта. Для этого придётся запоминать переменные, определяющие номер эффекта и его частоту не в ОЗУ, а в EEPROM. Соответсвенно - и считывать данные оттуда... Ещё мне кажется, что нужно придумать что-то для включения-выключения. Ставить ещё одну кнопку?.. Посмотрю, что лучше - отдельная кнопка "Вкл/Выкл" или комбинация из нажатия двух кнопок одновременно, например, кнопок частоты. Zandy, Вы свою программу лучше знаете, на сколько это сложно? Пока я особых сложностей не вижу, но это может быть по причине неопытности... В общем, пока тупо изучаю прогу... Чуть не забыл - вопрос по файлу конфигурации... Пока не могу найти описание, как он рассчитывается. Помню, что в статьях Долгого в ж. Радио об этом рассказывалось, но пока не нашёл. Раньше у меня для этого случая стояла дополнительно вторая версия MPLAB-а - 6-я, в которой я вычислял конфигурацию. Не ужели, снова её ставить?.. Объясните, пожалуйста в двух словах. |
|
|
DWD: По доке на МК получается, что при занесении в предделитель таймера числа 50, получается 128 отсчётов. Чего-то Вы не то вычитали. У 628 - есть три таймера. Отсчёт они могут производить и от тактового генератора, и от внешних сигналов, а один - и от собственного генератора. На двух могут подключаться предделители, а на одном и последелитель. Все приращения происходят по перепаду тактового сигнала (можно выбрать положительный/отрицательный), с учётом предделителей. Прерывания генерируются при переполнении счётчиков таймеров, т.е. при переходе к 0000. DWD: как он рассчитывается А это надо? Я так пишу опции в Ассемблере, и с расчётом не заморачиваюсь. |
|
|
DWD: Я так и смог вычислить время по константам - 50 для таймера и, например, 200+160 для паузы. Как привязать эти цифры к периоду тактового генератра? Не понял вопроса. DWD: По доке на МК получается, что при занесении в предделитель таймера числа 50, получается 128 отсчётов. При периоде генератора 1мкс (частота 4МГц) получится время между прерываниями 128мкс. Вы же указываете время 20мс. Вы забыли про сам таймер и его установку в нужное число в каждом прерывании (KTMR0 equ .50) DWD: ставить ещё одну кнопку - для регулировки частоты. Это просто, только надо ли? DWD: Ещё мне кажется, что нужно придумать что-то для включения-выключения. Ставить ещё одну кнопку?.. Посмотрю, что лучше - отдельная кнопка "Вкл/Выкл" или комбинация из нажатия двух кнопок одновременно, например, кнопок частоты. Вы имеете в виду, переводить МК в слип, погасив светодиоды? Это сложнее. Проще поставить обычный выключатель. DWD: Чуть не забыл - вопрос по файлу конфигурации... Пока не могу найти описание, как он рассчитывается. Помню, что в статьях Долгого в ж. Радио об этом рассказывалось, но пока не нашёл. Что за файл? Наверное биты конфигурации. Ничего расчитывать не надо. Просто пишете, что включить, что выключить. Можно по-другому. В мплабе (в любой версии) есть в меню - установка битов конфигурации. Выставляете, что нужно, и просто переписываете хекс - число в вашу программу. Именно так у меня и сделано. Или вы имеете в виду .inc файл? Так он автоматически присоединяется, если прописан. |
|
|
Gregory: Чего-то Вы не то вычитали. Вполне возможно... Используется таймер TMR0. В проге регистр OPTION устанавливается в такое состояние: B'00000110' 7-й и 6-й биты (первые слева) не нужны. 5-й бит - сброшен, по этому определяет работу таймера от внутреннего генератора. Приращение счётчика происходит при каждом машинном цикле (1мкс при частоте 4МГц). 4-й бит - не нужен, так как определяет работу таймера от внешнего тактового сигнала, а используется внутренний. 3-й бит - сброшен, по этому предделитель включен перед таймером TMR0 и можно установить его коэффициент деления, который определяется оставшимися тремя битами - 2-м, 1-м и 0-м Получается коэффициент "110". Это сколько? В общем, я уже запутался... Вот фрагмент проги:
KTMR0 equ .50 ; Установка таймера TMR0 Koption equ B'00000110' ; Установка OPTION_REG ; три младших разряда меняют ; коэффициент предделителя
Gregory: Я так пишу опции в Ассемблере, и с расчётом не заморачиваюсь. А как же тогда просчитать время паузы, например? Или через какое время сработает прерывание по таймеру? |
|
|
|
|