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

 
 
> вопросы по pic24, помогите новичку)
yliya
сообщение Nov 24 2012, 11:09
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 22-11-12
Из: Украина
Пользователь №: 74 519



Здраствуйте!!!
помогите, пожалуйста...

Измерить временной интервал. Входные сигналы являются сигналами логического уровня ТТЛ. 2 входных сигнала (от двух фотодатчиков).
Использую микроконтроллер PIC24F16KA102 (28 ножек), семисегментную индикацию (5 индикаторов), интерфейс SPI.

по-быстрячку накидала алгоритм (прикрепила), начала писатьт прогу, застряла...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
yliya
сообщение Nov 29 2012, 18:05
Сообщение #2





Группа: Новичок
Сообщений: 7
Регистрация: 22-11-12
Из: Украина
Пользователь №: 74 519



Спасибо большое!!!) Буду дальше продвигаться!

/***************************************** Обработчик прерывания 1 ******************************************/

Написала для себя алгоритмик, а как реализовать не знаю...Хоть в правильном направлении иду?
// сохранение контекста ( регистр STATUS и аккумулятор W)
// проверка источника запроса прерывания (опрашиваем флаг)
// сброс флага источника прерывания
// восстановление контекста

void __attribute__ ((__interrupt__, no_auto_psv)) _INT0Interrupt(void)
{
INTCON2=0;
_INT0EP=0;
// что-то....

}

/***************************************** Обработчик прерывания 2 ******************************************/

void __attribute__ ((__interrupt__, no_auto_psv)) _INT1Interrupt(void)
{
INTCON2=0;
_INT1EP=0;
// что-то

}




Как найти источник прерываний (опросить флаги)?
В программе необходимо определить источник прерывания (с какой стороны пришел сигнал), зажеч светодиод (INT0 - первый светодиод, на RB2, INT1 - второй светодиод, на RB3). Посчитать интервал в секундах.

+ есть кнопка которая разрешает выполнение программы и запрещает (кнопка нажата - пошла прога, еще раз нажали- остановилась (наверное запретили прерывания))

Обработку кнопки я поместила в main:

/* Для запрещения/разрешения прерываний используются две ассемблерные вставки. Группа команд
push SR
mov #0xE0, w0
ior SR
выполняет сохранение в стеке содержимого регистра состояния (push SR), устанавливает уровень приоритета 7 для процессора,
запрещая тем самым пользовательские прерывания (mov #0xE0, w0 и ior SR).
// Для разрешения прерываний нужно просто извлечь из стека старое содержимое регистра.Это произойдет при нажатии на кнопку */

asm ("push SR"
"\n mov #0xE0, w0"
"\n ior SR");
while (_RA6 != 1);
asm("pop SR");
while(1);

}





Как найти источник прерываний (опросить флаги)?
В программе необходимо определить источник прерывания (с какой стороны пришел сигнал), зажеч светодиод (INT0 - первый светодиод, на RB2, INT1 - второй светодиод, на RB3). Посчитать интервал в секундах.

+ есть кнопка которая разрешает выполнение программы и запрещает (кнопка нажата - пошла прога, еще раз нажали- остановилась (наверное запретили прерывания))

Обработку кнопки я поместила в main:

/* Для запрещения/разрешения прерываний используются две ассемблерные вставки. Группа команд
push SR
mov #0xE0, w0
ior SR
выполняет сохранение в стеке содержимого регистра состояния (push SR), устанавливает уровень приоритета 7 для процессора,
запрещая тем самым пользовательские прерывания (mov #0xE0, w0 и ior SR).
// Для разрешения прерываний нужно просто извлечь из стека старое содержимое регистра.Это произойдет при нажатии на кнопку */

asm ("push SR"
"\n mov #0xE0, w0"
"\n ior SR");
while (_RA6 != 1);
asm("pop SR");
while(1);

}
Go to the top of the page
 
