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

 
 
> вопросы по 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 28 2012, 18:04
Сообщение #2





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
evc
сообщение Nov 29 2012, 11:49
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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.


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

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:45
Рейтинг@Mail.ru


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