Продолжаю играться с фотоприемниками. Ситуация такая:
VD0 освещает оба фотоприемника. ШИМ микрухи обеспечивает нужную частоту мерцания светодиода VD0. Двигаем некий барьер вдоль приемников. Барьер перекрывает свет VD0 сначала одному приемнику, потом - второму. Таким образом, МК определяет направление движения этого барьера. При одном направлении МК включает VD1, при обратном направлении - выключает. Решение о включении/выключении принимается, когда оба приемника облучены, на основании сохраненных данных о их предыдущем состоянии.
Код:
Код: Выделить всё
.def CUR_VALUE = R16 ; текущее значение PIND
.def OLD_VALUE = R17 ; предыдущее значение PIND
.def TMP_VALUE = R18 ; вспомогательный регистр
ser TMP_VALUE
out DDRB, TMP_VALUE ; порты B - на вывод, D - на ввод
out PORTB, TMP_VALUE
out PORTD, TMP_VALUE
ldi TMP_VALUE, 0b01110011 ; настраиваем ШИМ
out TCCR0A, TMP_VALUE
ldi TMP_VALUE, 0b00001001
out TCCR0B, TMP_VALUE
ldi TMP_VALUE, 7
out OCR0A, TMP_VALUE
clr OLD_VALUE
LOOP:
in CUR_VALUE, PIND ; считываем данные с приемников
andi CUR_VALUE, 3 ; обнуляем биты старше второго
cp OLD_VALUE, CUR_VALUE ; если данные те же, что и в пред. витке цикла, ...
breq LOOP ; ... продолжаем цикл
mov TMP_VALUE, OLD_VALUE ; запоминаем старые данные с приемников
mov OLD_VALUE, CUR_VALUE ; замещаем старые данные новыми
cpi CUR_VALUE, 0 ; если хотя бы один приемник не облучен, ...
brne LOOP ; ... продолжаем цикл
; оба приемника облучены
cpi TMP_VALUE, 1 ; если только первый приемник в пред. витке цикла не был облучен, ...
breq LIGHT_ON ; ... включаем VD1
cpi TMP_VALUE, 2 ; если же только второй приемник в пред. витке цикла не был облучен, ...
breq LIGHT_OFF ; ... выключаем VD1
rjmp LOOP ; иначе продолжаем цикл
LIGHT_OFF:
sbi PORTB, 0
rjmp LOOP
LIGHT_ON:
cbi PORTB, 0
rjmp LOOPКабель - телефонный, около метра длиной. Падение напряжения на нем - 150 мВ. Расстояние от VD0 до приемников роли не играет. Как так?
- Вложения
-
- 1.png
- (13.07 КБ) 883 скачивания


