Счет по двум каналам
|
|
MasterPic |
Дата: Пн, 21.09.2009, 14:59 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Здравствуйте все! Кто нибудь может сказать, как можно реализовать такую задачу. Требуется считать непрерывно две последовательности импульсов, одна максимум 10 Гц частотой, вторая 50 Гц масимум. Причем эти два числа посылать на комп. Кто-нибудь имеет какие-то соображения на этот счет? Я теоретически на 16 серии могу считать по одному каналу на входе INT и посылать значение счетчика на данный момент, а как с двумя управиться? Я не знаком с 18 серией, но там вроде 3 входа прерывания INT, можно ли это как то использовать? Спасибо.
|
|
|
|
DAlexV |
Дата: Пн, 21.09.2009, 23:21 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Попробуй вариант с прерыванием по RB4-RB7+таймер. Смотря что считать, количество импульсов за период времени или частоту.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
Dmitry |
Дата: Вт, 22.09.2009, 00:34 | Сообщение # 3 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Ну ежели больше ничего не делать, кроме как частоту импульсов считать и отправлять на комп, то можно просто ноги в цикле опрашивать. Частоты-то мизерные. А TMR1 на полсекунды настроить и по прерыванию от него умножать насчитанные импульсы на 2 (получится частота в Гц) и скармливать результат USART-у.
|
|
|
|
MasterPic |
Дата: Вт, 22.09.2009, 11:28 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Нет, мне не частоту надо считать, а количество импульсов от начала до конца, то есть с самого первого пришедшего импульса и до последнего. Частота может меняться от 1 Гц(теоретически, но думаю не будет) до 10. И от 20 Гц примерно до 50. И так по двум каналам. В это же время нужно отправлять эти два значения на комп, необязательно на каждый пришедший импульс. Вот такая вот задачка.
|
|
|
|
Dmitry |
Дата: Ср, 23.09.2009, 01:57 | Сообщение # 5 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
т.е. на комп надо отправлять количество импульсов, насчитанных на момент отправки, так? А отправлять с какой-то периодичностью или по команде от компа? По идее все еще проще. Особенно если не ждать команду от компа, а посылать на него раз в секунду, например. Крутишься в цикле, опрашиваешь ноги, по переходу ноги из 0 в 1 увеличиваешь соотв. счетчик, по достижению счетчиком цикла определенного значения отправляешь два числа командой аппаратного вывода через USART (в PBP это HSEROUT, в протоне не знаю) на комп, чтобы задержки не было и импульсы не потерять. И все.
|
|
|
|
MasterPic |
Дата: Ср, 23.09.2009, 07:11 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Вот вся трудность и состоит в ловле фронтов, поскольку 0 и 1 ловить бесполезно, частота меняться может и соответственно период проверки может совпасть так, что два раза один и тот же импульс поймает. Одну я по INT могу считать, а вот вторую? Периодичность отправки - без разницы, можно и раз в секунду.
Сообщение отредактировал
MasterPic - Ср, 23.09.2009, 07:12
|
|
|
|
slavauk |
Дата: Ср, 23.09.2009, 22:31 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
64
Замечания:
±
На сайте с 14.03.2009
Статус:
Offline
|
Используйте таймеры настроенные на счет от внешних тактовых сигналов
Сообщение отредактировал
slavauk - Ср, 23.09.2009, 22:42
|
|
|
|
Dmitry |
Дата: Чт, 24.09.2009, 00:34 | Сообщение # 8 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
64
Замечания:
±
На сайте с 14.03.2009
Статус:
Offline
|
Quote (Dmitry) И хватит ли автору двухбайтного числа для количества импульсов? А зачем 2-х байтного.ЕслиQuote (MasterPic) одна максимум 10 Гц частотой так даже TMR0 без предделителя переполнится не раньше чем через 25,5 секунд. А для TMR1(2-х байтного) Quote (MasterPic) вторая 50 Гц масимум нужно будет еще больше времени. А применять аппаратный счетчик (по моему мнению)всегда более надежно.Так как считает независимо от хода программы ,даже при всевозможных pause и др. "длинных" команд.А для "аварийного" случая можно предусмотреть прерывание по переполнению. Впрочем ,у каждого свои вкусы, .Удачи
|
|
|
|
MasterPic |
Дата: Чт, 24.09.2009, 15:13 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
максимальные значения по обоим каналам не более 60000. Сегодня в протеусе попробовал вариант, предложенный Dmitry, вроде работает. Надо гонять реально. Еще у меня была проблема с передачей по хардварному порту USART. Передавал температуру на комп. Периодически передавал с ошибками(вместо цифр буквы, например, или другие цифры) . Кто что может сказать по этому поводу? Есть ли способ контроля правильности передачи? У кого-то проверенные алгоритмы есть? Может лучше софтварный USART использовать?
|
|
|
|
Dmitry |
Дата: Чт, 24.09.2009, 20:56 | Сообщение # 11 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Софтварный чревато, он реально долгий, особенно на малых скоростях. Тогда действительно импульсы лучше счетчиками считать, как slavauk говорит. А чтоб исключить ошибки, в данном случае проще всего нужную величину два раза посылать. На приемной стороне принять в две переменные, сравнить, если не совпало, ждать следующей передачи. Добавлено (24.09.2009, 20.56.38) ---------------------------------------------
Quote (slavauk) так даже TMR0 без предделителя переполнится не раньше чем через 25,5 секунд. А-а, точно, стормозил, в основной программе надо просто содержимое таймера переписывать в свою переменную, а таймер обнулять. Хороший вариант. Тогда можно в основной программе чем хош заниматься. Единственная опасность - если между командой копирования значения таймера и его очисткой проскочит фронт импульса, то этот импульс потеряется.
|
|
|
|