|
вопросы по pic24, помогите новичку) |
|
|
|
Nov 24 2012, 11:09
|
Группа: Новичок
Сообщений: 7
Регистрация: 22-11-12
Из: Украина
Пользователь №: 74 519

|
Здраствуйте!!! помогите, пожалуйста...
Измерить временной интервал. Входные сигналы являются сигналами логического уровня ТТЛ. 2 входных сигнала (от двух фотодатчиков). Использую микроконтроллер PIC24F16KA102 (28 ножек), семисегментную индикацию (5 индикаторов), интерфейс SPI.
по-быстрячку накидала алгоритм (прикрепила), начала писатьт прогу, застряла...
|
|
|
|
|
 |
Ответов
|
Nov 28 2012, 18:04
|
Группа: Новичок
Сообщений: 7
Регистрация: 22-11-12
Из: Украина
Пользователь №: 74 519

|
Индикацию так реализовала:
// Таблица изображения чисел и символов (0,1,2,3,4,5,6,7,8,9) для индикатора const unsigned char digit[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
#define f 5 // Частота обновления результата измерения в предварительном программном буфере, гц. #define nsum (200/f) // Количество слогаемых при усреднении результата измерения nsum=Fпрер/f. int data, rez, n, temp, SYM[5];
void __attribute__ ((__interrupt__, no_auto_psv)) _T1Interrupt(void) { _T1IF = 0; if (rez==T1) { // перевод 5-ти значного числа в десятично-символьное число data=data+rez; //data - преобразуемое число, n++; if (n==nsum) { data=data/n; if (data > 99999) data=99999; data=data*10; // умножим число на 10, чтобы вывести один знак после запятой temp=data/10000;
SYM[4]=digit[temp]; data=data-temp*10000; temp=data/1000; SYM[0]=digit[temp]; data=data-temp*1000; temp=data/100; SYM[1]=digit[temp]; data=data-temp*100; temp=data/10; SYM[2]=digit[temp]; data=data-temp*10; temp=data; SYM[3]=digit[temp]; data=0; n=0; } } }
Потом передаю через SPI
void SPI1MasterInit(void) { SPI1STATbits.SPIEN = 0; SPI1CON1 = 0; SPI1STATbits.SPIEN = 0; // отключить интерфейс SPI путем сброса бита SPIEN регистра состояния SPI1STAT SPI1CON1 = 0; // очистить регистр управления интерфейса SPI1
// Используем две сигнальные линии (синхронизации передачи SCK1 и выходных данных SDO1), управляются микроконтроллером SPI1CON1bits.DISSCK = 0; // бит DISSCK регистра управления SPI1CON сброшены SPI1CON1bits.DISSDO = 0; // бит DISSDO регистра управления SPI1CON сброшены SPI1CON1bits.MODE16 = 0; // для 8-битной посылки данных бит MODE16 регистра управления сброшен SPI1CON1bits.MSTEN = 1; // микроконтроллер в режиме «ведущего», устанавливаем бит MSTEN SPI1STATbits.SPIEN = 1; // включаем SPI - интерфейс
}
///// Передача данных на управляемый регистр
void peredacha (void) { // передается строка (массив) символов
char *pSYM = SYM[5]; _SPI1IF = 0; SPI1MasterInit(); while (*pSYM!= 0) { // Для передачи одного байта записываем его в регистр SPI1BUF, микроконтроллер выполняет все циклы синхронизации передачи каждого бита
SPI1BUF = *pSYM++; while (_SPI1IF == 0); _SPI1IF = 0; } SPI1STATbits.SPIEN = 0; // выключаем SPI - интерфейс while(1); }
Как измерить интервал в секундах от начала первого сигнала до начала второго?
Сделаю два обработчика прерываний (сигнал 1 появляется на INT0, сигнал 2 появляется на INT1 ), появляются один за другим.Запуталась...как это реализовать.
Сообщение отредактировал yliya - Nov 28 2012, 18:05
|
|
|
|
|
Nov 29 2012, 06:26
|

Частый гость
 
Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344

|
Цитата(yliya @ Nov 28 2012, 20:04)  Как измерить интервал в секундах от начала первого сигнала до начала второго?
Сделаю два обработчика прерываний (сигнал 1 появляется на INT0, сигнал 2 появляется на INT1 ), появляются один за другим.Запуталась...как это реализовать. Как вариант: 1 - настроить прерывания "1" и "2" на срабатывание по фронту(или спаду , но одинаково). 2 - по получению прерывания "1" - обнулить таймер, запустить таймер. 3 - по получению сигнала "2" - остановить таймер, прочитать количество тактов из регистра таймера. 4 - пересчитать количество тактов во время на основании параметров тактирования таймера и частоты CPU. Код #define _F_CLK 20000000 /*MHz*/ #define _F_TMR ((_F_CLK / _TMR_PR/*предделитель таймера*/) / 1000 /*для получения результата в милисекундах*/)
long tmrRes; /*результат из регистра таймера*/ long time; /*время*/
time = tmrRes / _F_TMR; Дополнительно, при длительных интервалах времени, может потребоваться фиксировать прерывания от таймера и учитывать переполнение счетчика при определении количества тактов таймера. Второй вариант - каскадирование таймеров в 32-битый (не помню которые позволяли пары создавать). в порядке "покритиковать" - операции деления могут реализоваться программно (есть аппаратная реализация в PIC24 - но зависит от компилятора) и займут много машинного времени. Пересчет лучше перенести в фоновый цикл ПО. Хотя и не обязательно (все таки из вредности) .
--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть" "Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
|
|
|
|
Сообщений в этой теме
yliya вопросы по pic24 Nov 24 2012, 11:09 Ruslan1 0. К сожалению, ничего не прикрепилось.
1. С чем и... Nov 24 2012, 21:05 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 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|