Программа должна работать следующим образом.
Каждые 18-20мс программа переходит в подпрограмму и выполняет PulsOut PORTA.0,T, т.е импульс высокого уровня продолжительностью T. В основной программе кнопками на портах А3 и А4 можно изменять значение T, т.е длину импульса. Все это необходимо для поворота сервы.
Но через некоторое время после запуска и нажатия на кнопки - подпрограмма зацикливается.
После запуска программа начинает работать нормально, но
Code
Device = 16F628A
Xtal=20
Include "modedefs.bas"
Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно -цифровой
Declare LCD_DTPin PORTB.4 ' Порт данных ЖКИ
Declare LCD_ENPin PORTB.0 ' Управление линией E
Declare LCD_RSPin PORTB.3 ' Управление линией RS
Declare LCD_Interface 4 ' Разрядность шины данных
Declare LCD_Lines 2
Declare LCD_CommandUs 2000
Declare LCD_DataUs 50
TRISA = %00011000
PORTA = %00000000
OPTION_REG=%10000000
PIE1.0 = 1 'Разрешение прерывания по переполнению TMR1
On_Interrupt GoTo myint ' При возникновении прерывания перейти на метку - myint
INTCON = %11000000 ' Включить прерывание по переферии
' Timer1 Registers: Prescaler=1:2; TMR1 Preset=18036; Freq=52,63158Hz; Period=19,00 ms
T1CON.5 = 0; ' bits 5-4 Prescaler Rate Select bits
T1CON.4 = 1; ' bit 4
'T1CON.3 = 1; ' bit 3 Timer1 Oscillator Enable Control: bit 1=on
T1CON.3 = 0; ' bit 3 Timer1 Oscillator Enable Control: bit 1=on
T1CON.2 = 1; ' bit 2 Timer1 External Clock Input Synchronization Control bit:1=Do not synchronize external clock input
T1CON.1 = 0; ' bit 1 Timer1 Clock Source Select bit:0=Internal clock (FOSC/4) / 1 = External clock from pin T1CKI (on the rising edge)
T1CON.0 = 1; ' bit 0 enables timer
PortB_Pullups = OFF ' Выключить подтягивающие резисторы на PORTB
Declare All_Digital = On ' Установить все порты цифровыми входами/выходами
Dim Timer As TMR1L.Word
Dim T As Word
T=750
Timer=1
'DelayMS 500 'инициализ lcd
Print $FE, 1, "Hello" ' Очистить экран и вывести “Hello”
main:
If PORTA.3=1 Then
v1:
If PORTA.3=0 Then
T=T+1
Print $FE, 1, Dec T
GoTo main
EndIf
GoTo v1
EndIf
If PORTA.4=1 Then
v2:
If PORTA.4=0 Then
T=T-1
Print $FE, 1, Dec T
GoTo main
EndIf
GoTo v2
EndIf
GoTo main
myint:
Context Save
If PIR1.0 = 1 Then 'Проверим, было ли вызвано прерывание именно переполнением таймера TMR1
PulsOut PORTA.0,T
Timer=18036
PIR1.0 = 0 'Если это так, то сразу сбросим флаг этого прерывания, чтобы
EndIf
Context Restore