+Quote Post
evc
сообщение Nov 30 2012, 09:06
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(yliya @ Nov 29 2012, 22:05) *
Написала для себя алгоритмик, а как реализовать не знаю...Хоть в правильном направлении иду?

Юля! Прочтите внимательно! На этом форуме считается "моветон" просить что бы кто-то за вас написал программу. Это не в обиду, просто имейте
ввиду!
Проехали.
Попытаюсь объяснить "на пальцах" что вам нужно. Для примера возьму ситуацию, когда вы отправляете своего молодого человека(мужа) в
магазин, и вам нужно засечь сколько это ему займет времени, дабы установить, не отклонялся ли он от маршрута (не баловался ли пивком
в попутной прилавке, хотя это можно по запаху установить, но допустим у вас нос заложен).
Сначала вам нужно определится с задачей. Если вы хотите засечь время - это и есть ваша главная задача. Придумать список покупок и
подсчитать необходимую сумму(опрашивать кнопки и передавать результат по SPI), это второстепенные задачи. И так, начнем:
Вам нужно засечь время между выходом молодого человека из дома (сигнал на входе INT0) и возвращением его домой (сигнал на входе INT1).
Что бы не пропустить эти две события, находясь в одноклассниках (когда процессор выполняет основную программу), нужно сделать так,
что бы эти события прервали вашу переписку в социальной сети, поставив (например) на дверь маленький колокольчик(нужно разрешить
в регистре IEC0 прерывание INT0 - выставить бит 0, а также в регистре IEC1 прерывание INT1 - выставить бит 4. Естественно, не надо забывать
настроить соответствующие выводы процессора на "вход" - в соответствующих регистрах TRIS).
По рассказам продвинутых девушек, лучше время засекать часами, но допустим, что вам лень доставать часы (у вашего процессора нет часов
реального времени), тогда можно использовать обычный кухонный таймер на 30 минут (лучше использовать Таймер1 процессора, так как он
заточен под измерение временных интервалов, а также пользуется для часов реального времени). Значит, достаем кухонный таймер,
(настраиваем требуемые функции Таймера1, в регистре T1CON, оставив пока бит 15 - 0, так как запустим таймер по первому событию - INT0).
Молодому человеку объясняем, что собираемся варить яйцо, поэтому достали таймер. Поскольку ожидаемое время прибытия подопытного
может оказаться за пределами этого полчаса (измеряемый интервал времени может оказаться больше времени переполнения Таймера1)
ставим кухонный таймер на стол, рядом с компьютером, на котором лазим в одноклассниках, что бы услышать звонок по окончании 30 минут
(в регистре IEC0 выставляем бит 3, что бы разрешить прерывание от Таймера1).
Все это была подготовка. (Всю эту подготовку, нужно сделать в основной программе. Можно, для наглядности ее вынести в отдельную процедуру,
назвав ее InitTimerAndInterrupts и вызвать ее в начале основной программы)
Теперь ждем первого звонка дверного колокольчика(передаем управление основной программе, в которой опрашиваем кнопки и т.д.).
Как только раздается звонок, запускаем кухонный таймер (при возникновении события на входе INT0 исполнение основной программы прерывается
и контроллер прерываний отправляет процессор на вектор соответствующего прерывания. Не надо опрашивать флаги прерываний, в 24-ой серии
об этом заботится контроллер прерываний, ровно как не надо заботится о сохранении статусного регистра и программного счетчика, об этом
заботится компилятор. И так первое что нужно сделать в обработчике прерываний по-вектору INT0 - это запустить Таймер1, выставив
бит 15 в регистре T1CON. После этого, что бы не терять время, нужно обнулить флаг INT0IF в регистре IFS0. Если предполагается что измерение
интервалов времени будет делаться многократно, сначала при входе в прерывание нужно обнулить Таймер1 а также и переменную vremya, в
которую накапливается общее количество времени, а только потом его запускать, так сказать, для чистоты эксперимента. И это все что нужно
сделать в обработчике прерывании INT0. Можно на всякий пожарный запретить прерывания INT0, что бы если произойдет второе событие
на входе INT0, до завершении цикла INT1, оно не сбило счет времени).
Дальше возвращаемся в одноклассники (управление автоматически передается основной программе. Продолжаем опрашивать кнопки и т.д.).
Как только раздается звонок кухонного таймера (если Таймер1 один переполнится - возникает прерывание), заряжаем его на 30 минут опять,
достаем ручку и ставим одну отметку на лист бумаги(в обработчике прерывании по вектору Т1 добавляем к переменной vremya 65536,
сбрасываем флаг T1IF в регистре IFS0 и выходим).
Дальше эта нехитрая процедура повторяется до возвращения любимого.
Как только услышим второй звонок дверного колокольчика, останавливаем кухонный таймер и записываем его показание(в обработчике
прерывании по вектору INT1 добавляем содержимое Таймера1 во vremya и останавливаем Таймер1 сбросив бит 15 в регистре T1CON. Если
запретили прерывание от INT0, здесь его нужно разрешить снова, что бы подготовить систему для следующего измерения).
Дальше делим количество отметок на листе на 2, что бы получить время в часах, добавляем туда последнее значение кухонного таймера,
для точности и звоним маме/продвинутой подруге (делим значение переменной vremya на количество тактов Таймера1 в секунду, что бы
получить время в секундах, а если хотим получить время в десятых секунды, делим на количество тактов Таймера1 в десятую секунды.
Дальше если надо, преобразуем значение времени в десятичное и выставляем флаг, что бы дать основной программе знать, что процедура
измерения закончена, у нас есть готовый результат и можно его передавать по SPI), что бы узнать нормально или нет опоздал наш молодой
человек. В обоих случаях целуем молодого человека и говорим ему, как его ждали с нетерпением, что бы в следующий раз ему тоже было
в нетерпение вернутся домой.
И все. Тут и сказочке конец. Увидели как просто! biggrin.gif


