Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: terrarus, ivan_fd  
Помогите разобраться с программой
Axell Дата: Пт, 25.02.2011, 15:07  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 25.02.2011

Статус: Offline

Добрый день..
Программированием начал заниматься недавно..
Это одна из первых моих программ..
Ребята помогите разобраться -- не работает счетчик импульсов...
При настройке T1CON как счетчик внешних импульсов -- не ситает ничего, при настройке T1CON как таймер -- все работает прекрасно...Помогите найти и разобраться, где собака порылась...

Выкладываю программу вместе с проектом Протеуса..

Сильно не пиннайтте и не ругайте -- это первая работа...

Большое спасибо за понимание и участие в решении моей проблемы..

Прикрепления: 0151588.zip (39.6 Kb)
ЯНДЕКС Дата: 25.02.2011
ADMIN Дата: Пт, 25.02.2011, 18:08  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Внешним входом импульсов для TMR1, как указано в вашей программе, является вывод RB6. Если подать на него импульсы, то таймер 1 инкрементируется, это видно в окне watch в протеусе при отладке. У вас же импульсы поступают на PORTA.0, соответственно, они не поступают в таймер. Давайте определимся с тем, что вам нужно. Потом можно и подумать, как лучше это реализовать. Потом, я так думаю, при переполнении TMR1, следует загружать в него определенное значение. У вас же очищается только TMR1L. Следующее - 10 Гц с генератора будут давать очень медленное приращение переменной counter. Я подправил чуть-чуть проект, а именно: импульсы подал на RB6, увеличил частоту генератора до 10кГц, (чтобы не ждать долго и убедиться в том, что counter инкрементируется ). В программе в прерывания добавил значение для TMR1H. Вот:
Прикрепления: 0151588.rar (49.2 Kb)
Axell Дата: Пт, 25.02.2011, 20:22  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 25.02.2011

Статус: Offline

Спасибо что откликнулись..Да, ступил я...Не тот прорект для Протееуса скинул...Закинул прошивку в нормальныйи все гут...

Quote (ADMIN)
...Давайте определимся с тем, что вам нужно. Потом можно и подумать, как лучше это реализовать....

Вообщем суть идеи такова...На RB6 будут подаваться импульсы..Их нуно сосчитать, но сосчитать по импульсу, который даст начало отсчета и по приходу этого же импульса закончится отсчет..Сосчитанное кол-во импульсов нуно вывести во вторую строчку..
Если импульс начала отсчета при подаче питания на схему через энное кол-во времени отсутствует в первую строчку вывести -- ERROR..
При нажатии на кнопку -- очистка всех счетчиков и очистка экрана(на схеме она присутствует)

Теперь по свойствам контроллера...Импульс начала отсчета кратковременный(сотые доли секунды) -- захватит ли его контроллер, если я его реализую с помощью функции BUTTON ИЛИ же его нуно бут реализовывать с помощью прерывания тоже..??

Сообщение отредактировал Axell - Сб, 26.02.2011, 01:36
ADMIN Дата: Сб, 26.02.2011, 02:34  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Думаю, будет проще импульс запуска подавать на вход INT, и в прерывании по INTF включать счет на RB6. Команду Button вооюще предпочитаю не использовать. Места много занимает, да и вообще, не нужна она.
Axell Дата: Сб, 26.02.2011, 14:24  |                                                                                                                Сообщение # 5
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 25.02.2011

Статус: Offline

Quote (ADMIN)
аю, будет проще импульс запуска подавать на вход INT, и в прерывании по INTF включать счет на RB6. Команду Button вооюще предпочитаю не использовать. Места много занимает, да и вообще, не нужна она.

Спасибо...И сче вопрос..Как в компиляторе реализовать вывод русских символов на ЛСД..???
В PBPro(вроде так наз-ся) пишешь символы в коде и он выводит их, а как сделать это в микроВасик..??
Мой ЛСД кирилицу поддерживает.

ADMIN Дата: Сб, 26.02.2011, 15:59  |                                                                                                                Сообщение # 6
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Здесь есть специальная программка, которая конвертирует русскую азбуку в коды для русифицированных дисплеев. В программе (в Microbasic) вместо русских букв, в команде вывода на дисплей, нужно просто вставить значения, полученные с помощью этой спец. программки.
Например, слово "Привет" будет выглядеть как "$A8,$70,$B8,$B3,$65,$BF"

Кроме того, тут же, есть всякие полезные инструменты, которые могут помочь при разработке.

Axell Дата: Вс, 27.02.2011, 01:05  |                                                                                                                Сообщение # 7
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 25.02.2011

Статус: Offline

Quote (ADMIN)
...в команде вывода на дисплей,,,,

Так я и спрашиваю, как ее правильно писать, если так Lcd_Out(1, 1, "$A8,$70,$B8,$B3,$65,$BF") -- то выводятся те же символы, если без кавычек -- то ругается на синтаксис...
А про кодировку я знаю и программы я знаю...

