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

 
 
 
Reply to this topicStart new topic
> Timer A, Непонятки с работой ТА0 и ТА1
megabuks
сообщение Sep 26 2012, 13:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-01-10
Из: Санкт-Петербург
Пользователь №: 55 080



Здравствуйте
Помогите разобраться с таймерами. Контроллер 430G2353.
что должна делать программа - подсчитывать число импульсов поступивших на таймер за период, задаваемый watchdog oм.
если стоит TA0 - все работает как надо
если в этом же коде поменять ТА0 на ТА1 то 1.IAR выдает ошибку (см выделение в тексте) 2.если закоментировать эту строку (где выдается ошибка, то все-равно импульсы не копяться)
Я считал что ТА0 и ТА1 идентичны. где я ошибаюсь?
CODE

bis #TACLR,&TA0CTL
mov #0x0320,&TA0CTL ;TASSEL_3+MC_2;// TACLK, cont mode ;for TACLK + cont.mode need 0x0026 ;0x0320
mov #0xe100,&TA0CCTL2 ; 0e100
;-------------------
mov #0x5a1e,&WDTCTL;wdthold=0,wdtnmies=0,wdtnmi=0,wdttmsel=1(interval mode),wdtcntcl=1(wdtcnt=0000h),wdtssel=1=aclk, wdtisxx=01=/8192

bis #TACLR,&TA0CTL
wait_capt6:
bit #CCIFG,&TA0CCTL2
jz wait_capt6
mov TA0R,r8 тут IAR выдает ошибку
mov &TA0CCR2,r9
......

;-------------
;WDT Interrupt
;-------------
WDT_INT:
xor #CCIS0,&TA0CCTL2

mov #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
reti;

Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 26 2012, 14:06
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Какую ошибку выдает? И еще: у тебя в строке не поменяно TA0 на TA1.

Сообщение отредактировал d7d1cd - Sep 26 2012, 15:32
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 26 2012, 18:21
Сообщение #3


Гуру
******

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



Цитата(megabuks @ Sep 26 2012, 18:41) *
1.IAR выдает ошибку (см выделение в тексте)

Видимо потому, что запись должна быть вида
Код
mov &TA0R,R8

Цитата(megabuks @ Sep 26 2012, 18:41) *
2.если закоментировать эту строку (где выдается ошибка, то все-равно импульсы не копяться)
Я считал что ТА0 и ТА1 идентичны. где я ошибаюсь?

В данном кристалле - да, таймеры идентичны. Возможной причиной может быть отсутствие полного понимания функционирования аппаратуры таймеров. Судя по листингу, у вас подсчет импульсов ведется непосредственно - импульсы подаются на тактовый (счетный) вход TA0 INCLK, так? Временные ворота вы формируете программно, используя WDT и режим захвата CCI2. Если все так, то простое переименование регистров в программе ничего вам не даст. Кроме смены номера таймера нужно еще физически перекоммутировать входные импульсы с пина TA0 INCLK на пин TA1 INCLK. Соответственно нужно настроить функцию соответствующего пина. Нюанс состоит еще и в том, что для TA0 вход INCLK внутренне коммутируется на PinOsc, а для TA1 вход INCLK действительно подключается к внешнему пину P3.7. В общем советую внимательно просмотреть и сравнить функции пинов, подключаемых к таймеру. См. следует datasheet MSP430G2353, а в нем Table 12. Timer0_A3 Signal Connections, Table 13. Timer1_A3 Signal Connections и Table 16. Port P1 (P1.0 to P1.2) Pin Functions, Table 23. Port P3 (P3.0 to P3.7) Pin Functions (28-Pin PW and 32-Pin RHB Packages Only).
Кстати, читать значение непосредственно из регистра TAxR при асинхронном тактировании таймера не рекомендуется. Рекомендуется сформировать программно захват значения TAxR и считать полученное значение уже из регистра TAxCCRx. То бишь строка с ошибкой у вас по сути лишняя. Строкой ниже из TA0CCR2 вы и так читаете искомое значение TA0R.
И еще одно замечание. Отучайтесь использовать "магические числа". Везде по тексту используйте стандартные (TI) символьные обозначения регистров и бит. Тогда программа на АСМе будет читаться также легко как на ЯВУ типа Си.
Код
mov #TASSEL_3+MC2,&TA0CTL;TASSEL_3+MC_2;// TACLK, cont mode;for TACLK + cont.mode need 0x0026;0x0320
mov #CM_3+CCIS_2+CAP,&TA0CCTL2; 0e100

Вот в таком виде текст программы был бы более понятным, не так ли? wink.gif
Go to the top of the page
 
+Quote Post
megabuks
сообщение Sep 26 2012, 19:51
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-01-10
Из: Санкт-Петербург
Пользователь №: 55 080



