Счет по двум каналам - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Счет по двум каналам
Счет по двум каналам
MasterPic Дата: Пн, 21.09.2009, 14:59  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Здравствуйте все!
Кто нибудь может сказать, как можно реализовать такую задачу.
Требуется считать непрерывно две последовательности импульсов, одна максимум 10 Гц частотой, вторая 50 Гц масимум. Причем эти два числа посылать на комп. Кто-нибудь имеет какие-то соображения на этот счет? Я теоретически на 16 серии могу считать по одному каналу на входе INT и посылать значение счетчика на данный момент, а как с двумя управиться? Я не знаком с 18 серией, но там вроде 3 входа прерывания INT, можно ли это как то использовать? Спасибо.
ЯНДЕКС Дата: 21.09.2009
DAlexV Дата: Пн, 21.09.2009, 23:21  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Попробуй вариант с прерыванием по RB4-RB7+таймер. Смотря что считать, количество импульсов за период времени или частоту.

Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
Dmitry Дата: Вт, 22.09.2009, 00:34  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Ну ежели больше ничего не делать, кроме как частоту импульсов считать и отправлять на комп, то можно просто ноги в цикле опрашивать. Частоты-то мизерные. А TMR1 на полсекунды настроить и по прерыванию от него умножать насчитанные импульсы на 2 (получится частота в Гц) и скармливать результат USART-у.
MasterPic Дата: Вт, 22.09.2009, 11:28  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Нет, мне не частоту надо считать, а количество импульсов от начала до конца, то есть с самого первого пришедшего импульса и до последнего. Частота может меняться от 1 Гц(теоретически, но думаю не будет) до 10. И от 20 Гц примерно до 50. И так по двум каналам. В это же время нужно отправлять эти два значения на комп, необязательно на каждый пришедший импульс. Вот такая вот задачка.
Dmitry Дата: Ср, 23.09.2009, 01:57  |                                                                                                                Сообщение # 5
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

т.е. на комп надо отправлять количество импульсов, насчитанных на момент отправки, так? А отправлять с какой-то периодичностью или по команде от компа?
По идее все еще проще. Особенно если не ждать команду от компа, а посылать на него раз в секунду, например.
Крутишься в цикле, опрашиваешь ноги, по переходу ноги из 0 в 1 увеличиваешь соотв. счетчик, по достижению счетчиком цикла определенного значения отправляешь два числа командой аппаратного вывода через USART (в PBP это HSEROUT, в протоне не знаю) на комп, чтобы задержки не было и импульсы не потерять. И все.
MasterPic Дата: Ср, 23.09.2009, 07:11  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Вот вся трудность и состоит в ловле фронтов, поскольку 0 и 1 ловить бесполезно, частота меняться может и соответственно период проверки может совпасть так, что два раза один и тот же импульс поймает. Одну я по INT могу считать, а вот вторую? Периодичность отправки - без разницы, можно и раз в секунду.
Сообщение отредактировал MasterPic - Ср, 23.09.2009, 07:12
slavauk Дата: Ср, 23.09.2009, 22:31  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 68
Репутация: 3   ±
Замечания:   ±
На сайте с 14.03.2009

Статус: Offline

Используйте таймеры настроенные на счет от внешних тактовых сигналов
Сообщение отредактировал slavauk - Ср, 23.09.2009, 22:42
Dmitry Дата: Чт, 24.09.2009, 00:34  |                                                                                                                Сообщение # 8
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Quote (slavauk)
Используйте таймеры настроенные на счет от внешних тактовых сигналов

Тоже вариант. А в 16 серии есть 2 16-битных таймера с внешним тактированием? И хватит ли автору двухбайтного числа для количества импульсов?

Quote (MasterPic)
Вот вся трудность и состоит в ловле фронтов, поскольку 0 и 1 ловить бесполезно, частота меняться может и соответственно период проверки может совпасть так, что два раза один и тот же импульс поймает

Не-е-е. Ловить фронты произвольной частоты - нефиг делать. Вот так, например:
Code

cnt = 0   ' тут вожделенное количество импульсов
flag = 0  ' состояние ноги в предыдущем цикле      
while 1=1
if portb.1 = 0 then      
       if flag = 1 then flag = 0   ' переход из 1 в 0      
else
       if flag = 0 then ' переход из 0 в 1
         cnt = cnt +1
         flag = 1        
       endif
endif
if (cnt // xx) = 0  then послать на комп        ' посылать на комп через каждые хх импульсов
wend

И что, вы хотите сказать, что этот цикл будет выполняться дольше 10 МИЛЛИсекунд (это ширина импульса скважности 1 на 50 Гц)? Да он раз 100 прокрутится, пока ноль сменится единицей или наоборот. Увеличив при этом cnt на единицу.
Опрос второй ноги в этом же цикле аналогичной конструкцией.

Сообщение отредактировал Dmitry - Чт, 24.09.2009, 00:44
slavauk Дата: Чт, 24.09.2009, 13:09  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 68
Репутация: 3   ±
Замечания:   ±
На сайте с 14.03.2009

Статус: Offline

Quote (Dmitry)
И хватит ли автору двухбайтного числа для количества импульсов?

А зачем 2-х байтного.Если
Quote (MasterPic)
одна максимум 10 Гц частотой

так даже TMR0 без предделителя переполнится не раньше чем через 25,5 секунд.
А для TMR1(2-х байтного)
Quote (MasterPic)
вторая 50 Гц масимум

нужно будет еще больше времени.
А применять аппаратный счетчик (по моему мнению)всегда более надежно.Так как считает независимо от
хода программы ,даже при всевозможных pause и др. "длинных" команд.А для "аварийного" случая
можно предусмотреть прерывание по переполнению. Впрочем ,у каждого свои вкусы, smile .Удачи
MasterPic Дата: Чт, 24.09.2009, 15:13  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

максимальные значения по обоим каналам не более 60000.
Сегодня в протеусе попробовал вариант, предложенный Dmitry, вроде работает. Надо гонять реально. Еще у меня была проблема с передачей по хардварному порту USART. Передавал температуру на комп. Периодически передавал с ошибками(вместо цифр буквы, например, или другие цифры) . Кто что может сказать по этому поводу? Есть ли способ контроля правильности передачи? У кого-то проверенные алгоритмы есть? Может лучше софтварный USART использовать?
Dmitry Дата: Чт, 24.09.2009, 20:56  |                                                                                                                Сообщение # 11
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Софтварный чревато, он реально долгий, особенно на малых скоростях. Тогда действительно импульсы лучше счетчиками считать, как slavauk говорит. А чтоб исключить ошибки, в данном случае проще всего нужную величину два раза посылать. На приемной стороне принять в две переменные, сравнить, если не совпало, ждать следующей передачи.

Добавлено (24.09.2009, 20.56.38)
---------------------------------------------

Quote (slavauk)
так даже TMR0 без предделителя переполнится не раньше чем через 25,5 секунд.

А-а, точно, стормозил, в основной программе надо просто содержимое таймера переписывать в свою переменную, а таймер обнулять. Хороший вариант. Тогда можно в основной программе чем хош заниматься. Единственная опасность - если между командой копирования значения таймера и его очисткой проскочит фронт импульса, то этот импульс потеряется.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Счет по двум каналам
Страница 1 из 11
Поиск: