28.11.2015, 12:16
|
|
Временная регистрация
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
|
Возможно ли такое в MPASM?
Добрый день уважаемые! Возможно ли, средствами MPASM поместить число из аккумулятора в номер бита, в битовых операциях? Может какие - то есть извращения о которых я не знаю? Помню в i8080 можно было делать все что угодно.
|
|
|
|
28.11.2015, 12:25
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Нет.
_____________________
|
|
|
|
28.11.2015, 12:47
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Если написать макрос - то конечно можно, отчего же нельзя. Ассемблер ограничивается теми инструкциями, которые есть в конкретном МК, но никто не запрещает писать макросы.
http://www.piclist.com/techref/micro...h/bit/mask.htm
http://www.piclist.com/techref/micro...bit/setbit.htm
Последний раз редактировалось NewWriter; 28.11.2015 в 12:53.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
28.11.2015, 13:19
|
|
Временная регистрация
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Жаль, это надо делать макрос и вставлять его 8 раз, чтобы проверить все 8 бит, ну или заменить бит. Тяжко код раздувается, да хотя бы и с повтором всего 3,4 раза.
Код:
|
comreg MACRO n,reg,jmp
movfw reg
sublw n
skpnz
goto jmp
ENDM
-------------------------------------------
-------------------------------------------
-------------------------------------------
сomreg 1,znm_new,kn1
comreg 2,znm_new,kn2
comreg 3,znm_new,kn3
goto bt_ret
;эту часть кода можно заменить макросом
kn1 btfss fl_znew,1
bsf fl_znew,1 ;установить бит нажатия "kn1"
btfss fl_zold,1
goto bt_out
;-------------------------------------------
;Выполнение действий по нажатию "kn1"
;-------------------------------------------
kn2 btfss fl_znew,2
bsf fl_znew,2 ;установить бит нажатия "kn2"
btfss fl_zold,2
goto bt_out
;-------------------------------------------
;Выполнение действий по нажатию "kn2"
;-------------------------------------------
Kn3 btfss fl_znew,3
bsf fl_znew,3 ;установить бит нажатия "kn3"
btfss fl_zold,3
goto bt_out
;-------------------------------------------
;Выполнение действий по нажатию "kn3"
;------------------------------------------- |
Последний раз редактировалось Nick19; 28.11.2015 в 14:05.
|
|
|
|
28.11.2015, 14:01
|
|
Временная регистрация
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
NewWriter, Ну скажем так, размер кода в ссылках, сопоставим с моим. Хотя последний код во второй ссылке, надо пощупать поближе. Вообще хороший этот ресурс "piclist.com". Я и раньше им пользовался. Все равно спасибо! А вот немного не по теме, а может и по теме, почему - то не работает пример из книги В. Тимофеева:
Код:
|
movf command, w
sublw ‘A’ ; Нормируем значение
addwf pcl, f
JumpTable:
goto Cmd_A
goto Cmd_B
goto Cmd_C
goto Cmd_D
goto Cmd_E
goto Cmd_F
goto Cmd_G
goto Cmd_H |
При первом же переходе (по моим понятиям в PCL должен быть адрес "goto Cmd_A"), программа улетает на адрес 68h. Программа находится в первом 256 - байтовом блоке, PCLATH обнулял. В чем засада? И можно ли как - то посмотреть PCL, в MPLAB он показывает 00.
|
|
|
|
28.11.2015, 17:43
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Сообщение от NewWriter
|
Если написать макрос - то конечно можно, отчего же нельзя.
|
И как вам макрос поможет? ТС в первом посте хочет использовать содержимое аккумулятора, как номер бита в битовой операции, но в инструкции bcf номер бита это константа и содержимое аккумулятора или другого регистра не может быть использовано как номер бита.
|
|
|
|
28.11.2015, 21:16
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Сообщение от realid
|
И как вам макрос поможет?
|
Чисто визуально. Да и не мне, а топикстартеру. Он хочет видеть текст в таком виде - пожалста, пусть будет в таком виде.
Сообщение от Nick19
|
. Тяжко код раздувается
|
Так оформить тогда не макросом, а вызовом подпрограммы call --- return
Быстрее всего и короче работает прямой выбор из таблицы:
W:
addwf PCL
dt 1‹‹0, 1‹‹1, 1‹‹2, 1‹‹3, 1‹‹4, 1‹‹5, 1‹‹6, 1‹‹7
dt - это аналог retlw. запись 1‹‹3 означает 1 в позиции бита 3 (0000 1000)
Сообщение от Nick19
|
PCLATH обнулял
|
А вот как раз и не нужно его обнулять! Если заглянуть в даташит, то можно увидеть, что PCLATH содержит старший байт счетчика адресов команд. Если PCLATH обнулить, то при попытке addwf PCL произойдет переход в первые 256 адресов. Объясняется это просто - старший байт счетчика берется из регистра PCLATH, а к младшему в PCL прибавляется значение из W. Значение из регистра PCLATH переписывается в счетчик команд только при командах изменения PCL. Поэтому при возврате обратно из таблицы никаких операций с PCLATH производить не нужно (кроме случая, когда возврат происходит из другой страницы, пересекая блоки по 2048 адресов)
Вот что будет происходить в разных ситуациях, каждый раз, когда таблица пересекает каждые 256 адресов или начало таблицы находится дальше, чем граница блока в 256 адресов от инструкции call, вызывающей таблицу:
Исходя из этого, если нельзя избежать того, что таблица будет пересекать границу блока, то придется вводить дополнительную функцию, которая будет прибавлять 1 к регистру PCLATH, если W превысит предельное значение, для которого произойдет пересечение границы блока.
Еще одна похожая штука есть с пересечением страниц - то есть, блоков по 2048 адресов. И действует она дополнительно и на команды call и goto. Но если заменить эти инструкции на псевдоинструкции lcall и lgoto, то ассемблер сам будет вставлять переключение двух битов в регистре PCLATH ‹4:3›.
Для вызова таблицы, находящейся в другой странице, работает способ из предыдущего случая, дополнительно lcall использовать не нужно.
Но а вот после возврата из другой страницы очень желательно сразу же выставить прежнюю (текущую) страницу битами PCLATH ‹4:3›, иначе при любом переходе "выбросит" в другую страницу, ведь биты PCLATH ‹4:3› остались не измененными и подействуют при первом же следующем переходе по goto или call
Вот такие вот есть особенности писания, которые нужно понимать и помнить.
Что касается определения нажатых кнопок, то тут хорошо работает простое тестирование бита, на котором сидит кнопка, инструкцией btfss ( btfsc) и переход для выполнения действия.
Желательно вначале прочитать порт целиком и занести в промежуточный регистр, и уже в нем тестировать биты. Хотя и не обязательно.
Однако, такая простая конструкция работает в простом случае, если нужно определить нажатую кнопку и тут же выполнить действие.
А вот если нужна вторая функция кнопки при долгом удержании кнопки или функции при одновременном нажатии двух (или более) кнопок, то придется отслеживать еще и опускание кнопки и действие выполнять уже после отпускания. А при нажатии двух и более кнопок, тестировать нажатие каждой кнопки последовательно, причем, учитывая, что в реале строго одновременного нажатия двух кнопок не бывает, нужен некоторый интервал для определения двух нажатых кнопок, и только после этого выполнять какое-то действие.
|
|
|
Эти 3 пользователя(ей) сказали Спасибо NewWriter за это сообщение:
|
|
|
28.11.2015, 22:01
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Сообщение от NewWriter
|
Вот такие вот есть особенности писания, которые нужно понимать и помнить.
|
А оно того стОит?
|
|
|
|
28.11.2015, 22:32
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
Сообщение от Nick19
|
почему - то не работает пример из книги В. Тимофеева:
sublw ‘A’
|
Кстати, не надо забывать, что 'A' в англ.кодировке - это значение 0х41, или 65, а sublw .65 означает .65 - W, то есть, W должно быть в диапазоне от .65 и в меньшую сторону на величину таблицы минус 1, то есть, от 58 до 65. Если W оказывается вне этого диапазона, то получаем вылет из таблицы и выполнение совсем другой инструкции, кстати, и без возврата обратно, ну и как следствие, сбой работы, ошибки, зависания.
Кстати, при значении W=.66, когда после вычитания получим 0xFF, после вызова таблицы мы получим абсолютное и совершенно невыходимое зависание МК, и спасет только WDT, если включен. Да и то - до следующего "попадания".
Поэтому, если W получается из входных данных - чтение порта, прием по интерфейсу, результат АЦП, то без проверки допустимого диапазона W, такой код применять с осторожностью и понимая последствия ошибочного значения.
Сообщение от STM32F0
|
А оно того стОит?
|
Хм. Ну если топикстартер желает именно так, то конечно стОит, иначе - кабздец.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
29.11.2015, 08:58
|
|
Временная регистрация
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
|
Re: Возможно ли такое в MPASM?
NewWriter,
Вот такая простая программка работает как надо.
Код:
|
str clrf t_nk
decf t_nk,f
jmp0 incf t_nk,f
movf t_nk,w
addwf PCL,f
jtab
goto cmd_0
goto cmd_1
goto cmd_2
goto jmp0
cmd_0 nop
goto jmp0
cmd_1 nop
goto jmp0
cmd_2 nop
goto str |
Таблицы давно и успешно использую:
Код:
|
;Таблица Segm7 преобразования: номер позиции таблицы -› ;семисегментный код
;адрес символа соответствует номеру символа, например в W=07h - ;символ "7"
Segm7
CLRF PCLATH
ADDWF PCL, F
; 0 1 2 3 4 5 6 7 8 9 A b
dt 07E, 00C, 0B6, 09E, 0CC, 0DA, 0FA, 00E, 0FE, 0DE, 0EE, 0F8
; C d E F
dt 072, 0BC, 0F2, 0E2
;-кодировка индикатора Протеуса А - верх горизонтал
;================================================= ===============
;таблица 1 символов начинается с W=0 - первая строка
Tab1
CLRF PCLATH
ADDWF PCL, F
;sim adr Tab1
dt 07C,81h ;"U" 0 напряжение
dt 08C,85h ;"-I" 2 установка тока
dt 00C,85h ;"I" 4 измерение тока
dt 0F0,89h ;"t" 6 температура
dt 09E,91h ;"3" 8 заряд
dt 0E6,91h ;"P" 0ah разряд
dt 0EC,91h ;"H" 0ch Hi
dt 070,91h ;"L" 0eh Li
dt 080 ;"-" 10h тире
;=============================================== |
Что -то с табуляцией не то.
Цитата:
|
1‹‹3 означает 1 в позиции бита 3 (00001000)
|
Такую операцию раньше не использовал. Спасибо. Действительно получается просто. А вот насчет кнопок подскажите. В инете программы опроса кнопок с программной задержкой:
Код:
|
loop decfsz Wait,f
goto loop |
У меня использован TMR0, создающий интервалы 16 мс. Это время свечения одного индикатора. Цикл обновления дисплея 16*3=48 мс. Работа по прерываниям от переполнения таймера. Все работает прекрасно в Протеусе, кроме кнопок. Никак не получается задействовать эти интервалы для опроса кнопок. Имеются 3 кнопки, они посажены на катоды 3-х 7сегм. индикаторов. Опрос ведется
по одному пину портаА. Хотелось бы обойтись без программных задержек, дабы не нарушать интервалы таймера. То есть опрос на лету. Где - то бы посмотреть как умные люди делают. Задержки можно делать подсчетом интервалов таймера.
Последний раз редактировалось Nick19; 29.11.2015 в 09:29.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:48.
|
|