--------------------
УЭР
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- yliya   вопросы по pic24   Nov 24 2012, 11:09
- - Ruslan1   0. К сожалению, ничего не прикрепилось. 1. С чем и...   Nov 24 2012, 21:05
- - yliya   Индикацию так реализовала: // Таблица изображения...   Nov 28 2012, 18:04
|- - volodya   Цитата(yliya @ Nov 28 2012, 20:04) Как из...   Nov 29 2012, 06:26
|- - evc   Юля, дополню volodya: Цитата(yliya @ Nov 28 ...   Nov 29 2012, 11:49
|- - volodya   Цитата(evc @ Nov 29 2012, 13:49) int data...   Nov 29 2012, 12:59
- - yliya   Я хочу научиться, а не просто "передрать и сд...   Dec 2 2012, 18:09
|- - evc   Цитата(yliya @ Dec 2 2012, 22:09) Я хочу ...   Dec 2 2012, 19:02
- - yliya   )))) Сделала так, чуть по другому. Мне надо знать ...   Dec 5 2012, 17:06
|- - volodya   Цитата(yliya @ Dec 5 2012, 19:06) Сделала...   Dec 6 2012, 06:34
|- - evc   В правильном направлении двигаетесь, Юля. Если я х...   Dec 6 2012, 08:11
- - yliya   Спасибо огромное за ценные замечания) Обязательно ...   Dec 11 2012, 17:44
|- - volodya   Цитата(yliya @ Dec 11 2012, 19:44) но ......   Dec 12 2012, 07:33
|- - evc   Цитата(volodya @ Dec 12 2012, 11:33) Если...   Dec 12 2012, 08:50
|- - volodya   Цитата(evc @ Dec 12 2012, 10:50) Опечат...   Dec 12 2012, 12:06
|- - evc   Цитата(volodya @ Dec 12 2012, 16:06) Опеч...   Dec 12 2012, 13:01
- - yliya   .   Dec 11 2012, 17:44


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 22:31
Рейтинг@Mail.ru


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