Счетчик Импульсов Может кто уже делал?
#1
Отправлено 17 Февраль 2010 - 12:48
Может кто уже решал подобную задачу?
Подробно. В станке три режима измерений.
1 Поворот на заданный градус.
2 Реверсивное измерение движения.
3 Однонаправленное измерение движения.
Все работает на железной логике, ни единого контроллера. Датчики использую мышиные оптические.
Исполнительные механизмы 3 шаговых двигателя + 1(рабочий асинхронник). Все работает довольно надежно.
Время от времени изменяется либо 1, либо 3 измерение. И получается не точность.
(Механика жесткая, редукторы без люфтов, шаговики не на пределе возможности
в момент измерения вибрация отсутствует).
С мышиного датчика сигнал идет на компаратор с демпфером.
Осцилограф не видит помех от датчиков.
Остается одно считать импульсы паралельно схеме для сравнения.
Собрал в Проте. схемку на PIC16f628 с выходом на LCD, написал на Бейсике счетчик с ростом частоты до 2к пропуски импульсов.
Попробовал СИ там код прошивки на пределе (дальше не ковырял).
На Асм не писал (не знаю). Хочу позже переделать платы упраления на процессоры.
Подскажите, как решить первую задачку, не наступая на грабли.
Заранее спасибо Вадим.
(Может куда еще написать подскажите.)
#2
Отправлено 17 Февраль 2010 - 19:12
#3
Отправлено 17 Февраль 2010 - 20:05
Вадим.
#4
Отправлено 18 Февраль 2010 - 08:59
#5
Отправлено 18 Февраль 2010 - 12:41
Спасибо.
Я пробую, подключаю TMR0 в OPTION на RA.4 и обнуляю после считывания.
Вроде бы правильно? А с переполнениями пока не понял как их организовать или по каким адресам они находятся.
#7
Отправлено 18 Февраль 2010 - 19:37
Alex (18.2.2010, 19:19) писал:
TMR0 использую как счетчик до 255 импульсов, по другому пока не получается.
Поэтому приходится его часто проверять и обнулять. Вычитал что его можно использовать с переполнениями в 3-х переменных, 1-сам счетчик, 2-я x255, 3-я x255x255 в сумме 255+(255*255)+(255*255*255)=16 646 655 импульсов до заполнения счетчика соотв. проверять (считывать результат) намного реже. Как это сделать пока не въехал.
Спасибо за участие.
#8
Отправлено 18 Февраль 2010 - 19:58
Но нужно учитывать одно, что Вы не сможете считать значения этих делителей. Они нужны только для подсчёта полных (вместе с делителями) переполнений таймера.
Что Вам нужно. А нужо задействовать не TMR0, а TMR1 (он 16 бит) и считать ещё его переполнения. Переполнения можно узнать просто - прерывание. Делаем обработчик и инкрементируем в нём переменную. Она и будет являться старшими байтами Вашего счётчика.
#9
Отправлено 18 Февраль 2010 - 21:24
#11
Отправлено 27 Февраль 2010 - 10:20
Alex (18.2.2010, 21:38) писал:
А можно еще помощи?
Все работает, все примерно хорошо. Только Прот. ругается, пишет
[PIC 16 CORE] PC=0x009B Stack underflow executing CALL i.
[PIC 16 CORE] PC=0x005D Stack underflow executing RETURN instruction.
Ну и так далее, только адреса меняются. Причем, ошибка начинается после 5-го импульса.
Вписал местами, где возврат из условных переходов CLRWDT, стал Прот. ругаться меньше
Не 7500 ошибок а 4500, после добавил в двух местах PCON = %00000111 , Стало ошибок
меньше 2000.
Я чего-то не понимаю. Вложений GoSub у меня не более 3-х. Стэк переполняться не может.
Счетчик команд я не контролирую. Или компилятор не верный. Или настройки Протеуса не
правильные. Или то, что на бейсике я написал програмку?
Подскажите. Могу выложить все файлы, если нужно.
Позже нашел в Debug Протеуса отключил instruction execution. Ошибки больше не показывает
но сомнения остались. Раз выскакивали ошибки значит они есть?
#12
Отправлено 28 Февраль 2010 - 08:26
Ошибка явно в программе. И не важно сколько у Вас там вложений, стек может переполняться и без них.
Выложите проект, посмотрим.
#14
Отправлено 28 Февраль 2010 - 11:21

Удачи.
Спасибо большое.
Я полностью все файлы выкладываю. Асм+Pbe в матлабе пробовал компилировать, получается тоже самое.
Прикрепленные файлы
-
Pr.rar (51,92К)
Количество загрузок:: 117
#15
Отправлено 28 Февраль 2010 - 11:38
#16
Отправлено 28 Февраль 2010 - 13:04
Запустил Ваш проект, ничего не показывает почему-то


По поводу визуала Си, если имеете в виду для компа, то можете поюзать, синтаксис такой-же.
Цитата
Скачайте . Там и Русский манул есть. Попробуйте, поюзайте. Для начинающих самое то.
#17
Отправлено 28 Февраль 2010 - 13:21
Alex (28.2.2010, 13:04) писал:
Запустил Ваш проект, ничего не показывает почему-то


По поводу визуала Си, если имеете в виду для компа, то можете поюзать, синтаксис такой-же.
Тут такого нет.
Скачайте . Там и Русский манул есть. Попробуйте, поюзайте. Для начинающих самое то.
Спасибочки. В том проекте просто сначала нужно сброс нажать а потом считает все.
А сдесь сразу может считать но без сброса первого теряется 1-й импульс, после считает правильно.
7FFF последняя цифра накопления счетчика, дальше не думал, мне нужно не больше 1000.
Прикрепленные файлы
-
Pr1.rar (52,63К)
Количество загрузок:: 102
#18
Отправлено 28 Февраль 2010 - 16:51

#19
Отправлено 28 Февраль 2010 - 17:08
Кусок кода.
ID: Ke = Le I = Ke - (( Ke / 10 ) * 10 ) D = (Ke - Ke/100*100 - I)/10 S = (Ke - Ke/1000*1000 - I - D*10)/100 T = (Ke - Ke/10000*10000-I-D*10-S*100)/1000 ST = Ke / 100000 DesT = (Ke - ST*100000) / 10000 GoSub St1 CLRWDT GoTo mainОн выполняется после каждого приходящего импульса.
Во первых, это не правильно, т.к. этот кусок выполняется дольше периода приходящих импульсов, но это не критично. Во вторых, после инструкции GoSub St1, обратно возврата нет, т.е. до следующей инструкции (CLRWDT) программа не доходит. По этому после нескольких импульсов происходит переполнение.
#20
Отправлено 28 Февраль 2010 - 17:27