Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

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

Ответ
 
Опции темы Опции просмотра
Старый 30.10.2011, 20:03   #1
kazbek
Member
 
Аватар для kazbek
 
Регистрация: 30.09.2011
Сообщений: 59
Вес репутации: 126/31
kazbek will become famous soon enoughkazbek will become famous soon enough
По умолчанию Сохранение контекста при обработке прерываний

Доброго времени суток.
Читаю техническую документацию на микроконтроллер 16F877, и в пункте 12. Особенности микроконтроллеров PIC16F87X в подпункте 12.11 Сохранение контекста при обработке прерываний, наткнулся на следующие строки:


Подскажите уважаемые форумчане, как быть с определением W_TEMP ?
Если его надо определить в 4-ёх банках памяти, то сначала (перед сохранением ключевых регистров) надо протестировать "в каком банке" произошло прерывание а затем сохранять WREG ?

Код:
w_temp_0 equ 20h    ; для банка 0
w_temp_1 equ 0Ah    ; для банка 1
w_temp_2 equ 120h  ; для банка 2
w_temp_3 equ 1A0h  ; для банка 3
Так как в комментариях написано сохранить WREG в текущем банке, то значит надо иметь в каждой "банке" по байту под этот регистр...?
Иначе как находясь в банке_1 - обратиться к переменной например "баки-второй" ?

Будьте добры внесите ясность в мой пытливый ум
kazbek вне форума   Ответить с цитированием
Старый 30.10.2011, 20:21   #2
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/102
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Re: Сохранение контекста при обработке прерываний

Цитата:
Сообщение от kazbek Посмотреть сообщение
Иначе как находясь в банке_1 - обратиться к переменной например "баки-второй" ?
Для пытливого ума надо сначала внимательно почитать как адресуются регистры общего назначения.
DL36 вне форума   Ответить с цитированием
Старый 30.10.2011, 20:32   #3
kazbek
Member
 
Аватар для kazbek
 
Регистрация: 30.09.2011
Сообщений: 59
Вес репутации: 126/31
kazbek will become famous soon enoughkazbek will become famous soon enough
По умолчанию Re: Сохранение контекста при обработке прерываний

DL36 может вы поясните "школьнику" на пальцах чего-куда?
Желательно на asm'e.
Допустим прерывание произошло, когда я находился в банке_3. Регистр W_TEMP определён по адресу 0x20.
И значит надо просто написать movwf W_TEMP ? я правильно понял ?
kazbek вне форума   Ответить с цитированием
Старый 30.10.2011, 21:25   #4
kazbek
Member
 
Аватар для kazbek
 
Регистрация: 30.09.2011
Сообщений: 59
Вес репутации: 126/31
kazbek will become famous soon enoughkazbek will become famous soon enough
По умолчанию Re: Сохранение контекста при обработке прерываний

Сорри за "лишний пост", не нашёл кнопки "редактирование\правка"
Вычитал в доках следующее:
Цитата:
Обращение к регистрам общего назначения может быть выполнено прямой или косвенной адресацией (через регистры FSR и INDF). В некоторых микроконтроллерах существуют регистры общего назначения, адресуемые к одной и той же ячейки ОЗУ, независимо от текущего банка памяти данных. Обратите внимание на эти регистры, т.к. они расположены в общем ОЗУ
То есть здесь речь идёт о регистрах чьи адреса для банка_0 70h-7Fh ?
Именно к ним я могу обращаться из любого банка памяти данных?
Код:
W_TEMP equ 70h
И только после такого обьявления могу писать в W_TEMP из "любой банки". Верно?
kazbek вне форума   Ответить с цитированием
Старый 30.10.2011, 21:25   #5
2AplusA
Senior Member
 
Аватар для 2AplusA
 
Регистрация: 26.02.2007
Адрес: Penza
Возраст: 38
Сообщений: 1,383
Вес репутации: 1267/72
2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of
По умолчанию Re: Сохранение контекста при обработке прерываний

Цитата:
Сообщение от kazbek Посмотреть сообщение
DL36 может вы поясните "школьнику" на пальцах чего-куда?
Желательно на asm'e.
Допустим прерывание произошло, когда я находился в банке_3. Регистр W_TEMP определён по адресу 0x20.
И значит надо просто написать movwf W_TEMP ? я правильно понял ?
прочитайте про access bank. Все вопросы решатся.
__________________
Лучше день потерять, потом за час долететь!
2AplusA вне форума   Ответить с цитированием
Старый 30.10.2011, 22:26   #6
kazbek
Member
 
