Здравствуйте всем. Не стал плодить темы, хотя вопрос в другом, но тема схожая.
Нужно измерять длину периода. Сигнал-меандр, но поскольку скважность может быть отличной от 2, то замерять при помощи Capture не получиться. По этому решил через int0. Первое прерывание запускаем таймер, второе - останавливаем Казалось бы всё просто, но показания не стабильны. В архиве , сократил до минимума, наблюдаю за переменной в протеусе Taimer1, и она постоянно скачет в пределах 2-3 едениц. Кто подскажет в чём может быть косяк, как исправить, или может другой метод замера?
$regfile = "m88pdef.dat"
$crystal = 16000000
$hwstack = 24
$swstack = 32
$framesize = 64
$loadersize = 1024
Ddrb.5 = 1
Config Timer1 = Timer , Prescale = 1
Config Int0 = Rising
Enable Timer1
Enable Interrupts
On Int0 Cont Nosave
On Timer1 Tim1 Nosave
Dim A As Byte , W As Word , S As String * 15 , I As Byte , V As Word , W_ind As Word
Dim Cont_fl As Byte , Freq As Dword , Fl_lcd As Byte , Ft As Byte , Cont_lcd As Byte
Dim F_int As Byte
'====================================================
'ÎÑÍÎÂÍÎÉ ÖÈÊË
'====================================================
A1:
Cls
Enable Int0
Do
If Fl_lcd = 1 Then
Disable Int0
Fl_lcd = 0
Cont_fl = 0
Eifr = 3
Enable Int0
End If
Loop
Tim1:
!push R16
!in R16 , sreg
!push R16
lds R16 , {F_int }
inc R16
sts {F_int } , R16
!pop R16 '
!out sreg , R16 '
!pop R16 '
Return
Cont:
$asm
PUSH R26
PUSH R27
push r25
PUSH R24
PUSH R16
IN R24,SREG
PUSH R24
$end Asm
Stop Timer1
If Cont_fl = 0 Then
Timer1 = 20
Start Timer1
Cont_fl = 1
Else
Fl_lcd = 1
End If
$asm
POP R24
Out Sreg , R24
POP R16
POP R24
pop r25
POP R27
POP R26
$end Asm
Return
ссылка на архив https://yadi.sk/d/HjHFoyrYfwElKA
Отредактировано kip (2020-10-31 10:42:57)
