kavimanus 0 24 мая, 2018 Опубликовано 24 мая, 2018 · Жалоба Помогите разобраться новичку. Пытался самостоятельно - не вышло. Ниже кусок когда (максимально упрощенный). Суть в банальном прерывании от таймера, которое срабатывает по достижении определённого значения, но вот срабатывает оно (прерывание) очень странно. Точнее имеются странные показания регистров при делителе частоты = 1 (значения приведены ниже). .org 0xf800 ;код с этого адреса init: mov.w #WDTPW+WDTHOLD, &WDTCTL;остановить WD mov.b &0x10FC, &DCOCTL ;установка DCO mov.b &0x10FD, &BCSCTL1 ;на частоту 8МГц mov.b #0x06, BCSCTL2 ;Источник сигнала для MCLK и SMCLK - DCOCLK. делитель MCLK-1. делитель SMCLK-8. резистор внутр. mov.w #0280h, SP ;стек с адреса #0x0280 eint ;общее разрешение прерываний loop: mov.w #TASSEL_2+ID_0+MC_1+TACLR, TACTL;источник сигнала - SMCLK/делитель частоты - 1/прямой счет/сброс таймера mov.w #CM_0+CCIE, TACCTL0 ;нет захвата+разрешить прерывание (по переполнению) mov.w #10000, TACCR0 ;предел счета call #delay_proc jmp loop delay_proc: mov.w #GIE+CPUOFF,SR ;LPM0 ret TimerA_int: ;обработчик прерывания Timer_A nop ;для отладки clr.w TACTL ;остановить таймер reti ;вернуться из прерывания .org 0xfffe ;адрес вектора прерывания проц-ры сброса dw init ;обработчик прерывания .org 0xfff2 ;адрес вектора прерывания Таймера_А, по переполнению dw TimerA_int ;обработчик прерывания В таком виде прерывание от таймера срабатывает, но попав обработчик регистры имеют непонятные значения: До входа в обработчик TACTL=0x210 TA0CCTL0=0x10 TA0CCTL1=0x00 TA0CCTL2=0x00 TAR=0x00 TA0CCR0=0x2710 TA0CCR1=0x00 TA0CCR2=0x00 При входе в обработчик TACTL=0x211 TA0CCTL0=0x10 TA0CCTL1=0x01 TA0CCTL2=0x01 TAR=0x00 TA0CCR0=0x2710 TA0CCR1=0x00 TA0CCR2=0x00 Т.е. в регистре TAR значение 0x00 вместо 0x2710. И устанавливаются флаги CCIFG в регистрах TA0CCTL1 и TA0CCTL2 Стоит отметить, что при других значениях делителя частоты (ID_1, ID_2, ID_3. регистр TACLR) значения вполне адекватные. Например при значении ID_1 состояния регистров следующие: До входа в обработчик TACTL=0x250 TA0CCTL0=0x10 TA0CCTL1=0x00 TA0CCTL2=0x00 TAR=0x00 TA0CCR0=0x2710 TA0CCR1=0x00 TA0CCR2=0x00 При входе в обработчик TACTL=0x250 TA0CCTL0=0x10 TA0CCTL1=0x00 TA0CCTL2=0x00 TAR=0x2710 TA0CCR0=0x2710 TA0CCR1=0x00 TA0CCR2=0x00 Помогите пожалуйста разобраться в чём моя ошибка? P.S.: Прошу прощения за форматирование текста Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 24 мая, 2018 Опубликовано 24 мая, 2018 · Жалоба Помогите пожалуйста разобраться в чём моя ошибка? Судя по всему при делителе на 1 у вас прерывание возникает еще до того, как вы настроите регистр TACCR0. Попробуйте запускать таймер после настройки: mov.w #MC_0, TACTL; Stop timer mov.w #CM_0+CCIE, TACCTL0 mov.w #10000, TACCR0 mov.w #TASSEL_2+ID_0+MC_0+TACLR, TACTL; Cfg. and Clear timer mov.w #TASSEL_2+ID_0+MC_1, TACTL; Start timer Ну и флаги прерываний на других каналах тоже видите поэтому. Ибо 0=0 А в других случаях они успевают сброситься в прерывании-заглушке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kavimanus 0 24 мая, 2018 Опубликовано 24 мая, 2018 (изменено) · Жалоба Судя по всему при делителе на 1 у вас прерывание возникает еще до того, как вы настроите регистр TACCR0. Попробуйте запускать таймер после настройки: mov.w #MC_0, TACTL; Stop timer mov.w #CM_0+CCIE, TACCTL0 mov.w #10000, TACCR0 mov.w #TASSEL_2+ID_0+MC_0+TACLR, TACTL; Cfg. and Clear timer mov.w #TASSEL_2+ID_0+MC_1, TACTL; Start timer Ну и флаги прерываний на других каналах тоже видите поэтому. Ибо 0=0 А в других случаях они успевают сброситься в прерывании-заглушке. Согласен с Вами. Ощущение такое, что прерывание генерируется неким иным источником, нежели задумано (что само по себе для меня странно по ряду причин). За идею Вам большое спасибо, попробовал, в разных вариациях, но увы, пока результат тот же. Изменено 24 мая, 2018 пользователем kavimanus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 26 мая, 2018 Опубликовано 26 мая, 2018 · Жалоба Не указали как (отладчиком или как) смотрите регистры. Попробуйте зафиксировать значения регистров которые смотрите не отладчиком, а используя переменные. Возможно при этом все будет работать как и ожидалось. Снизьте тактовую частоту еще в 2 или 4 раза. На время отладки не изменяйте режим LPM (только в активном режиме). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kavimanus 0 26 мая, 2018 Опубликовано 26 мая, 2018 · Жалоба Не указали как (отладчиком или как) смотрите регистры. Попробуйте зафиксировать значения регистров которые смотрите не отладчиком, а используя переменные. Возможно при этом все будет работать как и ожидалось. Снизьте тактовую частоту еще в 2 или 4 раза. На время отладки не изменяйте режим LPM (только в активном режиме). - Значения регистров смотрю в отладчике (IAR). Попытка анализа без отладчика, например включение светодиода по состоянию регистров (тому их состоянию, которое предполагается), так же положительных результатов не даёт. - При использовании активного режима (без перехода в режимы энергосбережения) результат не меняется. - Изменение значения делителя частоты (и соответственно частоты тактирующего сигнала) действительно дает ожидаемый положительный результат. Но, опять же, при различных частотах DCO появляются новые "спецэффекты" - Мне не понятно то, что прерывание, судя по всему, генерируется регистрами TACCL1 и TACCL2 (флаги CCIFG этих регистров установлены при входе в обработчик прерывания) в то время, как флаги CCIE, этих регистров изначально сброшены (т.е. чисто теоретически и прерывания от них запрещены). В то же время прерывание от TACCL0 разрешено, но не срабатывает, хотя, насколько я понимаю, имеет более высокий приоритет. - Есть подозрение, что я как-то неверно произвожу начальную инициализацию модуля синхронизации и таймера, но в чём моя ошибка, пока понять не могу. Капаю дальше ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kavimanus 0 26 мая, 2018 Опубликовано 26 мая, 2018 · Жалоба Хочу поблагодарить всех, кто оказывал помощь. Вопрос более не актуален. Всё работает. Выводы следующие: - действительно не стоит полностью полагаться на отладчик (что прискорбно); - более вдумчиво нужно читать документацию. Еще раз спасибо за посильную помощь. Все советы были полезны и способствовали решению моего вопроса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 28 мая, 2018 Опубликовано 28 мая, 2018 · Жалоба Хочу поблагодарить всех, кто оказывал помощь. Вопрос более не актуален. Всё работает. . . . :) "Легко отделались" :) Спасибо за отчет. --- Еще одна причина, по которой может возникать такое непонятное поведение. Неверное, по тем или иным причинам, "подключение" h-файлов и макроса переключения на конктретный тип процессора. (при этом, ест-но, наблюдается "фонарная" установка адресов регистров и их битов). В лучшем случае - не работает вообще. В худшем - проявляется в виде сбоев. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kavimanus 0 28 мая, 2018 Опубликовано 28 мая, 2018 · Жалоба :) "Легко отделались" :) Спасибо за отчет. --- Еще одна причина, по которой может возникать такое непонятное поведение. Неверное, по тем или иным причинам, "подключение" h-файлов и макроса переключения на конктретный тип процессора. (при этом, ест-но, наблюдается "фонарная" установка адресов регистров и их битов). В лучшем случае - не работает вообще. В худшем - проявляется в виде сбоев. Интересное замечание. Возьму на заметку, спасибо. Хотя, конечно, совсем отказываться от уже прописанных константных значений, и производить побитовую инициализацию, не очень бы хотелось ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться