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

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

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

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

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

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


 
Опции темы
Непрочитано 29.11.2015, 10:41  
Nick19
Временная регистрация
 
Аватар для Nick19
 
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
Nick19 на пути к лучшему
По умолчанию 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. Причина: добавление цитаты
Nick19 вне форума  
Непрочитано 29.11.2015, 11:02  
Nick19
Временная регистрация
 
Аватар для Nick19
 
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
Nick19 на пути к лучшему
По умолчанию Re: Возможно ли такое в MPASM?

NewWriter,
Цитата:
А вот как раз и не нужно его обнулять! Если заглянуть в даташит, то можно увидеть, что PCLATH содержит старший байт счетчика адресов команд. Если PCLATH обнулить, то при попытке addwf PCL произойдет переход в первые 256 адресов. Объясняется это просто - старший байт счетчика берется из регистра PCLATH, а к младшему в PCL прибавляется значение из W.
А он уже был обнулен (не мной), хотя команда "addwf PCL,f" находилась по адресу 131h, а прыгал он на адрес 31h. Добавил "incf PCLATH,f" и все встало на места. Значит "PCLATH" не
Цитата:
содержит старший байт счетчика адресов команд
Nick19 вне форума  
Непрочитано 29.11.2015, 12:50  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию 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.
STM32F0 вне форума  
Непрочитано 29.11.2015, 13:15  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,514
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию 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.
NewWriter вне форума  
Эти 2 пользователя(ей) сказали Спасибо NewWriter за это сообщение:
Alex9797 (29.11.2015), Nick19 (29.11.2015)
Непрочитано 29.11.2015, 13:49  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию 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.
STM32F0 вне форума  
Непрочитано 29.11.2015, 14:07  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,514
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Возможно ли такое в MPASM?

Сообщение от Nick19 Посмотреть сообщение
А вот насчет кнопок подскажите ... Имеются 3 кнопки, они посажены на катоды 3-х 7сегм. индикаторов. Опрос ведется
по одному пину портаА
Если всего один пин информационный, то во время зажигания каждого разряда и проверять состояние этого пина. Допустим, для зажигания разряда на выход МК выставляется "1". Через резистор с этого выхода подается на кнопку, а с кнопки - на информационный пин, который в режиме входа, и подтянут через резистор к "0". При замыкании кнопки, подсоединенной к разряду индикатора, в момент, когда разряд активен, на информационном пине появится "1" - это означает, что кнопка была нажата.
Зная, какой разряд в данный момент светится, можно узнать, какая кнопка была нажата.
Значит, в код, который зажигает каждый разряд индикатора, надо вставить проверку состояния информационного пина.
То есть, сработало прерывание от таймера - активируем разряд индикатора, выставляя на выход разряда активный уровень, и сразу же (но лучше через несколько микросекунд, чтобы не влияли ёмкости) проверяем уровень на информационном пине. Не поменялся ("0") - эта кнопка не нажата. Поменялся ("1") - зафиксировали факт нажатия, выполнили действие.
И так дальше, когда активируется следующий разряд индикатора. Никакие интервалы таймера при этом не меняются.
NewWriter вне форума  
Непрочитано 29.11.2015, 18:25  
Nick19
Временная регистрация
 
Аватар для Nick19
 
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
Nick19 на пути к лучшему
По умолчанию Re: Возможно ли такое в MPASM?

Сообщение от NewWriter Посмотреть сообщение
movlw high Table_label
movwf PCLATH
Умно, я ведь уже использую эту конструкцию, но видно тугодумие не позволяет расширить диапазон применения. Ну или мало опыта. Если PCLATH это защелка, то тогда понятно почему там 0. Я ведь до этого обращался к п/п таблиц, где однозначно прописан "clrf PCLATH", команд за 10 до того как использовать таблицу переходов. Спасибо, что натолкнули. Но в программе работает именно эта конструкция "incf PCLATH,f" причем 2 раза, но не подряд,в связи с тем, что ранее "обращался к п/п таблиц". Насчет кнопок, нужно ли проверять отжатие в цикле нажатия? Собсно я могу весь проект поместить, но там я думаю трудно будет разобраться, хотя я снабжал комментариями обильно.
Вложения:
Тип файла: zip Proejct_NickF.zip (105.9 Кб, 20 просмотров)
Nick19 вне форума  
Непрочитано 29.11.2015, 18:33  
Nick19
Временная регистрация
 
Аватар для Nick19
 
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
Nick19 на пути к лучшему
По умолчанию 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.
Nick19 вне форума  
Непрочитано 29.11.2015, 18:42  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,514
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Возможно ли такое в MPASM?

"отжатие" кнопок нужно проверять для исключения повторного выполнения действия по нажатой кнопке. То есть, не разрешать повторный переход к выполнению действия, пока не зафиксировано "отжатие".
Либо, если у кнопки есть вторая функция в виде "долгого удержания" кнопки, нужно выполнять действие по первой функции только после отжатия. Действие по второй функции кнопки выполнять после истечения интервала, в течение которого кнопка определена как "нажатая". И так же, блокировать повторную реакцию на нажатую кнопку до тех пор, пока не зафиксируется "отжатие"
NewWriter вне форума  
Непрочитано 29.11.2015, 18:55  
Nick19
Временная регистрация
 
Аватар для Nick19
 
Регистрация: 26.10.2008
Адрес: москва
Сообщений: 92
Сказал спасибо: 15
Сказали Спасибо 10 раз(а) в 5 сообщении(ях)
Nick19 на пути к лучшему
По умолчанию Re: Возможно ли такое в MPASM?

Сообщение от NewWriter Посмотреть сообщение
для исключения повторного выполнения действия
Вот с этого места поподробней, пожалуйста. Если каких - то файлов не хватает в проекте, сообщите.
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, время: 18:36.


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