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

 
 
> вопросы по 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
сообщение Dec 5 2012, 17:06
Сообщение #2





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



))))
Сделала так, чуть по другому. Мне надо знать в ту ли он сторону пошел вообще)

/*********************************** Обработчик прерывания 1 (INT0)(идет налево) ****************************/


void __attribute__ ((__interrupt__, no_auto_psv)) _INT0Interrupt(void)
{
_RB2=0; // засветили зеленый светодиод
_RB3=1; // погасили красный светодиод

IFS0bits.INT0IF =0; // обнуляем флаг INT0IF в регистре IFS0
IEC0bits.INT0IE=0; // запрещаем прерывания INT0, чтобы если произойдет второе событие на входе INT0,
// до завершении цикла INT1, оно не сбило счет времени
if (i==0)
{
T1CONbits.TON=1; // старт таймера 1
i=1;
}
else
T1CONbits.TON=0; // cтоп таймера 1
tmr1Res = TMR1;

TMR1=0; // обнуляем таймер 2
i=0;

}

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

void __attribute__ ((__interrupt__, no_auto_psv)) _INT1Interrupt(void)
{

_RB2=1; // погасили зеленый светодиод
_RB3=0; // засветили красный светодиод

IFS1bits.INT1IF =0; // обнуляем флаг INT1IF в регистре IFS1
IEC1bits.INT1IE=0; // запрещаем прерывания INT1

if (j==0)
{
T2CONbits.TON=1; // старт таймера 2
j=1;
}
else
T2CONbits.TON=0; // cтоп таймера 2
tmr2Res = TMR2;

TMR2=0; // обнуляем таймер 2
j=0;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

/************************************** Основная программа ***************************************************/
void main (void)
{
InitTimerAndInterrupts ();
_RB2=1; // погасили светодиод 1
_RB3=1; // погасили светодиод 2


// Счет времени

if (IFS0bits.INT0IF =1)
{
time = tmr1Res/256 /*предделитель таймера*/ / 1000/*для результата в милисекундах*/; // Результат, "молодец"
}
else
time = tmr2Res/256 /*предделитель таймера*/ / 1000/*для результата в милисекундах*/; // Результат, "сходил налево"


// *************************************** Инициализация ******************************************************//
// инициализация
void InitTimerAndInterrupts (void)
{
// Настройка прерываний
IEC0bits.INT0IE=1; // в регистре IEC0 прерывание INT0 - выставить бит 0, а также в регистре IEC1 прерывание INT1 - выставить бит 4
IEC1bits.INT1IE=1; // разрешаем прерывания на INT0 и INT1
// Настройка таймеров
IFS0bits.T1IF = 0; // Clear Output Compare interrupt flag
IEC0bits.T1IE = 1; // разрешаем прерывания таймеров
IFS0bits.T2IF = 0;
IEC0bits.T2IE = 1;

// работа от внешнего источника тактового сигнала
_TCS=1;
_TSYNC = 1; // выполняется синхронизация внешнего сигнала
_TCKPS=0011;
// Настройки выводов
TRISBbits.TRISB7 = 1; // выводы прерываний сконфигурированы на вход (RB7 и RB14)
TRISBbits.TRISB14 = 1;
TRISBbits.TRISB2 = 0; // выводы светодиодов сконфигурированы на выход (RB7 и RB14)
TRISBbits.TRISB3 = 0;

}




// Счет времени там... если... тыры пыры не обращайте внимания) там неправильно...посчитаю правильно в самих обработчиках и там же пошлю на индикацию
Go to the top of the page
 
+Quote Post
evc
сообщение Dec 6 2012, 08:11
Сообщение #3


Местный
***

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



В правильном направлении двигаетесь, Юля.
Если я хорошо понимаю, вы решили измерять временные интервалы между импульсами на одном и том же входе - INT0 и INT1.
Время между импульсами на входе INT0 измеряете Таймером1 и записываете в переменную tmr1res, а соответственно время между импульсами на входе INT1 - Таймером2 и записываете в переменную tmr2res.
Все правильно сделано, понравилось использование флагов i и J. Правда, принято в С обозначать флаги немножко по-другому,
использовать другие имена, начинающие, например на "fl" - fl_tmr1 или fl_tmr2. Но это вопрос синтаксиса.
Также не надо запрещать прерывание:
Код
             IFS0bits.INT0IF =0; // обнуляем флаг INT0IF в регистре IFS0
             IEC0bits.INT0IE=0;     // запрещаем прерывания INT0, чтобы если произойдет второе событие на входе INT0,
                                // до завершении цикла INT1, оно не сбило счет времени

так как в таком случае, после первого прерывания, второго не будет. Просто удалите строчку IEC0bits.INT0IE=0;. Я это предложил вам сделать,
что бы цикл измерения начинался только с сигнала на входе INT0 и заканчивался только по сигналу на входе INT1. Но тогда я вам
предложил разрешить его в конце цикла измерения, а именно в обработчике прерывания INT1.
Зато здесь, если запретите после первого сигнала, второй сигнал не вызовет прерывание и программа "зависнет".
То же самое нужно сделать и во втором обработчике - убрать похожую строчку.
Прокралась синтаксическая ошибка:
Цитата
if (i==0)
{
T1CONbits.TON=1; // старт таймера 1
i=1;
}
else
{
T1CONbits.TON=0; // cтоп таймера 1
tmr1Res = TMR1;

TMR1=0; // обнуляем таймер 2
i=0;
}


В основном - очень хорошо! Давайте дальше - вам нужно написать два (практически одинаковых) обработчика прерываний таймеров (1 и 2).


ПП А вот это:
Цитата(yliya @ Dec 5 2012, 21:06) *
...посчитаю правильно в самих обработчиках и там же пошлю на индикацию

в обработчиках не делается. Принцип С - это писать обработчики прерываний как можно короче и не прерывать исполнение кода обработчика
обращениями ко внешним функциям. Когда процессор исполняет код обработчика, он находится в особом состоянии - "исключение". Если в
основной программе его можно прерывать, здесь (в зависимости от приоритета прерывания, конечно) - нельзя. Поэтому можно пропустить
важные события или опоздать с обработкой других данных, если задержатся слишком долго в обработчике. Считается правильнее делать обработку данных в основной программе, а в обработчике прерываний выполнять только служебную работу - сбрасывать/поднимать флаги, запускать/заряжать таймеры, запускать/останавливать/опрашивать периферийные модули и т.д.

EDIT: volodya меня опередил. Все что он написал верно, просто вы до этого пока не дошли.


--------------------
УЭР
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   Спасибо большое!!!) Буду дальше продви...   Nov 29 2012, 18:05
|- - evc   Цитата(yliya @ Nov 29 2012, 22:05) Написа...   Nov 30 2012, 09:06
- - yliya   Я хочу научиться, а не просто "передрать и сд...   Dec 2 2012, 18:09
|- - evc   Цитата(yliya @ Dec 2 2012, 22:09) Я хочу ...   Dec 2 2012, 19:02
|- - volodya   Цитата(yliya @ Dec 5 2012, 19:06) Сделала...   Dec 6 2012, 06:34
- - 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 Текстовая версия Сейчас: 29th July 2025 - 12:12
Рейтинг@Mail.ru


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