Перейти к содержанию
    

Как настроить прерывания в IAR MSP430?

Скачал пример программы - часы, вторые сутки бьюсь, не работает:

#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 слишком сложные?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в Simulator у вас имхо ничего не выработается. берите плату с микроконтроллером и переключайтесь в FET Debugger и тогда смотрите. либо как предлагает MrYuran тикать таймером ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прежде, чем плату брать, хотелось бы чему-то научиться.

Извините за глупые вопросы, но как это -тикать таймером,

я думал он сам тикает, как в AVRStudio:

процессор sleep, а таймер работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема вот в этом месте:

                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 у Вас не может выполниться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

когда проц возвращается из прерывания, он считывает слово состояни из стека и, в отличие от AVR, тут же засыпает вновь. Поэтому, команда CALL #Clock у Вас не может выполниться.

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

В этом смысле вроде бы всё правильно.

 

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

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

 

Я давно уже пришёл к выводу, что отладка через симулятор или житаг - пустая трата времени. Лучше контрольные точки забить и отладочные сообщения выводить наружу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я думал он сам тикает, как в AVRStudio:

процессор sleep, а таймер работает.

В симуляторе периферия не симулируется. Таймера не тикают, соответственно прерывания не вызываются. Можно заставить симулятор вызывать прерывания через заданное количество тактов. Поищите эту функцию в его меню.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

В этом смысле вроде бы всё правильно.

 

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

А-а, блин! Пропустил мимо глаз как раз эту команду!

Значит тогда симулятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...