Программа
Чтобы перейти к обсуждению непосредственно программы измерителя, нам нужно решить еще один принципиальный вопрос. Передаточная характеристика любого измерителя температуры, показывающего ее в градусах Цельсия, должна «ломаться» в нуле — ниже и выше абсолютные значения показаний возрастают. Так как мы тут действуем в области положительных напряжений, то этот вопрос придется решать самостоятельно (в АЦП типа 572ПВ2, напомним, определение абсолютной величины и индикация знака производилась автоматически).
Это несложно сделать, если представить формулу пересчета значений температуры в виде уравнения:
N= К∙( х— Z),
где N — число на индикаторе, х — текущий код АЦП, Z — код АЦП, соответствующий нулю градусов Цельсия (при наших установках он должен соответствовать примерно середине диапазона).
Чтобы величина по данной формуле всегда получалась положительная, нам придется сначала определять, что больше — х или Z , и вычитать из большего меньшее. Заодно при этой операции сравнения мы определяем значение знака. Если мы предположим, что в регистрах AregH: AregLсодержится значение текущего кода АЦП х , а в регистрах KoeffH: KoeffLзначение коэффициента Z , то алгоритм будет выглядеть так, как иллюстрирует листинг 15.6.
Листинг 15.6
…
;вычисление знака:
ср AregL,KoeffL ;сравниваем х и Z
срс AregH,KoeffH
brsh Ь0
;если х меньше Z
sub KoeffL,AregL
sbc КоеffH,AregH
mov AregL,KoeffL ;меняем местами, чтобы температура
mov AregH,KoeffH ;оказалась опять в AregH: AregL
sbi PortD,7 ;знак -
rjmp m0
Ь0: ;если x больше Z
sub AregL,KoeffL
sbc AregH,KоеffH
cbi PortD,7 ;знак +
m0:
<���умножение на коэффициент К>
…
Здесь разряд 7 порта D (вывод 21 ) управляет плоским светодиодом, который горит, если температура меньше нуля, и погашен в противном случае.
Давление занимает только положительную область значений, поэтому там такой сложной процедуры не понадобится. Если вы посмотрите на характеристику датчика в фирменном описании, то выясните, что он работает не с начала шкалы — нулевому напряжению на выходе (и, соответственно, нулевому коду АЦП) будет соответствовать некоторое значение давления. В результате можно ожидать, что в формуле пересчета значений давления, представленной в виде
N= К∙( х + Z),
все величины будут находиться в положительной области.
Физический смысл коэффициента К — крутизна характеристики датчиков в координатах «входной код АЦП — число на индикаторах». Умножение на К мы будем производить описанным методом — через представление его в виде двоичной дроби (за основу берется 2 10= 1024, этого будет достаточно). Вычисление ориентировочных значений коэффициентов К и Z поясняется далее, при описании процедуры калибровки.
Теперь можно окинуть взглядом собственно программу, которая целиком приведена в Приложении 5 (раздел «Программа измерителя температуры и давления»). Как вы видите из таблицы прерываний, здесь используется всего один, самый простой Timer 0, который срабатывает с частотой около 2000 раз в секунду. В его обработчике по метке TIM0и заключена большая часть функциональности.
В каждом цикле сначала проверяется счетчик cRazr, который отсчитывает разряды индикаторов (от 0 до 5). В соответствии с его значением происходит формирование кода индицируемого знака (по алгоритму вызова константы-маски знака, описанному в главе 13 ) и затем на нужный разряд подается питание.
Заметки на полях
Как видите, здесь формирование знака реализовано не очень красиво, и довольно громоздким способом — просто передачей управления на нужную процедуру в зависимости от значения счетчика. Сами же процедуры структурно одинаковы (меняются лишь адреса в памяти, из которых считываются значения разрядов индикатора и номера разрядов порта управления PortB). Программу в этой части можно слегка сократить (если просто вывести одинаковые операторы в отдельную процедуру, и задействовать локальные переменные), но я не стал этого делать, т. к. принципиально это ничего не изменит: места в памяти у нас достаточно, а программа, на мой взгляд, тем лучше читается, чем в ней меньше структурных блоков. (Упоминавшийся в главе 13 Дейкстра, несомненно, схватился бы за сердце, услышав такое, но тем не менее это чистая правда — весь алгоритм окинуть взглядом легче, когда он максимально структурирован, но каждый отдельный фрагмент его проще понять, если не приходится «рыскать» по всему листингу.)
Читать дальше
Конец ознакомительного отрывка
Купить книгу