реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> как сделать счетчик на Timer B?, как сделать счетчик на Timer B?
cornflyer
сообщение Nov 30 2006, 10:55
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



Задача: посчитать импульсы на входе TBCLK (pin 83) за 1 сек. Импульсы приходят асинхронно от датчика.
По прерыванию Basic Timer'а (срабатывает каждую секунду) читаю TBR.

Но в мануале написано:

"When the timer clock is asynchronous to the CPU clock, any read from TBR should occur while the timer is not operating or the results may be
unpredictable."

т.е. прежде чем прочитать содержимое регистра счетчика TBR, его нужно остановить. И вообще как включить режим счетчика не написано. Ладно, включаю мозГ и пытаюсь привести все в систему =>

Управляющий регистр таймера B - TBCTL:
1 / Биты TBSSELx поставил в 00, т.е. выбрал Timer_B clock source = TBCLK.
2 / Биты MCx поставил 10, т.е. выбрал Continuous mode: the timer counts up to the value set by CNTLx.
3 / Биты CNTLx поставил 00, т.е. разрядность счетчика 16-bit, TBR(max) = 0FFFFh.

Если выставить биты MCx в 00, то получим "Stop mode: the timer is halted", т.е. таймер типа остановлен.

Так значит мне перед чтением надо обнулять биты MCx в регистре TBCTL !?

Всем спасибо за внимание и поддержку!!!!

Сообщение отредактировал cornflyer - Nov 30 2006, 10:56
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 30 2006, 11:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Вы понимаете и делаете все верно. Для того чтобы не останавливать счетчик перед считыванием его значения, я предлагаю вам использовать регистр(ы) захвата этого же таймера. Перед тем как прочитать значение TBR вы должны программно имитировать захват, по которому значение TBR (синхронно частоте TBCLK) запишется в один из выбранных вами регистров TBCCRx. А из этого регистра вы уже спокойно считаете значение.
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Nov 30 2006, 11:47
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



Цитата(rezident @ Nov 30 2006, 11:28) *
Вы понимаете и делаете все верно. Для того чтобы не останавливать счетчик перед считыванием его значения, я предлагаю вам использовать регистр(ы) захвата этого же таймера. Перед тем как прочитать значение TBR вы должны программно имитировать захват, по которому значение TBR (синхронно частоте TBCLK) запишется в один из выбранных вами регистров TBCCRx. А из этого регистра вы уже спокойно считаете значение.

Но ведь процессор тактируеца от MCLK. А MCLK асинхронен с TBCLK. Счетчик тактируеца от TBCLK.
Eсли проц начнет читать из TBR или TBCCRx, а в это время пришел сингал на TBCLK? Что тогда будет?
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 30 2006, 12:32
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(cornflyer @ Nov 30 2006, 13:47) *
Но ведь процессор тактируеца от MCLK. А MCLK асинхронен с TBCLK. Счетчик тактируеца от TBCLK.
Eсли проц начнет читать из TBR или TBCCRx, а в это время пришел сингал на TBCLK? Что тогда будет?

При чтении TBR результат может быть неопределенным, потому что одновременно с чтением может произойти запись в этот регистр (инкремент счетчика). Но при чтении из TBCCRx результат будет однозначным, т.к. записью в регистр захвата вы будете управлять программно сами. А в момент чтения значение TBCCRx меняется не будет.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 13:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01265 секунд с 7
ELECTRONIX ©2004-2016