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

 
 
> прерывания таймера. прошу помощи
kavimanus
сообщение May 24 2018, 11:22
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 23-05-18
Пользователь №: 104 608



Помогите разобраться новичку. Пытался самостоятельно - не вышло. Ниже кусок когда (максимально упрощенный). Суть в банальном прерывании от таймера, которое срабатывает по достижении определённого значения, но вот срабатывает оно (прерывание) очень странно. Точнее имеются странные показания регистров при делителе частоты = 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.: Прошу прощения за форматирование текста
Go to the top of the page
 
+Quote Post



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

 


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


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