29.11.2015, 10:41
|
|
Временная регистрация
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
УРА! Разобрался с "PCLATH". Блоки памяти программ в моем случае (PIC16F676) по 256 байт, поэтому надо было вставить:
Код:
|
incf PCLATH,f ;по умолчанию "PCLATH" = 0, т.е адресуется блок
;"0-FFh", чтобы адресовать блок "100-1FFh" надо "PCLATH" = "PCLATH" +1
movfw znm_new ;номер нажатой кнопки
addwf PCL,f
Jtab
nop ;нужен т.к. "znm_new" начинается с 1
goto kn1 ;переходы на блоки обработки кнопок
goto kn2
goto kn3
return ;выход |
чтобы таблица переходов заработала!
Последний раз редактировалось Nick19; 29.11.2015 в 10:44.
Причина: добавление цитаты
|
|
|
|
29.11.2015, 11:02
|
|
Временная регистрация
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
NewWriter,
Цитата:
|
А вот как раз и не нужно его обнулять! Если заглянуть в даташит, то можно увидеть, что PCLATH содержит старший байт счетчика адресов команд. Если PCLATH обнулить, то при попытке addwf PCL произойдет переход в первые 256 адресов. Объясняется это просто - старший байт счетчика берется из регистра PCLATH, а к младшему в PCL прибавляется значение из W.
|
А он уже был обнулен (не мной), хотя команда "addwf PCL,f" находилась по адресу 131h, а прыгал он на адрес 31h. Добавил "incf PCLATH,f" и все встало на места. Значит "PCLATH" не
Цитата:
|
содержит старший байт счетчика адресов команд
|
|
|
|
|
29.11.2015, 12:50
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Содержит, нравится это или нет.
Цитата:
|
The program counter (PC) is 13-bits wide. The low byte
comes from the PCL register, which is a readable and
writable register. The high byte (PC‹12:8›) is not
directly readable or writable and comes from PCLATH.
|
|
|
|
|
29.11.2015, 13:15
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Да-да, конечно же содержит. Но PCLATH - это защелка, а не прямой указатель. К регистру старшего байта счетчика команд прямого доступа нет и он нигде не показывается, а доступ к нему получается только через регистр PCLATH, его содержимое копируется в счетчик команд не сразу после записи в PCLATH, а только после изменения регистра PCL, и при изменениях счетчика команд содержимое PCLATH не меняется вслед за старшим байтом счетчика команд.
Операции через PCLATH сделаны для одновременного изменения обоих байтов в счетчике команд. Ведь МК 8-разрядный то, и двухбайтные операции выполняются в два приёма.
Сообщение от Nick19
|
хотя команда "addwf PCL,f" находилась по адресу 131h, а прыгал он на адрес 31h.
|
Всё правильно. Счетчик команд = 131h, то есть 01 31, в двух байтах. Выполняется команда изменения PCL, при этой команде значение старшего байта (было 01), берется из PCLATH, а он до этого = 00, поэтому новое значение счетчика команд = 00 31.
Как я уже до этого показывал, нужно вначале занести значение старшего байта в защелку PCLATH, и лишь потом выполнить операцию с PCL.
---
А теперь представим, что обращение к таблице происходит повторно после первого вызова, в процессе работы программы циклически обращается к таблице.
После первого обращения к таблице, когда PCLATH инкрементировался командой incf PCLATH и стал =1, переход был правильный. А второе обращение к таблице, и снова incf PCLATH ... Новое значение PCLATH после этого будет =2, так ведь? Ну и куда теперь произойдет переход? - через 256 адресов после таблицы. А все потому, что incf PCLATH вместо непосредственной записи 01 в PCLATH
movlw 01
movwf PCLATH.
Или, конкретно,
movlw high Table_label
movwf PCLATH
Table_label - это метка таблицы. она содержит числовое значение адреса, по которому размещена таблица. слово high означает, что из числового значения берется только старший байт. Ведь адрес то двухбайтный.
Последний раз редактировалось NewWriter; 29.11.2015 в 13:25.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо NewWriter за это сообщение:
|
|
|
29.11.2015, 13:49
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
И зачем весь этот словоблуд
Сообщение от NewWriter
|
Да-да, конечно же содержит. Но PCLATH - это защелка, а не прямой указатель. К регистру старшего байта счетчика команд прямого доступа нет и он нигде не показывается, а доступ к нему получается только через регистр PCLATH, его содержимое копируется в счетчик команд не сразу после записи в PCLATH, а только после изменения регистра PCL, и при изменениях счетчика команд содержимое PCLATH не меняется вслед за старшим байтом счетчика команд.
Операции через PCLATH сделаны для одновременного изменения обоих байтов в счетчике команд. Ведь МК 8-разрядный то, и двухбайтные операции выполняются в два приёма.
|
если всё и так вмещается в несколько слов из даташита?
Цитата:
|
The high byte (PC‹12:8›) is not
directly readable or writable and comes from PCLATH.
|
|
|
|
|
29.11.2015, 14:07
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Сообщение от Nick19
|
А вот насчет кнопок подскажите ... Имеются 3 кнопки, они посажены на катоды 3-х 7сегм. индикаторов. Опрос ведется
по одному пину портаА
|
Если всего один пин информационный, то во время зажигания каждого разряда и проверять состояние этого пина. Допустим, для зажигания разряда на выход МК выставляется "1". Через резистор с этого выхода подается на кнопку, а с кнопки - на информационный пин, который в режиме входа, и подтянут через резистор к "0". При замыкании кнопки, подсоединенной к разряду индикатора, в момент, когда разряд активен, на информационном пине появится "1" - это означает, что кнопка была нажата.
Зная, какой разряд в данный момент светится, можно узнать, какая кнопка была нажата.
Значит, в код, который зажигает каждый разряд индикатора, надо вставить проверку состояния информационного пина.
То есть, сработало прерывание от таймера - активируем разряд индикатора, выставляя на выход разряда активный уровень, и сразу же (но лучше через несколько микросекунд, чтобы не влияли ёмкости) проверяем уровень на информационном пине. Не поменялся ("0") - эта кнопка не нажата. Поменялся ("1") - зафиксировали факт нажатия, выполнили действие.
И так дальше, когда активируется следующий разряд индикатора. Никакие интервалы таймера при этом не меняются.
|
|
|
|
29.11.2015, 18:25
|
|
Временная регистрация
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Сообщение от NewWriter
|
movlw high Table_label
movwf PCLATH
|
Умно, я ведь уже использую эту конструкцию, но видно тугодумие не позволяет расширить диапазон применения. Ну или мало опыта. Если PCLATH это защелка, то тогда понятно почему там 0. Я ведь до этого обращался к п/п таблиц, где однозначно прописан "clrf PCLATH", команд за 10 до того как использовать таблицу переходов. Спасибо, что натолкнули. Но в программе работает именно эта конструкция "incf PCLATH,f" причем 2 раза, но не подряд,в связи с тем, что ранее "обращался к п/п таблиц". Насчет кнопок, нужно ли проверять отжатие в цикле нажатия? Собсно я могу весь проект поместить, но там я думаю трудно будет разобраться, хотя я снабжал комментариями обильно.
|
|
|
|
29.11.2015, 18:33
|
|
Временная регистрация
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
STM32F0,
Сообщение от STM32F0
|
The high byte (PC‹12:8›) is not
directly readable or writable and comes from PCLATH.
|
Это все верно для англичанина практикующегося в программировании на PIC-ах, но
NewWriter, дал более расширенный ответ и я ему благодарен за это.
Последний раз редактировалось Nick19; 29.11.2015 в 18:38.
|
|
|
|
29.11.2015, 18:42
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
"отжатие" кнопок нужно проверять для исключения повторного выполнения действия по нажатой кнопке. То есть, не разрешать повторный переход к выполнению действия, пока не зафиксировано "отжатие".
Либо, если у кнопки есть вторая функция в виде "долгого удержания" кнопки, нужно выполнять действие по первой функции только после отжатия. Действие по второй функции кнопки выполнять после истечения интервала, в течение которого кнопка определена как "нажатая". И так же, блокировать повторную реакцию на нажатую кнопку до тех пор, пока не зафиксируется "отжатие"
|
|
|
|
29.11.2015, 18:55
|
|
Временная регистрация
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Сообщение от NewWriter
|
для исключения повторного выполнения действия
|
Вот с этого места поподробней, пожалуйста. Если каких - то файлов не хватает в проекте, сообщите.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:07.
|
|