Свежие обсуждения
Электроника в автомобиле

Подсветка днища автомобиля ночью.

1 7 14

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

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