Initial draft for Nikon OML-L3 include file and ImplementationNotes readme.
[OpenInterval.git] / cameras / Nikon_OML-L3.inc
blob72e319b9cd459f8d11e4cf82ce9ba44e1001dd8f
1 ; Infrared remote control for Nikon D70 with Atmel 8bit MCU\r
2 \r
3 ; Copyright (C) 2005, 2006 Michele Bighignoli - Laives (BZ) - ITALY # www.bigmike.it/ircontrol\r
4 ;\r
5 ; Version 2.0.0-OI - 12/2007\r
6 ; Modified by Matt Coates (mattjackets+openinterval at gmail.com)\r
7 ; for use as an include file for the OpenInterval project\r
8 ; (http://repo.or.cz/w/OpenInterval.git)\r
9 ;\r
10 ; This program is free software; you can redistribute it and/or modify\r
11 ; it under the terms of the GNU General Public License as published by\r
12 ; the Free Software Foundation; either version 2 of the License, or\r
13 ; (at your option) any later version.\r
14 ;\r
15 ; This program is distributed in the hope that it will be useful,\r
16 ; but WITHOUT ANY WARRANTY; without even the implied warranty of\r
17 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
18 ; GNU General Public License for more details.\r
19 ;\r
20 ; You should have received a copy of the GNU General Public License\r
21 ; along with this program; if not, write to the Free Software\r
22 ; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
23 ;\r
24 ;\r
25 ; Implementation note:\r
26 ; ---------------------------\r
27 ; IR led is controlled by PD0 (with NPN transistor).\r
28 ; Led is "on" when PD0 is high.\r
29 ;\r
30 ; This code has tested with ATTiny2313 and ATMEGA8535 with 8.0 MHz Xtal\r
31 ;\r
32 ; Should work with every Atmel 8bit MCU\r
33 ;\r
34 ;\r
35 ; Special thanks to:\r
36 ; ------------------\r
37 ; Gerhard Schmidt (DG4FAC) - http://www.avr-asm-tutorial.net/index.html\r
38 ; Brian Hammill - http://www.ipass.net/~hammill\r
39 ;\r
40 ;\r
41 ; WaveForm data (03/2006 version):\r
42 ;\r
43 ; Infrared period = 26us (~38.4kHz)\r
44 ;\r
45 ; Strart pulse:  2000us\r
46 ; pause:                27830us\r
47 ; 1st pulse:      390us\r
48 ; pause:                 1580us\r
49 ; 2nd pulse:      410us\r
50 ; pause:                 3580us\r
51 ; 3rd pulse:      400us\r
52 ; longpause:    63200us\r
53 \r
54 ; REPEAT ONE TIME\r
55 ;\r
57 .DEF DelayReg  = R23\r
58 .DEF MainLoopC = R22\r
59 .DEF Counter   = R21\r
60 .DEF Counter2  = R20\r
62 delay130:\r
63 ; This is a 13.0 uS delay (104 cycles @ 8MHz)\r
64 ;\r
65 ; sbi/cbi = 2 cycles\r
66 ; rcall = 3 cycles\r
67 ;\r
68         nop\r
69         nop\r
70 ;\r
71 delay130_led_on:\r
72         nop\r
73         nop\r
74         nop\r
75 ;\r
76 delay130_led_off:\r
77         nop\r
78         nop\r
79         ldi     DelayReg,30             ; 1 cycle\r
80 delay130_loop:\r
81         dec     DelayReg                        ; 1 cycle\r
82         brne    delay130_loop           ; 2 cycle if jump to label, 1 if not\r
83         ret                             ; 4 cycles\r
86 ; Code executed at startup\r
88 shutterrelease:\r
89         ldi     MainLoopC,2             ; Send a complete waveform 2 times\r
91 mainloop:\r
93 ; Send start pulse (2000 uS)\r
94         ldi     Counter,77              ; (13 uS * 2 ) * 77 = 2002 uS\r
95 startpulse:\r
96         sbi     irport,irpin                    ; LED on\r
97         rcall   delay130_led_on         ; Wait 13.0 uS\r
98         cbi     irport,irpin                    ; LED off\r
99         rcall   delay130_led_off                ; wait 13.0 uS\r
100         dec     Counter\r
101         brne    startpulse\r
103 ; Pause (27830 uS)\r
104         ldi     Counter,237\r
105 startpause:\r
106         rcall   delay130\r
107         rcall   delay130\r
108         rcall   delay130\r
109         rcall   delay130\r
110         rcall   delay130\r
111         rcall   delay130\r
112         rcall   delay130\r
113         rcall   delay130\r
114         rcall   delay130\r
115         dec     Counter\r
116         brne    startpause\r
118         rcall   delay130_led_off\r
120 ; Send first pulse (390 uS)\r
121         ldi     Counter,15\r
122 pulse1:\r
123         sbi     irport,irpin                    ; LED on\r
124         rcall   delay130_led_on\r
125         cbi     irport,irpin                    ; LED off\r
126         rcall   delay130_led_off\r
127         dec     Counter\r
128         brne    pulse1\r
130 ; Pause (1580 uS)\r
131         ldi     Counter,118\r
132 pause1:\r
133         rcall   delay130\r
134         dec     Counter\r
135         brne    pause1\r
137         ldi     Counter,5\r
138 pause1b:\r
139         dec     Counter\r
140         brne    pause1b\r
143 ; Send 2nd pulse (410 uS)\r
145 ; NOTE: with Counter=16 the pulse width is 416 uS (counting the last "led off" time)\r
146 ; using Counter=15 and an additional "led on", it's possible to add the last 7 uS (led off) to the pause 2\r
147 \r
148 ; Counter=15 = 390 uS +\r
149 ; "led on"   =  13 uS =\r
150 ; TOTAL      = 403 uS\r
153         ldi     Counter,15\r
154 pulse2:\r
155         sbi     irport,irpin                    ; LED on\r
156         rcall   delay130_led_on\r
157         cbi     irport,irpin                    ; LED off\r
158         rcall   delay130_led_off\r
159         dec     Counter\r
160         brne    pulse2\r
162         sbi     irport,irpin                    ; LED on\r
163         rcall   delay130_led_on\r
164         cbi     irport,irpin                    ; LED off\r
166 ; Pause (3580 uS + 7 uS from pulse2 = 3587 uS)\r
167         ldi     Counter,136\r
168 pause2:\r
169         rcall   delay130\r
170         rcall   delay130\r
171         dec     Counter\r
172         brne    pause2\r
174 ; Send 3th pulse (400 uS) - (in real world = 403 uS)\r
175         ldi     Counter,15\r
176 pulse3:\r
177         sbi     irport,irpin                    ; LED on\r
178         rcall   delay130_led_on\r
179         cbi     irport,irpin                    ; LED off\r
180         rcall   delay130_led_off\r
181         dec     Counter\r
182         brne    pulse3\r
184         sbi     irport,irpin                    ; LED on\r
185         rcall   delay130_led_on\r
186         cbi     irport,irpin                    ; LED off\r
188         dec     MainLoopC\r
189 ; No long pause before sleep\r
190         breq    returnfromshutterrelease\r
193 ; Pause for 63200 uS\r
194         ldi     Counter,239\r
195 longpause:\r
196         ldi     Counter2,10\r
197 longpause1:     \r
198         rcall   delay130\r
199         rcall   delay130\r
200         dec     Counter2\r
201         brne    longpause1\r
202         dec     Counter\r
203         brne    longpause\r
205 ; At moment : 63126 uS + 3 uS from pulse3 = 63129 uS\r
207         ldi     Counter,5\r
208 longpause2:\r
209         rcall   delay130\r
210         dec     Counter\r
211         brne    longpause2\r
213 ; At moment 63193 uS + 3 uS from pulse3 = 63196 uS\r
215         ldi     Counter,10              ; 3,75 uS\r
216 longpause3:\r
217         dec     Counter\r
218         brne    longpause3\r
219         \r
220         rjmp    mainloop\r
222 returnfromshutterrelease:\r
223         ret\r