Я сам не супер спец,но думаю так:
1.Если у вас положительные импульсы приходят на INT1,а INT1 сконфигурирован так:
Код
Config Int1 = Falling ' прерывание INT1 по нисходящему фронту (c + на -)
то надо переделать прерывание с - на + ,а сам INT1 подтянуть к земле: Если импульс заведен на ногу PIND.3,то как этот импульс может приходить на ногу PIND.4?
В переменную W происходит запись,когда случается прерывание по приходу на ногу PIND.3 того самого импульса.Как только импульс пришел программа переходит в обработчик прерывания:
Код
On Int1 Encod ' если прерывание идем на метку encod
Чтобы по приходу импульса менялась переменная в обработчике прерываний я бы сделал так:
Код
Encod:
If Pind.3 = 1 Then 'Если на Pind.3 пришла единица
Waitms 5
W = W + 1 'увеличиваем переменную W на единицу
End If
Return
2.Надо завести ещё одну переменную,например Ww и в обработчике прерываний прибавлять к ней по единице 10 раз и как только она изменится в десятый раз,прибавлять к переменной W единицу,а переменную Ww сбрасывать в ноль:
Код
Encod:
If Pind.3 = 1 Then 'Если на Pind.3 пришла единица
Waitms 5
Ww = Ww + 1
If Ww = 10 Then
W = W + 1 'увеличиваем переменную W на единицу
Ww = 0
End If
End If
Return
3.Может при подаче питания сразу вызывается прерывание и счетчик прибавляет единицу. По вашему коду прерывание сидит на единице и ждет ноль,а при включении питания он этот ноль сразу и получает.
4.GIFR=64 - это сброс флага прерывания INT0,но у 2313,по даташиту,регистр флагов прерываний называется EIFR
Вот сюда положил даташит на 2313 на русском-https://yadi.sk/i/xLHOg65AiMRrD.Увлекательное чтиво ))