Помогите разобраться с pIC16F84A
Доброго времени суток! Задал преподу наивный вопрос "что лучше PIC или AVR?". Думал услышу что-то вроде того, что "надо знать и то и то", "каждый по своему хорош".В ответ то одназначно сказал что !!!AVR!! На вопрос почему? Предложил мне написать программку для пика следующего плана: С временным интервалом 2 милисекунды происходят прерывания на ноге RB0. как только оно произошло нужно записать в EEPROM 1 или 0 (смотря какой сигнал на второй ноге).
Выкладываю ту часть подпрограммы прерывания по ноге RB0:
INT movwf W_Temp ; стандартные процедуры сохранения регистров W и Status
movf Status,W
movwf Stat_Temp
Proverk btfss PortB,1 ; Если на 2 ноге 0, то в регистр Reristr записывается число 0
goto NOL
movlw .1 ; Если нет ,то в Registr Записывается число 1
movwf Registr
goto WRITEEPR Собственно переходим к записи в ЕЕПРОМ
NOL movlw .0
movwf Registr
goto WRITEEPR
WRITEEPR bcf Intcon,7 ; запрет всех преываний( нужен ли в ПП прерывания?)
incf SS,F ; Прибавить 1 к SS ( Запись начнется со второй ячейки ЕЕПРОМА)
movf SS,W
movwf EEAdr ; Собственно выбираем это адрес
movf Registr,W
movwf EEData ; Записываем
bsf Status,RP0
bsf EECon1,2 ; Стандартные процедуры записи
movlw 055h
movwf EECon2
movlw 0AAh
movwf EECon2
bsf EECon1,1
bcf EECon1,4
EndInt bcf Intcon,1
movf Stat_Temp,W
movwf Status
swapf W_Temp,F
swapf W_Temp,W
retfile
START clrf Intcon ; Запрещаем все прерывания
bsf Status,RP0 ; Первый банк
movlw .3 ; записываем в W число 0000 0011
movwf TrisB ; Соответсвенно RB0 и RB1 работают на вход.
movlw .64 ; Записываем в W 0100 0000
movwf OptionR ; Преывания по переднему фронту 0/1 включены
bcf Status,RP0 ; Переходим в нулевой банк
movlw .1 ; За писываем 1 в реистр SS(название от балды) нужен
movwf SS ; мне в далнейшем для последовательной записи в адреса EEPROM
Pause1 movlw .245 ; закладываю паузы для ожидания прерываний.
movwf SecH
movlw .255
movwf SecL
;************************************************* ***********************************************
movlw .144
movwf Intcon ; Записываю число 1001 0000( разрешаю глобальные и прерывания по RB0)
Pause decfsz SecL,F ; Собственно ожидаю этого прерывания
goto Pause
incfsz SecH,F
goto Pause
goto Pause1 ; Если прерывания не произошло то снова закладываем паузы и ждем
end
Все вроде как правильно..Только один момент. Если даже использовать ТИп генератора HS и частоту 10 Мгц то, если верить Mlab на выполнение ПП INT( c INT по retfile) требуется 12.4 милисекнды по таймеру!!!!! а должно быть не больше 2-х!!!!!!!!!!!!Вопрос Подскажите пожалуйсто как это можно решить??
|