Аватар для kazbek
 
Регистрация: 30.09.2011
Сообщений: 59
Вес репутации: 126/31
kazbek will become famous soon enoughkazbek will become famous soon enough
По умолчанию Re: Сохранение контекста при обработке прерываний

С адресацией разобрался, подсмотрел чужие исходники. Оказывается что последние 16 байт каждого банка типа как общее ОЗУ, и доступ к ним можно делать не зависимо в какой "банке" находишься.
Тогда вопрос по следующей строчке кода.
Команды:
Код:
 swapf STATUS, w
movwf STATUS_TEMP
Смысловой нагрузки я не увидел в команде swapf. Обменять местами тетрады и сохранить во "временном статусе", затем при восстановлении опять обменять тетрады местами с сохранением результата в WREG. И собственно восстановление "бака памяти".
Если заменить команды swapf на команды movf\movwf то результат выполнения будет аналогичным, более того восстановление STATUS'а будет происходить за два такта в любом из вариантов.

Дело в том что в 80% просмотренных мной исходников именно сэтими камандами сохраняют и восстанавливают "важные" регистры, когда дело касается прерываний. Даже СИшный компилятор так делает (когда просматриваешь код написанный на сях под отладчиком).

Вот собственно вопрос, команды swapf - это часть "ритуала" в микроконтроллере или они здесь написаны чтобы разбавить mov-ный код ?
kazbek вне форума   Ответить с цитированием
Старый 30.10.2011, 22:56   #7
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/102
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Re: Сохранение контекста при обработке прерываний

посмотрите какие команды меняют статусные биты.
DL36 вне форума   Ответить с цитированием
Старый 30.10.2011, 23:10   #8
kazbek
Member
 
Аватар для kazbek
 
Регистрация: 30.09.2011
Сообщений: 59
Вес репутации: 126/31
kazbek will become famous soon enoughkazbek will become famous soon enough
По умолчанию Re: Сохранение контекста при обработке прерываний

movf изменяет бит Z (нуля). Много раз видел, как эта команда используется для проверки "пересылаемого" на ноль.
вот и пересылаем movf staus_temp в регистр WREG. Предположим что переслали 0. Изменился в действующем STATUS'e бит Нуля.
Но ведь следующей командой мы ставим "другой статус", который был на момент возникновения прерывания.
Код:
swapf STATUS,W
movwf STATUS_TEMP
....
swapf STATUS_TEMP,w 
movwf STATUS
думаю два этих кода эквивалентны

Код:
movf STATUS
movwf STATUS_TEMP
...
movf STATUS_TEMP
movwf STATUS
Даже если мы записываем в регистр WREG регистр STATUS равный нулю, командой movf
ТО бит Z взведётся в статусе, который останется после выполнения команды movf.
Но ведь у нас в регистре WREG уже сохранился STATUS на момент прерывания, и что с ним дальше будет происходить в зависимости от байт ориентированных команд - по большому счёту пофиг.
Ведь как я понимаю работу команды movf, то бит нуля взводится после её выполнения. Или всё таки ошибаюсь?

Последний раз редактировалось kazbek; 30.10.2011 в 23:28.
kazbek вне форума   Ответить с цитированием
Старый 30.10.2011, 23:38   #9
kazbek
Member
 
Аватар для kazbek
 
Регистрация: 30.09.2011
Сообщений: 59
Вес репутации: 126/31
kazbek will become famous soon enoughkazbek will become famous soon enough
По умолчанию Re: Сохранение контекста при обработке прерываний

Цитата:
посмотрите какие команды меняют статусные биты.
Внимательно вчитавшись в Ваше сообщение и приглядевшись к коду - понял смысл.
Если вдруг на момент прерывания в регистре WREG находился ноль, то ...
Код:
movf W_TEMP
... при восстановлени аккамулятора взведёт в статусе флаг Z. После чего происходит выход из прерывания.
Другими словами
Код:
swapf w_temp, f
swapf w_temp, w
является частью "ритуала".

Всем спасибо за ответы. Вопросов больше не имею.
Ещё раз спасибо за просветление
kazbek вне форума   Ответить с цитированием
Старый 31.10.2011, 08:43   #10
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,887
Вес репутации: 5611/171
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Сохранение контекста при обработке прерываний

