Вопрос начинающего по таймеру
|
|
Addas |
Дата: Вс, 04.05.2014, 13:38 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 26.04.2014
Статус:
Offline
|
Доброго времени суток !
Я только недавно стал изучать PicBasicPro по книге Чака Хилибайка, книга класная, все доходчиво написано (до этого зубрил книгу по ассемблеру Корабельникова - не потянул, много программного текста), но дело не в том ... а в том что хочу сказать, что опыта у меня программирования ОЧЕНЬ мало =) У меня есть вопрос по таймеру. Каким алгоритмом можно реализовать схему с таймером, чтоб он начал считать время по низкому уровню на одном порте, а закончил считать по низкому уровню на другом порте, типа как СТАРТ - СТОП. Прошу на пальцах объяснить как можно это реализовать. Спасибо
|
|
|
|
anatol |
Дата: Вс, 04.05.2014, 15:14 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Начнем с другого. А как вы вообще стартуете и останавливаете таймер. Напомню что таймер это Отдельное ФИЗИЧЕСКОЕ устройство. Совершенно независимое, только управляемое с помощью окружающей процессор логики. Т.е. это банальный шестнадцатеричный счетчик. А вот как работает счетчик к гуглу.
|
|
|
|
Addas |
Дата: Вс, 04.05.2014, 18:14 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 26.04.2014
Статус:
Offline
|
Хорошо, я понял так, что счетчик (TMR0) в контроллере работает постоянно с частотой кварца. Но вот как сделать так чтоб, когда на (к примеру) ножке 0 порта Б пропала единица, то программа начала отсчет времени, а закончила когда пропала единица с 1 ножки порта Б, подсчитала время и выдала мне переменную с этим временем. Вся эта процедура с отрезком времени не больше 1 секунды, как это реализовать - ХЗ. Как обратится к таймеру чтоб подсчитать отрезок ну просто не догоняю, подскажите пожалуйста где можно почитать про это дело
|
|
|
|
Andriy76 |
Дата: Вс, 04.05.2014, 18:25 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
231
Замечания:
±
На сайте с 06.04.2010
Статус:
Offline
|
Можно пробовать так разрешение T0IE = 1 GIE = 1 ' Разрешение глобального прерывания запрет T0IE = 0 GIE = 0 Не понятно зачем так делать . Возможно что есть и другой путь в решении проблемы .
|
|
|
|
anatol |
Дата: Вс, 04.05.2014, 20:33 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
От нечего делать напишу. В инете информации море. Разжевывать по принципу ученик-учитель не будет никто. Поэтому напрягайся сам. Запуск и остановка таймеров фактически отсутствует. Если первое (запуск) еще верно физически - после установки всех предделителей для синхронизирующей частоты и записи числа в регистр таймера - то выполнение задачи (останов) только по условию (обнулился счетчик, достиг числа сравнения в устройстве сравнения) и записывается в виде одного бита (флага). Таймеры немного разные. Нулевой наиболее скоростной и его используют в частотомерах в качестве предварительного делителя. И по вашему вопросу включить счет и остановить его можно с разных портов (для таймера0 переключить внешнюю синхронизацию при ее отсуствии). Надоело писать написанное другими. http://diymicro.ru/pic-mk-eksperiment-3-ispolzovanie-tajmera-tmr0.html http://www.extrachip.ru/index.php/teoriy/periferiya/modul-tmr0 ftp://pti.kpi.ua/pub....87x.pdf
|
|
|
|
Addas |
Дата: Вс, 04.05.2014, 22:43 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 26.04.2014
Статус:
Offline
|
Спасибо за наставление. Буду детально изучать регистры таймеров
|
|
|
|
ADMIN |
Дата: Пн, 05.05.2014, 03:47 | Сообщение # 7 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Я могу в этом случае посоветовать так: Если обязательно нужно запустить немедленно таймер по 0 на порту Б, то в любом случае нужно использовать прерывание по порту Б. То есть: Разрешаем прерывание по порту Б -> ловим в прерывании срабатывание на 0 -> если это порт Б.0, то запускаем таймер в этом же прерывании. Если же это порт Б.1, то соответственно, выключаем счет. Чтобы поймать прерывания и по Б.0 и по Б.1 советую обратиться к статье о прерывании по любому порту. Насчет работы с таймерами, рекомендую изучить также каталог статей. Например, эту статью, эту, и особенно, эту, в которой практически, уже решена ваша задача.
|
|
|
|
Addas |
Дата: Пн, 05.05.2014, 20:33 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 26.04.2014
Статус:
Offline
|
Спасибо всем за советы. Вот потехоньку начал въезжать в работу таймера, но вот снова вопрос, как заставить счетчик таймера TMR0 стартовал не с нуля, а заданного значения. Надо чтоб прерывание таймера с предделителем было не 1024мкс, а 1000. Пытался просто указывать TMR0= 24 (в даташите указано что можно записывать) прерывания вообще не происходит.
Экспериментирую в протеусе, смотрю сигнал на портеБ,0 @ device pic16F877, xt_osc, wdt_off, pwrt_off, lvp_off, protect_off
OPTION_REG = %10000001 INTCON = %10100000 TRISB = %00000000 PORTB = %00000000
time VAR WORD
Main:
''''''''''''TMR0 = 24
LOW PORTB.0
on interrupt goto Obrabotka_prer
Goto Main
DISABLE Obrabotka_prer: IF INTCON.2 = 1 THEN INTCON.2 = 0 time=time + 1 if time = 1000 then time=0 HIGH PortB.0 endif ENDIF RESUME ENABLE
|
|
|
|
anatol |
Дата: Вт, 06.05.2014, 02:40 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Addas, возьмите себе за правило при программировании: 1. устанавливать процессор в нужный режим. (У вас не указана частота кварца, и как вы будете получать 1000 мкс? Или вы знаете какую частоту "установит" для вас компилятор?) 2. описывать все переменные. 3. не мешать компилятору делать вам замечания. Ну и самое главное - а вы включили прерывания прежде чем их проверять? Кстати с протеусом могут быть затыки и очень серьезные, в частности в протеусе работает, а в железе нет.
|
|
|
|
Addas |
Дата: Вт, 06.05.2014, 13:20 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 26.04.2014
Статус:
Offline
|
Если не сложно, можно по детальней. Цитата 1. устанавливать процессор в нужный режим. Подскажите чего не хватает. Установлены биты конфигурации - XT, в протеусе выставлен кварц на 4МГц, чего еще не хватает ? Что еще можно в компиляторе выставить?
Код 2. описывать все переменные. Одна единственная переменная и она описана "time VAR WORD"
Код не мешать компилятору делать вам замечания. А никто ему и не мешает ...
Код Ну и самое главное - а вы включили прерывания прежде чем их проверять?
Из даташита: прерывание от ТМР0 регистр INTCON.7=1 глобальное разрешение прерывания INTCON.5=1 прерывание от переполнения таймера ТМР0
Подскажите пожалуйста конкретнее "где" посмотреть
|
|
|
|
anatol |
Дата: Вт, 06.05.2014, 19:23 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
1. Что Это " ''''''''''''TMR0 = 24 " перед TMR0. Вполне может быть переменной. 2. Цитата в протеусе выставлен кварц на 4МГц А компилируете вы после протеуса? 3.Насчет прерываний прозевал (посмотрите время поста). К сожалению некогда вникать. работа.
Сообщение отредактировал
anatol - Вт, 06.05.2014, 19:25
|
|
|
|
Addas |
Дата: Вт, 06.05.2014, 20:56 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 26.04.2014
Статус:
Offline
|
" ''''''''''TMR0=24" эта строчка вообще закомментирована, вот как раз если написать со строкой "TMR=24" то прерывания НЕТ вообще, а с "''''''''''TMR0=24" оно есть =) Я таким образом пытался записать стартовое значение таймера, чтоб не стирать строчку, просто закомментировал для проверки. По поводу кварца, в примерах книги В.Н. Хилинский и Чака Хелибайка не нашел куда мона всунуть значения кварца в ПБП )
|
|
|
|
ivan_fd |
Дата: Вт, 06.05.2014, 21:44 | Сообщение # 13 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Addas, я понимаю, что для PBP есть книга на русском и это немаловажно для изучения.
Если хотите программировать PIC контроллеры на BASIC, то послушайте меня, начинайте сразу с PROTON. И забудьте о прерываниях, типа:
DISABLE RESUME ENABLE
Используйте хардварные прерывания.
|
|
|
|
Addas |
Дата: Вт, 06.05.2014, 21:54 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 26.04.2014
Статус:
Offline
|
С протоном знакомился с сайта http://terrarus.ucoz.ru/proton_plus_ide/index.html , но там не рассказывают про фундаментальные азы, примеры, а я вот только начал вообще знакомиться с программированием, мало информации для начинающих, а там даже раздела нет для начинающих. Надо пока хоть что-то понять )
|
|
|
|
ivan_fd |
Дата: Вт, 06.05.2014, 22:10 | Сообщение # 15 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Ну тогда Вам нужно начинать с изучения архитектуры контроллеров, принципов работы с ними. Изучить даташит, ну хотя бы на 16F628, для него есть на русском. А Вы сразу садитесь за программирование.
P.S: мой Вам совет, начинайте с ПРОТОНА (хотя, лучше было бы с ассемблера)!
|
|
|
|