В общем - на суд общественности.
Текущий алгоритм работы: автоматический - делаем одну пробную вспышку - синхронизатор запоминает количество импульсов и на следующую вспышку запускает подключенные к нему. При этом текущее количество импульсов запоминается на следующий сеанс работы. По-идее - даже если запускающая вспышка меняет количество импульсов в зависимости от каких-либо условий, мы будем успешно синхронизироваться с пропуском максимум одного пыха).
Выкладывал схему/прошивку на сайте osipoff.ru, собираясь доделать в сжатые сроки. Однако родился ребенок
И на "рукоделие" времени не осталось.
Тем не менее, текущий вариант был "обкатан" в течении нескольких месяцев. И особых нареканий не вызывал.
Долго провозился с собственно фотоприемником. В конечном итоге остановился на варианте схемы Waldemar Szymanski на основе мышиного фотодатчика.
Текущая схема и выглядит этот ужас на макетке пока что так:
Посмотреть на Яндекс.Фотках
Ручной режим (обучили на какой пых срабатывать - и срабатывает только на этот пых) пока не писал - для отладки более подходящим оказался автоматический режим.
А по результатам эксплуатации решил совсем от него отказаться. Более разумным оказалось решение добавить возможность запомнить количество импульсов во вспышке по умолчанию. В оригинале прошивки по включению питания устанавливался режим синхронизации по первому импульсу. Как результат - мне приходилось делать "контрольный выстрел" для обучения - теряя первый кадр. В более новой версии прошивки есть возможность запомнить количество импульсов. Соответственно по включению питания мы "стартуем" без дополнительного обучения.
Под спойлером исходник для "альфы" прошивки, (возможно кого-то заинтересует на предмет "покопаться" - нажмите на кнопку "Показать".
Показать
Код: Выделить всё
.include "tn22def.inc"
;********************************************************************
;* Hardware definition:ports and pins
;********************************************************************
.equ ledc =portb ;выходы
.equ mled =pb3 ; информационный светодиод
.equ flashled=pb4 ; светодиод оптрона вспышки
.equ sensors =pinb ;входы
.equ foto =pb1 ;фотодатчик
.equ key =pb2 ;кнопка
.equ switch =pb0 ;переключатель
.equ pbdir =0b11111000
;********************************************************************
;* register definition
;********************************************************************
.def ftemp =r2 ;регистры для временного хранения при отработке прерывания - копия темп-а
.def fsreg =r3 ;регистры для временного хранения при отработке прерывания - копия статусного
.def ttemp =r4
.def temp =r16 ;многофункциональная временная переменная
.def flast =r17 ;количество импульсов в последней серии
.def fcur =r18 ;количество импульсов в текущей серии
.def ctr0 =r19 ;счетчик
;*************************f*******************************************
;* Macro section
;********************************************************************
.macro mled_on ;макрос - включение инф. светодиода
cbi ledc,mled
.endm
.macro mled_off ;макрос - включение инф. светодиода
sbi ledc,mled
.endm
.macro flashled_on ;макрос - включение светодиода оптрона вспышки
cbi ledc,flashled
.endm
.macro flashled_off ;макрос - включение светодиода оптрона вспышки
sbi ledc,flashled
.endm
.macro start_tmr0 ;макрос - запуск таймера (цикл - 250мс)
ldi temp,0b00000101
out tccr0,temp
.endm
.macro stop_tmr0 ;макрос - останов и сброс таймера (цикл - 250мс)
clr temp
out tccr0,temp
out tcnt0,temp
.endm
.macro enable_ei0 ;макрос - разрешение прерывания от фотодатчика
ldi temp,0b01000000
out gimsk,temp
.endm
.macro disable_ei0 ;макрос - запрет прерывания от фотодатчика
clr temp
out gimsk,temp
.endm
;********************************************************************
;* Main programm section
;********************************************************************
;* Interrupt-vectors section
;********************************************************************
.cseg
.org 0x000
reset: rjmp start
ei0: rjmp ei0_isr ;точка входа прерывания от фотодатчика
t0of: rjmp t0_isr ;точка входа прерывания по переполнению таймера
;********************************************************************
;* Main programm: inits section
;********************************************************************
start: ldi temp,ramend ;установка указателя стека
out spl,temp ; -"-
ldi temp,pbdir ;настройка портов ввода-вывода
out ddrb,temp ; -"-
ser temp ; -"-
out portb,temp ; -"-
ldi flast,1 ;считаем, что в последней серии был 1 пых
clr fcur ; а в текущей - ессно - 0
ldi temp,0b00000010 ; настраиваем таймер
out timsk,temp ; -"-
clr temp ; -"-
out tcnt0,temp ; -"-
ldi temp,0b00000010 ;и прерывание от фотодатчика - по переходу 1-0 кстати - возможно это просто.
out mcucr,temp ;Выкинув VT5 и использовав прерывания по 0-1 можно упростить схему - надо проверить
sei ;разрешить все прерывания вообще
enable_ei0 ;и от фотодатчика в частности
; Показалось разумным сделать индикацию количестваимпульсов в последней серии
blinker: mov temp,flast
blink: mled_on ;мигаем короткими импульсами столько раз, сколько импульсов в серии
rcall del30ms ; -"-
mled_off ; -"-
rcall del300ms ; -"-
dec temp ; -"-
brne blink ; -"-
rcall del1s ;разделитель - секундная пауза
rjmp blinker ; -"-
t0_isr: mov ttemp,temp ;Тут обрабатывается переполнение таймера
mov flast,fcur ;Считаем, что наша вспышка должна "отвспыхивать" все свои импульсы за 250 мс, не более
ldi fcur,0 ;и уж если мы попали сюда - значит серия закончена - запомним сколько в ней было импульсов
stop_tmr0 ;таймер - стоять!
mov temp,ttemp
reti
ei0_isr: mov ftemp,temp ;а тут обрабатываем сигнал с фотодатчика
in fsreg,sreg ;сохраняем модифицируемые регистры общего пользования
inc fcur ;увеличиваем счетчик импульсов текущей серии
cp fcur,flast ;и сравниваем его со значением предидущего измерения
brlo pre_exit ;если сейчас меньше - то идем на выход
flash: disable_ei0 ;иначе - генерируем пых. для начала запрещаем подсчет вспышек
flashled_on ;и пыхаем
rcall del50mks ;длина импульса запуска - 50 мкс
flashled_off ;-"-
rcall del3ms ;Ожидаем 3 мс - пока вспышка не закончится
enable_ei0 ;и разрешаем снова подсчет вспышек
pre_exit: start_tmr0 ;безусловный запуск таймера
exit_isr: out sreg,fsreg ;восстанавливаем модифицируемые регистры общего пользования
mov temp,ftemp ;-"-
reti
;------------------------------------------------------------------------------------------
del50mks: push temp ;банальная отработка задержки - 50 мкс
ldi temp,13
w50mks: dec temp
brne w50mks
pop temp
ret
;------------------------------------------------------------------------------------------
del3ms: push temp ;банальная отработка задержки - 3 мс
ldi temp,60
d3ms: rcall del50mks
dec temp
brne d3ms
pop temp
ret
;------------------------------------------------------------------------------------------
del30ms: push temp ;банальная отработка задержки - 30 мс
ldi temp,10
d30ms: rcall del3ms
dec temp
brne d30ms
pop temp
ret
;------------------------------------------------------------------------------------------
del1s: push temp ;банальная отработка задержки - 1с
ldi temp,166
d1s: rcall del3ms
dec temp
brne d1s
pop temp
ret
;------------------------------------------------------------------------------------------
del300ms: push temp ;;банальная отработка задержки - 300 мс
ldi temp,55
d300ms: rcall del3ms
dec temp
brne d300ms
pop temp
ret
.exit
;********************************************************************************************************
И хекс-код прошивки:
Код: Выделить всё
:020000020000FC
:1000000002C023C01AC00FED0DBF08EF07BB0FEFF2
:1000100008BB11E0222702E009BF002702BF02E06F
:1000200005BF789400E40BBF012FC3982DD0C39A6D
:1000300039D00A95D1F72FD0F7CF402E122F20E0DC
:10004000002703BF02BF042D1895202E3FB623952D
:10005000211740F000270BBFC49809D0C49A0DD0D7
:1000600000E40BBF05E003BF3FBE022D18950F93C0
:100070000DE00A95F1F70F9108950F930CE3F7DF68
:100080000A95E9F70F9108950F930AE0F6DF0A95B4
:10009000E9F70F9108950F9306EAEFDF0A95E9F764
:1000A0000F9108950F9307E3E8DF0A95E9F70F91A1
:0200B0000895B1
:00000001FF
Несколько ответов на возможные вопросы:
Q: Почему использована Atmel Tiny22L - она ведь снята с производства?
А: 1) У меня просто их много валяется. Подозреваю, у кого-то тоже может найтись. 2) Когда я начинал делать синхронизатор, под рукой ничего не оказалось. 3) отлаживать программу проще на кристаллах имеющих хоть какой-то обьем ОЗУ.
Будет порт на Тини13 (Или тини15). И, возможно, по просьбам заинтересовавшихся - на другие контроллеры (если смогу достать). Да, некоторые изменения в схеме будут. Некритические.
Q: Кварца в схеме нет?
А: нет - использован внутренний RCгенератор (1МГц) - его вполне хватает.
Q: Как пользоваться?
А: Собрать/прошить/подключить. Должнен коротко вспыхивать светодиод. "Пыхнуть" один раз. Подключенная вспышка должна сработать. Если запускающая вспышка дает более чем один импульс - то светодиод будет вспыхивать сериями. Несколько вспышек (по количеству импульсов запускающей вспышки)-пауза. И так по циклу.
На все последующие срабатывания запускающей вспышки, схемка должна поджигать ведомую вспышку по последнему импульсу запускающей.
Q:Почему на схеме нарисован оптотиристор, а на плате явно виден оптотранзистор?
А:Изначально планировал использовать оптотиристор - как замену поджигающему тиристору самой вспышки. Как-никак гальваническая развязка. Но отлаживал на вспышке от Полароида. А там проще было использовать оптотранзистор. С другой стороны - "со стороны" микроконтроллера разница между оптотранзистором или оптотиристором несущественна.
Фух. На первый раз - вроде бы все.
Продолжение следует.