Добрый день, форумчане. Опять вопрос, и опять к вам за помощью.
столкнулся вот с какой проблемой: если программа залита в девайс по следующему коду
$regfile = "m8def.dat"
$crystal = 12000000
$hwstack = 32
$swstack = 32
$framesize = 32
$baud = 57600
Dim I As Word
Dim W As Word
Dim N As Word
Config Pind.5 = Input
Config Pind.6 = Input
Config Pind.7 = Input
Config Portc.4 = Output
Config Timer0 = Timer , Prescale = 64
On Timer0 Tim0:
Enable Timer0
Config Int0 = Falling ' прерывание INT0 по нисходящему фронту (c + на -)
On Int0 Encod
Enable Interrupts
Enable Int0
Do
If I <> W Then Print W
I = W
Loop
Encod: ' тут узнаем в каком направлении вращают ручку энкодера
' ждем пока утихнет дребезг контактов
If Pind.6 = 0 Then ' если на ноге единица (импульс не пришел) тогда
Incr W ' инкременируем переменную (увеличиваем на 1)
N = W
If N = 1001 Then
W = 0
End If
Else ' в обратном случае
'--------------------------------------------------------------
If W > 0 Then
Decr W ' декрементируем переменную (уменьшаем на 1)
End If
'--------------------------------------------------------------
N = W
If N = 0 Then
W = 1000
End If
End If
Gifr = 64
Return
Tim0:
If Pind.5 = 0 Then W = 0
If Pind.5 = 0 Then Print W
Returnто в программе терминала Bascom и по графику в LabVIEW видны пропуски посылок:
123
124
127
129
...
Программа не успевает отправить посылки на СОМ порт?
НО программа работает стабильно(счет идет от 0 до 1000, нет "зацикливаний" ) как бы быстро ты не вращал энкодер от руки
фото:
а если переписать код программы вот так:
$regfile = "m8def.dat"
$crystal = 12000000
$hwstack = 32
$swstack = 32
$framesize = 32
$baud = 57600
Dim I As Word
Dim W As Word
Dim N As Word
Config Pind.5 = Input
Config Pind.6 = Input
Config Pind.7 = Input
Config Portc.4 = Output
Config Timer0 = Timer , Prescale = 64
On Timer0 Tim0:
Enable Timer0
Config Int0 = Falling ' прерывание INT0 по нисходящему фронту (c + на -)
On Int0 Encod
Enable Interrupts
Enable Int0
Do
Loop
Encod: ' тут узнаем в каком направлении вращают ручку энкодера
If I <> W Then Print W
I = W
' ждем пока утихнет дребезг контактов
If Pind.6 = 0 Then ' если на ноге единица (импульс не пришел) тогда
Incr W ' инкременируем переменную (увеличиваем на 1)
N = W
If N = 1001 Then
W = 0
End If
Else ' в обратном случае
'--------------------------------------------------------------
If W > 0 Then
Decr W ' декрементируем переменную (уменьшаем на 1)
End If
'--------------------------------------------------------------
N = W
If N = 0 Then
W = 1000
End If
End If
Gifr = 64
Return
Tim0:
If Pind.5 = 0 Then W = 0
If Pind.5 = 0 Then Print W
ReturnТо по терминалу и на графике пропусков значений не наблюдается, НО вращать энкодер нужно медленно, иначе видны "зацикливания" фото:

сначала идет медленное вращение, все норм, а затем быстрое (график).
вот такая ситуация...не могу понять куда копать.
