Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
16.09.2007, 21:44
|
|
Временная регистрация
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
Поскажи что здесь сделать,счетчик команд pclath старший его биты
|
для переносимости кода использую следующую структуру:
if low($) › 0
org (high($)+1) *.256
endif
Tables
и дальше все коротенькие таблицы. А заголовки размещаю в программе.
Старшие биты можно получить директивой компилятора high(Tables). А именно их и нужно сувать в PCLATH
Цитата:
|
1)не понял для чего регистры ZumCnt(сколько опрос если не изменилось) и HoldTimer(удержание кнопки) ведь при декриминировании этих регистров они внновь загружаются новыми значениями
|
нда... мозг мертв, думаю глазами, но попытаюсь вспомнить. Вот пример обработчика Hold
Код:
|
KeyUpH ; Кнопка "вверх" удержана
decfsz HoldTimeDecCount,F
goto KeyUpP ; переход на кн. "нажата"
movlw HoldTimeDecCountInit
movwf HoldTimeDecCount
decfsz HoldInit,F
goto KeyUpP
incf HoldInit,F ; если перестарались с уменьшением - вернём обратно (min val = 1)
goto KeyUpP |
HoldTimeDecCount - регистр, определяющий, через какое количество ПОВТОРНЫХ реакций (напр. приращений значения, если кнопка удерживается) необходимо увеличить скорость этих реакций (т.е. снизить задержку).
HoldInit - как уже говорил, время, в течении которого надо держать кнопку, чтобы произошло повторное нажатие. Оно-то и уменьшается после каждых HoldTimeDecCount событий удержания.
Цитата:
|
регистр KbdO служит для того чтоб обозначивать какая кнопка была отжата и нажата
|
нет, регистр KbdO исторически хранит старое состояние клавы для сравнения с новым. Но в момент, когда мы уже сравнили его и обрабатываем, необходимость в старом состоянии теряется и регистр хранит биты измененных кнопок. В конце обработки в него снова загружается очередное состояние клавы, которое уже и стало "старым" - т.е. обработанным.
Код:
|
; Запоминаем новое состояние как старое
movfw KbdN
movwf KbdO |
|
|
|
|
16.09.2007, 23:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
разобрался относительно того, почему компилятор не сохраняет pclath -
Да, при каждой команде goto call содержимое pclath переписывается автоматом в рсн. Но 3 старшие разряда -а8 а9 а10 берутся из кода операции, поэтому для объема кода программ до 2 к. слов адресация проходит нормально.
Другими словами, при покареженном pclath
goto 0x7ff - проходит нормально
goto 0x800 - будет ошибка
А поскольку компилил под 628, где 7ff - крайнее...
|
|
|
|
17.09.2007, 07:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Теперь понял что такое счетчик команд и как пользоватся с PCLATH,хотя неудобно то что он разделен на старший и младший.
Операторы high, low и upper используются для получения одного байта из многобайтного значения, соответствующего метке. Применяются для управления расчетом точек динамического перехода при чтении таблиц и записи программ.
-- Прилагается рисунок: --
|
|
|
|
17.09.2007, 07:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Конечно речь шла сначало о кнопках и AVR как я помню,а ушли на счтчик команд в пиках,наверно не хорошо
-- Прилагается рисунок: --
![](https://kazus.ru/nuke/users_images/17092007/6297468.JPG)
|
|
|
|
17.09.2007, 08:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
rremix
Ошибочку нашел:
При вызове таблицы
Код:
|
BtnPress
andlw 0x0F
movwf Tbl_Tmp
movlw high(Font)
movwf PCLATH
movfw Tbl_Tmp
addwf PCL,F
return
return
return
return
return
return
goto Key1P
goto Key2P
goto Key3P |
Нужно вместо команд Key1P и т.д. ставить call так как при вызове команды goto программа просто уходит на выполнение и потом в главную программу,но у нас же остался недокрученый регистры KbdN и KbdO и при следущем сканировании сравнивая потом с регистром KbdO будет ошибка.
И в конец таблице наверно надо ставить еще return или retlw 0.
|
|
|
|
17.09.2007, 09:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Не так не вышло как предлогал.Может после выполнения например Key1P нас уже не волнует что в регистре KbdO осталось? Но как же потом увидеть что кнопка удерживается?
|
|
|
|
17.09.2007, 12:51
|
|
Временная регистрация
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
Не так не вышло как предлогал.Может после выполнения например Key1P нас уже не волнует что в регистре KbdO осталось? Но как же потом увидеть что кнопка удерживается?
|
А в этом и есть маленький хитрость:
При работе процедуры анализа происходит следующая последовательность call-goto:
Код:
|
call BtnHold
.... в стеке - адрес возврата в проц. анализа
.... PC в таблице
goto Key1H
... в стеке тот же адрес
... исполняем реакцию на кнопку
return
... возвращаемся в процедуру анализа |
справедливости ради надо отметить, что:
1. процедура реакции на кнопку должна быть короткой по времени (еще и потому, что анализ вызывается из прервыания)
2. в обработчиках кнопок нельзя использовать регистры работы с клавой (и читать тоже - не знаем, как он повернут). Хотя, если известно, какая кнопка нажата - зачем они нам?
Таким образом, обрабатываются все нажатые кнопки за один вызов KbdScan в строко определенной последовательности (начиная с конпки с большим "виртуальным" номером).
|
|
|
|
17.09.2007, 12:54
|
|
Временная регистрация
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
и еще...
1. не получилось, потому, что если вместо goto ставишь call то после исполнения процедуры реакции PC вернется в ТАБЛИЦУ. А нам эта нада?
2. насчет retlw 0: можно, но не нужно. Вырезая, я, кончено, отрезал еще 8 return-ов, и, естественно, забыл
исправить на 0x07. Таким образом ширина прыжка маскируется 8-мью значениями. Некорректный прыжок исключается.
|
|
|
|
19.09.2007, 04:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
rremix
Все разобрался,спасиб.
Только у меня не применяется HoldTimeDecCount,кажись и без него хватает задержек.Сделал небольшой проектик на протеусе,только одно но.
Опишу програмку на портах RB0-RB2 кнопки,RB3 выставляем единицу для опроса кнопок,RB4-RB6 выходы на светодиоды загарается в зависимости от нажатой кнопки.Но только все портит команда bsf PORTB,3 светодиод сам выключается,видать это и есть чтение-модификация-запись,я ее так и не понял,сейчас еще почитаю.
Прикрепленный файл: 7075335.rar
|
|
|
|
19.09.2007, 05:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Понял с командой bsf ,поставил последовательно со светодиодами резисторы по 470 Ом,заработало как надо,но будет ли так реально работать?
Да и еще немножко там напутал в подпрограмках Key1P-Key3P сейчас поправлю если надо выложу на протеусе.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Задержка нажатой кнопки
|
yostaf |
Электроника - это просто |
31 |
15.04.2008 13:37 |
Опрос кнопки
|
Electric111 |
Микроконтроллеры, АЦП, память и т.д |
15 |
18.12.2007 22:48 |
Снова кнопки....
|
dosikus |
Микроконтроллеры, АЦП, память и т.д |
34 |
10.08.2007 20:46 |
Часовой пояс GMT +4, время: 12:29.
|
|