Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Timer A
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
megabuks
Здравствуйте
Помогите разобраться с таймерами. Контроллер 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;

d7d1cd
Какую ошибку выдает? И еще: у тебя в строке не поменяно TA0 на TA1.
rezident
Цитата(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
megabuks
Цитата(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
megabuks
Цитата(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
Подниму темку....
Таймер Т1 так и не удается заставить выдавать временной интервал... sad.gif
В отладчике (симуляторе) все работает на ура. В железе-нет
"Железо" - ланчпад и припаяный к нему кусок макетки с процессором.
Припаяны только +3в,земля, test и reset. кварц 32.768кГц и площадка
емкостного сенсора распаяны на макетке. Ланчпад старенький.
Контроллер 2553 - достаточно свежий.
Не может ли тут какая бяка быть?
controller_m30
А в "железе" - это в смысле просто автономная работа контроллера, или пошаговая отладка на плате?
megabuks
Цитата(controller_m30 @ Sep 30 2012, 14:04) *
А в "железе" - это в смысле просто автономная работа контроллера, или пошаговая отладка на плате?

Пошаговая отладка. Причем не важно, выполняется ли именно шаг за шагом, или ставиться точка останова за процедурой (тут соответственно останов не срабатывает т.к. до него дойти не получается), или просто программа запускается на выполнение и потом в некий момент я ее останавливаю результат одинаковый. при записи значения в ТА1ССR0 устанавливается (и больше не сбрасывается ни очисткой бита ни записью mov #0,&TA1CCTL0) флаг CCIFG и соответственно висит прерывание от T1CCR0.
Тот-же код использовался для генерации интервала от таймера ТА0 в нем все четко - ничего лишнего не возникает.
Уже весь мозг сломал - не могу понять в чем дело....
Где-то мельком попадалась информация что ланчпады обновлялись и стали комплектоваться новыми контроллерами - может с этим как-то связано - но где я это видел найти не могу.
controller_m30
Цитата(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.
megabuks
Цитата(controller_m30 @ Sep 30 2012, 23:35) *
http://processors.wiki.ti.com/index.php/MS...Firmware_Update вот тут обновлялка для ланчпада. Может действительно дело в прошивке, которая не знает про новые контроллеры MSP430G2xx3...
По крайней мере они пишут что-то в этом роде

Спасибо. Скачал. у меня ревизия ланчпада - 1.3 последняя - 1.4. Обновлялка сказала что обновление не требуется. ???
Похоже дело не в этом, а вот в чем.....
controller_m30
megabuks, может проверить код программы на другом контроллере серии 430x2xxx (в котором есть два таймера)? К примеру MSP430F2112. Только тактирование того таймера, что получает импульсы от Pin-oscillator, переключить на (к примеру) Very Lov Oscillator (VLO). Если программа и там виснет, то всё-таки дело в программе. А если работает - то хз biggrin.gif может надо в TI обращаться...
Или выложите здесь файл с текстом - может я чё найду в программе. Правда у меня нет контроллера серии 430х2ххх с двумя таймерами... но мож так, в симуляторе, или визуально даже laughing.gif
megabuks
Цитата(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
controller_m30
скинул один вариант в личку
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.