Цитата(rezident @ Sep 26 2012, 21:21) *
Видимо потому, что запись должна быть вида
Код
mov &TA0R,R8

вот тут прикол в том что запись mov &TA0R,R8 работает а на mov &TA1R,R8 компилятор ругается sad.gif
Цитата(rezident @ Sep 26 2012, 21:21) *
В данном кристалле - да, таймеры идентичны. Возможной причиной может быть отсутствие полного понимания функционирования аппаратуры таймеров. Судя по листингу, у вас подсчет импульсов ведется непосредственно - импульсы подаются на тактовый (счетный) вход TA0 INCLK, так?
Временные ворота вы формируете программно, используя WDT и режим захвата CCI2.

Да, в данном варианте кода так.
Дело в том, что я делаю сенсорную кнопку. сенсор подключен к порту 2.5 частота с него подается на вход TA0 INCLK.
В начале работы у меня был только контроллер 430g2252. в него я прошил пример от TI. Результат меня устроил.
Я переписал код на асм, используя ТА0 для счета и WDT для формирования временного окна измерения, и опять-же на 430g2252 все работало.
Для проекта, в котором должна использоваться эта кнопка, нужен UART и WDT. Поэтому выбрали 430g2353. соответственно для формирования интервала измерения я решил использовать ТА1. Вот тут и начались чудеса....
Код
        mov #0x5a1e,&WDTCTL;wdthold=0,wdtnmies=0,wdtnmi=0,wdttmsel=1(interval mode),wdtcntcl=1(wdtcnt=0000h),wdtssel=1=aclk, wdtisxx=01=/8192             bis #TACLR,&TA0CTL
[code]
        bis #TACLR,&TA1CTL
        mov.w #0x0110,&TA1CTL ;15-10=0(free);9,8=01(aclk);7,6=00(/1);5,4=01(up to taccr0);3=0(free);2=0(TACLR);1=0(прерывание запрещено);0=0
        mov #0x1fff,&TA1CCR0;    interval interrupt
        bis #CCIE,&TA1CCTL0 ; CCR interrupt for TA1 enable


сначала я проверил, как работает сенсорная кнопка бовал реализовать
Вообще

Собственно идея была в том, что ТА0 должен был считать входные импульсы, а ворота я хотел формировать таймером ТА1.
Если все так, то простое переименование регистров в программе ничего вам не даст. Кроме смены номера таймера нужно еще физически перекоммутировать входные импульсы с пина TA0 INCLK на пин TA1 INCLK. Соответственно нужно настроить функцию соответствующего пина. Нюанс состоит еще и в том, что для TA0 вход INCLK внутренне коммутируется на PinOsc, а для TA1 вход INCLK действительно подключается к внешнему пину P3.7. В общем советую внимательно просмотреть и сравнить функции пинов, подключаемых к таймеру. См. следует datasheet MSP430G2353, а в нем Table 12. Timer0_A3 Signal Connections, Table 13. Timer1_A3 Signal Connections и Table 16. Port P1 (P1.0 to P1.2) Pin Functions, Table 23. Port P3 (P3.0 to P3.7) Pin Functions (28-Pin PW and 32-Pin RHB Packages Only).
Кстати, читать значение непосредственно из регистра TAxR при асинхронном тактировании таймера не рекомендуется. Рекомендуется сформировать программно захват значения TAxR и считать полученное значение уже из регистра TAxCCRx. То бишь строка с ошибкой у вас по сути лишняя. Строкой ниже из TA0CCR2 вы и так читаете искомое значение TA0R.
И еще одно замечание. Отучайтесь использовать "магические числа". Везде по тексту используйте стандартные (TI) символьные обозначения регистров и бит. Тогда программа на АСМе будет читаться также легко как на ЯВУ типа Си.
Код
mov #TASSEL_3+MC2,&TA0CTL;TASSEL_3+MC_2;// TACLK, cont mode;for TACLK + cont.mode need 0x0026;0x0320
mov #CM_3+CCIS_2+CAP,&TA0CCTL2; 0e100

Вот в таком виде текст программы был бы более понятным, не так ли? wink.gif
Go to the top of the page
 
+Quote Post
megabuks
сообщение Sep 26 2012, 19:51
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-01-10
Из: Санкт-Петербург
Пользователь №: 55 080



Цитата(rezident @ Sep 26 2012, 21:21) *
Видимо потому, что запись должна быть вида
Код
mov &TA0R,R8

вот тут прикол в том что запись mov &TA0R,R8 работает а на mov &TA1R,R8 компилятор ругается sad.gif
Цитата(rezident @ Sep 26 2012, 21:21) *
В данном кристалле - да, таймеры идентичны. Возможной причиной может быть отсутствие полного понимания функционирования аппаратуры таймеров. Судя по листингу, у вас подсчет импульсов ведется непосредственно - импульсы подаются на тактовый (счетный) вход TA0 INCLK, так?
Временные ворота вы формируете программно, используя WDT и режим захвата CCI2.

