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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Вопрос начинающего по таймеру
Addas Дата: Вс, 04.05.2014, 13:38  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 26.04.2014

Статус: Offline

Доброго времени суток !

Я только недавно стал изучать PicBasicPro по книге Чака Хилибайка, книга класная, все доходчиво написано (до этого зубрил книгу по ассемблеру Корабельникова - не потянул, много программного текста), но дело не в том ... а в том что хочу сказать, что опыта у меня программирования ОЧЕНЬ мало =) У меня есть вопрос по таймеру. Каким алгоритмом можно реализовать схему с таймером, чтоб он начал считать время по низкому уровню на одном порте, а закончил считать по низкому уровню на другом порте, типа как СТАРТ - СТОП. Прошу на пальцах объяснить как можно это реализовать. Спасибо
ЯНДЕКС Дата: 04.05.2014
anatol Дата: Вс, 04.05.2014, 15:14  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Начнем с другого. А как вы вообще стартуете и останавливаете таймер. Напомню что таймер это Отдельное ФИЗИЧЕСКОЕ устройство. Совершенно независимое, только управляемое с помощью окружающей процессор  логики.  Т.е. это банальный шестнадцатеричный счетчик. А вот как работает счетчик к гуглу.
Addas Дата: Вс, 04.05.2014, 18:14  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 26.04.2014

Статус: Offline

Хорошо, я понял так, что счетчик (TMR0) в контроллере работает постоянно с частотой кварца. Но вот как сделать так чтоб, когда на (к примеру) ножке 0 порта Б пропала единица, то программа начала отсчет времени, а закончила когда пропала единица с 1 ножки порта Б, подсчитала время и выдала мне переменную с этим временем. Вся эта процедура с отрезком времени не больше 1 секунды, как это реализовать - ХЗ. Как обратится к таймеру чтоб подсчитать отрезок ну просто не догоняю, подскажите пожалуйста где можно почитать про это дело
Andriy76 Дата: Вс, 04.05.2014, 18:25  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 231
Репутация: 10   ±
Замечания:   ±
На сайте с 06.04.2010

Статус: Offline

Можно пробовать так 
разрешение  
T0IE = 1                                                                    
GIE = 1                                 ' Разрешение глобального прерывания
запрет 
T0IE = 0                                                                    
GIE = 0
Не понятно зачем так делать . Возможно что есть и другой путь в решении проблемы .
anatol Дата: Вс, 04.05.2014, 20:33  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 26.04.2014

Статус: Offline

Спасибо за наставление. Буду детально изучать регистры таймеров
ADMIN Дата: Пн, 05.05.2014, 03:47  |                                                                                                                Сообщение # 7
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Я могу в этом случае посоветовать так: Если обязательно нужно запустить немедленно таймер по 0 на порту Б, то в любом случае нужно использовать прерывание по порту Б. То есть:
Разрешаем прерывание по порту Б -> ловим в прерывании срабатывание на 0 -> если это порт Б.0, то запускаем таймер в этом же прерывании. Если же это порт Б.1, то соответственно, выключаем счет. 
Чтобы поймать прерывания и по Б.0 и по Б.1 советую обратиться к статье о прерывании по любому порту. Насчет работы с таймерами, рекомендую изучить также каталог статей. Например, эту статью, эту, и особенно, эту, в которой практически, уже решена ваша задача.
Addas Дата: Пн, 05.05.2014, 20:33  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Addas, возьмите себе за правило при программировании:
1. устанавливать процессор в нужный режим.
(У вас не указана частота кварца, и как вы будете получать 1000 мкс? Или вы знаете какую частоту "установит" для вас компилятор?)
2. описывать все переменные.
3. не мешать компилятору делать вам замечания.
Ну и самое главное - а вы включили прерывания прежде чем их проверять?
Кстати с протеусом могут быть затыки и очень серьезные, в частности в протеусе работает, а в железе нет.
Addas Дата: Вт, 06.05.2014, 13:20  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

1. Что Это "    ''''''''''''TMR0 = 24 " перед  TMR0. Вполне может быть переменной.
2. 
Цитата
в протеусе выставлен кварц на 4МГц
А компилируете вы после протеуса?
3.Насчет прерываний прозевал (посмотрите время поста). К сожалению некогда вникать. работа.

Сообщение отредактировал anatol - Вт, 06.05.2014, 19:25
ЯНДЕКС Дата: 06.05.2014
Addas Дата: Вт, 06.05.2014, 20:56  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 26.04.2014

Статус: Offline

" ''''''''''TMR0=24" эта строчка вообще закомментирована, вот как раз если написать со строкой "TMR=24" то прерывания НЕТ вообще, а с "''''''''''TMR0=24" оно есть =) Я таким образом пытался записать стартовое значение таймера, чтоб не стирать строчку, просто закомментировал для проверки. По поводу кварца, в примерах книги В.Н. Хилинский и Чака Хелибайка не нашел куда мона всунуть значения кварца в ПБП )
ivan_fd Дата: Вт, 06.05.2014, 21:44  |                                                                                                                Сообщение # 13
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

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

Если хотите программировать PIC контроллеры на BASIC, то послушайте меня, начинайте сразу с PROTON.
И забудьте о прерываниях, типа:

DISABLE
RESUME 
ENABLE 

Используйте хардварные прерывания.
Addas Дата: Вт, 06.05.2014, 21:54  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 26.04.2014

Статус: Offline

С протоном знакомился с сайта http://terrarus.ucoz.ru/proton_plus_ide/index.html , но там не рассказывают про фундаментальные азы, примеры, а я вот только начал вообще знакомиться с программированием, мало информации для начинающих, а там даже раздела нет для начинающих. Надо пока хоть что-то понять )
ivan_fd Дата: Вт, 06.05.2014, 22:10  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Ну тогда Вам нужно начинать с изучения архитектуры контроллеров, принципов работы с ними.
Изучить даташит, ну хотя бы на 16F628, для него есть на русском.
А Вы сразу садитесь за программирование.

P.S: мой Вам совет, начинайте с ПРОТОНА (хотя, лучше было бы с ассемблера)!
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: