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

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

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

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

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

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

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Как выйти из режима Sleep (PIC16F84A)?

Непрочитано 08.11.2007, 11:20  
tnosov
Временная регистрация
 
Регистрация: 19.06.2007
Сообщений: 85
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
tnosov на пути к лучшему
По умолчанию Как выйти из режима Sleep (PIC16F84A)?

Как выйти из режима Sleep (PIC16F84A)?

Войти в режим Sleep получается. А выйти не получается. Задача экспериментальная:
1) после подачи питания включить светодиод;
2) по нажатию кнопки выключить светодиод и войти в режим sleep;
3) повторное нажатие выводит микроконтроллер из режима sleep и включает светодиод;
... переход к п.2

Прикладываю исходник на асемблере и схему. В железе макет собран. Все действия прокомментированы. Друзья, прошу помочь решить проблему.

-- Прилагается рисунок: --


Прикрепленный файл: 1078124.zip
Реклама:
tnosov вне форума  
Непрочитано 08.11.2007, 11:57  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

У Вас неправильно реализовано прерывание. Так оно не делается - простым переходом, ведь оно связано со стеком.
urry вне форума  
Непрочитано 08.11.2007, 12:45  
tnosov
Временная регистрация
 
Регистрация: 19.06.2007
Сообщений: 85
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
tnosov на пути к лучшему
По умолчанию

Сообщение от urry
У Вас неправильно реализовано прерывание. Так оно не делается - простым переходом, ведь оно связано со стеком.
Уважаемый urry. Я в душе надеялся на ваш ответ (на ответ профессионала). Спасибо. Однако я не понимаю физиологии, а если быть точнее, я не понимаю какая нужна последовательность действий.

Я понимаю что перед входом в сон надо загрузить в стек некий адрес. Предположим что перед командой sleep будет что-то типа call metka_sleep. Затем мы засыпаем. Дожидаемся прерывания. Выходим на вектор 4. Выполняем кусок программы который заканчивается командой retfie (возврат из прерывания по стеку). И куда мы возвращаемся? Опять к нашей метке metka_sleep. Ерунда какая-то. Может в стек можно загрузить адрес как-то иначе (или иной адрес).

urry - ну если вы знаете применительно к указанному простейшему примеру как сделать - подскажите. Я не могу найти конкретных примеров входа и выхода из режима sleep на ассемблере.

urry - ну вы же спец. Полагаю что для вас эта задача минутное дело. Помогите (на ассемблере).
tnosov вне форума  
Непрочитано 08.11.2007, 18:55  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

При выпонении команды слип происходит выборка следующей за инструкцией команды, которая будет выполнена - независимо от того, по какому поводу просыпаемся. Для подстраховки ставят ноп. Т.е идет загрузка программного счетчика, а не стека.
Чтобы не цитировать даташит дальше -
https://kazus.run/datasheets/pdf-dat...PIC16F62X.html
На асме меня программить не заставишь и мне не совсем понятно, что Ваша прога делает - поэтому я на Си написал кусочек для иллюстрации - разбирайтесь, там и проект в протеусе.

Прикрепленный файл: 4590505.rar
urry вне форума  
Непрочитано 09.11.2007, 10:29  
tnosov
Временная регистрация
 
Регистрация: 19.06.2007
Сообщений: 85
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
tnosov на пути к лучшему
По умолчанию

За материал спасибо. Я на самом деле не знал где правильно рыть.

Итак (выдержка из документации):
При выполнении команды SLEEP происходит предвыборка следующей инструкции (PC+1). Если прерывание должно выводить микроконтроллер из режима SLEEP, соответствующий бит разрешения прерывания устанавливается в '1'. Микроконтроллер выходит из режима SLEEP независимо от состояния бита GIE. Если GIE=0, выполняется следующая инструкция после SLEEP без перехода по вектору прерывания. Если GIE=1, исполняется следующая инструкция после SLEEP и происходит переход на подпрограмму обработки прерываний (адрес 0004h). Когда выполнение какой-либо команды при выходе из режима SLEEP нежелательно, необходимо после команды SLEEP использовать инструкцию NOP.

Нас не интересует переход на подпрограмму обработки прерываний. Нужно заснуть, по прерыванию проснуться, и работать дальше после команды Sleep. Я сделал всё как положено. Однако, теперь микроконтроллер не засыпает, выполняет команду Sleep и по непонятным причинам просыпается и "молотит" дальше (WDT отключен; сделан внешний подтягивающий резистор к кнопке).

Помогите разобраться!!!

LIST P=PIC16F84A
__CONFIG H'3FF1'

STATUS EQU H'0003'
PORTB EQU H'0006'
TRISB EQU H'0006'
OPTION_REG EQU H'0001' ; внимание! регистр из 2го банка
INTCON EQU H'000B' ; т.н. регистр запросов и масок

