Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 1 1 . Аналоговый компаратор и АЦП . endm ldi razrO , high ( @ O ) ере ternp, razrO ; сравниваем с порогом ldi temp , ObO O O O O O O l out DDRВ , temp PortB . 0 - Output ; ADC ==== ; start ADC 1 / 8 = 1 2 5 кГц, непрерывный режим ADFR=l ; ldi temp , l<<ADFR l l<<ADEN l l<<ADPS l i l<<ADPSO out ADCSRA, temp ldi ternp, ( l<<REFS O ) ; Vref = AVCC , , канал ADCO out ADМUX , temp sbi ADCSRA, ADSC ; запуск первого преобразования Gcykle : sbic PortB , O ; если горит , то на выключение rjmp test On led Test Off led : ; если Led выключен , надо включать при падении ReadADC 4 00 ; сравниваем с нижним порогом =4 0 0 brsh Test_Off_led ; если больше , ничего н е делаем ; если меньше , проверяем заново DelayB O $ 0 9 , $ 2 7 , $СО ; задержка 3 с ReadADC 4 0 0 ; опять сравниваем с нижним порогом =4 0 0 brsh Test Of f l ed ; если опять больше , ничего не делаем ; если меньше , включаем sbi PortB , 0 ; зажигаем Led rjmp Gcykle ; и назад Test On led : ; если Led включен , надо выключать при возрастании ReadADC 500 ; сравниваем с верхним порогом =500 brlo Test_On_ led ; если меньше , ничего не делаем ; если больше , проверяем заново DelayB O $ 0 9 , $ 2 7 , $СО ; задержка 3 с ReadADC 5 0 0 ; опять сравниваем с верхним порогом =500 brlo Test On led ; если опять меньше , ничего не делаем ; если больше , выключаем cbi PortB , 0 ; гасим Led rjmp Gcykle ; и назад 309 Программа построена в Arduino-cтилe: поскольку мы здесь никуда не торопимся, и нигде нет узких мест по скорости выполнения отдельных участков, то весь алго ритм сосредоточен в главном цикле, никакие прерывания не задействованы, необ ходимые задержки - чисто программные . АЦП изначально запускается на непре рывные преобразования фоном к выполнению основной программы. Механизм защиты от ложных срабатываний двухступенчатый : сначала мы читаем АЦП и сравниваем его с порогом (см. текст макроса ReadADC ) . Если обнаруживаем,
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==