Да, в данном варианте кода так.
Дело в том, что я делаю сенсорную кнопку. сенсор подключен к порту 2.5 частота с него подается на вход TA0 INCLK.
В начале работы у меня был только контроллер 430g2252. в него я прошил пример от TI. Результат меня устроил.
Я переписал код на асм, используя ТА0 для счета и WDT для формирования временного окна измерения, и опять-же на 430g2252 все работало.
Для проекта, в котором должна использоваться эта кнопка, нужен UART и WDT. Поэтому выбрали 430g2553. соответственно для формирования интервала измерения я решил использовать ТА1. Вот тут и начались чудеса....
строки
Код
        
         mov #0x5a1e,&WDTCTL;wdthold=0,wdtnmies=0,wdtnmi=0,wdttmsel=1(interval mode),wdtcntcl=1(wdtcnt=0000h),wdtssel=1=aclk, wdtisxx=01=/8192
         bis #TACLR,&TA0CTL

я заменил на:
Код
        bis #TACLR,&TA1CTL
        mov.w #0x0110,&TA1CTL;15-10=0(free);9,8=01(aclk);7,6=00(/1);5,4=01(up to taccr0);3=0(free)
                                                                     ;2=0(TACLR);1=0(прерывание запрещено);0=0
        mov #0x1fff,&TA1CCR0;    interval interrupt
        bis #CCIE,&TA1CCTL0; CCR interrupt for TA1 enable

соответственно в прерывании ТА1ССR0
Код
TA1_CCR0_INT:
        xor #CCIS0,&TA1CCTL2;0
        clr &TA1CTL ;timer halted ta1
        reti


И тут затык - как только я пишу значение в &TA1CCR0 возникает флаг прерывания CCIFG,
который не сбросить ни командой bic ни командой mov. Ну и дальше из этого прерывания получается не выйти. Те-же действия но с таймером ТА0 - прекрасно проходят. Тогда и возникла идея поробовать поменять их местами - ТА0 формировать интервал измерения а ТА1 -считать входные импульсы. Да вот действительно не учел, что надо перекомутацию произвести.... Тогда вопрос - а чего делать то теперь - в какую сторону копать???
Цитата(rezident @ Sep 26 2012, 21:21) *
Если все так, то простое переименование регистров в программе ничего вам не даст. Кроме смены номера таймера нужно еще физически перекоммутировать входные импульсы с пина TA0 INCLK на пин TA1 INCLK. Соответственно нужно настроить функцию соответствующего пина. Нюанс состоит еще и в том, что для TA0 вход INCLK внутренне коммутируется на PinOsc, а для TA1 вход INCLK действительно подключается к внешнему пину P3.7. В общем советую внимательно просмотреть и сравнить функции пинов, подключаемых к таймеру. См. следует datasheet MSP430G2353, а в нем Table 12. Timer0_A3 Signal Connections, Table 13. Timer1_A3 Signal Connections и Table 16. Port P1 (P1.0 to P1.2) Pin Functions, Table 23. Port P3 (P3.0 to P3.7) Pin Functions (28-Pin PW and 32-Pin RHB Packages Only).

Да про это я забыл....
Цитата(rezident @ Sep 26 2012, 21:21) *
То бишь строка с ошибкой у вас по сути лишняя. Строкой ниже из TA0CCR2 вы и так читаете искомое значение TA0R.

Вообщем-то да, лишняя, остаток от отладок. Просто смутило что на TA1R выдало ошибку
Цитата(rezident @ Sep 26 2012, 21:21) *
И еще одно замечание. Отучайтесь использовать "магические числа". Везде по тексту используйте стандартные (TI) символьные обозначения регистров и бит. Тогда программа на АСМе будет читаться также легко как на ЯВУ типа Си.
Код
mov #TASSEL_3+MC2,&TA0CTL;TASSEL_3+MC_2;// TACLK, cont mode;for TACLK + cont.mode need 0x0026;0x0320
mov #CM_3+CCIS_2+CAP,&TA0CCTL2; 0e100

Вот в таком виде текст программы был бы более понятным, не так ли? wink.gif


Трудно не согласиться sm.gif

Сообщение отредактировал megabuks - Sep 26 2012, 20:19
Go to the top of the page
 
+Quote Post
megabuks
сообщение Sep 30 2012, 10:25
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-01-10
Из: Санкт-Петербург
Пользователь №: 55 080



Подниму темку....
Таймер Т1 так и не удается заставить выдавать временной интервал... sad.gif
В отладчике (симуляторе) все работает на ура. В железе-нет
"Железо" - ланчпад и припаяный к нему кусок макетки с процессором.
Припаяны только +3в,земля, test и reset. кварц 32.768кГц и площадка
емкостного сенсора распаяны на макетке. Ланчпад старенький.
Контроллер 2553 - достаточно свежий.
Не может ли тут какая бяка быть?
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Sep 30 2012, 11:04
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



