Maximus Опубликовано 12 февраля, 2013 Жалоба Поделиться Опубликовано 12 февраля, 2013 (изменено) На основе базовой схемы несколько доработаная конструкция для цифрового манометра-термостата . Датчик ММ393А, конструктивно крепится на массу, его резистивное сопротивление составляет , от 0 до 300 ом, чтобы получить на входе АЦП диапазон напряжения от 0 до 5V используем в схеме ОУ. Операционный усилитель , хоть и является небольшим усложнением схемы, но с его помощью можно добиться неплохой точности показаний прибора, даже с таким примитивным датчиком давления как ММ393А ( это самый доступный, другие специализирование стоят достойных денег ). А выход из МК, настраиваемого порога включения/выключения с настраиваемым гистерезисом (или просто сигнал) дополнительного устройства, делает эту схему полноценной, для любого применения !!!! А так же, всё получается ещё интереснее когда это 2 в 1. Например: манометр/манометр , манометр/вольтметр , манометр/термостат ……… , ну в общем по этому же принципу схемы базовой схемы какие угодно комбинации устройств. В данном случае схема работает как манометр/термостат. Фото датчика давления .Схема: В схеме используется датчик— ММ393А с рабочим давлением от 0 до 8 кг/см2 и температурый датчик NTC термистор 640-10k. Светодиоды имитируют включение исполнительных устройств.Видео работы цифрового манометра ( шкала для кг/см2 на манометре отградуирована до 7 атм. красным цветом) Плата для корпуса DIP: Прошивка цифрового манометра-термостата 5-0V_100_999.rarНастройка и управление (назначение кнопок , светодиодов) аналогично описаному в базовой схеме.Работать будет и с другими автомобильными датчиками серии ММ3ххх , вот примерные характеристики таких датчиков Датчик ММ358 при отсутствии давления должен иметь сопротивление 160...175 Ом, при давлении в 2 кг/см2 — 110...114 Ом, при давлении в 4 кг/см2 — 58...65 Ом, при давлении в 6кг/см2 — 0...5 ОмДатчик 23.3839 при отсутствии давления должен иметь сопротивление 305...330 Ом, при давлении в 1,5 кг/см2 — 180...200 Ом, при давлении в 4,5 кг/см2 — 70...80 Ом, при давлении в 6кг/см2 — 0...8 ОмДатчик ММ393А при отсутствии давления должен иметь сопротивление 310...320 Ом, при давлении в 4 кг/см2 — 115...130 Ом, при давлении в 6 кг/см2 — 55...65 Ом, при давлении в 8 кг/см2 — 0...15 Ом. Экслюзивное фото , что у датчика давления, внутри. Вольтметр от 0.0 до 50.0 вольт, давление от 0.0 до 8.0 кг/см , канал давления с использованием корректировки экспонентой. Для измерительной схемы с применением аналогово автомобильного датчика , автор этой программы MACTEPok сделал небольшую редакцию кода в этой программе.Так как аналоговые датчики ММ3хх имеют некоторую нелинейность изменения сопротивления при увеличении давления.Для программной корректировки, в программу внесена експонента. Any_var = Chvar_1 / 2000 ' 2000 - можно задавать изгиб линииAny_var = Negativ * Any_var ' Если закоментировать, изменим направление изгиба экспонентыAny_var = Exp(any_var)Chvar_1 = 1023 - Chvar_1Chvar_1 = Chvar_1 / 12.786 ' диапазон до 80 Any_var = Chvar_1 * Any_varChvar_1 = Any_var Таким образом, получаем вот такую коректированую кривизну измеренияСхема;Исходный код программы; '* Filename : Универсальный 2х-канальный индикатор *'* Revision : 5.0 *'* Controller : ATMEGA8 *'* Compiler : BASCOM-AVR 2.0.6.1 *'* Author : MACTEPOK *'*******************************************************************************$regfile = "m8def.dat" 'определяем контроллер$crystal = 8000000 'внутренний генератор'$sim$lib "mcsbyte.lbx" 'подключаем библиотеку функций$hwstack = 40$swstack = 16$framesize = 32Config Pinc.0 = Input : Portc.0 = 1 'кнопка ВыборConfig Pinc.1 = Input : Portc.1 = 1 'кнопка ВверхConfig Pinc.2 = Input : Portc.2 = 1 'кнопка ВнизConfig Portd = Output : Config Portb = Output 'порты на выход к которым подключен индикаторLoad1 Alias Portb.3 'нагрузка №1Load2 Alias Portb.4 'нагрузка №2Vibor Alias Pinc.0 'кнопка ВыборUp Alias Pinc.1 'кнопка ВверхDown Alias Pinc.2 'кнопка ВнизConfig Adc = Single , Prescaler = Auto , Reference = Avcc 'настраиваем АЦПDim W As Byte , Y As Byte , X As Byte , I As Byte , Z As Byte , Chislo(6) As Integer , Channel_1 As Integer , On1 As Word , Off1 As Word , Channel_2 As Integer , On2 As Word , Off2 As Word , Sostoyanie As Byte , Sostoyanie_2 As Byte , Copy_print As Integer , Copy_print_sec As Integer , Copy_var As Integer , _print As Integer , _print_sec As Integer , Pokazaniya As Integer , View_menu As Byte , Booton_flag As Bit , Booton_flag_2 As Bit , Count As Word , Error_flag As BitDim Razryad_1 As Byte , Razryad_2 As Byte , Temp_najatiya As Byte , Indicator As ByteDim Menu_punkt As Byte , Any_var As Single 'пункт менюDim Set_flag As Bit 'флаг режима настройки уставокDim Podskaz_flag As Bit , Podskaz_flag_sec As Bit 'флаги режима отображения подсказок на соответствующих каналахDim Default As Eram Byte At &H14 'переменная EEPROM для записи начальных уставок для первого включения прибораDim Adc_ready As Bit ' Флаг готовности АЦПDim Chvar_1 As Single , Chvar_2 As Single ' промежуточные переменные для расчетовDim Ch1 As Integer , Ch2 As Integer,Const Negativ = -1A Alias Portd.2 : B Alias Portd.6 : C Alias Portb.7 : D Alias Portb.2 'порты, к которым подключены сегменты индикатораE Alias Portd.0 : F Alias Portb.6 : G Alias Portd.7 : H Alias Portb.5 'Dig1 Alias Portd.3 : Dig2 Alias Portd.4 : Dig3 Alias Portd.1 ' порты, к которым подключены общие аноды 1го индикатораDig1_sec Alias Portd.5 : Dig2_sec Alias Portb.0 : Dig3_sec Alias Portb.1 ' порты, к которым подключены общие аноды 2го индикатораFor X = 1 To 6 ' присваиваем всем цифрам пустоту, чтоб в момент включения не высвечивались нулиChislo(x) = 11Next'*********** ___ Переключение типа индикаторов (ОК/ОА) ___ *********************Readeeprom Indicator , 26If Vibor = 0 Then ' Удерживая кнопку УСТ, подаем питание.For X = 1 To 200If X = 150 Then ' При длительном нажатииSet Booton_flagToggle Indicator.3 ' Переключаем младший (четвертый) бит переменной. Номер бита выбрал произвольноWriteeeprom Indicator , 26If Indicator = &B00000000 Then ' Если переключили на ОА, зажжем все сегменты идикатора для подтвержденияReset A : Reset B : Reset C : Reset D : Reset E : Reset F : Reset G : Reset HSet Dig1 : Set Dig2 : Set Dig3 : Set Dig1_sec : Set Dig2_sec : Set Dig3_secEnd IfIf Indicator = &B00001000 Then ' Если переключили на ОK, зажжем все сегменты идикатора для подтвержденияSet A : Set B : Set C : Set D : Set E : Set F : Set G : Set HReset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig1_sec : Reset Dig2_sec : Reset Dig3_secEnd IfWaitms 1500Exit ForEnd IfIf Vibor = 1 Then Exit ForWaitms 10NextEnd If'*******************************************************************************If Default = 255 Then 'при первом запуске, когда Default=255Off1 = 70 'присваиваем начальный уставкиOn1 = 50Off2 = 140On2 = 120Indicator = &B00001000 ' для ОА. Indicator = &B00001000 для ОКRazryad_1 = &B10111011Razryad_2 = &B10111011Writeeeprom On1 , 0 ' Записываем в EEPROM уставку ON1Writeeeprom Off1 , 5 ' Записываем в EEPROM уставку OFF1Writeeeprom On2 , 10 ' Записываем в EEPROM уставку ON2Writeeeprom Off2 , 14 ' Записываем в EEPROM уставку OFF2Writeeeprom Razryad_1 , 16Writeeeprom Razryad_2 , 17Writeeeprom Indicator , 26Default = 100 ' присваиваем значение 100(произвольное, отличное от 255) и больше этот кусок кода выполняться не будетEnd IfReadeeprom On1 , 0 ' Считываем из EEPROM уставку ON1Readeeprom Off1 , 5 ' Считываем из EEPROM уставку OFF1Readeeprom On2 , 10 ' Считываем из EEPROM уставку ON2Readeeprom Off2 , 14 ' Считываем из EEPROM уставку OFF2Readeeprom Razryad_1 , 16Readeeprom Razryad_2 , 17Config Timer0 = Timer , Prescale = 64 : On Timer0 Pulse ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймераConfig Timer1 = Timer , Prescale = 1 : On Timer1 Bootons ' конфигурируем таймер 1 и назначаем подпрограмму которая выполняется при переполнении таймераEnable Interrupts : Enable Timer0 : Enable Timer1 ' разрешаем прерывания, таймер 0, таймер 1Start Timer0 : Start Timer1Start Adc ' начало преобразованияX = 50 ' чтобы опрос АЦП произошел в первом кругеDoIf X > 50 And Timer0 < 50 ThenStop Timer0 : Stop Timer1 ' на время преобразования останавливаем таймерыCh1 = Getadc(5) ' ДавлениеCh2 = Getadc(4) ' НапряжениеChvar_1 = Ch1Chvar_2 = Ch2Start Timer0 : Start Timer1Any_var = Chvar_1 / 2000 ' 2000 - можно задавать изгиб линииAny_var = Negativ * Any_var ' Если закоментировать, изменим направление изгиба экспонентыAny_var = Exp(any_var)Chvar_1 = 1023 - Chvar_1Chvar_1 = Chvar_1 / 12.786 'пересчет тут любая формула для требуемого диапазона или необходимой характеристики ==============Any_var = Chvar_1 * Any_varChvar_1 = Any_varChvar_2 = Chvar_2 / 2.046 'пересчет тут любая формула для требуемого диапазона или необходимой характеристики ==============If Chvar_2 > 500 Then Chvar_2 = 500 'верхний предел показанийStop Timer0 : Stop Timer1If Ch1 < 1023 ThenIf Chvar_1 > 0 Then Channel_1 = Chvar_1 ' присваиваем значения переменных для индикацииIf Chvar_1 > 80 Then Channel_1 = 80 'верхний предел показанийElseChannel_1 = 0End IfChannel_2 = Chvar_2Start Timer0 : Start Timer1X = 0End IfIf On1 < Off1 Then 'если уставка ON1 < OFF1 то режим нагревателяIf Channel_1 <= On1 Then Sostoyanie = 1 'если значение первого канала АЦП ниже уставки ON1, то включаем нагрузку №1If Channel_1 >= Off1 Then Sostoyanie = 0 'если значение первого канала АЦП выше уставки OFF1, то выключаем нагрузку №1Else 'если уставка ON1 > OFF1 то режим охладителяIf Channel_1 >= On1 Then Sostoyanie = 1 'если значение первого канала АЦП выше уставки ON1, то включаем нагрузку №1If Channel_1 <= Off1 Then Sostoyanie = 0 'если значение первого канала АЦП ниже уставки OFF1, то выключаем нагрузку №1End IfIf Sostoyanie = 1 Then Set Load1 Else Reset Load1 'управление 1м каналом нагрузкиIf On2 < Off2 Then 'если уставка ON2 < OFF2 то режим нагревателяIf Channel_2 <= On2 Then Sostoyanie_2 = 1 'если давление ниже уставки ON2, то включаем нагрузку №2If Channel_2 >= Off2 Then Sostoyanie_2 = 0 'если давление выше уставки OFF2, то выключаем нагрузку №2Else 'если уставка ON2 > OFF2 то режим охладителяIf Channel_2 >= On2 Then Sostoyanie_2 = 1 'если давление выше уставки ON2, то включаем нагрузку №2If Channel_2 <= Off2 Then Sostoyanie_2 = 0 'если давление ниже уставки OFF2, то выключаем нагрузку №2End IfIf Sostoyanie_2 = 1 Then Set Load2 Else Reset Load2 'управление 2м каналом нагрузкиLoop'*******************************************************************************' ИндикацияPulse:If View_menu <> 0 And Error_flag = 0 Then Incr Count 'если находимся в меню и нет ошибки ввода уставок,то инкриментируем счетчик, который отвечает за автоматический выход из меню (~ через 5 сек)If Count > 7000 Then 'задается время автоматического выхода из менюCount = 0 'сброс счетчикаView_menu = 0 ' выход из меню в основной режимEnd If' H = 1 ' выключаем точку на индикатореStop Timer0 'останавливаем таймер 0Select Case View_menu 'в зависимости от пункта меню, записываем в переменные расчета следующие данныеCase 0 :_print = Channel_1 ' основной режим. 1й индикатор показывает значение АЦП 1го канала_print_sec = Channel_2 ' основной режим. 2й индикатор показывает значение АЦП 2го каналаCase 1 :_print = On1 ' 1й индикатор показывает значение уставки ON1_print_sec = Channel_2 ' 2й индикатор показывает значение АЦП 2го каналаCase 2 :_print = Off1 ' 1й индикатор показывает значение уставки OFF1_print_sec = Channel_2 ' 2й индикатор показывает значение АЦП 2го каналаCase 3 :_print = Channel_1 ' 1й индикатор показывает значение АЦП 1го канала_print_sec = On2 ' 2й индикатор показывает значение уставки ON2Case 4 :_print = Channel_1 ' 1й индикатор показывает значение АЦП 1го канала_print_sec = Off2 ' 2й индикатор показывает значение уставки OFF2End SelectIf Podskaz_flag = 0 Then 'если не выводим на 1й индикатор подсказки, то работаем с числамиCopy_print = _print 'Copy_var = Copy_print 'For I = 3 To 1 Step -1 ' цикл в котором разбивается переменная на 3 числаChislo(i) = Copy_print Mod 10 ' заносим в масив последнюю цифру от числа Copy_print(123 mod 10 = 3)Copy_print = Copy_print / 10 ' отсекаем последнюю цифру от числа Copy_print (123/10=12)Next ' убираем незначимые нулиIf Copy_var < 100 Then Chislo(1) = 11 'для 2х значного числа' If Copy_var < 10 Then Chislo(2) = 11 'для однозначного числаEnd IfIf Podskaz_flag_sec = 0 Then 'если не выводим на 2й индикатор подсказки, то работаем с числамиCopy_print_sec = _print_sec 'Copy_var = Copy_print_secFor I = 6 To 4 Step -1 ' цикл в котором разбивается переменная на 3 числаChislo(i) = Copy_print_sec Mod 10 ' заносим в масив последнюю цифру от числа _print(123 mod 10 = 3)Copy_print_sec = Copy_print_sec / 10 ' отсекаем последнюю цифру от числа Copy_print_sec (123/10=12)Next 'убираем незначимые нулиIf Copy_var < 100 Then Chislo(4) = 11 'для 2х значного числа' If Copy_var < 10 Then Chislo(5) = 11 'для однозначного числаEnd IfIf Indicator = 0 Then ' Гасим индикаторы перед выводом информацииReset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig1_sec : Reset Dig2_sec : Reset Dig3_sec ' Для индикатора с ОАElseSet Dig1 : Set Dig2 : Set Dig3 : Set Dig1_sec : Set Dig2_sec : Set Dig3_sec 'Для индикатора с ОKEnd IfIncr W : If W > 6 Then W = 1 ' выбираем какую цифру сейчас включатьY = 0Gosub Look : A = Z ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту АGosub Look : B = ZGosub Look : C = ZGosub Look : D = ZGosub Look : E = ZGosub Look : F = ZGosub Look : G = ZSelect Case W ' включаем цифру(разряд) которую выбрали (w). Подаем плюс на общий провод конкретной цифры (разряда)Case 1 :If Indicator = 0 ThenSet Dig3If Podskaz_flag = 0 Then H = Razryad_1.3 Else H = 1ElseReset Dig3If Podskaz_flag = 0 ThenH = Razryad_1.3Toggle HElseH = 0End IfEnd IfCase 2 :If Indicator = 0 ThenSet Dig2If Podskaz_flag = 0 Then H = Razryad_1.2 Else H = 1ElseReset Dig2If Podskaz_flag = 0 ThenH = Razryad_1.2Toggle HElseH = 0End IfEnd IfCase 3 :If Indicator = 0 ThenSet Dig1If Podskaz_flag = 0 Then H = Razryad_1.1 Else H = 1ElseReset Dig1If Podskaz_flag = 0 ThenH = Razryad_1.1Toggle HElseH = 0End IfEnd IfCase 4 :If Indicator = 0 ThenSet Dig3_secIf Podskaz_flag_sec = 0 Then H = Razryad_2.3 Else H = 1ElseReset Dig3_secIf Podskaz_flag_sec = 0 ThenH = Razryad_2.3Toggle HElseH = 0End IfEnd IfCase 5 :If Indicator = 0 ThenSet Dig2_secIf Podskaz_flag_sec = 0 Then H = Razryad_2.2 Else H = 1ElseReset Dig2_secIf Podskaz_flag_sec = 0 ThenH = Razryad_2.2Toggle HElseH = 0End IfEnd IfCase 6 :If Indicator = 0 ThenSet Dig1_secIf Podskaz_flag_sec = 0 Then H = Razryad_2.1 Else H = 1ElseReset Dig1_secIf Podskaz_flag_sec = 0 ThenH = Razryad_2.1Toggle HElseH = 0End IfEnd IfEnd Select'Start Timer0Return'Look: ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограммуZ = Chislo(w) * 7 : Z = Y + Z ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 1..2..3, Y это номер сегмента (A=0 B=1 C=2...G=7)If Indicator = 0 ThenZ = Lookup(z , Cifri_oa) ' выбираем из таблици включить или выключить нужный сегмент -OAElseZ = Lookup(z , Cifri_ok) '-OKEnd IfIncr Y 'Y это номер сегмента (A=0 B=1 C=2...). Chislo(w) * 7 - переход на начало нужной строки Data.Z = Y + Z - по очереди перебираем сегменты в строке.Return'Cifri_oa:' таблица сегментом для индикаторов с общим плюсом |Chislo(i)| Символ |Data 0 , 0 , 0 , 0 , 0 , 0 , 1 '0Data 1 , 0 , 0 , 1 , 1 , 1 , 1 '1Data 0 , 0 , 1 , 0 , 0 , 1 , 0 '2Data 0 , 0 , 0 , 0 , 1 , 1 , 0 '3Data 1 , 0 , 0 , 1 , 1 , 0 , 0 '4Data 0 , 1 , 0 , 0 , 1 , 0 , 0 '5Data 0 , 1 , 0 , 0 , 0 , 0 , 0 '6Data 0 , 0 , 0 , 1 , 1 , 1 , 1 '7Data 0 , 0 , 0 , 0 , 0 , 0 , 0 '8Data 0 , 0 , 0 , 0 , 1 , 0 , 0 '9Data 1 , 1 , 1 , 1 , 1 , 1 , 0 '10 "-"Data 1 , 1 , 1 , 1 , 1 , 1 , 1 '11 ""Data 1 , 1 , 1 , 0 , 0 , 0 , 1 '12 "L"Data 1 , 1 , 0 , 1 , 0 , 1 , 0 '13 "n"Data 0 , 1 , 1 , 1 , 0 , 0 , 0 '14 "F"Data 0 , 1 , 1 , 0 , 0 , 0 , 0 '15 "E"Data 1 , 1 , 1 , 1 , 0 , 1 , 0 '16 "r"'*******************************************************************************Cifri_ok:' таблица сегментом для индикаторов с общим минусом |Chislo(i)| Символ |Data 1 , 1 , 1 , 1 , 1 , 1 , 0 '0Data 0 , 1 , 1 , 0 , 0 , 0 , 0 '1Data 1 , 1 , 0 , 1 , 1 , 0 , 1 '2Data 1 , 1 , 1 , 1 , 0 , 0 , 1 '3Data 0 , 1 , 1 , 0 , 0 , 1 , 1 '4Data 1 , 0 , 1 , 1 , 0 , 1 , 1 '5Data 1 , 0 , 1 , 1 , 1 , 1 , 1 '6Data 1 , 1 , 1 , 0 , 0 , 0 , 0 '7Data 1 , 1 , 1 , 1 , 1 , 1 , 1 '8Data 1 , 1 , 1 , 1 , 0 , 1 , 1 '9Data 0 , 0 , 0 , 0 , 0 , 0 , 1 '10 "-"Data 0 , 0 , 0 , 0 , 0 , 0 , 0 '11 "" пустоData 0 , 0 , 0 , 1 , 1 , 1 , 0 '12 "L"Data 0 , 0 , 1 , 0 , 1 , 0 , 1 '13 "n"Data 1 , 0 , 0 , 0 , 1 , 1 , 1 '14 "F"Data 1 , 0 , 0 , 1 , 1 , 1 , 1 '15 "E"Data 0 , 0 , 0 , 0 , 1 , 0 , 1 '16 "r"'*******************************************************************************''*******************************************************************************' Опрос кнопокBootons:Incr XStop Timer1If Vibor = 0 And Booton_flag = 0 And Up = 1 And Down = 1 Then Gosub Set_mode ' Нажатие кнопки УСТIf Set_flag = 1 And Vibor = 1 Then 'Кнопки Вверх и Вниз активны только после входа в менюIf Up = 0 Then Gosub Up_constIf Down = 0 Then Gosub Down_constEnd IfIf Vibor = 0 And Up = 0 And View_menu = 0 And Booton_flag_2 = 0 Then Gosub Set_h_led1If Vibor = 0 And Down = 0 And View_menu = 0 And Booton_flag_2 = 0 Then Gosub Set_h_led2If Vibor = 1 And Up = 1 And Down = 1 Then Reset Booton_flag 'сброс флага удержания кнопкиIf Vibor = 1 Then Reset Booton_flag_2Start Timer1 : Start Timer0Return'*******************************************************************************''Set_mode:Enable Interrupts : Enable Timer0 : Start Timer0Set Set_flag ' поднимаем флаг режима настройки уставок (находимся в меню)Set Booton_flag ' поднимаем флаг удержания кнопки (пока не сбросится, в следующий пункт меню не попадаем)Count = 0 'сброс счетчика автоматического выхода из менюIf On1 = Off1 Or On2 = Off2 Then Gosub Errors 'Блокировка ввода уставок. Переходим в подпрограмму индикации ошибкиIncr View_menu ' следующий пункт менюIf View_menu > 4 Then View_menu = 0 ' всего 4 пункта меню, 0й - основной режимSelect Case View_menu 'индикация подсказок пунктов менюCase 0 : ' ---Set Podskaz_flagSet Podskaz_flag_secChislo(1) = 10Chislo(2) = 10Chislo(3) = 10Chislo(4) = 10Chislo(5) = 10Chislo(6) = 10Reset Set_flag 'Waitms 500Stop Timer1 : Stop Timer0Writeeeprom Off2 , 14 ' запись уставки OFF2 в EEPROMCase 1 : ' On1Set Podskaz_flag 'Поднимаем флаг вывода подсказок (буквы) на 1й индикаторChislo(3) = 1Chislo(2) = 13Chislo(1) = 0Waitms 500Case 2 : ' OF1Set Podskaz_flag 'Поднимаем флаг вывода подсказок (буквы) на 1й индикаторChislo(3) = 1Chislo(2) = 14Chislo(1) = 0Waitms 500Stop Timer1 : Stop Timer0Writeeeprom On1 , 0 ' запись уставки ON1 в EEPROMCase 3 : ' On2Set Podskaz_flag_sec 'Поднимаем флаг вывода подсказок (буквы) на 2й индикаторChislo(6) = 2Chislo(5) = 13Chislo(4) = 0Waitms 500Stop Timer1 : Stop Timer0Writeeeprom Off1 , 5 ' запись уставки OFF1 в EEPROMCase 4 : ' OFF2Set Podskaz_flag_sec 'Поднимаем флаг вывода подсказок (буквы) на 2й индикаторChislo(6) = 2Chislo(5) = 14Chislo(4) = 0Waitms 500Stop Timer1 : Stop Timer0Writeeeprom On2 , 10 ' запись уставки ON2 в EEPROMEnd SelectReset Podskaz_flagReset Podskaz_flag_secReturn'Errors:Set Error_flag ' поднимаем флаг ошибкиIf On1 = Off1 ThenSet Podskaz_flagChislo(1) = 15Chislo(2) = 16 'Выводим подсказку Err и мигаем на 1м индикатореChislo(3) = 16Waitms 500Chislo(1) = 11Chislo(2) = 11Chislo(3) = 11Waitms 500Chislo(1) = 15Chislo(2) = 16Chislo(3) = 16Waitms 500Chislo(1) = 11Chislo(2) = 11Chislo(3) = 11Waitms 500End IfIf On2 = Off2 ThenSet Podskaz_flag_secChislo(4) = 15Chislo(5) = 16 'Выводим подсказку Err и мигаем на 2м индикатореChislo(6) = 16Waitms 500Chislo(4) = 11Chislo(5) = 11Chislo(6) = 11Waitms 500Chislo(4) = 15Chislo(5) = 16Chislo(6) = 16Waitms 500Chislo(4) = 11Chislo(5) = 11Chislo(6) = 11Waitms 500End IfSelect Case View_menu ' взависимости от того, в каком пункте меню ввели неверное значениеCase 0 : ' возвращаем из EEPROM предыдущие значенияCase 1 :Readeeprom On1 , 0Case 2 :Readeeprom Off1 , 5Case 3 :Readeeprom On2 , 10Case 4 :Readeeprom Off2 , 14End SelectDecr View_menu ' возвращаемся в предыдущий пункт меню (в ошибочный)Count = 0 : Reset Error_flagReturn'Up_const:Enable Interrupts : Enable Timer0 : Start Timer0Count = 0Select Case View_menuCase 1 :If On1 < 80 Then Incr On1 'Case 2 : 'If Off1 < 80 Then Incr Off1Case 3 : 'If On2 < 500 Then Incr On2 'Case 4 : 'If Off2 < 500 Then Incr Off2End Select ' время задержки установки кн.+ значений уставокWaitms 100Return''Down_const:Enable Interrupts : Enable Timer0 : Start Timer0Count = 0Select Case View_menuCase 1 :If On1 > 0 Then Decr On1 ' добавляется второе условие при работе с отрицательными числамиCase 2 :If Off1 > 0 Then Decr Off1Case 3 :If On2 > 0 Then Decr On2Case 4 :If Off2 > 0 Then Decr Off2End SelectWaitms 100 ' время задержки установки кн.- значений уставокReturn''Set_h_led1:Set Booton_flag_2Rotate Razryad_1 , LeftStop Timer1 : Stop Timer0Writeeeprom Razryad_1 , 16Return''Set_h_led2:Set Booton_flag_2Rotate Razryad_2 , LeftStop Timer1 : Stop Timer0Writeeeprom Razryad_2 , 17Return Схема с применением температурного датчика DS18b20 и второй канал для измерения давления. Исходный код программы; '* Filename : Универсальный 2х-канальный индикатор *'* Revision : 5.0 *'* Controller : ATMEGA8 *'* Compiler : BASCOM-AVR 2.0.6.1 *'* Author : MACTEPOK *'*******************************************************************************$regfile = "m8def.dat" 'определяем контроллер$crystal = 8000000 'внутренний генератор'$sim$lib "mcsbyte.lbx" 'подключаем библиотеку функций$hwstack = 40$swstack = 16$framesize = 32Config Pinc.0 = Input : Portc.0 = 1 'кнопка ВыборConfig Pinc.1 = Input : Portc.1 = 1 'кнопка ВверхConfig Pinc.2 = Input : Portc.2 = 1 'кнопка ВнизConfig Portd = Output : Config Portb = Output 'порты на выход к которым подключен индикаторConfig 1wire = Portc.4 ' Порт для подключения датчика DS18B20Load1 Alias Portb.3 'нагрузка №1Load2 Alias Portb.4 'нагрузка №2Vibor Alias Pinc.0 'кнопка ВыборUp Alias Pinc.1 'кнопка ВверхDown Alias Pinc.2 'кнопка ВнизConfig Adc = Single , Prescaler = Auto , Reference = Avcc 'настраиваем АЦПDim W As Byte , Y As Byte , X As Byte , I As Byte , Z As Byte , Chislo(6) As Integer , Channel_1 As Integer , Channel_1word As Word , On1 As Word , Off1 As Word , Channel_2 As Integer , On2 As Word , Off2 As Word , Sostoyanie As Byte , Sostoyanie_2 As Byte , Copy_print As Integer , Copy_print_sec As Integer , Copy_var As Integer , _print As Integer , _print_sec As Integer , Pokazaniya As Integer , View_menu As Byte , Booton_flag As Bit , Booton_flag_2 As Bit , Count As Word , Error_flag As Bit , Error_temp_flag As BitDim Razryad_1 As Byte , Razryad_2 As Byte , Temp_najatiya As Byte , Indicator As ByteDim Menu_punkt As Byte , Any_var As Single 'пункт менюDim Set_flag As Bit 'флаг режима настройки уставокDim Podskaz_flag As Bit , Podskaz_flag_sec As Bit 'флаги режима отображения подсказок на соответствующих каналахDim Default As Eram Byte At &H14 'переменная EEPROM для записи начальных уставок для первого включения прибораDim Adc_ready As Bit ' Флаг готовности АЦПDim Chvar_1 As Single , Chvar_2 As Integer ' промежуточные переменные для расчетовDim Ch1 As Integer , Ch2 As Integer,Dim Numb As Word , Dsid1(8) As Byte , Bd1 As Byte , Bd2 As Byte , Bd(9) As Byte , ' Переменные для работы с DS18B20Dim T1 As Single , T2 As Integer , Minus_flag As Bit , Read_flag As Bit , Conv_flag As Bit , Ds_count As ByteConst Negativ = -1A Alias Portd.2 : B Alias Portd.6 : C Alias Portb.7 : D Alias Portb.2 'порты, к которым подключены сегменты индикатораE Alias Portd.0 : F Alias Portb.6 : G Alias Portd.7 : H Alias Portb.5 'Dig1 Alias Portd.3 : Dig2 Alias Portd.4 : Dig3 Alias Portd.1 ' порты, к которым подключены общие аноды 1го индикатораDig1_sec Alias Portd.5 : Dig2_sec Alias Portb.0 : Dig3_sec Alias Portb.1 ' порты, к которым подключены общие аноды 2го индикатора'A Alias Portd.5 : B Alias Portd.7 : C Alias Portd.3 : D Alias Portd.1 'порты, к которым подключены сегменты индикатора'E Alias Portd.0 : F Alias Portd.6 : G Alias Portd.4 : H Alias Portd.2 ''Dig1 Alias Portb.0 : Dig2 Alias Portb.1 : Dig3 Alias Portb.2 ' порты, к которым подключены общие аноды 1го индикатора'Dig1_sec Alias Portb.5 : Dig2_sec Alias Portb.6 : Dig3_sec Alias Portb.7 ' порты, к которым подключены общие аноды 2го индикатора'Numb = 1wirecount()'If Numb > 0 Then Dsid1(1) = 1wsearchfirst() Else Set Error_temp_flagFor X = 1 To 6 ' присваиваем всем цифрам пустоту, чтоб в момент включения не высвечивались нулиChislo(x) = 11Next'*********** ___ Переключение типа индикаторов (ОК/ОА) ___ *********************Readeeprom Indicator , 26If Vibor = 0 Then ' Удерживая кнопку УСТ, подаем питание.For X = 1 To 200If X = 150 Then ' При длительном нажатииSet Booton_flagToggle Indicator.3 ' Переключаем младший (четвертый) бит переменной. Номер бита выбрал произвольноWriteeeprom Indicator , 26If Indicator = &B00000000 Then ' Если переключили на ОА, зажжем все сегменты идикатора для подтвержденияReset A : Reset B : Reset C : Reset D : Reset E : Reset F : Reset G : Reset HSet Dig1 : Set Dig2 : Set Dig3 : Set Dig1_sec : Set Dig2_sec : Set Dig3_secEnd IfIf Indicator = &B00001000 Then ' Если переключили на ОK, зажжем все сегменты идикатора для подтвержденияSet A : Set B : Set C : Set D : Set E : Set F : Set G : Set HReset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig1_sec : Reset Dig2_sec : Reset Dig3_secEnd IfWaitms 1500Exit ForEnd IfIf Vibor = 1 Then Exit ForWaitms 10NextEnd If'*******************************************************************************If Default = 255 Then 'при первом запуске, когда Default=255Off1 = 70 'присваиваем начальный уставкиOn1 = 50Off2 = 30On2 = 27' Indicator = &B00001000Indicator = &B00000000 ' для ОА. Indicator = &B00001000 для ОКRazryad_1 = &B10111011Razryad_2 = &B11101110Writeeeprom On1 , 0 ' Записываем в EEPROM уставку ON1Writeeeprom Off1 , 5 ' Записываем в EEPROM уставку OFF1Writeeeprom On2 , 10 ' Записываем в EEPROM уставку ON2Writeeeprom Off2 , 14 ' Записываем в EEPROM уставку OFF2Writeeeprom Razryad_1 , 16Writeeeprom Razryad_2 , 17Writeeeprom Indicator , 26Default = 100 ' присваиваем значение 100(произвольное, отличное от 255) и больше этот кусок кода выполняться не будетEnd IfReadeeprom On1 , 0 ' Считываем из EEPROM уставку ON1Readeeprom Off1 , 5 ' Считываем из EEPROM уставку OFF1Readeeprom On2 , 10 ' Считываем из EEPROM уставку ON2Readeeprom Off2 , 14 ' Считываем из EEPROM уставку OFF2Readeeprom Razryad_1 , 16Readeeprom Razryad_2 , 17Config Timer0 = Timer , Prescale = 64 : On Timer0 Pulse ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймераConfig Timer1 = Timer , Prescale = 1 : On Timer1 Bootons ' конфигурируем таймер 1 и назначаем подпрограмму которая выполняется при переполнении таймераEnable Interrupts : Enable Timer0 : Enable Timer1 ' разрешаем прерывания, таймер 0, таймер 1Start Timer0 : Start Timer1Start Adc ' начало преобразованияX = 60DoIf X > 50 And Timer0 < 50 ThenStop Timer0 : Stop Timer1 ' на время преобразования останавливаем таймерыCh1 = Getadc(5) ' 1 канал 'опрос АЦПChvar_1 = Ch1Start Timer0 : Start Timer1Any_var = Chvar_1 / 2000 ' 2000 - можно задавать изгиб линииAny_var = Negativ * Any_varAny_var = Exp(any_var)Chvar_1 = 1023 - Chvar_1Chvar_1 = Chvar_1 / 12.035 'пересчет тут любая формула для требуемого диапазона или необходимой характеристики ==============Any_var = Chvar_1 * Any_varChvar_1 = Any_varStop Timer0 : Stop Timer1If Ch1 < 1023 ThenIf Chvar_1 > 0 Then Channel_1 = Chvar_1 ' присваиваем значения переменных для индикацииIf Chvar_1 > 85 Then Channel_1 = 85 'верхний предел показанийElseChannel_1 = 0End IfStart Timer0 : Start Timer1X = 0End IfIf Conv_flag = 0 And Timer0 < 50 Then1wreset '1wwrite &HCC ' Выдаем команду чтения ПЗУ1wwrite &H44 ' Запуск измеренияSet Conv_flagDs_count = 0End If'If Read_flag = 1 And Timer0 < 50 Then '1wreset1wwrite &HCC1wwrite &HBE ' Команда чтения ОЗУ датчикаBd(1) = 1wread(9)If Bd(9) = Crc8(bd(1) , 8) ThenBd1 = Bd(1) ' Читаем нулевой байтBd2 = Bd(2) ' Читаем первый байтIf Bd2 >= 248 ThenBd1 = &H100 - Bd1Bd2 = &HFF - Bd2If Err = 0 Then Set Minus_flag ' Znak = "-"ElseReset Minus_flag ' Znak = "+"End IfT1 = Bd1 / 16 ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)T2 = Bd2 * 16 ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)T1 = T1 + T2' T1 = T1 * 10Chvar_2 = T1 'отсекаем от температуры все после запятойIf Err = 0 ThenIf Chvar_2 > 120 Then Chvar_2 = 120Channel_2 = Chvar_2End IfReset Read_flagReset Conv_flagEnd IfEnd IfIf On1 < Off1 Then 'если уставка ON1 < OFF1 то режим нагревателяIf Channel_1 <= On1 Then Sostoyanie = 1 'если значение первого канала АЦП ниже уставки ON1, то включаем нагрузку №1If Channel_1 >= Off1 Then Sostoyanie = 0 'если значение первого канала АЦП выше уставки OFF1, то выключаем нагрузку №1Else 'если уставка ON1 > OFF1 то режим охладителяIf Channel_1 >= On1 Then Sostoyanie = 1 'если значение первого канала АЦП выше уставки ON1, то включаем нагрузку №1If Channel_1 <= Off1 Then Sostoyanie = 0 'если значение первого канала АЦП ниже уставки OFF1, то выключаем нагрузку №1End IfIf Sostoyanie = 1 Then Set Load1 Else Reset Load1 'управление 1м каналом нагрузкиIf Minus_flag = 0 ThenIf On2 < Off2 Then 'если уставка ON2 < OFF2 то режим нагревателяIf Channel_2 <= On2 Then Sostoyanie_2 = 1 'если давление ниже уставки ON2, то включаем нагрузку №2If Channel_2 >= Off2 Then Sostoyanie_2 = 0 'если давление выше уставки OFF2, то выключаем нагрузку №2Else 'если уставка ON2 > OFF2 то режим охладителяIf Channel_2 >= On2 Then Sostoyanie_2 = 1 'если давление выше уставки ON2, то включаем нагрузку №2If Channel_2 <= Off2 Then Sostoyanie_2 = 0 'если давление ниже уставки OFF2, то выключаем нагрузку №2End IfEnd IfIf Sostoyanie_2 = 1 Then Set Load2 Else Reset Load2 'управление 2м каналом нагрузкиLoop'*******************************************************************************' ИндикацияPulse:Stop Timer0If View_menu <> 0 And Error_flag = 0 Then Incr Count 'если находимся в меню и нет ошибки ввода уставок,то инкриментируем счетчик, который отвечает за автоматический выход из меню (~ через 5 сек)If Count > 7000 Then 'задается время автоматического выхода из менюCount = 0 'сброс счетчикаView_menu = 0 ' выход из меню в основной режимEnd If' H = 1 ' выключаем точку на индикаторе'останавливаем таймер 0Select Case View_menu 'в зависимости от пункта меню, записываем в переменные расчета следующие данныеCase 0 :_print = Channel_1 ' основной режим. 1й индикатор показывает значение АЦП 1го канала_print_sec = Channel_2 ' основной режим. 2й индикатор показывает значение АЦП 2го каналаCase 1 :_print = On1 ' 1й индикатор показывает значение уставки ON1_print_sec = Channel_2 ' 2й индикатор показывает значение АЦП 2го каналаCase 2 :_print = Off1 ' 1й индикатор показывает значение уставки OFF1_print_sec = Channel_2 ' 2й индикатор показывает значение АЦП 2го каналаCase 3 :_print = Channel_1 ' 1й индикатор показывает значение АЦП 1го канала_print_sec = On2 ' 2й индикатор показывает значение уставки ON2Case 4 :_print = Channel_1 ' 1й индикатор показывает значение АЦП 1го канала_print_sec = Off2 ' 2й индикатор показывает значение уставки OFF2End SelectIf Podskaz_flag = 0 Then 'если не выводим на 1й индикатор подсказки, то работаем с числамиCopy_print = _print 'Copy_var = Copy_print 'For I = 3 To 1 Step -1 ' цикл в котором разбивается переменная на 3 числаChislo(i) = Copy_print Mod 10 ' заносим в масив последнюю цифру от числа Copy_print(123 mod 10 = 3)Copy_print = Copy_print / 10 ' отсекаем последнюю цифру от числа Copy_print (123/10=12)Next ' убираем незначимые нулиIf Copy_var < 100 Then Chislo(1) = 11 'для 2х значного числа' If Copy_var < 10 Then Chislo(2) = 11 'для однозначного числаEnd IfIf Podskaz_flag_sec = 0 Then 'если не выводим на 2й индикатор подсказки, то работаем с числамиCopy_print_sec = _print_sec 'Copy_var = Copy_print_secFor I = 6 To 4 Step -1 ' цикл в котором разбивается переменная на 3 числаChislo(i) = Copy_print_sec Mod 10 ' заносим в масив последнюю цифру от числа _print(123 mod 10 = 3)Copy_print_sec = Copy_print_sec / 10 ' отсекаем последнюю цифру от числа Copy_print_sec (123/10=12)Next 'убираем незначимые нулиIf Copy_var < 100 Then Chislo(4) = 11 'для 2х значного числаIf Copy_var < 10 Then Chislo(5) = 11 'для однозначного числаIf Minus_flag = 1 And View_menu < 3 Then Chislo(4) = 10End IfIf Indicator = 0 Then ' Гасим индикаторы перед выводом информацииReset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig1_sec : Reset Dig2_sec : Reset Dig3_sec ' Для индикатора с ОАElseSet Dig1 : Set Dig2 : Set Dig3 : Set Dig1_sec : Set Dig2_sec : Set Dig3_sec 'Для индикатора с ОKEnd IfIncr W : If W > 6 Then W = 1 ' выбираем какую цифру сейчас включатьY = 0Gosub Look : A = Z ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту АGosub Look : B = ZGosub Look : C = ZGosub Look : D = ZGosub Look : E = ZGosub Look : F = ZGosub Look : G = ZSelect Case W ' включаем цифру(разряд) которую выбрали (w). Подаем плюс на общий провод конкретной цифры (разряда)Case 1 :If Indicator = 0 ThenSet Dig3If Podskaz_flag = 0 Then H = Razryad_1.3 Else H = 1ElseReset Dig3If Podskaz_flag = 0 ThenH = Razryad_1.3Toggle HElseH = 0End IfEnd IfCase 2 :If Indicator = 0 ThenSet Dig2If Podskaz_flag = 0 Then H = Razryad_1.2 Else H = 1ElseReset Dig2If Podskaz_flag = 0 ThenH = Razryad_1.2Toggle HElseH = 0End IfEnd IfCase 3 :If Indicator = 0 ThenSet Dig1If Podskaz_flag = 0 Then H = Razryad_1.1 Else H = 1ElseReset Dig1If Podskaz_flag = 0 ThenH = Razryad_1.1Toggle HElseH = 0End IfEnd IfCase 4 :If Indicator = 0 ThenSet Dig3_secIf Podskaz_flag_sec = 0 Then H = Razryad_2.3 Else H = 1ElseReset Dig3_secIf Podskaz_flag_sec = 0 ThenH = Razryad_2.3Toggle HElseH = 0End IfEnd IfCase 5 :If Indicator = 0 ThenSet Dig2_secIf Podskaz_flag_sec = 0 Then H = Razryad_2.2 Else H = 1ElseReset Dig2_secIf Podskaz_flag_sec = 0 ThenH = Razryad_2.2Toggle HElseH = 0End IfEnd IfCase 6 :If Indicator = 0 ThenSet Dig1_secIf Podskaz_flag_sec = 0 Then H = Razryad_2.1 Else H = 1ElseReset Dig1_secIf Podskaz_flag_sec = 0 ThenH = Razryad_2.1Toggle HElseH = 0End IfEnd IfEnd Select'Start Timer0Return'Look: ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограммуZ = Chislo(w) * 7 : Z = Y + Z ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 1..2..3, Y это номер сегмента (A=0 B=1 C=2...G=7)If Indicator = 0 ThenZ = Lookup(z , Cifri_oa) ' выбираем из таблици включить или выключить нужный сегмент -OAElseZ = Lookup(z , Cifri_ok) '-OKEnd IfIncr Y 'Y это номер сегмента (A=0 B=1 C=2...). Chislo(w) * 7 - переход на начало нужной строки Data.Z = Y + Z - по очереди перебираем сегменты в строке.Return'Cifri_oa:' таблица сегментом для индикаторов с общим плюсом |Chislo(i)| Символ |Data 0 , 0 , 0 , 0 , 0 , 0 , 1 '0Data 1 , 0 , 0 , 1 , 1 , 1 , 1 '1Data 0 , 0 , 1 , 0 , 0 , 1 , 0 '2Data 0 , 0 , 0 , 0 , 1 , 1 , 0 '3Data 1 , 0 , 0 , 1 , 1 , 0 , 0 '4Data 0 , 1 , 0 , 0 , 1 , 0 , 0 '5Data 0 , 1 , 0 , 0 , 0 , 0 , 0 '6Data 0 , 0 , 0 , 1 , 1 , 1 , 1 '7Data 0 , 0 , 0 , 0 , 0 , 0 , 0 '8Data 0 , 0 , 0 , 0 , 1 , 0 , 0 '9Data 1 , 1 , 1 , 1 , 1 , 1 , 0 '10 "-"Data 1 , 1 , 1 , 1 , 1 , 1 , 1 '11 ""Data 1 , 1 , 1 , 0 , 0 , 0 , 1 '12 "L"Data 1 , 1 , 0 , 1 , 0 , 1 , 0 '13 "n"Data 0 , 1 , 1 , 1 , 0 , 0 , 0 '14 "F"Data 0 , 1 , 1 , 0 , 0 , 0 , 0 '15 "E"Data 1 , 1 , 1 , 1 , 0 , 1 , 0 '16 "r"'*******************************************************************************Cifri_ok:' таблица сегментом для индикаторов с общим минусом |Chislo(i)| Символ |Data 1 , 1 , 1 , 1 , 1 , 1 , 0 '0Data 0 , 1 , 1 , 0 , 0 , 0 , 0 '1Data 1 , 1 , 0 , 1 , 1 , 0 , 1 '2Data 1 , 1 , 1 , 1 , 0 , 0 , 1 '3Data 0 , 1 , 1 , 0 , 0 , 1 , 1 '4Data 1 , 0 , 1 , 1 , 0 , 1 , 1 '5Data 1 , 0 , 1 , 1 , 1 , 1 , 1 '6Data 1 , 1 , 1 , 0 , 0 , 0 , 0 '7Data 1 , 1 , 1 , 1 , 1 , 1 , 1 '8Data 1 , 1 , 1 , 1 , 0 , 1 , 1 '9Data 0 , 0 , 0 , 0 , 0 , 0 , 1 '10 "-"Data 0 , 0 , 0 , 0 , 0 , 0 , 0 '11 "" пустоData 0 , 0 , 0 , 1 , 1 , 1 , 0 '12 "L"Data 0 , 0 , 1 , 0 , 1 , 0 , 1 '13 "n"Data 1 , 0 , 0 , 0 , 1 , 1 , 1 '14 "F"Data 1 , 0 , 0 , 1 , 1 , 1 , 1 '15 "E"Data 0 , 0 , 0 , 0 , 1 , 0 , 1 '16 "r"'*******************************************************************************''*******************************************************************************' Опрос кнопокBootons:Incr XIf Conv_flag = 1 And Ds_count < 254 Then Incr Ds_countIf Ds_count > 160 ThenSet Read_flagEnd IfStop Timer1If Vibor = 0 And Booton_flag = 0 And Up = 1 And Down = 1 Then Gosub Set_mode ' Нажатие кнопки УСТIf Set_flag = 1 And Vibor = 1 Then 'Кнопки Вверх и Вниз активны только после входа в менюIf Up = 0 Then Gosub Up_constIf Down = 0 Then Gosub Down_constEnd IfIf Vibor = 0 And Up = 0 And View_menu = 0 And Booton_flag_2 = 0 Then Gosub Set_h_led1If Vibor = 0 And Down = 0 And View_menu = 0 And Booton_flag_2 = 0 Then Gosub Set_h_led2If Vibor = 1 And Up = 1 And Down = 1 Then Reset Booton_flag 'сброс флага удержания кнопкиIf Vibor = 1 Then Reset Booton_flag_2Start Timer1 : Start Timer0Return'*******************************************************************************''Set_mode:Enable Interrupts : Enable Timer0 : Start Timer0Set Set_flag ' поднимаем флаг режима настройки уставок (находимся в меню)Set Booton_flag ' поднимаем флаг удержания кнопки (пока не сбросится, в следующий пункт меню не попадаем)Count = 0 'сброс счетчика автоматического выхода из менюIf On1 = Off1 Or On2 = Off2 Then Gosub Errors 'Блокировка ввода уставок. Переходим в подпрограмму индикации ошибкиIncr View_menu ' следующий пункт менюIf View_menu > 4 Then View_menu = 0 ' всего 4 пункта меню, 0й - основной режимSelect Case View_menu 'индикация подсказок пунктов менюCase 0 : ' ---Set Podskaz_flagSet Podskaz_flag_secChislo(1) = 10Chislo(2) = 10Chislo(3) = 10Chislo(4) = 10Chislo(5) = 10Chislo(6) = 10Reset Set_flag 'Waitms 500Stop Timer1 : Stop Timer0Writeeeprom Off2 , 14 ' запись уставки OFF2 в EEPROMCase 1 : ' On1Set Podskaz_flag 'Поднимаем флаг вывода подсказок (буквы) на 1й индикаторChislo(3) = 1Chislo(2) = 13Chislo(1) = 0Waitms 500Case 2 : ' OF1Set Podskaz_flag 'Поднимаем флаг вывода подсказок (буквы) на 1й индикаторChislo(3) = 1Chislo(2) = 14Chislo(1) = 0Waitms 500Stop Timer1 : Stop Timer0Writeeeprom On1 , 0 ' запись уставки ON1 в EEPROMCase 3 : ' On2Set Podskaz_flag_sec 'Поднимаем флаг вывода подсказок (буквы) на 2й индикаторChislo(6) = 2Chislo(5) = 13Chislo(4) = 0Waitms 500Stop Timer1 : Stop Timer0Writeeeprom Off1 , 5 ' запись уставки OFF1 в EEPROMCase 4 : ' OFF2Set Podskaz_flag_sec 'Поднимаем флаг вывода подсказок (буквы) на 2й индикаторChislo(6) = 2Chislo(5) = 14Chislo(4) = 0Waitms 500Stop Timer1 : Stop Timer0Writeeeprom On2 , 10 ' запись уставки ON2 в EEPROMEnd SelectReset Podskaz_flagReset Podskaz_flag_secReturn'Errors:Set Error_flag ' поднимаем флаг ошибкиIf On1 = Off1 ThenSet Podskaz_flagChislo(1) = 15Chislo(2) = 16 'Выводим подсказку Err и мигаем на 1м индикатореChislo(3) = 16Waitms 500Chislo(1) = 11Chislo(2) = 11Chislo(3) = 11Waitms 500Chislo(1) = 15Chislo(2) = 16Chislo(3) = 16Waitms 500Chislo(1) = 11Chislo(2) = 11Chislo(3) = 11Waitms 500End IfIf On2 = Off2 ThenSet Podskaz_flag_secChislo(4) = 15Chislo(5) = 16 'Выводим подсказку Err и мигаем на 2м индикатореChislo(6) = 16Waitms 500Chislo(4) = 11Chislo(5) = 11Chislo(6) = 11Waitms 500Chislo(4) = 15Chislo(5) = 16Chislo(6) = 16Waitms 500Chislo(4) = 11Chislo(5) = 11Chislo(6) = 11Waitms 500End IfSelect Case View_menu ' взависимости от того, в каком пункте меню ввели неверное значениеCase 0 : ' возвращаем из EEPROM предыдущие значенияCase 1 :Readeeprom On1 , 0Case 2 :Readeeprom Off1 , 5Case 3 :Readeeprom On2 , 10Case 4 :Readeeprom Off2 , 14End SelectDecr View_menu ' возвращаемся в предыдущий пункт меню (в ошибочный)Count = 0 : Reset Error_flagReturn'Up_const:Enable Interrupts : Enable Timer0 : Start Timer0Count = 0Select Case View_menuCase 1 :If On1 < 85 Then Incr On1 'Case 2 : 'If Off1 < 85 Then Incr Off1Case 3 : 'If On2 < 120 Then Incr On2 'Case 4 : 'If Off2 < 120 Then Incr Off2End SelectWaitms 30Return''Down_const:Enable Interrupts : Enable Timer0 : Start Timer0Count = 0Select Case View_menuCase 1 :If On1 > 0 Then Decr On1 ' добавляется второе условие при работе с отрицательными числамиCase 2 :If Off1 > 0 Then Decr Off1Case 3 :If On2 > 0 Then Decr On2Case 4 :If Off2 > 0 Then Decr Off2End SelectWaitms 30Return''Set_h_led1:Set Booton_flag_2Rotate Razryad_1 , LeftStop Timer1 : Stop Timer0Writeeeprom Razryad_1 , 16Return''Set_h_led2:Set Booton_flag_2Rotate Razryad_2 , LeftStop Timer1 : Stop Timer0Writeeeprom Razryad_2 , 17Return Всё взято тут Изменено 12 февраля, 2013 пользователем Максимус VanekL и Wazokrit 2 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Lovebb Опубликовано 12 февраля, 2013 Жалоба Поделиться Опубликовано 12 февраля, 2013 Хорошая тема. тоже видел этот датчик и видео работы. ты такие же используешь? как бы не совсем четко показывает. Но и манометр на этом компрессоре я думаю врет безбожно. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Maximus Опубликовано 12 февраля, 2013 Автор Жалоба Поделиться Опубликовано 12 февраля, 2013 у меня до 10 атм, но принцип тот же! Достаточно точные, тем боле под автоматику их можно откалибровать.... Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Maximus Опубликовано 16 апреля, 2013 Автор Жалоба Поделиться Опубликовано 16 апреля, 2013 Обсуждение тут http://pnevmopodveska-club.ru/topic/675-obsuzhdaem-tcifrovye-samodelnye-manometry/ Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
freshkee Опубликовано 24 апреля, 2013 Жалоба Поделиться Опубликовано 24 апреля, 2013 офигеть, мне кажется или это сложно?? просто цифровые манометры если покупать то дорого(( а так вроде ниче, они удобные очень. блин..задумался) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Gregor Опубликовано 27 ноября, 2015 Жалоба Поделиться Опубликовано 27 ноября, 2015 Вот еще вариант для творчества. Датчик давления - до 10 бар. резьба 1/8, 1/4. показометр - вольтметр. 4 датчика плюс 4 показометра примерно 5 килорублей. Вполне бюджетно. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
DEMONЮГА Опубликовано 27 ноября, 2015 Жалоба Поделиться Опубликовано 27 ноября, 2015 Вот еще вариант для творчества. Датчик давления - до 10 бар. резьба 1/8, 1/4. показометр - вольтметр. 4 датчика плюс 4 показометра примерно 5 килорублей. Вполне бюджетно. а это испытано или так,просто я как раз сижу и думаю над этим вопросом,вольтметрами такими я затарился,а вот по поводу этих датчиков задумался,брать или нет,как то не хочется закупаться зря. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Gregor Опубликовано 27 ноября, 2015 Жалоба Поделиться Опубликовано 27 ноября, 2015 а это испытано или так,просто я как раз сижу и думаю над этим вопросом,вольтметрами такими я затарился,а вот по поводу этих датчиков задумался,брать или нет,как то не хочется закупаться зря. первый пост, там начало такой темы. Но можно делать проще - 4 масштабирующих усилителя чтобы диапазон был 10 вольт - 10 бар. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
DEMONЮГА Опубликовано 27 ноября, 2015 Жалоба Поделиться Опубликовано 27 ноября, 2015 извини начал с конца,пощарим темку Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Gregor Опубликовано 27 ноября, 2015 Жалоба Поделиться Опубликовано 27 ноября, 2015 извини начал с конца,пощарим темку Давай. Может чего "родишь". Думаю будет полезно для форумчан. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
DEMONЮГА Опубликовано 27 ноября, 2015 Жалоба Поделиться Опубликовано 27 ноября, 2015 да я то сильно не рожун,есть знакомый кибер,сказал всё привезти замутит Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
nixx56 Опубликовано 17 февраля, 2016 Жалоба Поделиться Опубликовано 17 февраля, 2016 А есть ли у кого прошива под манометр-манометр? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
алекса Опубликовано 17 февраля, 2016 Жалоба Поделиться Опубликовано 17 февраля, 2016 А есть ли у кого прошива под манометр-манометр? Конечно, есть. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
nixx56 Опубликовано 18 февраля, 2016 Жалоба Поделиться Опубликовано 18 февраля, 2016 Прошу прощения. Нашел в оригинальной теме! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
andrein Опубликовано 2 октября, 2016 Жалоба Поделиться Опубликовано 2 октября, 2016 зачем в схеме с датчиком давления операционный усилитель? так хуже будет? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рустем Опубликовано 4 октября, 2016 Жалоба Поделиться Опубликовано 4 октября, 2016 Видимо защита, плюс усиление. Может компенсирует нелинейность датчика давления Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
вазерати Опубликовано 15 мая, 2017 Жалоба Поделиться Опубликовано 15 мая, 2017 (изменено) В 04.10.2016 в 20:27, Рустем сказал: Видимо защита, плюс усиление. Может компенсирует нелинейность датчика давления Ниче не компенсируется, это колхоз на датчиках давления масла от ваза делать, делал я такие манометры и там точность +- 1, 5атм, то есть выставить примерное положение уже трудно, потом из за конструктивной особености датчика где то при 4х атмосфер показывает 0 потом дальше опять показывает, а про температуру окружающую я вообще молчу. Изменено 15 мая, 2017 пользователем вазерати Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
strvv Опубликовано 4 декабря, 2017 Жалоба Поделиться Опубликовано 4 декабря, 2017 (изменено) на 23.хххх ставил манометр, но я сделал для линеаризации верхний резистор равный полному сопротивлению датчика, и зашунтировал датчик 10кОм. получил примерно: 0bar (~2.5V, 330 Ohm), 1,5bar (~1.85V, 200 Ohm), 3bar (~1,24V, 110 Ohm), 4,5bar (~0,6V, 45 Ohm), 6bar (~0,12V, 8 Ohm), при отсутствии датчика 4,8 вольт. получается и диагностика наличия датчика и почти линейные значения. Изменено 4 декабря, 2017 пользователем strvv Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Женек43 Опубликовано 10 марта, 2019 Жалоба Поделиться Опубликовано 10 марта, 2019 Мне вот интересно, сейчас модно пользоваться "ардуино". Можно ли на нем все сделать? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.