|  |  |  | 
|  | 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: Я так пишу опции в Ассемблере, и с расчётом не заморачиваюсь. А как же тогда просчитать время паузы, например?Или через какое время сработает прерывание по таймеру?
 | 
 | 
|  |  |  |