Цитата:
Сообщение от kazbek Посмотреть сообщение
Всем спасибо за ответы. Вопросов больше не имею.
Ещё раз спасибо за просветление
как ни странно, вопросы должны были остаться.
потому что на входе в прерывание swap не нужен.
для интереса изучите папку \mpasm suite\template\code на вашем диске

особой роли это не играет, потому что размер кода остается тот же, но просто зачем делать малопонятные телодвижения, если можно обойтись без них...
Greg вне форума   Ответить с цитированием
Старый 31.10.2011, 09:19   #11
kazbek
Member
 
Аватар для kazbek
 
Регистрация: 30.09.2011
Сообщений: 59
Вес репутации: 126/31
kazbek will become famous soon enoughkazbek will become famous soon enough
По умолчанию Re: Сохранение контекста при обработке прерываний

Ну дык вопросов куча исшо, тока не по этой теме
kazbek вне форума   Ответить с цитированием
Старый 20.10.2019, 15:51   #12
Бобочек
Senior Member
 
Регистрация: 01.04.2013
Сообщений: 131
Вес репутации: 233/28
Бобочек has a spectacular aura aboutБобочек has a spectacular aura aboutБобочек has a spectacular aura about
По умолчанию Re: Сохранение контекста при обработке прерываний

Почему не рассматривается вопрос о сохранении банка памяти при прерываниях ?
Для малых PiC данные о банке памяти хранились в STATUS, для "продвинутых" типа PiC16F1786 для этого выделяется регистр BSR - есть пример на ассемблере ?
Бобочек вне форума   Ответить с цитированием
Старый 20.10.2019, 18:24   #13
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 2,624
Вес репутации: 3612/107
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Сохранение контекста при обработке прерываний

Может быть Вы все таки научитесь читать даташит?

Цитата:
8.5 Automatic Context Saving

Upon entering an interrupt, the return PC address is
saved on the stack. Additionally, the following registers
are automatically saved in the shadow registers:

• W register
• STATUS register (except for TO and PD)
BSR register
• FSR registers
• PCLATH register
Upon exiting the Interrupt Service Routine, these registers
are automatically restored. Any modifications to
these registers during the ISR will be lost. If modifications
to any of these registers are desired, the corresponding
shadow register should be modified and the
value will be restored when exiting the ISR. The
shadow registers are available in Bank 31 and are
readable and writable. Depending on the user’s application,
other registers may also need to be saved.
Марк вне форума   Ответить с цитированием
Старый 20.10.2019, 20:52   #14
Бобочек
Senior Member
 
Регистрация: 01.04.2013
Сообщений: 131
Вес репутации: 233/28
Бобочек has a spectacular aura aboutБобочек has a spectacular aura aboutБобочек has a spectacular aura about
По умолчанию Re: Сохранение контекста при обработке прерываний

Благодарю за подсказку, но фраза "Any modifications to these registers during the ISR will be lost" - настораживает, объясните для туповатых - что с этим делать ?
Бобочек вне форума   Ответить с цитированием
Старый 20.10.2019, 22:54   #15
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 2,624
Вес репутации: 3612/107
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Сохранение контекста при обработке прерываний

Я не очень понял что Вас насторожило. Обычный набор теневых регистров для сохранения-восстановления контекста. После восстановления контекста все изменения ОСНОВНЫХ (не теневых) регистров сделанные во время исполнения обработчика будут утеряны. При желании сохраненный контекст можно модифицировать (включая вторичное сохранение для вложенных прерываний), поскольку все теневые регистры доступны в 31 банке.
"Additionally, the following registers are automatically saved in the shadow registers:..."
Подлежащее выделено красным, а обстоятельство - зеленым.

Последний раз редактировалось Марк; 20.10.2019 в 23:06.
Марк вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
новичок просит помощи дмитрий626 Вопросы начинающих 8 30.11.2009 09:36
глюк Proteus при работе с ATtiny 45 igor727 Микроконтроллеры других производителей 0 23.05.2009 12:35
Вопрос по обработке прерываний an-sver Продукция MICROCHIP 8 06.03.2009 18:55
PIC16F877, АСМ, не могу разобраться с переключение страниц (ПРОДОЛЖЕНИЕ) OPM Продукция MICROCHIP 49 10.04.2008 22:07


Часовой пояс GMT +3, время: 13:43.


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