реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Как правильно выйти из "спящего режима"
Jagupop
сообщение Jul 17 2007, 11:09
Сообщение #16


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



С прерываниями разобрался - проц. по приходу сигнала на INT0 "просыпается", выполняет поставленную задачу и снова "засыпает". Все красиво. Спасибо конференции. НО (!). Есть несколько другая задача, которую я не знаю как решить из-за небольшого опыта. В общем, проц. "спит". На INT0 постоянно сидит лог. 1. При появлении лог. 0 проц должен проснуться и выполнять, что ему указано. При этом на INT0 - лог. 0 держится постоянно. Лишь с появлением на INT0 лог.1 проц. должен выполнить определенные предпмсания и "заснуть" в ожидании очередного лог. 0 на INT0. Вот как это реализовать? Я так понимаю, в процессе работы INT0 должен "превращаться" в PD2? Спасибо.
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Jul 17 2007, 11:34
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



Цитата
При появлении лог. 0 проц должен проснуться и выполнять, что ему указано.

Прерывание по спаду уровня(falling edge).
перестраиваем
Перенастроить прерывание по фронту(rising edge) и вот
Цитата
Лишь с появлением на INT0 лог.1 проц. должен выполнить определенные предпмсания и "заснуть" в ожидании очередного лог. 0 на INT0.


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
Jagupop
сообщение Jul 19 2007, 12:26
Сообщение #18


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Чуток не так... По falling edge проц выходит из спящего режима уходит на подпрограмму обработки прерывания. На INT0 все это время "сидит" лог. 0. Тут все хорошо. Но "заснуть"снова он должен после прихода на INT0 логической единицы! А не перед этим. Как это осуществить? Спасибо.
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Jul 19 2007, 12:43
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



если так?
Цитата
По falling edge проц выходит из спящего режима уходит на подпрограмму обработки прерывания.

Цитата
На INT0 все это время "сидит" лог. 0.

Залетаем в прерывание и анализируем наличие"0", если, верно, делаем что либо. Заодно перенастраиваем прерывание по фронту.
При появлении фронта, залетаем в прерывание и снова проверяем наличие "0", его нет соответственно, делаем другое, то есть отправляем спать.
В прерывании лучше много не делать, а устанавливать флаги. Их обрабатывать а программе.


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
Jagupop
сообщение Jul 19 2007, 13:17
Сообщение #20


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Цитата
Залетаем в прерывание и анализируем наличие"0",


А разве можно в прерывании процессор снова заставить "уснуть"? А куда процессор уйдет после просыпания в этом случае? Разве не на эту же самую подпрограмму обработки прерывания, в которой он и так уже находится?

Сообщение отредактировал Jagupop - Jul 19 2007, 13:18
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 19 2007, 15:08
Сообщение #21


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Jagupop @ Jul 19 2007, 16:17) *
А разве можно в прерывании процессор снова заставить "уснуть"? А куда процессор уйдет после просыпания в этом случае? Разве не на эту же самую подпрограмму обработки прерывания, в которой он и так уже находится?

Один из возможных вариантов:

Код
volatile U8 StateMachine = 0;

SIGNAL(INT0)
{
   StateMachine = 1;
}


main()
{
      ...    
      for(;;)
      {
          switch( StateMachine)
          {
                case 1: // Работать
                     DoSmth(); // выполнять какое-то повторяющееся действие (пока присутсвует лог 0 на Int0)
                     break;
                case 0: // Спать
                default:
                     sleep();
                     break;
           }

           if (PIND & 0x4)  // единица на INT0 - переключение состояния
               StateMachine = 0;
      }
}
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th July 2025 - 00:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01428 секунд с 7
ELECTRONIX ©2004-2016