|
вопросы по 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, 11:49
|

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

|
Юля, дополню volodya: Цитата(yliya @ Nov 28 2012, 22:04)  int data, rez, n, temp, SYM[5]; ... if (data > 99999) data=99999; data=data*10; // умножим число на 10, чтобы вывести один знак после запятой Во первых, присваивать int значения больше 65535, нельзя. Оператор if здесь никогда не исполнится. Во вторых, что это за переменная "data"? Вы добавляете туда значение таймера Т1? Так, это же двоичное значение. Его нужно сначала перевести в десятичное, а только потом вытаскивать каждую цифру отдельно, что вы делаете дальше. Хотя неизвестно зачем это вам, если будете передавать все цифры через серийный интерфейс SPI - можно "вычислять" каждую цифру перед отправкой, а потом отправлять, в рамках одного цикла. В языке С принято одинаковые, многократно совершаемые действия, загонять в цикл. Имейте ввиду, что если не переведете значение "data" в десятичное, при преобразовании "цифра" -> "символ", зайдете за рамки массива digit, с весьма непредвидимыми(печальными) последствиями. Но, конечно, вам сначала нужно решить основную задачу, именно как это вам расписал volodya.
--------------------
УЭР
|
|
|
|
Сообщений в этой теме
yliya вопросы по pic24 Nov 24 2012, 11:09 Ruslan1 0. К сожалению, ничего не прикрепилось.
1. С чем и... Nov 24 2012, 21:05 volodya Цитата(yliya @ Nov 28 2012, 20:04) Как из... Nov 29 2012, 06:26  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
|
|
|