Reg_1 EQU H'000C'
Reg_2 EQU H'000D'
Reg_3 EQU H'000E'


org 0 ; начало программы
; подготовительные моменты
bsf STATUS,5 ; переход в Банк 1
; нам нужна нога RB0/INT для внешнего прерывания (согл. документации)
movlw b'00000001' ; RB0/INT на вход, остальные на выход
movwf TRISB

; включение подтягивающих резисторов, в частности для ноги RB0/INT
; т.к. управляющий бит инверсный, используем команду bcf
;bcf OPTION_REG,7

bcf STATUS,5 ; переход назад в Банк 0
clrf PORTB ; очистка порта
; работа
Start
bsf PORTB,7 ; подали сигнал на RB7
; короткая задержка, чтобы успеть отпустить кнопку после выхода из сна
call Pause
; здесь могут быть и др строчки,
; касающиеся, работы "вне сна"
; отслеживание нажатия кнопки на ноге RB0 (для входа в "сон")
m1 btfsc PORTB,0 ; бит-проверка ножки RB0/INT
goto m1
bcf PORTB,7 ; выключили сигнал на RB7 перед сном
; короткая задержка, чтобы успеть отпустить кнопку перед входом в сон
call Pause

; определение разрешений прерываний
bsf INTCON,4 ; разрешили прерывание по ноге RB0/INT

; настройка прерывания на "спадающий" фронт на ножке RA0/INT,
; т.к. она ч.з. внутренний резистор "подтянута" к плюсу
bsf STATUS,5 ; переход в Банк 1
bcf OPTION_REG,6
bcf STATUS,5 ; переход назад в Банк 0

sleep

; сегмент для контроля выполнения команды sleep
bsf PORTB,6 ; выключили сигнал на RB6
call Pause
bcf PORTB,6 ; выключили сигнал на RB6

goto Start

;delay = 1'000'000 machine cycles
Pause movlw .173
movwf Reg_1
movlw .19
movwf Reg_2
movlw .6
movwf Reg_3
wr decfsz Reg_1, F
goto wr
decfsz Reg_2, F
goto wr
decfsz Reg_3, F
goto wr
return

end ; конец программы

Прикрепленный файл: 9092381.zip
tnosov вне форума  
Непрочитано 09.11.2007, 10:34  
tnosov
Временная регистрация
 
Регистрация: 19.06.2007
Сообщений: 85
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
tnosov на пути к лучшему
По умолчанию

Уважаемы urry
Плз., не поленитесь - сделайте на Си сегмент без ухода на подпрограмму обработки прерываний. Я бы hex файл дизасемблировал и посмотрел как он устроен.
tnosov вне форума  
Непрочитано 09.11.2007, 11:25  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Чтобы посмотреть команды в си -шном коде, существует файл *.lst . Также в протеусе можете поставить галочку pic cpu registers и смотреть регистры -в пошаговой отладке.

Прикрепленный файл: 7021818.rar
urry вне форума  
Непрочитано 09.11.2007, 11:50  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Не поленился и запустил Ваш проект в МП-ЛАБе - уходит проц в спячку.
Пользуйтесь симулятором.

Прикрепленный файл: 8371382.rar
urry вне форума  
Непрочитано 09.11.2007, 12:40  
tnosov
Временная регистрация
 
Регистрация: 19.06.2007
Сообщений: 85
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
tnosov на пути к лучшему
По умолчанию

У меня конечно не так уж и много опыта, но симулятором я умею пользоваться. И в симуляторе действительно засыпает контроллер. Однако в железе контроллер "не хочет укладываться спать"...

Команда Sleep точно выполняется (в программе для контроля предусмотрен внешний сигнал на RB6 после пробуждения). Но процессор упорно не хочет спать.

Прошивал и пробовал два заведомо исправных микроконтроллера. Результат одинаков. НЕ СПИТ!

Может со схемотехникой что-то не так. Друзья - ну у кого есть практический опыт - не стесняйтесь - говорите.
tnosov вне форума  
Непрочитано 09.11.2007, 12:57  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

А как именно Вы видите, что он не спит ?
Через какое время выходит ?
Ваш хекс в студию.
urry вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AVR SLEEP режим picavr Микроконтроллеры, АЦП, память и т.д 2 19.08.2009 15:38
Как корректно перейти в sleep? hubble Микроконтроллеры, АЦП, память и т.д 7 25.12.2008 04:05
ATMEGA8 и SLEEP-режим black27512 Микроконтроллеры, АЦП, память и т.д 4 08.10.2008 18:55
выход из sleep (18f2320) SergeyKN Микроконтроллеры, АЦП, память и т.д 1 02.11.2006 14:41
HDD 2 режима? IgorN Ремонт оргтехники 9 21.10.2003 12:30


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.