Посмотрите что у меня не так с INT и INTF ...Вроде правильно задал, а ничего не происходит...Проект тот же, только RS подкл. к RA4, а наа RB0 повешен иммпульс в виде одиночного нажатия на кнопку..

А как в Протеусе открыть это окошко "Watch Window"..?? Что то у меня не получилось

Прикрепления: 2334287.rar (21.1 Kb)
ADMIN Дата: Вс, 27.02.2011, 07:37  |                                                                                                                Сообщение # 8
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

А где протеусный файл? Скинь последний проект полностью. В протеусе нужно нажать Debug -> Watch window, в котором нужно правой кнопкой выбрать Add item by name.
Axell Дата: Вс, 27.02.2011, 16:56  |                                                                                                                Сообщение # 9
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 25.02.2011

Статус: Offline

Вот проект полностью..
Запуск вроде сделал..Поправьте, если не правильно..
Есть пару вопросов по проекту :
1.ПОчему TMR1 по нажатию ккнопки СБРОС не сбрасывается в НОЛЬ..В Протеусе это видно..
2.Как сделать что бы последнее значение счетчика перед приходом второго импульса(останов) статически выводилось на экран, т.е. перед приходом имульса останова значение счетчика было 2500 вот его и вывести на екран.Первый импульс - запуск счета, второй останов..У меня сбрасывает в 0 по приходу этого импульса..
3. И что я сделал в проекте что у меня не показывает ничего на экране..Вроде ЛСД расписан правильно..По Протеусу не активен выход RB4..

Спасибо

Прикрепления: 1458947.rar (36.6 Kb)

Сообщение отредактировал Axell - Вс, 27.02.2011, 16:58
ADMIN Дата: Вс, 27.02.2011, 18:52  |                                                                                                                Сообщение # 10
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Вот исправленный проект. Запуск и останов сделал через прерывания. Обрати внимание на комментарии.
В протеусе не видно как TMR1 не сбрасывается в 0 потому, что он сразу загружается значением в прерывании. Если правильно установить слово конфигурации, то все будет работать.
Второе, пока не забыл: porta.4 имеет выход с открытым коллектором, поэтому я использовал porta.3 для линии RS.
Далее, по поводу русских букв на дисплее - думаю, можно попробовать написать так:
Lcd_Out(2,5,"Привет")
Если в протеусе видны кракозябры, вместо слова "Привет", то нужно поменять файл LCDALPHA.DLL в папке models в каталоге установки протеуса(если кто не знает).
В общем, темное дело там с русскими буквами. Может, кто сталкивался?
Прикрепления: 3491337.rar (50.9 Kb)
Axell Дата: Чт, 03.03.2011, 03:26  |                                                                                                                Сообщение # 11
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 25.02.2011

Статус: Offline

Спасибо за помощь..Все работает..
Хочу у Вас поинтересоваться еще..Хватит ли у контроллера мощностей и способностей(PIC16f628),что бы выполнить такую задачу..Подать на 2 входа 2 независимых источника импульсов, подсчитать кол-во импульсов по одному из входов(делалось выше), а также высчитать длительность импульса и смещение начала одного импульса относительно другого( на фото).На ЛСД вывести 3 параметра : количество, длительность одного им-са(можно 2-х) и смещение..Частота, период следования импульсов одинаковая,форма импульсов тоже,только один смещен относительно другого...Единицы измерения не критичны(mS или какие нить условные единицы)

Или для этого нуно исп-ть другой контроллер...

ПыСы..С русским шрифтом разобрался..Пришлось отредактитовать HEX файл, по другому никак не хочет..Кракозябры вылазят..А вот в НЕХе подправил и на индикаторе все гут...

Прикрепления: 6181058.jpg (39.8 Kb)

Сообщение отредактировал Axell - Чт, 03.03.2011, 03:42
ЯНДЕКС Дата: 03.03.2011
ADMIN Дата: Пт, 04.03.2011, 03:30  |                                                                                                                Сообщение # 12
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Думаю, хватит
Axell Дата: Пт, 04.03.2011, 12:55  |                                                                                                                Сообщение # 13
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 25.02.2011

Статус: Offline

Я немножко в теорию вдамся, прежде чем приступать к реализации задуманного плана, так если что поправьте меня..

По контроллеру.Внутренний тактовый 4МГц = 4 000 000 Гц в секунду..
По моему датчику. Датчик имеет такие параметры. 2500 имп./ оборот, при частоте оборотов 1000 в мин. мы имеем частоту следования импульсов в 41,666 КГц..
Если совместить эти два параметра, то мы получим такое условие --- За ширину одного импульса датчика у нас проследует 96 импульсов внутреннего генератора.(при синхронизации обоих импульсов)...Эти все условия соблюдутся при всех известных величинах..Но..
В реалии мне известны только такие величины : Внутренняя тактовая, кол-во импульсов на оборот для датчика и приблизительная скорость вращения датчика 200-1000 оборотов..

Мне необходимо посчитать : Количество импульсов на оборот от начала отсчета, смещение начала одного относительно другого и ширину одного из импульсов, что бы знать в какую сторону смещение..
И вот вопрсы: Сможет ли контроллер все эти 3 параметра выводить в динамике в реальном времени..??
Или мнее придется разделить эти операции на 2 раздельные(ттоже не критично) 1-я операция подсчет импульсов..2-я подсчет смещения..Например для подсчета задействовать еще один вход(кнопку)+начало отсчета.

По поводу импульсов: Для подсчета сдвига запустить внутренний тайймер по пер.фронту первого им-са и остановить по заднему второга(т.к. второй имп-с инверсный) , а для подсчета ширины запуск по пер. фронту и останов по заднему одного из импульсов..Как это реализовать програмно, если возможно...

Хочу сделать стенд для проверки датчиков и понимаю, что осцилом это все увидеть проще(импульсы), но хлчется современного..Подсчет уже сделал, осталось сдиг высчитать..

Извините, что так много вопросов.Просто мне не с кем на работе посоветоваться по поводу прорграммирования..Сташее поколение не знает про это -- они исче по старинке, а молодое только учится..Ват и приходится искать ответы в интернете...

Спасибо за понимание и участие..

retas Дата: Сб, 05.03.2011, 00:14  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 445
Репутация: 11   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

.Я бы при подходе к подобной задачи сразу бы нацеливался на мах частоту осцилятора.
.Далее в Протеусе посмотреть получается ли следить "одновременно" за двоими портами.
.Если нестрашнО применение дополнительного корпуса в виде цифровой микрухи, то один её
элемент (быть может ИСКЛЮЧАЮЩЕЕ-ИЛИ - нетрудно уточнить самому) с двумя входами и одним
выходом позволил бы иметь сигнал только при смещении импульсов и для МК осталось бы только
измерять длительность.
.Как определить в какую сторону произошло смещение, наверное можно поизучав комп. мышку.
Axell Дата: Сб, 05.03.2011, 03:04  |                                                                                                                Сообщение # 15
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 25.02.2011

Статус: Offline

Quote (retas)
Я бы при подходе к подобной задачи сразу бы нацеливался на мах частоту осцилятора.

Я просто считал при 4Мгц, а исп-ть в любом случае нуно мах., т.к. точность будет получше..

На счет доп.ЛОГИКИ -- посчитаю сдвиг и что дальше.... все равно придется считаль ширину импульса, что бы знать куда сдвиг..А значит не имеет смысла ее ставить..

Я вот что придумал, но получится ли..Запустить таймер. На INT подать первый сигнал - когда придет, захватить
значение таймера, второй сигнал завести на вход CCP, когда на него придет
второй сигнал, снова захватить значение таймера, потом расчитать разницу
первого и второго значения. Но это я рассчитаю только смещение, а мне необходимо знать и ширину импульса, что бы смотреть куда уходит смещение..

Вот алгоритм программы:
1.Нажал кнопку(тумблер) -- посчитал кол-во импульсов, отпустил -- счет прекратился -- на экране последнее значение нуно что б осталось..
2.Нажал другую кнопу(тумблер) - посчитал ширину импульса по одному входу(можно по двум) последнее значение на экран.
3. Нажал третью кнопку(тумблер) -- считает сдвиг и выводит его в реальном времени на экран, для регулировки датчика..

Вот в принципе и весь алгоритм..

Структура программы(мое мнение) должна быть такой
1.инициализация ЛСД
2.Переменные
3.Программа
3.1 Выбор режима
3.1.1 Подпрограмма для первого счета.
3.1.1.1 Вывод информации на ЛСД
3.1.1.2 Выход из нее для проверки незадан ли другой режим, ели нет, то возврат сюда
3.1.2 Подпоограмма для второго счета
3.1.2.1 Вывод информации на ЛСД
3.1.2.2 Выход из нее для проверки незадан ли другой режим, ели нет, то возврат сюда
3.1.3 Подпрограммы для третьего счета
3.1.3.1 Вывод информации на ЛСД
3.1.3.2 Выход из нее для проверки незадан ли другой режим, ели нет, то возврат сюда
3.2 Вывод информации на ЛСД(общей и сохраненной в переменных)
3.3 Конец программы

TMR0 использовать как счетчик нажатия кнопок..
TMR1 для подсчета импульсов в зависимости от выбранной программы..Значение его всеравно бут переписываться в переменные для вывода на экран, только в 3-й подпрограмме значения бут непосредственно браться с него и на зкран, что бы уменьшить время обработки(т.е. не писать значения в переменные)

вот теперь вопрос..Как правильно в теле программы написать подпрограмму, выход из нее и правильно расставить метки переходов..???
Можно ли в каждой подпрограмме задать свое условие на прерывание или нет...??
Если можно, то думаю все получится..

По входам-выходам мк: 5шт на ЛСД, 1 нопка выбора, 2 для вход. импульсов и 1 для доп импульса(первая подпрограмма) итого 9 шт. Вот вроде и все..

Попровьте меня, ели что не правильно..

Спасибо за участие..

  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: