Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как настроить прерывания в IAR MSP430?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
George22
Скачал пример программы - часы, вторые сутки бьюсь, не работает:
CODE
#include "msp430x11x1.h" ; include std defs
; RTC variables
#define SEC R13
#define MIN R14
#define HR R15
;-----------------------------------------------------------------------------
; Program RESET
RSEG CODE
;-----------------------------------------------------------------------------
RESET MOV #02FEh,SP ; Initialize stackpointer
MOV #WDTPW+WDTHOLD,&WDTCTL ; Stop Watchdog Timer
MOV #TASSEL0+TACLR, &TACTL ; ACLK for Timer_A.
BIS #CCIE,&CCTL0 ; Enable CCR0 interrupt.
MOV #07FFFh,&CCR0 ; load CCR0 with 32,767.
BIS #MC0, &TACTL ; start TA in "up to CCR0" mode
ClearRTC MOV.b #00h,SEC ; Clear SEC
MOV.b #00h,MIN ; Clear MIN
MOV.b #00h,HR ; Clear HR
EINT ; Enable interrupts
; Mainloop
Mainloop BIS #LPM3,SR ; Set SR bits for LPM3
CALL #Clock ; Update Clock
JMP Mainloop ; Endless Loop
;-----------------------------------------------------------------------------
; Clock: Update clock SEC and MIN and HR
;-----------------------------------------------------------------------------

Clock SETC ; Set Carry bit.
DADC.b SEC ; Increment seconds decimally
CMP.b #060h,SEC ; One minute elapsed?
JLO Clockend ; No, return
CLR.b SEC ; Yes, clear seconds
DADC.b MIN ; Increment minutes decimally
CMP.b #060h,MIN ; Sixty minutes elapsed?
JLO Clockend ; No, return
CLR.b MIN ; yes, clear minutes
DADC.b HR ; Increment Hours decimally
CMP.b #024h,HR ; 24 hours elapsed?
JLO Clockend ; No, return
CLR.b HR ; yes, clear hours
Clockend RET ;
;-----------------------------------------------------------------------------


; Setup: Configure Modules and Control Registers
;-----------------------------------------------------------------------------
CCR0INT BIC #LPM3,0(SP) ; Clear SR LPM3 Bits, on top of stack
RETI ;
;-----------------------------------------------------------------------------


;---Interrupt vectors---------------------------------------------------------
RSEG INTVEC

DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ;
DW CCR0INT ; Timer_A (CCIFG0)
DW RESET ; Watchdog Timer
DW RESET ;
DW RESET ;
DW RESET ;
DW RESET ; NMI, Osc. fault
DW RESET ; POR, ext. Reset, Watchdog
END
;------------------------------------------------------------------------------


В дебаггере заходит в LPM3 и все - молчок -никаких прерываний.

Варианты:
0.в программе ошибка?
1.или я тупой и надо возвращаться к AVR?
2.может настройки в IAR слишком сложные?
Elresearch
А у Вас режим Debugger-a какой стоит в Options? FET Debugger или Simulator?
George22
Projects->Options->Debugger->Setup->Simulator
MrYuran
А таймером оттикали 327хх тактов?
Elresearch
в Simulator у вас имхо ничего не выработается. берите плату с микроконтроллером и переключайтесь в FET Debugger и тогда смотрите. либо как предлагает MrYuran тикать таймером wink.gif
George22
Прежде, чем плату брать, хотелось бы чему-то научиться.
Извините за глупые вопросы, но как это -тикать таймером,
я думал он сам тикает, как в AVRStudio:
процессор sleep, а таймер работает.
zhevak
Цитата(George22 @ Feb 13 2009, 12:58) *
Проблема вот в этом месте:
Код
                EINT                    
; Enable interrupts
; Mainloop              
Mainloop       BIS     #LPM3,SR      ; Set SR bits for LPM3
       CALL    #Clock        ; Update Clock  <--- сюда мы никогда не попадем, т.к. проц спит
       JMP     Mainloop      ; Endless Loop



CCR0INT         BIC     #LPM3,0(SP)    ; Clear SR LPM3 Bits, on top of stack
                RETI                ;


У Вас проблема в том, что Вы подходите к прерываниям MSP430 с позиции прерываний AVR. Разница в том, что у MSP430 при входе в прерывание сохраняется слово состояния проца в стеке, а в нем поднятые биты режимов энергосбрежения. Заметьте, когда выполняется код обработчика прерывания, эти биты сброшены. Но когда проц возвращается из прерывания, он считывает слово состояни из стека и, в отличие от AVR, тут же засыпает вновь. Поэтому, команда CALL #Clock у Вас не может выполниться.
MrYuran
Цитата(zhevak @ Feb 13 2009, 15:02) *
когда проц возвращается из прерывания, он считывает слово состояни из стека и, в отличие от AVR, тут же засыпает вновь. Поэтому, команда CALL #Clock у Вас не может выполниться.

Так они ж (эти биты) в прерывании сбрасываются прямо на стеке.
В этом смысле вроде бы всё правильно.

Код
CCR0INT         BIC     #LPM3,0(SP)    ; Clear SR LPM3 Bits, on top of stack
RETI

Единственная видимая причина - в симуляторе

Я давно уже пришёл к выводу, что отладка через симулятор или житаг - пустая трата времени. Лучше контрольные точки забить и отладочные сообщения выводить наружу.
Сергей Борщ
Цитата(George22 @ Feb 13 2009, 13:56) *
я думал он сам тикает, как в AVRStudio:
процессор sleep, а таймер работает.
В симуляторе периферия не симулируется. Таймера не тикают, соответственно прерывания не вызываются. Можно заставить симулятор вызывать прерывания через заданное количество тактов. Поищите эту функцию в его меню.
zhevak
Цитата(MrYuran @ Feb 13 2009, 17:12) *
Так они ж (эти биты) в прерывании сбрасываются прямо на стеке.
В этом смысле вроде бы всё правильно.

Код
CCR0INT         BIC     #LPM3,0(SP); Clear SR LPM3 Bits, on top of stack
RETI

А-а, блин! Пропустил мимо глаз как раз эту команду!
Значит тогда симулятор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.