мне кажется имеет смысл все переписать для работы с прерываниями. в этом нет ничего сложного. я вот делаю примерно так:
1. в файле picxxxx.lkr вносим изменения:
CODEPAGE NAME=resvectors START=0x0 END=0x3 PROTECTED
CODEPAGE NAME=intvectors START=0x4 END=0xff PROTECTED
CODEPAGE NAME=page START=0x100 END=0x3FE
SECTION NAME=RESET_VECTOR ROM=resvectors // Reset and interrupt vectors
SECTION NAME=INT_VECTOR ROM=intvectors // Reset and interrupt vectors
SECTION NAME=PROG ROM=page // ROM code space
теперь у нас разделен вектор ресета (начальной загрузки) и прерывания. числа обязательно проверяются по мануалу. да бы не париться с банками я обычно откаменцичаваю
//SHAREBANK NAME=gpr0 START=0xA0 END=0xDF
так что переменные созданые через res выбираются тока в нулевом банке.
Теперь в .asm. Начало кода будет как
RESET_VECTOR CODE ; processor reset vector
goto main ; go to beginning of program
с ресета идем на меин
INT_VECTOR CODE ;interrupt vector location
movwf w_temp ;save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
bcf PORTC,0
goto but
сохранили регистры w, STATUS далее проверили от чего прерывание. в данном случае проверялась ножка по порту. далее так же можно проверить по завершенности работы таймера и т д.
хочется заметить, что в процессе работы с 16ыми пиками нашелся интересный глючек. как известно у 16го пика 8ми уровневый стек, но при этом нет флажка в флайловых регистрах сообщающих о его переполнении. при таком раскладе вроде бы можно отрываться на прерывание и не возвращаться из него по retfie. ну в общем это не так )) в дебаггере все работает на ура, а в реальной плате пик либо просто не шьется, либо сходит сума. ...мы разменяли с пяток адамов пока поняли в чем дело ))) (с).
а потом совсем все просто. запускаешь таймер разрешаешь прерывания, пускаешь вечный цыкл время от времени его будет отдергивать по таймеру. вот так.
кстати в си ты всегда можешь подсунуть асемблерный год при помощи
#asm
blabla
#endasm