Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 28.11.2015, 12:16  
Nick19
Временная регистрация
 
Аватар для Nick19
 
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
Nick19 на пути к лучшему
По умолчанию Возможно ли такое в MPASM?

Добрый день уважаемые! Возможно ли, средствами MPASM поместить число из аккумулятора в номер бита, в битовых операциях? Может какие - то есть извращения о которых я не знаю? Помню в i8080 можно было делать все что угодно.
Миниатюры:
Нажмите на изображение для увеличения
Название: ASM.jpg
Просмотров: 441
Размер:	10.8 Кб
ID:	85262  
Реклама:
Nick19 вне форума  
Непрочитано 28.11.2015, 12:25  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Возможно ли такое в MPASM?

Нет.
_____________________
realid вне форума  
Непрочитано 28.11.2015, 12:47  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" NewWriter
Nick19 (28.11.2015)
Непрочитано 28.11.2015, 13:19  
Nick19
Временная регистрация
 
Аватар для Nick19
 
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
Nick19 на пути к лучшему
По умолчанию 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"
;-------------------------------------------
Вложения:
Тип файла: doc Mpasm_16f.doc (26.5 Кб, 32 просмотров)

Последний раз редактировалось Nick19; 28.11.2015 в 14:05.
Nick19 вне форума  
Непрочитано 28.11.2015, 14:01  
Nick19
Временная регистрация
 
Аватар для Nick19
 
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
Nick19 на пути к лучшему
По умолчанию 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.
Nick19 вне форума  
Непрочитано 28.11.2015, 17:43  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Возможно ли такое в MPASM?

Сообщение от NewWriter Посмотреть сообщение
Если написать макрос - то конечно можно, отчего же нельзя.
И как вам макрос поможет? ТС в первом посте хочет использовать содержимое аккумулятора, как номер бита в битовой операции, но в инструкции bcf номер бита это константа и содержимое аккумулятора или другого регистра не может быть использовано как номер бита.
realid вне форума  
Непрочитано 28.11.2015, 21:16  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию 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 (00001000)

Сообщение от 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) и переход для выполнения действия.
Желательно вначале прочитать порт целиком и занести в промежуточный регистр, и уже в нем тестировать биты. Хотя и не обязательно.
Однако, такая простая конструкция работает в простом случае, если нужно определить нажатую кнопку и тут же выполнить действие.
А вот если нужна вторая функция кнопки при долгом удержании кнопки или функции при одновременном нажатии двух (или более) кнопок, то придется отслеживать еще и опускание кнопки и действие выполнять уже после отпускания. А при нажатии двух и более кнопок, тестировать нажатие каждой кнопки последовательно, причем, учитывая, что в реале строго одновременного нажатия двух кнопок не бывает, нужен некоторый интервал для определения двух нажатых кнопок, и только после этого выполнять какое-то действие.
NewWriter вне форума  
Эти 3 пользователя(ей) сказали Спасибо NewWriter за это сообщение:
Alex9797 (29.11.2015), Nick19 (29.11.2015), seregkasa (20.01.2016)
Непрочитано 28.11.2015, 22:01  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: Возможно ли такое в MPASM?

Сообщение от NewWriter Посмотреть сообщение
Вот такие вот есть особенности писания, которые нужно понимать и помнить.
А оно того стОит?
STM32F0 вне форума  
Непрочитано 28.11.2015, 22:32  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" NewWriter
Alex9797 (29.11.2015)
Непрочитано 29.11.2015, 08:58  
Nick19
Временная регистрация
 
Аватар для Nick19
 
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
Nick19 на пути к лучшему
По умолчанию 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.
Nick19 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что такое идентификатор для пакета CAN? greafuger Микроконтроллеры, АЦП, память и т.д 5 01.04.2008 08:53
Что такое JDM? pfgx Микроконтроллеры, АЦП, память и т.д 29 22.11.2007 22:37
floppy к lpt это возможно??? quicklyWWW Делимся опытом 8 10.04.2005 21:38
[Решено] !!! Знающие люди, HELP !!! Что такое "триггер шмитта&qu AlL Электроника - это просто 2 03.11.2004 15:43


Часовой пояс GMT +4, время: 05:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot