Digi 0 1 апреля, 2012 Опубликовано 1 апреля, 2012 · Жалоба Пишу программу под отечественный клон TMS320F240. По каждому периоду таймера вырабататывается прерывание .Вектора прерываний находятся начиная с адреса 0. Прерывание INT3. После первого включения питания и формирования прерывания, процессор в обработчик заходит только один раз, всё выполняет и больше не заходит, хотя флаг прерывания устанавливается. Если дать принудительный сброс процессору, то проц начинает заходить в прерывание каждый раз и в дальнейшем программа работает верно до следующего выключения питания. Кто нибудь с таким сталкивался или это особенность отечественного клона ? Причем ведет себя одинаково как при работе из Flash, так и из RAM. Вот кусок кода. .sect "vectors" .global RESET .global NMI .global INT3 .global _c_int0 _c_int0 b RESET ; Переход по вектору RESET INT1: B INT1 INT2: B INT2 b INT3 INT4: B INT4 INT5: B INT5 INT6: B INT6 ..... ..... ..... ;============================================================== ..... .text INT3: ;Обработка прерывания; push_ PC7_ON ldp #7433h>>7 ;PM=*PIVR lacl 7433h ; EVIMRB xor #002Bh ;Определение T2PINT bcnd T2CMP_FINT, EQ zzz: b zzz ; Halt if int not valid T2CMP_FINT: ..... ..... ..... EXIT_INT: clrc INTM PC7_OFF pop_ ret -------------------------------------------------------------- file.cmd MEMORY { PAGE 0 : VECS: origin = 0x0, length = 0x40 PAGE 0 : PROG: origin = 0x40, length = 0x3d00 PAGE 0 : Bootloader: origin=0x3E00 length = 0x200 PAGE 0 : B0prg: origin = 0xFE00, length = 0x100 PAGE 0 : PAGE 1 : B1: origin = 0x300, length = 0x100 PAGE 1 : B2: origin = 0x60, length = 0x20 PAGE 1 : B0data: origin = 0x200, length = 0x100 PAGE 1 : DATA: origin = 0x8000, length = 0x7FFF } SECTIONS { vectors : {} > VECS PAGE 0 .text : {} > PROG PAGE 0 .bss : {} > B1 PAGE 1 .edata : {} > DATA PAGE1 stack : {} > B2 PAGE1 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eug28 0 19 апреля, 2012 Опубликовано 19 апреля, 2012 · Жалоба Работаю с данным микроконтроллером: Вот код настройки прерывания и работа с ним: asm-файл .include "wc5reg_asm.h" .sect "vectors" b 03E00h ;вектор сброса _c_int1 b _c_int1 ; b _c_int2 ; обработчик прерывания таймера _c_int3 b _c_int3 ; _c_int4 b _c_int4 ; _c_int5 b _c_int5 ; _c_int6 b _c_int6 ; .space 16*6 .text ... ldp #DP_EV splk #04207h,COMCON splk #0C207h,COMCON splk #Tduty,T1PER splk #0,T1CNT splk #0A800h,T1CON lar ar4,#60h ... ldp #DP_EV ; Очистка EV IFR и IMR регистров splk #07FFh,IFRA splk #00FFh,IFRB splk #000Fh,IFRC ; Разрешение прерывание по обнулению таймера 1 splk #0200h,IMRA splk #0000h,IMRB splk #0000h,IMRC ;Установка IMR для прерывания INT2 ldp #0h ;Очистка флагов прерываний lacc #0FFh sacl IFR lacc #0000010b sacl IMR ldp #DP_EV lacc T1CON or #0040h sacl T1CON clrc INTM main ... b main ******************************************************* *Прерывание INT2 от таймера 1 ******************************************************* _c_int2: larp ar4 mar *- sst #1,*- sst #0,*- sach *- sacl *- ... Программа обработки прерывания ... ldp #DP_EV lacc IVRA larp ar4 mar *+ lacl *+ add *+,16 lst #0,*+ lst #1,*+ clrc INTM ret Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Digi 0 20 апреля, 2012 Опубликовано 20 апреля, 2012 · Жалоба Спасибо ОГРОМНОЕ !!! Проблема у меня была в сохранении регристров при входе в прерывание. Ваш код помог обнаружить ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться