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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Модератор форума: ivan_fd  
Форум Picbasic.ru » Программирование МК » PicBasicPro » Вопрос по таймеру TMR0
Вопрос по таймеру TMR0
tolyan249 Дата: Пт, 12.02.2010, 14:20  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Много уже воросов поднято на эту тему,прочитал но ни чего не понял.
Пишу маршрутный комп для авто на PIC16F877.

1. вести подсчет имульсов за 1секунду-это будут обароты двигателя
2. считывать ширину каждого импульса складывать их -это будет расход топлива проходящего через форсунки
3. вести счет импульсов скорости-это будет скорость

вопрос:
Как можно через таймер TMR0 узнать ширину импульса как + так и -
приходящего на любой порт или порт который использует таймер.

Кто может подсказать примерным кодом работы с этим таймером.
Спасибо всем за помощь.


если знаешь,помоги.
ЯНДЕКС Дата: 12.02.2010
MasterPic Дата: Пт, 12.02.2010, 21:19  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 186
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Сначала укажи, какие частоты там. А так можно по любому порту. Настраиваешь TMR0 по тактированию с внутреннего источника. Потом задаешь прерывание по RB0. Здесь на форуме есть схема, как сделать, чтобы через диод импульс, приходящий на любой вход, поступал на RB0(может, кто помнит где). По прерыванию от RB0 запускай таймер, отключай прерывание по RB0(фронт, например) и включай прерывание по спаду. То, что насчитает таймер между фронтом и спадом, с учетом операций в прерываниях, и будет шириной положительного импульса. Для отрицательного наоборот. Но если тебе надо непрерывно считать, то, по-моему, надо что-то другое думать.
А что ты думаешь?
slavauk Дата: Пт, 12.02.2010, 22:18  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 64
Репутация: 3   ±
Замечания:   ±
На сайте с 14.03.2009

Статус: Offline

Тут обсуждалась похожая задача.
http://www.picbasic.ru/forum/9-265-1
Хозяин темы потом пропал,потому неизвестно чем дело закончилось.
Broka Дата: Пт, 12.02.2010, 22:38  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 253
Репутация: 9   ±
Замечания:   ±
На сайте с 30.09.2009

Статус: Offline

Извените меня если не совсем по теме, просто хотелось бы по подробнее всё это увидеть, а ещё лучше в примерах!
Я тоже этим делом занимаюсь сейчас,хочу на свой ВАЗ 21074i приспособить.
Но только вот с расходом топлива незнаю как. Вы тут говорили про ширину импулься на форсунках,складывать их
получим расход? А это как будет считаться мгновеный расход или как?
С скоростью я проблему решил быстро, там по моему нет таких напрягов с вычитанием разных величин,даже сделал
информатор превышения скорости на 16F84A,а вот с расходом топлива ни как не пойму!
Либо АЦП применить, ну и естественно каллибровать каждый залитый литр, а потом всё это записывать в EPPROM,
считывать всё это с датчика и сравнивать со значением записаным в EPPROM , Вообщем ни как не пойму как правильно надо, Если у кого есть наработки по этому поводу, подскажите пожалуйста начинающему.....
ТАК хочется сделать всё своими руками,а не покупать!


Наладчик КИП и А
Сообщение отредактировал Broka - Пт, 12.02.2010, 22:52
tolyan249 Дата: Сб, 13.02.2010, 11:57  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 6   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 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 'вывести на экран значение температуры со знаком градуса

Выводит значек еще и с палкой какойто.

Прикрепления: 1158680.jpg (48.5 Kb) · 5128756.jpg (25.3 Kb)


если знаешь,помоги.
Сообщение отредактировал tolyan249 - Пн, 15.02.2010, 10:53
Dmitry Дата: Сб, 20.02.2010, 03:19  |                                                                                                                Сообщение # 8
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

незнаю что за палка. У меня на физическом индикаторе никакой палки нет. Правда,
у меня протон, но он в данном случае отличается только командой print вместо lcdout.
Ну попробуй сам нарисуй приложенной программкой, строчку внизу вставляешь в текст.

а точно померить ширину положительного импульса на рисунке можно, подав его на ножку
RB0, включить прерывание по фронту на этой ножке, при сработке
прерывания в обработчике прерывания запустить таймер0, переключить прерывание по спаду
на ножке RB0, и при втором срабатывании прерывания считать регистр tmr0 - там будет длительность
положительного импульса (с учетом предделителя). Ну это так, очень кратко и очень общими словами smile

А еще есть команда PULSIN

Например

witdh var word
PULSIN PORTB.1, 1, width

померит длительность положительного импульса на ножке PORTB.1,
результат = width * 10 мкс (для 4 МГц) или * 2 мкс (для 20 МГц)

Прикрепления: LCD_Chr_Generat.exe (20.0 Kb)

Сообщение отредактировал Dmitry - Сб, 20.02.2010, 03:41
tolyan249 Дата: Сб, 20.02.2010, 17:58  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

а тебя какая точность измерения положительного импульса интересует?
А то "on interrupt" не сработает, пока не отработает очередная команда,
а если это lcdout, то это могут быть сотни мкс (если не единицы мс). Если
нужна точность +- 50 мкс, то прерывание надо писать аппаратное, on interrupt
не подойдет. В протоне подойдет on_hardware_interrupt.
tolyan249 Дата: Вс, 21.02.2010, 11:49  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 21.02.2010
Dmitry Дата: Вс, 21.02.2010, 15:26  |                                                                                                                Сообщение # 12
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Quote (tolyan249)
я и пишу в протоне

ага, щас нас модеры в другой форум выгонят smile

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
Репутация: 17   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Не..., не буду указывать где описание на русском, хватит, итак уже себе врагов нажил..., ну не врагов а так. недоброжелателей...
Захотите сами переведете...


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Dmitry Дата: Вс, 21.02.2010, 22:19  |                                                                                                                Сообщение # 14
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Quote (terrarus)
хватит, итак уже себе врагов нажил.

smile smile smile
Да ладно вам обижаться-то, ну подколол holyuser слегка, просто уж больно ярко вы за протон выступаете,
практически в каждом посте. Никто ж не спорит что он лучше. Вот и новички потихоньку на него перелазят, как только с реальными задачами сталкиваются. Так что ресурс нужный однозначно. В конце концов, компилятор -
всего лишь инструмент и конечный результат зависит от мастера.
slavauk Дата: Вт, 23.02.2010, 19:06  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 64
Репутация: 3   ±
Замечания:   ±
На сайте с 14.03.2009

Статус: Offline

Quote (tolyan249)
как запустить какой таймер и как

Так кто победил?
Вы таймер , или таймер Вас?

Добавлено (23.02.2010, 19.06.14)
---------------------------------------------
Я в плане, вопрос снят,или актуален?

Форум Picbasic.ru » Программирование МК » PicBasicPro » Вопрос по таймеру TMR0
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Поиск: