Сб июл 29, 2017 08:15:07
$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 32
$framesize = 32
'----------
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
'----------
Dim Errord1 As Bit , Errord2 As Bit 'переменные для температуры
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim A As Byte , A2 As Byte , N As Byte 'переменные для температуры
Dim B As Byte , B2 As Byte
Dim Ss1 As Byte , Ss2 As Byte
Dim D As Byte , D2 As Byte
Dim E As Byte , E2 As Byte
Dim Zahvatvrem As Word , Zahvatvrem1 As Word , Perphazi As Word , Ugol1 As Word ,Phaza As Word 'переменные для ветра
Dim Period1 As Single , Per1 As Single , Ugol As Single , Sdvig As Single
Dim Chastota As Single
Dim Sd As String * 3 'скорость ветра
Dim Znak As String * 1 , Znak1 As String * 1 , Znak2 As String * 1 'переменные для температуры
'----------
Config Timer1 = Timer , Prescale = 1024 , Capture Edge = Rising , Noise Cancel = 1 , Clear Timer = 1
Config Portd.4 = Input
Enable Interrupts
Enable Capture1
Enable Timer1
Start Timer1
Zahvatvrem = 0
'----------
Config Timer3 = Timer , Prescale = 1024 , Capture Edge = Rising , Noise Cancel = 1
Config Porte.7 = Input..
Enable Capture3
Enable Timer3
Start Timer3
Zahvatvrem1 = 0
'----------
Config Pinc.7 = Input
Config Portd.7 = Output
Config Portd.2 = Output
Yug Alias Pinc.7 ' Вход для сигнала от геркон
Osnovnaya Alias Portd.2 ' Сигналы на входы IC1,IC3 МК входы подаются через оптопары. Через этот порт коммутируем
Sdvinut Alias Portd.7 ' То же самое
Reset Osnovnaya
Reset Sdvinut
Reset Yug
'----------
On Capture3 Zahvat3
On Capture1 Zahvat1
Const Pha = 0 , 01152 ' 180* 0.000064 для удобства вычислений
Const T = 0.000064 ' (1024*65536/16 000 000)/65536 -примерное время за
' которое значение Timer1,Timer3 увеличивактся на 1
Do
Set Osnovnaya
Reset Sdvinut
Gosub Skorost
Gosub Napravlenie
Gosub Datchik1
Gosub Datchik2
Gosub Pokaz
Loop
End
Napravlenie:
If Yug = 1 Then 'добавлено временно, чтобы узнать где юг. В М63М в этом положении есть геркон
Ugol1 = 180
Else
If Period1 = 0 Then
Ugol1 = 0
Else ' Ugol=(180*t)/period1 ,где t= Phaza*T Pha=180*T
Per1 = Phaza / Period1
Ugol = Pha * Per1
Ugol1 = Round(ugol)
End If
End If
Phaza = 0
Return
'----------
Skorost:
Period1 = Zahvatvrem * T 'получаем время для вычисления частоты
If Period1 = 0 Then
Chastota = 0
Else
Chastota = 1 / Period1
End If
Sd = Fusing(chastota , "#.#")
Return
'----------
'----------
'----------
'Тут код для датчиков температуры
----------
Pokaz:
Locate 1 , 1
If Ugol1 < 100 Then Lcd Chr(7) ; " " ; Sd ; " m/c" ; " " ; "0" ; Ugol1 ; Chr(2) ; " " 'выводим на LCD
If Ugol1 < 10 Then Lcd Chr(7) ; " " ; Sd ; " m/c" ; " " ; "00" ; Ugol1 ; Chr(2) ; " "
If Ugol1 > 99 Then Lcd Chr(7) ; " " ; Sd ; " m/c" ; " " ; Ugol1 ; Chr(2) ; " "
Ugol1 = 0
Locate 2 , 1
If Errord1 = 1 Or Errord2 = 1 Then
If Errord2 = 1 Then
Errord2 = 0
Lcd Chr(1) ; " " ; Znak1 ; Ss1 ; Chr(2) ; "C" ; " " ; Chr(0) ; "-Error"
Else
If Errord1 = 1 Then
Errord1 = 0
Lcd Chr(1) ; "-Error" ; " " ; Chr(0) ; " " ; Znak2 ; Ss2 ; Chr(2) ; "C "
End If
End If
Else
Lcd Chr(1) ; " " ; Znak1 ; Ss1 ; Chr(2) ; "C" ; " " ; Chr(0) ; " " ; Znak2 ; Ss2 ; Chr(2) ; "C "
End If
Return
'*******************************************************************************
Zahvat1:
Stop Timer1
Stop Timer3
Zahvatvrem = Timer1 'берем значение для вычисления скорости ветра
Phaza = Timer 'берем значение для вычисления напрвления ветра
Timer1 = 0
Start Timer1
Start Timer3
Return
Zahvat3:
Timer3 = 0 'обнуляем значение Timer 3
Return
Сб июл 29, 2017 09:13:22
Сб июл 29, 2017 09:21:25
В обработчике прерывания захвата от таймера 1, считайте значения порта второй частоты
Zahvat1:
Stop Timer1
Stop Timer3
Zahvatvrem = Timer1 'берем значение для вычисления скорости ветра
Phaza = Timer3 'берем значение для вычисления напрвления ветра
Timer1 = 0
Start Timer1
Start Timer3
Сб июл 29, 2017 09:27:53
Сб июл 29, 2017 09:35:09
Я Вам предлагал считать не значение таймера, а логический уровень на порте.
Сб июл 29, 2017 09:43:18
Сб июл 29, 2017 10:12:14
Сб июл 29, 2017 11:03:29
Сб июл 29, 2017 12:14:51
По поводу обработки переполнения таймеров при измерении длительности периода вот тут поглядите.
Сб июл 29, 2017 12:19:00
Сб июл 29, 2017 12:21:36
Сб июл 29, 2017 12:25:41
Сб июл 29, 2017 12:27:55
Вс июл 30, 2017 08:18:13
Zahvat1:
Zahvatvrem = Timer1 ' переменная для вычисления скорости
Timer1 = 0
Return
Zahvat3:
Phaza = Timer1 'переменная для вычисления направления
Timer3 = 0
Return
Вс июл 30, 2017 08:27:47
Вс июл 30, 2017 08:38:08
Zahvat3: ' Это подпрограмма , которая выполняется при прерывании Timer3
Phaza = Timer1 "Тут я захватываю значение Timer1 , когда происходит прерывание Timer3
Timer3 = 0 ' обнуляю значение Timer3
Return
Вс июл 30, 2017 09:02:19
Вс июл 30, 2017 09:20:12
Вс июл 30, 2017 09:45:26
Не путайте события и прерывания.Ramis12 писал(а):Даже если не произошло прерывание Тimer3?
Вс июл 30, 2017 10:40:37