Здравствуйте дорогие форумчане. Хочу сделать часы, вольтметр, индикатор уровня топлива в одном флаконе на Atmega8.
Вообщем есть у меня код на вольтметр, "бакометр", и часов. Только умею я выводить на дисплей с контроллером HD44780!
а сейчас нужно вывести на 4-x разрядный семисегментный индикатор. Но я всё перечитал пересмотрел и ничего не понял. Принцип работы то знаю но как организовать хз. Нашел код сделал на нем часы но в этом коде нет таймера. т.е. значения считываются раз в 20мс. поэтому бакометр и вольтметр не работают.
Не могли бы вы мне в этом помочь собрать весь этот код и вывести на семисегментный индикатор?
Код бакометра.
Вольтметр:
часы:
Раздел: AVR
Вообщем есть у меня код на вольтметр, "бакометр", и часов. Только умею я выводить на дисплей с контроллером HD44780!
а сейчас нужно вывести на 4-x разрядный семисегментный индикатор. Но я всё перечитал пересмотрел и ничего не понял. Принцип работы то знаю но как организовать хз. Нашел код сделал на нем часы но в этом коде нет таймера. т.е. значения считываются раз в 20мс. поэтому бакометр и вольтметр не работают.
Не могли бы вы мне в этом помочь собрать весь этот код и вывести на семисегментный индикатор?
Код бакометра.
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim Inercia As Byte
Dim Inercia_eep As Eram Byte
Dim Flag_acp As Bit
Declare Sub Sens_fuel
Dim Litr As Byte
Dim Adc_litr(70) As Integer
Dim Adc_litr_eep(70) As Eram Integer
Dim Fuel_adc As Integer
Dim Fuel_adc_array(10) As Integer
Dim Fuel As Byte
Inercia = Inercia_eep
If Inercia = 255 Then Inercia = 2
For Fuel = 1 To 70 'считываем из еепром в массив
Adc_litr(fuel) = Adc_litr_eep(fuel)
Next
Do
'для данного алгоритма необходимо организовать опрос ацп 1 раз в секунду. в данном случае я использовал четность/нечетность секунд времени:
If Seco.0 = 0 And Flag_acp = 0 Then 'заходим на АЦП один раз в секунду
Flag_acp = 1
Gosub Acp
Elseif Seco.0 = 1 And Flag_acp = 1 Then
Flag_acp = 0
Gosub Acp
End If
......................
For Fuel = 1 To 70 'определение остатка топлива на основе калибровочных данных
If Adc_litr(fuel) <= Fuel_adc And Fuel_adc < Adc_litr(fuel + 1) Or Adc_litr(fuel + 1) = -1 Then
Fuel = Fuel - 1
Exit For
End If
Next
......................
Lcd Fuel
Loop
Acp:
Start Adc
U = Getadc(0) 'напряжение борт сети
U_sin = U
U_sin = U_sin / 50
'U_str = Fusing(u_sin , "00.0")
For Y = Inercia To 2 Step -1
Fuel_adc_array(y) = Fuel_adc_array(y - 1) 'сдвиг элементов массива вправо
Next
Fuel_adc_array(1) = Getadc(1) 'в 1-ый элемент массива записываем значение АЦП в данный момент
Stop Adc
Fuel_adc = 0
For Z = 1 To Inercia
Fuel_adc = Fuel_adc + Fuel_adc_array(z)
Next
Fuel_adc = Fuel_adc / Inercia
Fuel_adc = 1023 - Fuel_adc 'для датчиков "ПОЛНЫЙ БАК - 0 Ом"
Return
'============================SENS_FUEL==========================================
Sub Sens_fuel
Cls
'Waitms 500
Local B As Integer
Local Fuel_adc_str As String * 4
Local B_str As String * 4
Do
Start Adc
Fuel_adc = Getadc(1)
Stop Adc
Fuel_adc = 1023 - Fuel_adc 'для датчиков "ПОЛНЫЙ БАК - 0 Ом"
If Up = 0 Then
Call Zvuk
Incr Litr
Waitms 200
End If
If Litr > 70 Then Litr = 0
If Down = 0 Then
Call Zvuk
Decr Litr
Waitms 200
End If
If Litr = 255 Then Litr = 70
If Ok = 0 Then
Call Zvuk
Adc_litr_eep(litr + 1) = Fuel_adc
Locate 1 , 15
Lcd "Ok"
Waitms 1000
End If
If Esc = 0 Then
Call Zvuk
Cls
Waitms 300
Exit Do
End If
B = Adc_litr_eep(litr + 1)
Home
Lcd "Calibr.litres " ;
If Litr < 10 Then
Lcd " " ; Litr
Else
Lcd Litr
End If
Lowerline
Fuel_adc_str = Str(fuel_adc)
Lcd "ADC=" ; Format(fuel_adc_str , "0000") ; " "
Locate 2 , 13
B_str = Str(B)
If B > -1 Then
Lcd Format(b_str , "0000")
Else
Lcd "----"
End If
Loop
End Sub
Вольтметр:
Sub Voltmeter()
Start Adc
Readadc1 = Getadc(1)
Voltage = Readadc1 / 1023
Voltage = Voltage * 30
Locate 2 , 1
Lcd Chr(4) ; Fusing(voltage , "##.#") ; "B"
Stop Adc
End Sub
часы:
Sub Getds1307()
I2cstart
I2cwbyte &HD0
I2cwbyte &H00
I2cstart
I2cwbyte &HD1
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Ack
I2crbyte Day , Ack
I2crbyte Dat , Ack
I2crbyte Month , Ack
I2crbyte Year , Nack
I2cstop
Seco = Makedec(seco)
Mine = Makedec(mine)
Hour = Makedec(hour)
Day = Makedec(day)
Dat = Makedec(dat)
Month = Makedec(month)
Year = Makedec(year)
End Sub
'-------------------------------------время------------------------------------'
Sub Getclock()
Call Getds1307()
Locate 1 , 1
Lcd Chr(1)
Locate 1 , 5
If Mine > 9 Then
Lcd Mine
Else
Lcd "0" ; Mine
End If
Locate 1 , 4
Lcd ":"
Locate 1 , 2
If Hour > 9 Then
Lcd Hour
Else
Lcd "0" ; Hour
End If
End Sub
Раздел: AVR