А в "железе" - это в смысле просто автономная работа контроллера, или пошаговая отладка на плате?
Go to the top of the page
 
+Quote Post
megabuks
сообщение Sep 30 2012, 12:29
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-01-10
Из: Санкт-Петербург
Пользователь №: 55 080



Цитата(controller_m30 @ Sep 30 2012, 14:04) *
А в "железе" - это в смысле просто автономная работа контроллера, или пошаговая отладка на плате?

Пошаговая отладка. Причем не важно, выполняется ли именно шаг за шагом, или ставиться точка останова за процедурой (тут соответственно останов не срабатывает т.к. до него дойти не получается), или просто программа запускается на выполнение и потом в некий момент я ее останавливаю результат одинаковый. при записи значения в ТА1ССR0 устанавливается (и больше не сбрасывается ни очисткой бита ни записью mov #0,&TA1CCTL0) флаг CCIFG и соответственно висит прерывание от T1CCR0.
Тот-же код использовался для генерации интервала от таймера ТА0 в нем все четко - ничего лишнего не возникает.
Уже весь мозг сломал - не могу понять в чем дело....
Где-то мельком попадалась информация что ланчпады обновлялись и стали комплектоваться новыми контроллерами - может с этим как-то связано - но где я это видел найти не могу.
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Sep 30 2012, 20:35
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



Цитата(megabuks @ Sep 30 2012, 15:29) *
Где-то мельком попадалась информация что ланчпады обновлялись и стали комплектоваться новыми контроллерами - может с этим как-то связано - но где я это видел найти не могу.
http://processors.wiki.ti.com/index.php/MS...Firmware_Update вот тут обновлялка для ланчпада. Может действительно дело в прошивке, которая не знает про новые контроллеры MSP430G2xx3...

По крайней мере они пишут что-то в этом роде
Цитата
With this update, your LaunchPad will be able to support all new and future MSP430G2xx Value Line devices.
Go to the top of the page
 
+Quote Post
megabuks
сообщение Oct 1 2012, 07:32
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-01-10
Из: Санкт-Петербург
Пользователь №: 55 080



Цитата(controller_m30 @ Sep 30 2012, 23:35) *
http://processors.wiki.ti.com/index.php/MS...Firmware_Update вот тут обновлялка для ланчпада. Может действительно дело в прошивке, которая не знает про новые контроллеры MSP430G2xx3...
По крайней мере они пишут что-то в этом роде

Спасибо. Скачал. у меня ревизия ланчпада - 1.3 последняя - 1.4. Обновлялка сказала что обновление не требуется. ???
Похоже дело не в этом, а вот в чем.....
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Oct 3 2012, 06:51
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



megabuks, может проверить код программы на другом контроллере серии 430x2xxx (в котором есть два таймера)? К примеру MSP430F2112. Только тактирование того таймера, что получает импульсы от Pin-oscillator, переключить на (к примеру) Very Lov Oscillator (VLO). Если программа и там виснет, то всё-таки дело в программе. А если работает - то хз biggrin.gif может надо в TI обращаться...
Или выложите здесь файл с текстом - может я чё найду в программе. Правда у меня нет контроллера серии 430х2ххх с двумя таймерами... но мож так, в симуляторе, или визуально даже laughing.gif
Go to the top of the page
 
+Quote Post
megabuks
сообщение Oct 3 2012, 11:25
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-01-10
Из: Санкт-Петербург
Пользователь №: 55 080



Цитата(controller_m30 @ Oct 3 2012, 09:51) *
megabuks, может проверить код программы на другом контроллере серии 430x2xxx (в котором есть два таймера)? К примеру MSP430F2112. Только тактирование того таймера, что получает импульсы от Pin-oscillator, переключить на (к примеру) Very Lov Oscillator (VLO). Если программа и там виснет, то всё-таки дело в программе. А если работает - то хз biggrin.gif может надо в TI обращаться...
Или выложите здесь файл с текстом - может я чё найду в программе. Правда у меня нет контроллера серии 430х2ххх с двумя таймерами... но мож так, в симуляторе, или визуально даже laughing.gif

Другого контроллера 2й серии с двумя таймерами под рукой к сожалению нет. Попробовал на 5м семействе - там при инициализации таймера ТА1 флаг не выставляется. Файлик (архив приложил), если не затруднит просьба глянуть. rolleyes.gif
Прикрепленные файлы
Прикрепленный файл  sense.zip ( 14.13 килобайт ) Кол-во скачиваний: 17
 
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Oct 3 2012, 17:20
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



скинул один вариант в личку
Go to the top of the page
 
+Quote Post

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

 


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


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