|
|
  |
Как настроить прерывания в IAR MSP430?, Скачал пример - часы, не могу запустить... |
|
|
|
Feb 13 2009, 07:58
|

Группа: Новичок
Сообщений: 6
Регистрация: 10-02-09
Пользователь №: 44 653

|
Скачал пример программы - часы, вторые сутки бьюсь, не работает: 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 слишком сложные?
Причина редактирования: Уменьшение видимого размера цитаты исходника.
|
|
|
|
|
Feb 13 2009, 10:47
|

Группа: Новичок
Сообщений: 6
Регистрация: 10-02-09
Пользователь №: 44 653

|
Projects->Options->Debugger->Setup->Simulator
|
|
|
|
|
Feb 13 2009, 11:56
|

Группа: Новичок
Сообщений: 6
Регистрация: 10-02-09
Пользователь №: 44 653

|
Прежде, чем плату брать, хотелось бы чему-то научиться. Извините за глупые вопросы, но как это -тикать таймером, я думал он сам тикает, как в AVRStudio: процессор sleep, а таймер работает.
|
|
|
|
|
Feb 13 2009, 12:02
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(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 у Вас не может выполниться.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Feb 13 2009, 12:12
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(zhevak @ Feb 13 2009, 15:02)  когда проц возвращается из прерывания, он считывает слово состояни из стека и, в отличие от AVR, тут же засыпает вновь. Поэтому, команда CALL #Clock у Вас не может выполниться. Так они ж (эти биты) в прерывании сбрасываются прямо на стеке. В этом смысле вроде бы всё правильно. Код CCR0INT BIC #LPM3,0(SP) ; Clear SR LPM3 Bits, on top of stack RETI Единственная видимая причина - в симуляторе Я давно уже пришёл к выводу, что отладка через симулятор или житаг - пустая трата времени. Лучше контрольные точки забить и отладочные сообщения выводить наружу.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Feb 13 2009, 13:38
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(MrYuran @ Feb 13 2009, 17:12)  Так они ж (эти биты) в прерывании сбрасываются прямо на стеке. В этом смысле вроде бы всё правильно. Код CCR0INT BIC #LPM3,0(SP); Clear SR LPM3 Bits, on top of stack RETI А-а, блин! Пропустил мимо глаз как раз эту команду! Значит тогда симулятор.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|