Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
Не возвращается в программу.
sandro37 Дата: Сб, 25.02.2012, 23:25  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 21
Репутация: 0   ±
Замечания:   ±
На сайте с 06.02.2012

Статус: Offline

Программа должна работать следующим образом.
Каждые 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
Прикрепления: 10.dsn (87.6 Kb)
ЯНДЕКС Дата: 25.02.2012
DAlexV Дата: Вс, 26.02.2012, 01:14  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

В протоне не особо силен, но принцип понятен. Советую вынести PulsOut PORTA.0,T из прерывания а вместо него устанавливать какой нибудь флаг, а уже в основном цикле выполнять PulsOut и не забывать его сбрасывать.

Dim Timer As TMR1L.Word
Dim T As Word
Dim ServoOn as Bit

T=750
Timer=1

'DelayMS 500 'инициализ lcd
Print $FE, 1, "Hello" ' Очистить экран и вывести “Hello”
ServoOn=0
main:

if ServoOn =1 then
PulsOut PORTA.0,T
ServoOn =0
end if


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
ServoOn=1
Timer=18036
PIR1.0 = 0 'Если это так, то сразу сбросим флаг этого прерывания, чтобы
EndIf
Context Restore

Не нужно загружать прерывание сложными и длинными по времени операциями. Это в основном и приводит к зависаним. Удачи ...


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
sandro37 Дата: Вс, 26.02.2012, 01:42  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 21
Репутация: 0   ±
Замечания:   ±
На сайте с 06.02.2012

Статус: Offline

Спасибо за алгоритм, все работает.
  • Страница 1 из 1
  • 1
Поиск: