|
|
  |
Timer A, Непонятки с работой ТА0 и ТА1 |
|
|
|
Sep 26 2012, 13:41
|

Участник

Группа: Участник
Сообщений: 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;
|
|
|
|
|
Sep 26 2012, 18:21
|
Гуру
     
Группа: Свой
Сообщений: 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 Вот в таком виде текст программы был бы более понятным, не так ли?
|
|
|
|
|
Sep 26 2012, 19:51
|

Участник

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

|
Цитата(rezident @ Sep 26 2012, 21:21)  Видимо потому, что запись должна быть вида Код mov &TA0R,R8 вот тут прикол в том что запись mov &TA0R,R8 работает а на mov &TA 1R,R8 компилятор ругается  Цитата(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 Вот в таком виде текст программы был бы более понятным, не так ли?
|
|
|
|
|
Sep 26 2012, 19:51
|

Участник

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

|
Цитата(rezident @ Sep 26 2012, 21:21)  Видимо потому, что запись должна быть вида Код mov &TA0R,R8 вот тут прикол в том что запись mov &TA0R,R8 работает а на mov &TA 1R,R8 компилятор ругается  Цитата(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 Вот в таком виде текст программы был бы более понятным, не так ли?  Трудно не согласиться
Сообщение отредактировал megabuks - Sep 26 2012, 20:19
|
|
|
|
|
Sep 30 2012, 10:25
|

Участник

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

|
Подниму темку.... Таймер Т1 так и не удается заставить выдавать временной интервал...  В отладчике (симуляторе) все работает на ура. В железе-нет "Железо" - ланчпад и припаяный к нему кусок макетки с процессором. Припаяны только +3в,земля, test и reset. кварц 32.768кГц и площадка емкостного сенсора распаяны на макетке. Ланчпад старенький. Контроллер 2553 - достаточно свежий. Не может ли тут какая бяка быть?
|
|
|
|
|
Sep 30 2012, 12:29
|

Участник

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

|
Цитата(controller_m30 @ Sep 30 2012, 14:04)  А в "железе" - это в смысле просто автономная работа контроллера, или пошаговая отладка на плате? Пошаговая отладка. Причем не важно, выполняется ли именно шаг за шагом, или ставиться точка останова за процедурой (тут соответственно останов не срабатывает т.к. до него дойти не получается), или просто программа запускается на выполнение и потом в некий момент я ее останавливаю результат одинаковый. при записи значения в ТА1ССR0 устанавливается (и больше не сбрасывается ни очисткой бита ни записью mov #0,&TA1CCTL0) флаг CCIFG и соответственно висит прерывание от T1CCR0. Тот-же код использовался для генерации интервала от таймера ТА0 в нем все четко - ничего лишнего не возникает. Уже весь мозг сломал - не могу понять в чем дело.... Где-то мельком попадалась информация что ланчпады обновлялись и стали комплектоваться новыми контроллерами - может с этим как-то связано - но где я это видел найти не могу.
|
|
|
|
|
Sep 30 2012, 20:35
|
Местный
  
Группа: Участник
Сообщений: 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.
|
|
|
|
|
Oct 1 2012, 07:32
|

Участник

Группа: Участник
Сообщений: 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. Обновлялка сказала что обновление не требуется. ??? Похоже дело не в этом, а вот в чем.....
|
|
|
|
|
Oct 3 2012, 11:25
|

Участник

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

|
Цитата(controller_m30 @ Oct 3 2012, 09:51)  megabuks, может проверить код программы на другом контроллере серии 430x2xxx (в котором есть два таймера)? К примеру MSP430F2112. Только тактирование того таймера, что получает импульсы от Pin-oscillator, переключить на (к примеру) Very Lov Oscillator (VLO). Если программа и там виснет, то всё-таки дело в программе. А если работает - то хз  может надо в TI обращаться... Или выложите здесь файл с текстом - может я чё найду в программе. Правда у меня нет контроллера серии 430х2ххх с двумя таймерами... но мож так, в симуляторе, или визуально даже  Другого контроллера 2й серии с двумя таймерами под рукой к сожалению нет. Попробовал на 5м семействе - там при инициализации таймера ТА1 флаг не выставляется. Файлик (архив приложил), если не затруднит просьба глянуть.
Прикрепленные файлы
sense.zip ( 14.13 килобайт )
Кол-во скачиваний: 17
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|