Суть вопроса такова. Собрал зарядное устройство для аккумулятора с функцией тренировки (цикл заряд- разряд).
Когда работает в подпрограмме заряд - разряд Rechim: индикация тока и напряжения обновляется у меня в цикле. При этом цикл может быть такой например заряд 10 секунд, разряд 5 секунд. Ну и естественно обновления измерения происходит через 15 секунд. Что меня не устраивает. Как можно сделать так чтобы во время цикла заряд - разряд, измерения проходили не зависимо от времени цикла? Выход на режим заряд - разряд тумблером на PD1. Установка времени заряда и разряда в подпрограмме прерывания по INT0. Код программы прилагаю.
$regfile = "m8def.dat"
$crystal = 8000000
$lib "lcd4.lbx"
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Конфигурация АЦП
Config Portd.0 = Output
Reset Portd.0
Config Pind.1 = Input
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pinc.3 = Input
Config Pinc.2 = Input
Portd.1 = 1
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portc.3 = 1
Portc.2 = 1
Config Int0 = Low Level
'Объявление переменных
Dim Vremja_r As Word
Dim Vremja_z As Word
Dim I As Single
Dim U As Single
Dim Iperv As Word
Dim Uperv As Word
Dim A As Word
On Int0 Vremiy 'Имя подпрограммы прерывания
Enable Interrupts
Enable Int0
Start Adc 'Запускаем аналого-дискретное преобразование
'-------------------------------------------------------------
'Главный цикл программы
Zikl: 'Подпрограмма просто замер тока и напряжения
Reset Portd.0
Vremja_r = 1
Vremja_z = 1
Cls
Do
If Pind.1 = 0 Then 'Переход на подпрограмму заряд - разряд
Goto Rechim
End If
Iperv = Getadc(5) 'Считываем результат с пина 5 порта C измерение тока
I = Iperv / 100
Uperv = Getadc(4) 'Считываем результат с пина 4 порта C измерение напряжения
U = Uperv / 43
Locate 1 , 1 'Позиция курсора
Lcd "HaѕpЗ¶eЅёe " ; U ; " " 'Выводим результат преобразования на дисплей
Locate 2 , 1
Lcd "Toє " ; I ; " "
Waitms 200 ' Задержка 100 мс
Loop
End
Rechim:
Cls 'Подпрограмма цикла заряд - разряд по заданному времени
Do
Set Portd.0
Wait Vremja_r 'Время разряда
Reset Portd.0
Wait Vremja_z 'Время заряда
Set Portd.0
If Pind.1 = 1 Then
Goto Zikl
End If
Waitms 100
Iperv = Getadc(5) 'Считываем результат с пина 5 порта C - ТОК
I = Iperv / 100
Uperv = Getadc(4) 'Считываем результат с пина 4 порта C - НАПРЯЖЕНИЕ
U = Uperv / 43
Locate 1 , 1
Lcd "Pa· " ; Vremja_r ; " "
Locate 1 , 9 'Позиция курсора
Lcd "Haѕ " ; U ; " "
Locate 2 , 1
Lcd "¤ap " ; Vremja_z ; " "
Locate 2 , 9
Lcd "Toє " ; I ; " "
Loop
End
Vremiy: 'Подпрограмма прерывания для задания времени заряда
'разряда аккумулятора
Cls
Locate 1 , 1
Lcd " BpeјЗ "
Locate 2 , 1
Lcd "Pa· " ; Vremja_r ; " "
Locate 2 , 9
Lcd "¤ap " ; Vremja_z ; " "
If Pind.3 = 0 Then 'Кнопка для увеличения времени задания разряда
Incr Vremja_r
End If
If Pind.4 = 0 Then 'Кнопка для уменьшенияи времени задания разряда
Decr Vremja_r
End If
If Vremja_r < 1 Then
Vremja_r = 1
End If
If Pinc.3 = 0 Then 'Кнопка для увеличения времени задания заряда
Incr Vremja_z
End If
If Pinc.2 = 0 Then 'Кнопка для увеличения времени задания заряда
Decr Vremja_z
End If
If Vremja_z < 1 Then
Vremja_z = 1
End If
Waitms 200
Return
End
Отредактировано AleksanderG (2013-01-21 12:52:24)