Вопрос по таймеру TMR0
|
|
tolyan249 |
Дата: Пт, 12.02.2010, 14:20 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Много уже воросов поднято на эту тему,прочитал но ни чего не понял. Пишу маршрутный комп для авто на PIC16F877. 1. вести подсчет имульсов за 1секунду-это будут обароты двигателя 2. считывать ширину каждого импульса складывать их -это будет расход топлива проходящего через форсунки 3. вести счет импульсов скорости-это будет скорость вопрос: Как можно через таймер TMR0 узнать ширину импульса как + так и - приходящего на любой порт или порт который использует таймер. Кто может подсказать примерным кодом работы с этим таймером. Спасибо всем за помощь.
если знаешь,помоги.
|
|
|
|
MasterPic |
Дата: Пт, 12.02.2010, 21:19 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Сначала укажи, какие частоты там. А так можно по любому порту. Настраиваешь TMR0 по тактированию с внутреннего источника. Потом задаешь прерывание по RB0. Здесь на форуме есть схема, как сделать, чтобы через диод импульс, приходящий на любой вход, поступал на RB0(может, кто помнит где). По прерыванию от RB0 запускай таймер, отключай прерывание по RB0(фронт, например) и включай прерывание по спаду. То, что насчитает таймер между фронтом и спадом, с учетом операций в прерываниях, и будет шириной положительного импульса. Для отрицательного наоборот. Но если тебе надо непрерывно считать, то, по-моему, надо что-то другое думать. А что ты думаешь?
|
|
|
|
slavauk |
Дата: Пт, 12.02.2010, 22:18 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
64
Замечания:
±
На сайте с 14.03.2009
Статус:
Offline
|
Тут обсуждалась похожая задача. http://www.picbasic.ru/forum/9-265-1 Хозяин темы потом пропал,потому неизвестно чем дело закончилось.
|
|
|
|
Broka |
Дата: Пт, 12.02.2010, 22:38 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
253
Замечания:
±
На сайте с 30.09.2009
Статус:
Offline
|
Извените меня если не совсем по теме, просто хотелось бы по подробнее всё это увидеть, а ещё лучше в примерах! Я тоже этим делом занимаюсь сейчас,хочу на свой ВАЗ 21074i приспособить. Но только вот с расходом топлива незнаю как. Вы тут говорили про ширину импулься на форсунках,складывать их получим расход? А это как будет считаться мгновеный расход или как? С скоростью я проблему решил быстро, там по моему нет таких напрягов с вычитанием разных величин,даже сделал информатор превышения скорости на 16F84A,а вот с расходом топлива ни как не пойму! Либо АЦП применить, ну и естественно каллибровать каждый залитый литр, а потом всё это записывать в EPPROM, считывать всё это с датчика и сравнивать со значением записаным в EPPROM , Вообщем ни как не пойму как правильно надо, Если у кого есть наработки по этому поводу, подскажите пожалуйста начинающему..... ТАК хочется сделать всё своими руками,а не покупать!
Наладчик КИП и А
Сообщение отредактировал
Broka - Пт, 12.02.2010, 22:52
|
|
|
|
tolyan249 |
Дата: Сб, 13.02.2010, 11:57 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Ответ: вот тут я уже обсуждал эту тему про расчеты http://www.picbasic.ru/forum/9-123-1 меня интересует пока другое по таймеру TMRO. Спасибо за ответы и помощь. Добавлено (13.02.2010, 11.57.17) --------------------------------------------- И еще вопрос по поводу LCD не могу найти как с ним обращаться lcdout fe,1-очистить LCD lcdout fe,2- переместится в начало 1-строки lcdout fe,92- переместится в начало 2-строки меня интересует вопрос: как показать любой символ на LCD в любом месте из 2- строк перемащать мигающий курсор для ввода данных и вывод их на LCD-пример ввод времени и даты и как вывести значок температуры после самой температуры команды наверно нужны LCD HD44780-стандарт Спасибо всем за помощь и ответы.
если знаешь,помоги.
|
|
|
|
Dmitry |
Дата: Сб, 13.02.2010, 23:29 | Сообщение # 6 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Quote (tolyan249) как показать любой символ на LCD в любом месте из 2- строк А вот эта табличка из хелпа на пикбейсик не поможет: $FE, 1 Clear display $FE, 2 Return home (beginning of first line) $FE, $0C Cursor off $FE, $0E Underline cursor on $FE, $0F Blinking cursor on $FE, $10 Move cursor left one position $FE, $14 Move cursor right one position $FE, $C0 Move cursor to beginning of second line Quote (tolyan249) и как вывести значок температуры после самой температуры Нарисовать свой символ (знак градуса). Пример моего кода: Code lcdout $FE,$40,$0C,$12,$12,$0C,$00,$00,$00,$00 ' записать в ОЗУ LCD символ с кодом 0 - градус
LCDOUT $FE, 1, #temperatura, 0 'вывести на экран значение температуры со знаком градуса ну можно и других значков нарисовать, но только 8 штук: lcdout $FE, $40, ... lcdout $FE, $48, ... lcdout $FE, $50, ... lcdout $FE, $58, ... lcdout $FE, $60, ... lcdout $FE, $68, ... lcdout $FE, $70, ... lcdout $FE, $78, ...
Сообщение отредактировал
Dmitry - Сб, 13.02.2010, 23:30
|
|
|
|
tolyan249 |
Дата: Пн, 15.02.2010, 10:45 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
узнаем ширину импульса нулевого,и плюсового,затем складываем,получаем период, 1 делим на период-узнаем частоту,зная частоту умнажаем на 60-получаем обороты. а по ширене имульса узнаем сколько была открыта форсунка,расчеты есть в моей теме выше. и так далее. пример: есть частота с генератора-10гц*60 получаем 600 оборотов ширина импульса состовляет 50 миллисекунд при условии период равен 2 т.е импуль верхний и нижний одинаковые. расчет: 1/10гц/2*1000=50миллисекунд. ================================================================= По этому нужно считать импульсы постоянно,что бы данные были достовернее. Может кто что подскажет жду ваших предложений. СПАСИБО ВСЕМ ЗА ОТВЕТЫ И ПОМОЩЬ. Добавлено (15.02.2010, 10.45.51) --------------------------------------------- lcdout $FE,$40,$0C,$12,$12,$0C,$00,$00,$00,$00 ' записать в ОЗУ LCD символ с кодом 0 - градус LCDOUT $FE, 1, #temperatura, 0 'вывести на экран значение температуры со знаком градуса Выводит значек еще и с палкой какойто.
если знаешь,помоги.
Сообщение отредактировал
tolyan249 - Пн, 15.02.2010, 10:53
|
|
|
|
Dmitry |
Дата: Сб, 20.02.2010, 03:19 | Сообщение # 8 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
незнаю что за палка. У меня на физическом индикаторе никакой палки нет. Правда, у меня протон, но он в данном случае отличается только командой print вместо lcdout. Ну попробуй сам нарисуй приложенной программкой, строчку внизу вставляешь в текст. а точно померить ширину положительного импульса на рисунке можно, подав его на ножку RB0, включить прерывание по фронту на этой ножке, при сработке прерывания в обработчике прерывания запустить таймер0, переключить прерывание по спаду на ножке RB0, и при втором срабатывании прерывания считать регистр tmr0 - там будет длительность положительного импульса (с учетом предделителя). Ну это так, очень кратко и очень общими словами А еще есть команда PULSIN Например witdh var word PULSIN PORTB.1, 1, width померит длительность положительного импульса на ножке PORTB.1, результат = width * 10 мкс (для 4 МГц) или * 2 мкс (для 20 МГц)
Сообщение отредактировал
Dmitry - Сб, 20.02.2010, 03:41
|
|
|
|
tolyan249 |
Дата: Сб, 20.02.2010, 17:58 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Pulsin не пойдет,это уже написано выше мне там уже написали что нужно использовать только таймер, что бы именно считывать каждый импульс,для расхода топлива. а так будем терять импульсы во время считывания оператором pulsin и остальными задержками выводом на LCD и так далее, будут пропуски,а значит будем не првильно считать раход топлива. да я понимаю что нужно запускать таймер по фронту или спаду с PORTB.0 как написать правильно программу, нужен примерно код,я не знаю по тому что еще не работал с таймерами. какая частота опроса будет порта с предделителем или без него,т.е пример: по рисунку выше опрос ведеться с частотой 1мкс то в таймере мы должны получить 2500мкс-имульс 2,5мс рисунок выше-нижний импульс в верхнем мы должны получить 50000мкс наверно так я думаю может я не прав. может кто что подскажет. жду ваших предложений программа встала на этом. Спасибо всем за ответы и помощь. Добавлено (20.02.2010, 17.58.37) --------------------------------------------- пример работы с таймером,был взять от сюда гдето но в нем я не могу разобраться как его переписать для своих нужд. Include "modedefs.bas" DEFINE OSC 4 'Использование кварца на 4Мгц Segments Var PORTB Digits Var PORTA n Var Byte Value Var Word l VAR Word nk var Word ns var Word nn var Word od var Byte s var Byte ' w1 var Word ' od100 var Word od101 var Word ' od1km var Word ' всякие там переменные(некоторые пока даже неиспользуются) F var Word ' st var Bit q var Bit ' i var Word TRISB =%00000001' $80 ' Set segment pins to output TRISA =%00000000 '$f0 ' Set digit pins to output nn=0 value=0 nk=0 OPTION_REG.7=1'подтягивающий резистор выключен OPTION_REG.6=1 'прерывание по фронту portb.0 OPTION_REG.5=0 'приращение таймера от внутреннего генератора OPTION_REG.3=0 'предделитель включен перед таймером 'OPTION_REG =%01000101 ' $43 ' Включаем подтягивающие резисторы и настраиваем предделитель для TMR0 @ device WDT_OFF 'LCDOUT $FE, 1,"Nachinaem schet" ' это так чтоб проконтролировать работу pause 1000 ' TMR0=5 od100=0 od101=0 q=0 INTCON = $B0 ' включаем прерывания от входа INT и по переполнению таймера TMR0 On Interrupt GoTo myint loop: If q=1 Then value=od101 'LCDOUT $FE, 1,#od101," za 1 sec " ' Выводим данные если разрешенно q=0 od101=0 EndIf For i =3 To 0 step-1 n = Value Dig i Digits =$ff LookUp n, [$DE, $50, $E6, $F4, $78, $BC, $BE, $54, $FE, $FC], Segments Digits =~Dcd i pause 1 Next i GoTo loop ' Interrupt handler Disable myint: If INTCON.1=1 Then ' если прерывание произошло по входу INT увеличиваем счетчик od100=od100+1 INTCON.1 = 0 EndIf If INTCON.2=1 Then ' если прерывание по переполнению TMR0 разрешаем вывод на экран s=s+1 If s=250 Then s=0 q=1 od101=od100 od100=0 EndIf TMR0=5 INTCON.2=0 EndIf Resume Enable
если знаешь,помоги.
|
|
|
|
Dmitry |
Дата: Сб, 20.02.2010, 22:28 | Сообщение # 10 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
а тебя какая точность измерения положительного импульса интересует? А то "on interrupt" не сработает, пока не отработает очередная команда, а если это lcdout, то это могут быть сотни мкс (если не единицы мс). Если нужна точность +- 50 мкс, то прерывание надо писать аппаратное, on interrupt не подойдет. В протоне подойдет on_hardware_interrupt.
|
|
|
|
tolyan249 |
Дата: Вс, 21.02.2010, 11:49 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
я и пишу в протоне ,я даже не знаю какие оператоы там есть, не могу найти описание протона на русском,использую готовые программы переделываю под свое. on_hardware_interrupt пример можно использования. пока не могу разобраться с таймерами. вроде у pic16f877 их 3-вроде. 1.предделитьель кого делит частоту входную для таймера, или частоту внешнюю делит. 2.считывать переполнение таймера переполнение происходит через 256 чего то,то ли тактов то ли мкс -не знаю можно сделать считывать переполнение через 100, TMRO=156 256-156=100-то же чего не понятно. я думаю так. приходит 0 на PORTB.0 запускаем таймер и считываем переполнения пока на входе PORTB.0=0 при приходе 1 на PORTB.0 остонавливаем таймер,и сбрасывем все переменные кроме считаных переполнений таймера. так же считываем положительный импульс на входе PORTB.0 но таймер надо использовать другой. как правильно это написать я не знаю пример: допустим получили мы 100 переполнений таймера 10мкс-1переполнение-хотя не знаю с какой переодичностью происходит переполнение. 100*10=1000мкс или 1мс-если период равен 2 то частота получаеться 200кгц как написать правильно программу не знаю,как запустить какой таймер и как.
если знаешь,помоги.
Сообщение отредактировал
tolyan249 - Вс, 21.02.2010, 11:54
|
|
|
|
Dmitry |
Дата: Вс, 21.02.2010, 15:26 | Сообщение # 12 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Quote (tolyan249) я и пишу в протоне ага, щас нас модеры в другой форум выгонят Quote (tolyan249) не могу найти описание протона на русском, та зачем оно тебе надо, открываешь в хелпе описание команды и ищещь слово example (пример). И все что ниже утаскиваешь к себе в программу и разбираешься. Да и terrarus щас подключится и покажет, где описания протоновских команд на русском. Quote (tolyan249) 1.предделитьель кого делит частоту входную для таймера, да Quote (tolyan249) 2.считывать переполнение таймера переполнение происходит через 256 чего то таймер - это счетчик, с разрядностью 8 бит или 16 бит. Он считает те импульсы, которые выбраны ему в качестве тактовых (обычно это частота кварца, деленная на 4), и когда досчитывает до 255 (8 бит) или 65535 (16 бит), то следующий тактовый импульс вызывает прерывание, а в регистр(ы) таймера записывается 0. Quote (tolyan249) как запустить какой таймер и как. http://www.microchip.ru/files/d-sheets-rus/pic16f87x.pdf
Сообщение отредактировал
Dmitry - Вс, 21.02.2010, 15:28
|
|
|
|
terrarus |
Дата: Вс, 21.02.2010, 18:08 | Сообщение # 13 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Не..., не буду указывать где описание на русском, хватит, итак уже себе врагов нажил..., ну не врагов а так. недоброжелателей... Захотите сами переведете...
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
Dmitry |
Дата: Вс, 21.02.2010, 22:19 | Сообщение # 14 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Quote (terrarus) хватит, итак уже себе врагов нажил. Да ладно вам обижаться-то, ну подколол holyuser слегка, просто уж больно ярко вы за протон выступаете, практически в каждом посте. Никто ж не спорит что он лучше. Вот и новички потихоньку на него перелазят, как только с реальными задачами сталкиваются. Так что ресурс нужный однозначно. В конце концов, компилятор - всего лишь инструмент и конечный результат зависит от мастера.
|
|
|
|
slavauk |
Дата: Вт, 23.02.2010, 19:06 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
64
Замечания:
±
На сайте с 14.03.2009
Статус:
Offline
|
Quote (tolyan249) как запустить какой таймер и как Так кто победил? Вы таймер , или таймер Вас?Добавлено (23.02.2010, 19.06.14) --------------------------------------------- Я в плане, вопрос снят,или актуален?
|
|
|
|