182 |
kaklik |
1 |
GAS LISTING /tmp/ccCMjSjd.s page 1
|
174 |
kaklik |
2 |
|
|
|
3 |
|
|
|
4 |
1 # 1 "CamInterfaceAsm.S"
|
|
|
5 |
2 # 1 "<built-in>"
|
151 |
kaklik |
6 |
1 ;
|
174 |
kaklik |
7 |
|
|
|
8 |
|
151 |
kaklik |
9 |
2 ; Copyright (C) 2004 John Orlando
|
|
|
10 |
3 ;
|
|
|
11 |
4 ; AVRcam: a small real-time image processing engine.
|
|
|
12 |
5
|
|
|
13 |
6 ; This program is free software; you can redistribute it and/or
|
|
|
14 |
7 ; modify it under the terms of the GNU General Public
|
|
|
15 |
8 ; License as published by the Free Software Foundation; either
|
|
|
16 |
9 ; version 2 of the License, or (at your option) any later version.
|
|
|
17 |
10
|
|
|
18 |
11 ; This program is distributed in the hope that it will be useful,
|
|
|
19 |
12 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
20 |
13 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
21 |
14 ; General Public License for more details.
|
|
|
22 |
15
|
|
|
23 |
16 ; You should have received a copy of the GNU General Public
|
|
|
24 |
17 ; License along with this program; if not, write to the Free Software
|
|
|
25 |
18 ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
26 |
19
|
|
|
27 |
20 ; For more information on the AVRcam, please contact:
|
|
|
28 |
21
|
|
|
29 |
22 ; john@jrobot.net
|
|
|
30 |
23
|
|
|
31 |
24 ; or go to www.jrobot.net for more details regarding the system.
|
|
|
32 |
25 ;**********************************************************************
|
|
|
33 |
26 ; Module Name: CanInterfaceAsm.S
|
|
|
34 |
27 ; Module Date: 04/14/2004
|
|
|
35 |
28 ; Module Auth: John Orlando
|
|
|
36 |
29 ;
|
|
|
37 |
30 ; Description: This module provides the low-level interface
|
|
|
38 |
31 ; to the OV6620 camera hardware. It is responsible for
|
|
|
39 |
32 ; acquiring each pixel block (R,G,B), performing the mapping
|
|
|
40 |
33 ; into an actual color (orange, purple, etc), run-length
|
|
|
41 |
34 ; encoding the data, and storing the info off to the appropriate
|
|
|
42 |
35 ; line buffer. This routine is synchronized with the pixel data
|
|
|
43 |
36 ; so that no polling of the camera data needs to be done (the
|
|
|
44 |
37 ; OV6620 is clocked off of the same crystal source as the mega8,
|
|
|
45 |
38 ; thus providing inherent synchronization between the two).
|
|
|
46 |
39 ;
|
|
|
47 |
40 ; Revision History:
|
|
|
48 |
41 ; Date Rel Ver. Notes
|
|
|
49 |
42 ; 4/10/2004 0.1 Module created
|
|
|
50 |
43 ; 6/30/2004 1.0 Initial release for Circuit Cellar
|
|
|
51 |
44 ; contest.
|
|
|
52 |
45 ; 1/16/2005 1.4 Fixed issue with the TCCR1B register
|
|
|
53 |
46 ; where PCLK was getting routed to the
|
|
|
54 |
47 ; timer1 even when it wasn't needed.
|
|
|
55 |
48 ; This caused excessive counter overflow
|
|
|
56 |
49 ; interrupts, and caused problems. Now,
|
|
|
57 |
50 ; the "PCLK" pipe feeds timer1 when needed,
|
|
|
58 |
51 ; and is turned off when it isn't needed.
|
|
|
59 |
52
|
|
|
60 |
53 #include <avr/io.h>
|
182 |
kaklik |
61 |
GAS LISTING /tmp/ccCMjSjd.s page 2
|
174 |
kaklik |
62 |
|
|
|
63 |
|
|
|
64 |
1 /* Copyright (c) 2002,2003,2005,2006, Marek Michalkiewicz, Joerg Wunsch
|
|
|
65 |
2 All rights reserved.
|
|
|
66 |
3
|
|
|
67 |
4 Redistribution and use in source and binary forms, with or without
|
|
|
68 |
5 modification, are permitted provided that the following conditions are met:
|
|
|
69 |
6
|
|
|
70 |
7 * Redistributions of source code must retain the above copyright
|
|
|
71 |
8 notice, this list of conditions and the following disclaimer.
|
|
|
72 |
9
|
|
|
73 |
10 * Redistributions in binary form must reproduce the above copyright
|
|
|
74 |
11 notice, this list of conditions and the following disclaimer in
|
|
|
75 |
12 the documentation and/or other materials provided with the
|
|
|
76 |
13 distribution.
|
|
|
77 |
14
|
|
|
78 |
15 * Neither the name of the copyright holders nor the names of
|
|
|
79 |
16 contributors may be used to endorse or promote products derived
|
|
|
80 |
17 from this software without specific prior written permission.
|
|
|
81 |
18
|
|
|
82 |
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
83 |
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
84 |
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
85 |
22 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
86 |
23 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
87 |
24 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
88 |
25 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
89 |
26 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
90 |
27 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
91 |
28 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
92 |
29 POSSIBILITY OF SUCH DAMAGE. */
|
|
|
93 |
30
|
|
|
94 |
31 /* $Id: io.h,v 1.24.2.7 2006/04/19 16:53:25 aesok Exp $ */
|
|
|
95 |
32
|
|
|
96 |
33 /** \defgroup avr_io <avr/io.h>: AVR device-specific IO definitions
|
|
|
97 |
34 \code #include <avr/io.h> \endcode
|
|
|
98 |
35
|
|
|
99 |
36 This header file includes the apropriate IO definitions for the
|
|
|
100 |
37 device that has been specified by the <tt>-mmcu=</tt> compiler
|
|
|
101 |
38 command-line switch. This is done by diverting to the appropriate
|
|
|
102 |
39 file <tt><avr/io</tt><em>XXXX</em><tt>.h></tt> which should
|
|
|
103 |
40 never be included directly. Some register names common to all
|
|
|
104 |
41 AVR devices are defined directly within <tt><avr/io.h></tt>,
|
|
|
105 |
42 but most of the details come from the respective include file.
|
|
|
106 |
43
|
|
|
107 |
44 Note that this file always includes
|
|
|
108 |
45 \code #include <avr/sfr_defs.h> \endcode
|
|
|
109 |
46 See \ref avr_sfr for the details.
|
|
|
110 |
47
|
|
|
111 |
48 Included are definitions of the IO register set and their
|
|
|
112 |
49 respective bit values as specified in the Atmel documentation.
|
|
|
113 |
50 Note that Atmel is not very consistent in its naming conventions,
|
|
|
114 |
51 so even identical functions sometimes get different names on
|
|
|
115 |
52 different devices.
|
|
|
116 |
53
|
|
|
117 |
54 Also included are the specific names useable for interrupt
|
|
|
118 |
55 function definitions as documented
|
|
|
119 |
56 \ref avr_signames "here".
|
|
|
120 |
57
|
182 |
kaklik |
121 |
GAS LISTING /tmp/ccCMjSjd.s page 3
|
174 |
kaklik |
122 |
|
|
|
123 |
|
|
|
124 |
58 Finally, the following macros are defined:
|
|
|
125 |
59
|
|
|
126 |
60 - \b RAMEND
|
|
|
127 |
61 <br>
|
|
|
128 |
62 A constant describing the last on-chip RAM location.
|
|
|
129 |
63 <br>
|
|
|
130 |
64 - \b XRAMEND
|
|
|
131 |
65 <br>
|
|
|
132 |
66 A constant describing the last possible location in RAM.
|
|
|
133 |
67 This is equal to RAMEND for devices that do not allow for
|
|
|
134 |
68 external RAM.
|
|
|
135 |
69 <br>
|
|
|
136 |
70 - \b E2END
|
|
|
137 |
71 <br>
|
|
|
138 |
72 A constant describing the address of the last EEPROM cell.
|
|
|
139 |
73 <br>
|
|
|
140 |
74 - \b FLASHEND
|
|
|
141 |
75 <br>
|
|
|
142 |
76 A constant describing the last byte address in flash ROM.
|
|
|
143 |
77 <br>
|
|
|
144 |
78 - \b SPM_PAGESIZE
|
|
|
145 |
79 <br>
|
|
|
146 |
80 For devices with bootloader support, the flash pagesize
|
|
|
147 |
81 (in bytes) to be used for the \c SPM instruction. */
|
|
|
148 |
82
|
|
|
149 |
83 #ifndef _AVR_IO_H_
|
|
|
150 |
84 #define _AVR_IO_H_
|
|
|
151 |
85
|
|
|
152 |
86 #include <avr/sfr_defs.h>
|
|
|
153 |
1 /* Copyright (c) 2002, Marek Michalkiewicz <marekm@amelek.gda.pl>
|
|
|
154 |
2 All rights reserved.
|
|
|
155 |
3
|
|
|
156 |
4 Redistribution and use in source and binary forms, with or without
|
|
|
157 |
5 modification, are permitted provided that the following conditions are met:
|
|
|
158 |
6
|
|
|
159 |
7 * Redistributions of source code must retain the above copyright
|
|
|
160 |
8 notice, this list of conditions and the following disclaimer.
|
|
|
161 |
9
|
|
|
162 |
10 * Redistributions in binary form must reproduce the above copyright
|
|
|
163 |
11 notice, this list of conditions and the following disclaimer in
|
|
|
164 |
12 the documentation and/or other materials provided with the
|
|
|
165 |
13 distribution.
|
|
|
166 |
14
|
|
|
167 |
15 * Neither the name of the copyright holders nor the names of
|
|
|
168 |
16 contributors may be used to endorse or promote products derived
|
|
|
169 |
17 from this software without specific prior written permission.
|
|
|
170 |
18
|
|
|
171 |
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
172 |
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
173 |
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
174 |
22 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
175 |
23 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
176 |
24 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
177 |
25 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
178 |
26 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
179 |
27 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
180 |
28 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
182 |
kaklik |
181 |
GAS LISTING /tmp/ccCMjSjd.s page 4
|
174 |
kaklik |
182 |
|
|
|
183 |
|
|
|
184 |
29 POSSIBILITY OF SUCH DAMAGE. */
|
|
|
185 |
30
|
|
|
186 |
31 /* avr/sfr_defs.h - macros for accessing AVR special function registers */
|
|
|
187 |
32
|
|
|
188 |
33 /* $Id: sfr_defs.h,v 1.16 2005/09/10 21:31:13 joerg_wunsch Exp $ */
|
|
|
189 |
34
|
|
|
190 |
35 #ifndef _AVR_SFR_DEFS_H_
|
|
|
191 |
36 #define _AVR_SFR_DEFS_H_ 1
|
|
|
192 |
37
|
|
|
193 |
38 /** \defgroup avr_sfr_notes Additional notes from <avr/sfr_defs.h>
|
|
|
194 |
39 \ingroup avr_sfr
|
|
|
195 |
40
|
|
|
196 |
41 The \c <avr/sfr_defs.h> file is included by all of the \c <avr/ioXXXX.h>
|
|
|
197 |
42 files, which use macros defined here to make the special function register
|
|
|
198 |
43 definitions look like C variables or simple constants, depending on the
|
|
|
199 |
44 <tt>_SFR_ASM_COMPAT</tt> define. Some examples from \c <avr/iom128.h> to
|
|
|
200 |
45 show how to define such macros:
|
|
|
201 |
46
|
|
|
202 |
47 \code
|
|
|
203 |
48 #define PORTA _SFR_IO8(0x1b)
|
|
|
204 |
49 #define TCNT1 _SFR_IO16(0x2c)
|
|
|
205 |
50 #define PORTF _SFR_MEM8(0x61)
|
|
|
206 |
51 #define TCNT3 _SFR_MEM16(0x88)
|
|
|
207 |
52 \endcode
|
|
|
208 |
53
|
|
|
209 |
54 If \c _SFR_ASM_COMPAT is not defined, C programs can use names like
|
|
|
210 |
55 <tt>PORTA</tt> directly in C expressions (also on the left side of
|
|
|
211 |
56 assignment operators) and GCC will do the right thing (use short I/O
|
|
|
212 |
57 instructions if possible). The \c __SFR_OFFSET definition is not used in
|
|
|
213 |
58 any way in this case.
|
|
|
214 |
59
|
|
|
215 |
60 Define \c _SFR_ASM_COMPAT as 1 to make these names work as simple constants
|
|
|
216 |
61 (addresses of the I/O registers). This is necessary when included in
|
|
|
217 |
62 preprocessed assembler (*.S) source files, so it is done automatically if
|
|
|
218 |
63 \c __ASSEMBLER__ is defined. By default, all addresses are defined as if
|
|
|
219 |
64 they were memory addresses (used in \c lds/sts instructions). To use these
|
|
|
220 |
65 addresses in \c in/out instructions, you must subtract 0x20 from them.
|
|
|
221 |
66
|
|
|
222 |
67 For more backwards compatibility, insert the following at the start of your
|
|
|
223 |
68 old assembler source file:
|
|
|
224 |
69
|
|
|
225 |
70 \code
|
|
|
226 |
71 #define __SFR_OFFSET 0
|
|
|
227 |
72 \endcode
|
|
|
228 |
73
|
|
|
229 |
74 This automatically subtracts 0x20 from I/O space addresses, but it's a
|
|
|
230 |
75 hack, so it is recommended to change your source: wrap such addresses in
|
|
|
231 |
76 macros defined here, as shown below. After this is done, the
|
|
|
232 |
77 <tt>__SFR_OFFSET</tt> definition is no longer necessary and can be removed.
|
|
|
233 |
78
|
|
|
234 |
79 Real example - this code could be used in a boot loader that is portable
|
|
|
235 |
80 between devices with \c SPMCR at different addresses.
|
|
|
236 |
81
|
|
|
237 |
82 \verbatim
|
|
|
238 |
83 <avr/iom163.h>: #define SPMCR _SFR_IO8(0x37)
|
|
|
239 |
84 <avr/iom128.h>: #define SPMCR _SFR_MEM8(0x68)
|
|
|
240 |
85 \endverbatim
|
182 |
kaklik |
241 |
GAS LISTING /tmp/ccCMjSjd.s page 5
|
174 |
kaklik |
242 |
|
|
|
243 |
|
|
|
244 |
86
|
|
|
245 |
87 \code
|
|
|
246 |
87
|
|
|
247 |
88 #ifndef __AVR_HAVE_MOVW__
|
|
|
248 |
89 # if defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
|
|
|
249 |
90 # define __AVR_HAVE_MOVW__ 1
|
|
|
250 |
91 # endif
|
|
|
251 |
92 #endif
|
|
|
252 |
93
|
|
|
253 |
94 #ifndef __AVR_HAVE_LPMX__
|
|
|
254 |
95 # if defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
|
|
|
255 |
96 # define __AVR_HAVE_LPMX__ 1
|
|
|
256 |
97 # endif
|
|
|
257 |
98 #endif
|
|
|
258 |
99
|
|
|
259 |
100 /*
|
|
|
260 |
101 * Registers common to all AVR devices.
|
|
|
261 |
102 */
|
|
|
262 |
103
|
|
|
263 |
104 #if __AVR_ARCH__ != 1
|
|
|
264 |
105 /*
|
|
|
265 |
106 * AVR architecture 1 has no RAM, thus no stack pointer.
|
|
|
266 |
107 *
|
|
|
267 |
108 * All other archs do have a stack pointer. Some devices have only
|
|
|
268 |
109 * less than 256 bytes of possible RAM locations (128 Bytes of SRAM
|
|
|
269 |
110 * and no option for external RAM), thus SPH is officially "reserved"
|
|
|
270 |
111 * for them. We catch this case below after including the
|
|
|
271 |
112 * device-specific ioXXXX.h file, by examining XRAMEND, and
|
|
|
272 |
113 * #undef-ining SP and SPH in that case.
|
|
|
273 |
114 */
|
|
|
274 |
115 /* Stack Pointer */
|
|
|
275 |
116 #define SP _SFR_IO16(0x3D)
|
|
|
276 |
117 #define SPL _SFR_IO8(0x3D)
|
|
|
277 |
118 #define SPH _SFR_IO8(0x3E)
|
|
|
278 |
119 #endif /* #if __AVR_ARCH__ != 1 */
|
|
|
279 |
120
|
|
|
280 |
121 /* Status REGister */
|
|
|
281 |
122 #define SREG _SFR_IO8(0x3F)
|
|
|
282 |
123
|
|
|
283 |
124 /* Status Register - SREG */
|
|
|
284 |
125 #define SREG_I 7
|
|
|
285 |
126 #define SREG_T 6
|
|
|
286 |
127 #define SREG_H 5
|
|
|
287 |
128 #define SREG_S 4
|
|
|
288 |
129 #define SREG_V 3
|
|
|
289 |
130 #define SREG_N 2
|
|
|
290 |
131 #define SREG_Z 1
|
|
|
291 |
132 #define SREG_C 0
|
|
|
292 |
133
|
|
|
293 |
134 /* Pointer definition */
|
|
|
294 |
135 #if __AVR_ARCH__ != 1
|
|
|
295 |
136 /* avr1 has only the Z pointer */
|
|
|
296 |
137 #define XL r26
|
|
|
297 |
138 #define XH r27
|
|
|
298 |
139 #define YL r28
|
|
|
299 |
140 #define YH r29
|
|
|
300 |
141 #endif /* #if __AVR_ARCH__ != 1 */
|
182 |
kaklik |
301 |
GAS LISTING /tmp/ccCMjSjd.s page 6
|
174 |
kaklik |
302 |
|
|
|
303 |
|
|
|
304 |
142 #define ZL r30
|
|
|
305 |
143 #define ZH r31
|
|
|
306 |
144
|
|
|
307 |
145 /*
|
|
|
308 |
146 * Only few devices come without EEPROM. In order to assemble the
|
|
|
309 |
147 * EEPROM library components without defining a specific device, we
|
|
|
310 |
148 * keep the EEPROM-related definitions here.
|
|
|
311 |
149 */
|
|
|
312 |
150 #if defined(__COMPILING_AVR_LIBC__)
|
|
|
313 |
151
|
|
|
314 |
152 /* EEPROM Control Register */
|
|
|
315 |
153 #define EECR _SFR_IO8(0x1C)
|
|
|
316 |
154
|
|
|
317 |
155 /* EEPROM Data Register */
|
|
|
318 |
156 #define EEDR _SFR_IO8(0x1D)
|
|
|
319 |
157
|
|
|
320 |
158 /* EEPROM Address Register */
|
|
|
321 |
159 #define EEAR _SFR_IO16(0x1E)
|
|
|
322 |
160 #define EEARL _SFR_IO8(0x1E)
|
|
|
323 |
161 #define EEARH _SFR_IO8(0x1F)
|
|
|
324 |
162
|
|
|
325 |
163 /* EEPROM Control Register */
|
|
|
326 |
164 #define EERIE 3
|
|
|
327 |
165 #define EEMWE 2
|
|
|
328 |
166 #define EEWE 1
|
|
|
329 |
167 #define EERE 0
|
|
|
330 |
168
|
|
|
331 |
169 #endif /* __COMPILING_AVR_LIBC__ */
|
|
|
332 |
170
|
|
|
333 |
171 #if defined (__AVR_AT94K__)
|
|
|
334 |
172 # include <avr/ioat94k.h>
|
|
|
335 |
173 #elif defined (__AVR_AT43USB320__)
|
|
|
336 |
174 # include <avr/io43u32x.h>
|
|
|
337 |
175 #elif defined (__AVR_AT43USB355__)
|
|
|
338 |
176 # include <avr/io43u35x.h>
|
|
|
339 |
177 #elif defined (__AVR_AT76C711__)
|
|
|
340 |
178 # include <avr/io76c711.h>
|
|
|
341 |
179 #elif defined (__AVR_AT86RF401__)
|
|
|
342 |
180 # include <avr/io86r401.h>
|
|
|
343 |
181 #elif defined (__AVR_AT90PWM2__)
|
|
|
344 |
182 # include <avr/io90pwmx.h>
|
|
|
345 |
183 #elif defined (__AVR_AT90PWM3__)
|
|
|
346 |
184 # include <avr/io90pwmx.h>
|
|
|
347 |
185 #elif defined (__AVR_ATmega128__)
|
|
|
348 |
186 # include <avr/iom128.h>
|
|
|
349 |
187 #elif defined (__AVR_ATmega1280__)
|
|
|
350 |
188 # include <avr/iom1280.h>
|
|
|
351 |
189 #elif defined (__AVR_ATmega1281__)
|
|
|
352 |
190 # include <avr/iom1281.h>
|
|
|
353 |
191 #elif defined (__AVR_AT90CAN32__)
|
|
|
354 |
192 # include <avr/iocan32.h>
|
|
|
355 |
193 #elif defined (__AVR_AT90CAN64__)
|
|
|
356 |
194 # include <avr/iocan64.h>
|
|
|
357 |
195 #elif defined (__AVR_AT90CAN128__)
|
|
|
358 |
196 # include <avr/iocan128.h>
|
|
|
359 |
197 #elif defined (__AVR_AT90USB646__)
|
|
|
360 |
198 # include <avr/iousb646.h>
|
182 |
kaklik |
361 |
GAS LISTING /tmp/ccCMjSjd.s page 7
|
174 |
kaklik |
362 |
|
|
|
363 |
|
|
|
364 |
199 #elif defined (__AVR_AT90USB647__)
|
|
|
365 |
200 # include <avr/iousb647.h>
|
|
|
366 |
201 #elif defined (__AVR_AT90USB1286__)
|
|
|
367 |
202 # include <avr/iousb1286.h>
|
|
|
368 |
203 #elif defined (__AVR_AT90USB1287__)
|
|
|
369 |
204 # include <avr/iousb1287.h>
|
|
|
370 |
205 #elif defined (__AVR_ATmega64__)
|
|
|
371 |
206 # include <avr/iom64.h>
|
|
|
372 |
207 #elif defined (__AVR_ATmega640__)
|
|
|
373 |
208 # include <avr/iom640.h>
|
|
|
374 |
209 #elif defined (__AVR_ATmega644__)
|
|
|
375 |
210 # include <avr/iom644.h>
|
|
|
376 |
211 #elif defined (__AVR_ATmega644P__)
|
|
|
377 |
212 # include <avr/iom644.h>
|
|
|
378 |
213 #elif defined (__AVR_ATmega645__)
|
|
|
379 |
214 # include <avr/iom645.h>
|
|
|
380 |
215 #elif defined (__AVR_ATmega6450__)
|
|
|
381 |
216 # include <avr/iom6450.h>
|
|
|
382 |
217 #elif defined (__AVR_ATmega649__)
|
|
|
383 |
218 # include <avr/iom649.h>
|
|
|
384 |
219 #elif defined (__AVR_ATmega6490__)
|
|
|
385 |
220 # include <avr/iom6490.h>
|
|
|
386 |
221 #elif defined (__AVR_ATmega103__)
|
|
|
387 |
222 # include <avr/iom103.h>
|
|
|
388 |
223 #elif defined (__AVR_ATmega32__)
|
|
|
389 |
224 # include <avr/iom32.h>
|
|
|
390 |
225 #elif defined (__AVR_ATmega323__)
|
|
|
391 |
226 # include <avr/iom323.h>
|
|
|
392 |
227 #elif defined (__AVR_ATmega324P__)
|
|
|
393 |
228 # include <avr/iom324.h>
|
|
|
394 |
229 #elif defined (__AVR_ATmega325__)
|
|
|
395 |
230 # include <avr/iom325.h>
|
|
|
396 |
231 #elif defined (__AVR_ATmega3250__)
|
|
|
397 |
232 # include <avr/iom3250.h>
|
|
|
398 |
233 #elif defined (__AVR_ATmega329__)
|
|
|
399 |
234 # include <avr/iom329.h>
|
|
|
400 |
235 #elif defined (__AVR_ATmega3290__)
|
|
|
401 |
236 # include <avr/iom3290.h>
|
|
|
402 |
237 #elif defined (__AVR_ATmega406__)
|
|
|
403 |
238 # include <avr/iom406.h>
|
|
|
404 |
239 #elif defined (__AVR_ATmega16__)
|
|
|
405 |
240 # include <avr/iom16.h>
|
|
|
406 |
241 #elif defined (__AVR_ATmega161__)
|
|
|
407 |
242 # include <avr/iom161.h>
|
|
|
408 |
243 #elif defined (__AVR_ATmega162__)
|
|
|
409 |
244 # include <avr/iom162.h>
|
|
|
410 |
245 #elif defined (__AVR_ATmega163__)
|
|
|
411 |
246 # include <avr/iom163.h>
|
|
|
412 |
247 #elif defined (__AVR_ATmega164P__)
|
|
|
413 |
248 # include <avr/iom164.h>
|
|
|
414 |
249 #elif defined (__AVR_ATmega165__)
|
|
|
415 |
250 # include <avr/iom165.h>
|
|
|
416 |
251 #elif defined (__AVR_ATmega168__)
|
|
|
417 |
252 # include <avr/iom168.h>
|
|
|
418 |
253 #elif defined (__AVR_ATmega169__)
|
|
|
419 |
254 # include <avr/iom169.h>
|
|
|
420 |
255 #elif defined (__AVR_ATmega8__)
|
182 |
kaklik |
421 |
GAS LISTING /tmp/ccCMjSjd.s page 8
|
174 |
kaklik |
422 |
|
|
|
423 |
|
|
|
424 |
256 # include <avr/iom8.h>
|
|
|
425 |
1 /* Copyright (c) 2002, Marek Michalkiewicz
|
|
|
426 |
2 All rights reserved.
|
|
|
427 |
3
|
|
|
428 |
4 Redistribution and use in source and binary forms, with or without
|
|
|
429 |
5 modification, are permitted provided that the following conditions are met:
|
|
|
430 |
6
|
|
|
431 |
7 * Redistributions of source code must retain the above copyright
|
|
|
432 |
8 notice, this list of conditions and the following disclaimer.
|
|
|
433 |
9
|
|
|
434 |
10 * Redistributions in binary form must reproduce the above copyright
|
|
|
435 |
11 notice, this list of conditions and the following disclaimer in
|
|
|
436 |
12 the documentation and/or other materials provided with the
|
|
|
437 |
13 distribution.
|
|
|
438 |
14
|
|
|
439 |
15 * Neither the name of the copyright holders nor the names of
|
|
|
440 |
16 contributors may be used to endorse or promote products derived
|
|
|
441 |
17 from this software without specific prior written permission.
|
|
|
442 |
18
|
|
|
443 |
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
444 |
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
445 |
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
446 |
22 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
447 |
23 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
448 |
24 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
449 |
25 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
450 |
26 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
451 |
27 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
452 |
28 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
453 |
29 POSSIBILITY OF SUCH DAMAGE. */
|
|
|
454 |
30
|
|
|
455 |
31 /* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */
|
|
|
456 |
32
|
|
|
457 |
33 /* avr/iom8.h - definitions for ATmega8 */
|
|
|
458 |
34
|
|
|
459 |
35 #ifndef _AVR_IOM8_H_
|
|
|
460 |
36 #define _AVR_IOM8_H_ 1
|
|
|
461 |
37
|
|
|
462 |
38 /* This file should only be included from <avr/io.h>, never directly. */
|
|
|
463 |
39
|
|
|
464 |
40 #ifndef _AVR_IO_H_
|
|
|
465 |
41 # error "Include <avr/io.h> instead of this file."
|
|
|
466 |
42 #endif
|
|
|
467 |
43
|
|
|
468 |
44 #ifndef _AVR_IOXXX_H_
|
|
|
469 |
45 # define _AVR_IOXXX_H_ "iom8.h"
|
|
|
470 |
46 #else
|
|
|
471 |
47 # error "Attempt to include more than one <avr/ioXXX.h> file."
|
|
|
472 |
48 #endif
|
|
|
473 |
49
|
|
|
474 |
50 /* I/O registers */
|
|
|
475 |
51
|
|
|
476 |
52 /* TWI stands for "Two Wire Interface" or "TWI Was I2C(tm)" */
|
|
|
477 |
53 #define TWBR _SFR_IO8(0x00)
|
|
|
478 |
54 #define TWSR _SFR_IO8(0x01)
|
|
|
479 |
55 #define TWAR _SFR_IO8(0x02)
|
|
|
480 |
56 #define TWDR _SFR_IO8(0x03)
|
182 |
kaklik |
481 |
GAS LISTING /tmp/ccCMjSjd.s page 9
|
174 |
kaklik |
482 |
|
|
|
483 |
|
|
|
484 |
57
|
|
|
485 |
58 /* ADC */
|
|
|
486 |
59 #define ADCW _SFR_IO16(0x04)
|
|
|
487 |
60 #ifndef __ASSEMBLER__
|
|
|
488 |
61 #define ADC _SFR_IO16(0x04)
|
|
|
489 |
62 #endif
|
|
|
490 |
63 #define ADCL _SFR_IO8(0x04)
|
|
|
491 |
64 #define ADCH _SFR_IO8(0x05)
|
|
|
492 |
65 #define ADCSR _SFR_IO8(0x06)
|
|
|
493 |
66 #define ADCSRA _SFR_IO8(0x06) /* Changed in 2486H-AVR-09/02 */
|
|
|
494 |
67 #define ADMUX _SFR_IO8(0x07)
|
|
|
495 |
68
|
|
|
496 |
69 /* analog comparator */
|
|
|
497 |
70 #define ACSR _SFR_IO8(0x08)
|
|
|
498 |
71
|
|
|
499 |
72 /* USART */
|
|
|
500 |
73 #define UBRRL _SFR_IO8(0x09)
|
|
|
501 |
74 #define UCSRB _SFR_IO8(0x0A)
|
|
|
502 |
75 #define UCSRA _SFR_IO8(0x0B)
|
|
|
503 |
76 #define UDR _SFR_IO8(0x0C)
|
|
|
504 |
77
|
|
|
505 |
78 /* SPI */
|
|
|
506 |
79 #define SPCR _SFR_IO8(0x0D)
|
|
|
507 |
80 #define SPSR _SFR_IO8(0x0E)
|
|
|
508 |
81 #define SPDR _SFR_IO8(0x0F)
|
|
|
509 |
82
|
|
|
510 |
83 /* Port D */
|
|
|
511 |
84 #define PIND _SFR_IO8(0x10)
|
|
|
512 |
85 #define DDRD _SFR_IO8(0x11)
|
|
|
513 |
86 #define PORTD _SFR_IO8(0x12)
|
|
|
514 |
87
|
|
|
515 |
88 /* Port C */
|
|
|
516 |
89 #define PINC _SFR_IO8(0x13)
|
|
|
517 |
90 #define DDRC _SFR_IO8(0x14)
|
|
|
518 |
91 #define PORTC _SFR_IO8(0x15)
|
|
|
519 |
92
|
|
|
520 |
93 /* Port B */
|
|
|
521 |
94 #define PINB _SFR_IO8(0x16)
|
|
|
522 |
95 #define DDRB _SFR_IO8(0x17)
|
|
|
523 |
96 #define PORTB _SFR_IO8(0x18)
|
|
|
524 |
97
|
|
|
525 |
98 /* EEPROM Control Register */
|
|
|
526 |
99 #define EECR _SFR_IO8(0x1C)
|
|
|
527 |
100
|
|
|
528 |
101 /* EEPROM Data Register */
|
|
|
529 |
102 #define EEDR _SFR_IO8(0x1D)
|
|
|
530 |
103
|
|
|
531 |
104 /* EEPROM Address Register */
|
|
|
532 |
105 #define EEAR _SFR_IO16(0x1E)
|
|
|
533 |
106 #define EEARL _SFR_IO8(0x1E)
|
|
|
534 |
107 #define EEARH _SFR_IO8(0x1F)
|
|
|
535 |
108
|
|
|
536 |
109 #define UCSRC _SFR_IO8(0x20)
|
|
|
537 |
110 #define UBRRH _SFR_IO8(0x20)
|
|
|
538 |
111
|
|
|
539 |
112 #define WDTCR _SFR_IO8(0x21)
|
|
|
540 |
113 #define ASSR _SFR_IO8(0x22)
|
182 |
kaklik |
541 |
GAS LISTING /tmp/ccCMjSjd.s page 10
|
174 |
kaklik |
542 |
|
|
|
543 |
|
|
|
544 |
114
|
|
|
545 |
115 /* Timer 2 */
|
|
|
546 |
116 #define OCR2 _SFR_IO8(0x23)
|
|
|
547 |
117 #define TCNT2 _SFR_IO8(0x24)
|
|
|
548 |
118 #define TCCR2 _SFR_IO8(0x25)
|
|
|
549 |
119
|
|
|
550 |
120 /* Timer 1 */
|
|
|
551 |
121 #define ICR1 _SFR_IO16(0x26)
|
|
|
552 |
122 #define ICR1L _SFR_IO8(0x26)
|
|
|
553 |
123 #define ICR1H _SFR_IO8(0x27)
|
|
|
554 |
124 #define OCR1B _SFR_IO16(0x28)
|
|
|
555 |
125 #define OCR1BL _SFR_IO8(0x28)
|
|
|
556 |
126 #define OCR1BH _SFR_IO8(0x29)
|
|
|
557 |
127 #define OCR1A _SFR_IO16(0x2A)
|
|
|
558 |
128 #define OCR1AL _SFR_IO8(0x2A)
|
|
|
559 |
129 #define OCR1AH _SFR_IO8(0x2B)
|
|
|
560 |
130 #define TCNT1 _SFR_IO16(0x2C)
|
|
|
561 |
131 #define TCNT1L _SFR_IO8(0x2C)
|
|
|
562 |
132 #define TCNT1H _SFR_IO8(0x2D)
|
|
|
563 |
133 #define TCCR1B _SFR_IO8(0x2E)
|
|
|
564 |
134 #define TCCR1A _SFR_IO8(0x2F)
|
|
|
565 |
135
|
|
|
566 |
136 #define SFIOR _SFR_IO8(0x30)
|
|
|
567 |
137
|
|
|
568 |
138 #define OSCCAL _SFR_IO8(0x31)
|
|
|
569 |
139
|
|
|
570 |
140 /* Timer 0 */
|
|
|
571 |
141 #define TCNT0 _SFR_IO8(0x32)
|
|
|
572 |
142 #define TCCR0 _SFR_IO8(0x33)
|
|
|
573 |
143
|
|
|
574 |
144 #define MCUCSR _SFR_IO8(0x34)
|
|
|
575 |
145 #define MCUCR _SFR_IO8(0x35)
|
|
|
576 |
146
|
|
|
577 |
147 #define TWCR _SFR_IO8(0x36)
|
|
|
578 |
148
|
|
|
579 |
149 #define SPMCR _SFR_IO8(0x37)
|
|
|
580 |
150
|
|
|
581 |
151 #define TIFR _SFR_IO8(0x38)
|
|
|
582 |
152 #define TIMSK _SFR_IO8(0x39)
|
|
|
583 |
153
|
|
|
584 |
154 #define GIFR _SFR_IO8(0x3A)
|
|
|
585 |
155 #define GIMSK _SFR_IO8(0x3B)
|
|
|
586 |
156 #define GICR _SFR_IO8(0x3B) /* Changed in 2486H-AVR-09/02 */
|
|
|
587 |
157
|
|
|
588 |
158 /* 0x3C reserved (OCR0?) */
|
|
|
589 |
159
|
|
|
590 |
160 /* 0x3D..0x3E SP */
|
|
|
591 |
161
|
|
|
592 |
162 /* 0x3F SREG */
|
|
|
593 |
163
|
|
|
594 |
164 /* Interrupt vectors */
|
|
|
595 |
165
|
|
|
596 |
166 /* External Interrupt Request 0 */
|
|
|
597 |
167 #define INT0_vect _VECTOR(1)
|
|
|
598 |
168 #define SIG_INTERRUPT0 _VECTOR(1)
|
|
|
599 |
169
|
|
|
600 |
170 /* External Interrupt Request 1 */
|
182 |
kaklik |
601 |
GAS LISTING /tmp/ccCMjSjd.s page 11
|
174 |
kaklik |
602 |
|
|
|
603 |
|
|
|
604 |
171 #define INT1_vect _VECTOR(2)
|
|
|
605 |
172 #define SIG_INTERRUPT1 _VECTOR(2)
|
|
|
606 |
173
|
|
|
607 |
174 /* Timer/Counter2 Compare Match */
|
|
|
608 |
175 #define TIMER2_COMP_vect _VECTOR(3)
|
|
|
609 |
176 #define SIG_OUTPUT_COMPARE2 _VECTOR(3)
|
|
|
610 |
177
|
|
|
611 |
178 /* Timer/Counter2 Overflow */
|
|
|
612 |
179 #define TIMER2_OVF_vect _VECTOR(4)
|
|
|
613 |
180 #define SIG_OVERFLOW2 _VECTOR(4)
|
|
|
614 |
181
|
|
|
615 |
182 /* Timer/Counter1 Capture Event */
|
|
|
616 |
183 #define TIMER1_CAPT_vect _VECTOR(5)
|
|
|
617 |
184 #define SIG_INPUT_CAPTURE1 _VECTOR(5)
|
|
|
618 |
185
|
|
|
619 |
186 /* Timer/Counter1 Compare Match A */
|
|
|
620 |
187 #define TIMER1_COMPA_vect _VECTOR(6)
|
|
|
621 |
188 #define SIG_OUTPUT_COMPARE1A _VECTOR(6)
|
|
|
622 |
189
|
|
|
623 |
190 /* Timer/Counter1 Compare Match B */
|
|
|
624 |
191 #define TIMER1_COMPB_vect _VECTOR(7)
|
|
|
625 |
192 #define SIG_OUTPUT_COMPARE1B _VECTOR(7)
|
|
|
626 |
193
|
|
|
627 |
194 /* Timer/Counter1 Overflow */
|
|
|
628 |
195 #define TIMER1_OVF_vect _VECTOR(8)
|
|
|
629 |
196 #define SIG_OVERFLOW1 _VECTOR(8)
|
|
|
630 |
197
|
|
|
631 |
198 /* Timer/Counter0 Overflow */
|
|
|
632 |
199 #define TIMER0_OVF_vect _VECTOR(9)
|
|
|
633 |
200 #define SIG_OVERFLOW0 _VECTOR(9)
|
|
|
634 |
201
|
|
|
635 |
202 /* Serial Transfer Complete */
|
|
|
636 |
203 #define SPI_STC_vect _VECTOR(10)
|
|
|
637 |
204 #define SIG_SPI _VECTOR(10)
|
|
|
638 |
205
|
|
|
639 |
206 /* USART, Rx Complete */
|
|
|
640 |
207 #define USART_RXC_vect _VECTOR(11)
|
|
|
641 |
208 #define SIG_UART_RECV _VECTOR(11)
|
|
|
642 |
209
|
|
|
643 |
210 /* USART Data Register Empty */
|
|
|
644 |
211 #define USART_UDRE_vect _VECTOR(12)
|
|
|
645 |
212 #define SIG_UART_DATA _VECTOR(12)
|
|
|
646 |
213
|
|
|
647 |
214 /* USART, Tx Complete */
|
|
|
648 |
215 #define USART_TXC_vect _VECTOR(13)
|
|
|
649 |
216 #define SIG_UART_TRANS _VECTOR(13)
|
|
|
650 |
217
|
|
|
651 |
218 /* ADC Conversion Complete */
|
|
|
652 |
219 #define ADC_vect _VECTOR(14)
|
|
|
653 |
220 #define SIG_ADC _VECTOR(14)
|
|
|
654 |
221
|
|
|
655 |
222 /* EEPROM Ready */
|
|
|
656 |
223 #define EE_RDY_vect _VECTOR(15)
|
|
|
657 |
224 #define SIG_EEPROM_READY _VECTOR(15)
|
|
|
658 |
225
|
|
|
659 |
226 /* Analog Comparator */
|
|
|
660 |
227 #define ANA_COMP_vect _VECTOR(16)
|
182 |
kaklik |
661 |
GAS LISTING /tmp/ccCMjSjd.s page 12
|
174 |
kaklik |
662 |
|
|
|
663 |
|
|
|
664 |
228 #define SIG_COMPARATOR _VECTOR(16)
|
|
|
665 |
229
|
|
|
666 |
230 /* 2-wire Serial Interface */
|
|
|
667 |
231 #define TWI_vect _VECTOR(17)
|
|
|
668 |
232 #define SIG_2WIRE_SERIAL _VECTOR(17)
|
|
|
669 |
233
|
|
|
670 |
234 /* Store Program Memory Ready */
|
|
|
671 |
235 #define SPM_RDY_vect _VECTOR(18)
|
|
|
672 |
236 #define SIG_SPM_READY _VECTOR(18)
|
|
|
673 |
237
|
|
|
674 |
238 #define _VECTORS_SIZE 38
|
|
|
675 |
239
|
|
|
676 |
240 /* Bit numbers */
|
|
|
677 |
241
|
|
|
678 |
242 /* GIMSK / GICR */
|
|
|
679 |
243 #define INT1 7
|
|
|
680 |
244 #define INT0 6
|
|
|
681 |
245 #define IVSEL 1
|
|
|
682 |
246 #define IVCE 0
|
|
|
683 |
247
|
|
|
684 |
248 /* GIFR */
|
|
|
685 |
249 #define INTF1 7
|
|
|
686 |
250 #define INTF0 6
|
|
|
687 |
251
|
|
|
688 |
252 /* TIMSK */
|
|
|
689 |
253 #define OCIE2 7
|
|
|
690 |
254 #define TOIE2 6
|
|
|
691 |
255 #define TICIE1 5
|
|
|
692 |
256 #define OCIE1A 4
|
|
|
693 |
257 #define OCIE1B 3
|
|
|
694 |
257 #elif defined (__AVR_ATmega48__)
|
|
|
695 |
258 # include <avr/iom48.h>
|
|
|
696 |
259 #elif defined (__AVR_ATmega88__)
|
|
|
697 |
260 # include <avr/iom88.h>
|
|
|
698 |
261 #elif defined (__AVR_ATmega8515__)
|
|
|
699 |
262 # include <avr/iom8515.h>
|
|
|
700 |
263 #elif defined (__AVR_ATmega8535__)
|
|
|
701 |
264 # include <avr/iom8535.h>
|
|
|
702 |
265 #elif defined (__AVR_AT90S8535__)
|
|
|
703 |
266 # include <avr/io8535.h>
|
|
|
704 |
267 #elif defined (__AVR_AT90C8534__)
|
|
|
705 |
268 # include <avr/io8534.h>
|
|
|
706 |
269 #elif defined (__AVR_AT90S8515__)
|
|
|
707 |
270 # include <avr/io8515.h>
|
|
|
708 |
271 #elif defined (__AVR_AT90S4434__)
|
|
|
709 |
272 # include <avr/io4434.h>
|
|
|
710 |
273 #elif defined (__AVR_AT90S4433__)
|
|
|
711 |
274 # include <avr/io4433.h>
|
|
|
712 |
275 #elif defined (__AVR_AT90S4414__)
|
|
|
713 |
276 # include <avr/io4414.h>
|
|
|
714 |
277 #elif defined (__AVR_ATtiny22__)
|
|
|
715 |
278 # include <avr/iotn22.h>
|
|
|
716 |
279 #elif defined (__AVR_ATtiny26__)
|
|
|
717 |
280 # include <avr/iotn26.h>
|
|
|
718 |
281 #elif defined (__AVR_AT90S2343__)
|
|
|
719 |
282 # include <avr/io2343.h>
|
|
|
720 |
283 #elif defined (__AVR_AT90S2333__)
|
182 |
kaklik |
721 |
GAS LISTING /tmp/ccCMjSjd.s page 13
|
174 |
kaklik |
722 |
|
|
|
723 |
|
|
|
724 |
284 # include <avr/io2333.h>
|
|
|
725 |
285 #elif defined (__AVR_AT90S2323__)
|
|
|
726 |
286 # include <avr/io2323.h>
|
|
|
727 |
287 #elif defined (__AVR_AT90S2313__)
|
|
|
728 |
288 # include <avr/io2313.h>
|
|
|
729 |
289 #elif defined (__AVR_ATtiny2313__)
|
|
|
730 |
290 # include <avr/iotn2313.h>
|
|
|
731 |
291 #elif defined (__AVR_ATtiny13__)
|
|
|
732 |
292 # include <avr/iotn13.h>
|
|
|
733 |
293 #elif defined (__AVR_ATtiny25__)
|
|
|
734 |
294 # include <avr/iotn25.h>
|
|
|
735 |
295 #elif defined (__AVR_ATtiny45__)
|
|
|
736 |
296 # include <avr/iotn45.h>
|
|
|
737 |
297 #elif defined (__AVR_ATtiny85__)
|
|
|
738 |
298 # include <avr/iotn85.h>
|
|
|
739 |
299 #elif defined (__AVR_ATtiny24__)
|
|
|
740 |
300 # include <avr/iotn24.h>
|
|
|
741 |
301 #elif defined (__AVR_ATtiny44__)
|
|
|
742 |
302 # include <avr/iotn44.h>
|
|
|
743 |
303 #elif defined (__AVR_ATtiny84__)
|
|
|
744 |
304 # include <avr/iotn84.h>
|
|
|
745 |
305 #elif defined (__AVR_ATtiny261__)
|
|
|
746 |
306 # include <avr/iotn261.h>
|
|
|
747 |
307 #elif defined (__AVR_ATtiny461__)
|
|
|
748 |
308 # include <avr/iotn461.h>
|
|
|
749 |
309 #elif defined (__AVR_ATtiny861__)
|
|
|
750 |
310 # include <avr/iotn861.h>
|
|
|
751 |
311 /* avr1: the following only supported for assembler programs */
|
|
|
752 |
312 #elif defined (__AVR_ATtiny28__)
|
|
|
753 |
313 # include <avr/iotn28.h>
|
|
|
754 |
314 #elif defined (__AVR_AT90S1200__)
|
|
|
755 |
315 # include <avr/io1200.h>
|
|
|
756 |
316 #elif defined (__AVR_ATtiny15__)
|
|
|
757 |
317 # include <avr/iotn15.h>
|
|
|
758 |
318 #elif defined (__AVR_ATtiny12__)
|
|
|
759 |
319 # include <avr/iotn12.h>
|
|
|
760 |
320 #elif defined (__AVR_ATtiny11__)
|
|
|
761 |
321 # include <avr/iotn11.h>
|
|
|
762 |
322 #else
|
|
|
763 |
323 # if !defined(__COMPILING_AVR_LIBC__)
|
|
|
764 |
324 # warning "device type not defined"
|
|
|
765 |
325 # endif
|
|
|
766 |
326 #endif
|
|
|
767 |
327
|
|
|
768 |
328 #include <avr/portpins.h>
|
|
|
769 |
1 /* Copyright (c) 2003 Theodore A. Roth
|
|
|
770 |
2 All rights reserved.
|
|
|
771 |
3
|
|
|
772 |
4 Redistribution and use in source and binary forms, with or without
|
|
|
773 |
5 modification, are permitted provided that the following conditions are met:
|
|
|
774 |
6
|
|
|
775 |
7 * Redistributions of source code must retain the above copyright
|
|
|
776 |
8 notice, this list of conditions and the following disclaimer.
|
|
|
777 |
9
|
|
|
778 |
10 * Redistributions in binary form must reproduce the above copyright
|
|
|
779 |
11 notice, this list of conditions and the following disclaimer in
|
|
|
780 |
12 the documentation and/or other materials provided with the
|
182 |
kaklik |
781 |
GAS LISTING /tmp/ccCMjSjd.s page 14
|
174 |
kaklik |
782 |
|
|
|
783 |
|
|
|
784 |
13 distribution.
|
|
|
785 |
14
|
|
|
786 |
15 * Neither the name of the copyright holders nor the names of
|
|
|
787 |
16 contributors may be used to endorse or promote products derived
|
|
|
788 |
17 from this software without specific prior written permission.
|
|
|
789 |
18
|
|
|
790 |
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
791 |
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
792 |
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
793 |
22 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
794 |
23 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
795 |
24 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
796 |
25 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
797 |
26 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
798 |
27 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
799 |
28 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
800 |
29 POSSIBILITY OF SUCH DAMAGE. */
|
|
|
801 |
30
|
|
|
802 |
31 /* $Id: portpins.h,v 1.3.4.1 2006/03/10 16:22:38 aesok Exp $ */
|
|
|
803 |
32
|
|
|
804 |
33 #ifndef _AVR_PORTPINS_H_
|
|
|
805 |
34 #define _AVR_PORTPINS_H_ 1
|
|
|
806 |
35
|
|
|
807 |
36 /* This file should only be included from <avr/io.h>, never directly. */
|
|
|
808 |
37
|
|
|
809 |
38 #ifndef _AVR_IO_H_
|
|
|
810 |
39 # error "Include <avr/io.h> instead of this file."
|
|
|
811 |
40 #endif
|
|
|
812 |
41
|
|
|
813 |
42 /* Define Generic PORTn, DDn, and PINn values. */
|
|
|
814 |
43
|
|
|
815 |
44 /* Port Data Register (generic) */
|
|
|
816 |
45 #define PORT7 7
|
|
|
817 |
46 #define PORT6 6
|
|
|
818 |
47 #define PORT5 5
|
|
|
819 |
48 #define PORT4 4
|
|
|
820 |
49 #define PORT3 3
|
|
|
821 |
50 #define PORT2 2
|
|
|
822 |
51 #define PORT1 1
|
|
|
823 |
52 #define PORT0 0
|
|
|
824 |
53
|
|
|
825 |
54 /* Port Data Direction Register (generic) */
|
|
|
826 |
55 #define DD7 7
|
|
|
827 |
56 #define DD6 6
|
|
|
828 |
57 #define DD5 5
|
|
|
829 |
58 #define DD4 4
|
|
|
830 |
59 #define DD3 3
|
|
|
831 |
60 #define DD2 2
|
|
|
832 |
61 #define DD1 1
|
|
|
833 |
62 #define DD0 0
|
|
|
834 |
63
|
|
|
835 |
64 /* Port Input Pins (generic) */
|
|
|
836 |
65 #define PIN7 7
|
|
|
837 |
66 #define PIN6 6
|
|
|
838 |
67 #define PIN5 5
|
|
|
839 |
68 #define PIN4 4
|
|
|
840 |
69 #define PIN3 3
|
182 |
kaklik |
841 |
GAS LISTING /tmp/ccCMjSjd.s page 15
|
174 |
kaklik |
842 |
|
|
|
843 |
|
|
|
844 |
70 #define PIN2 2
|
|
|
845 |
71 #define PIN1 1
|
|
|
846 |
72 #define PIN0 0
|
|
|
847 |
73
|
|
|
848 |
74 /* Define PORTxn values for all possible port pins. */
|
|
|
849 |
75
|
|
|
850 |
76 /* PORT A */
|
|
|
851 |
77
|
|
|
852 |
78 #if defined(PA0)
|
|
|
853 |
79 # define PORTA0 PA0
|
|
|
854 |
80 #endif
|
|
|
855 |
81 #if defined(PA1)
|
|
|
856 |
82 # define PORTA1 PA1
|
|
|
857 |
83 #endif
|
|
|
858 |
84 #if defined(PA2)
|
|
|
859 |
85 # define PORTA2 PA2
|
|
|
860 |
86 #endif
|
|
|
861 |
87 #if defined(PA3)
|
|
|
862 |
88 # define PORTA3 PA3
|
|
|
863 |
89 #endif
|
|
|
864 |
90 #if defined(PA4)
|
|
|
865 |
91 # define PORTA4 PA4
|
|
|
866 |
92 #endif
|
|
|
867 |
93 #if defined(PA5)
|
|
|
868 |
94 # define PORTA5 PA5
|
|
|
869 |
95 #endif
|
|
|
870 |
96 #if defined(PA6)
|
|
|
871 |
97 # define PORTA6 PA6
|
|
|
872 |
98 #endif
|
|
|
873 |
99 #if defined(PA7)
|
|
|
874 |
100 # define PORTA7 PA7
|
|
|
875 |
101 #endif
|
|
|
876 |
102
|
|
|
877 |
103 /* PORT B */
|
|
|
878 |
104
|
|
|
879 |
105 #if defined(PB0)
|
|
|
880 |
106 # define PORTB0 PB0
|
|
|
881 |
107 #endif
|
|
|
882 |
108 #if defined(PB1)
|
|
|
883 |
109 # define PORTB1 PB1
|
|
|
884 |
110 #endif
|
|
|
885 |
111 #if defined(PB2)
|
|
|
886 |
112 # define PORTB2 PB2
|
|
|
887 |
113 #endif
|
|
|
888 |
114 #if defined(PB3)
|
|
|
889 |
115 # define PORTB3 PB3
|
|
|
890 |
116 #endif
|
|
|
891 |
117 #if defined(PB4)
|
|
|
892 |
118 # define PORTB4 PB4
|
|
|
893 |
119 #endif
|
|
|
894 |
120 #if defined(PB5)
|
|
|
895 |
121 # define PORTB5 PB5
|
|
|
896 |
122 #endif
|
|
|
897 |
123 #if defined(PB6)
|
|
|
898 |
124 # define PORTB6 PB6
|
|
|
899 |
125 #endif
|
|
|
900 |
126 #if defined(PB7)
|
182 |
kaklik |
901 |
GAS LISTING /tmp/ccCMjSjd.s page 16
|
174 |
kaklik |
902 |
|
|
|
903 |
|
|
|
904 |
127 # define PORTB7 PB7
|
|
|
905 |
128 #endif
|
|
|
906 |
129
|
|
|
907 |
130 /* PORT C */
|
|
|
908 |
131
|
|
|
909 |
132 #if defined(PC0)
|
|
|
910 |
133 # define PORTC0 PC0
|
|
|
911 |
134 #endif
|
|
|
912 |
135 #if defined(PC1)
|
|
|
913 |
136 # define PORTC1 PC1
|
|
|
914 |
137 #endif
|
|
|
915 |
138 #if defined(PC2)
|
|
|
916 |
139 # define PORTC2 PC2
|
|
|
917 |
140 #endif
|
|
|
918 |
141 #if defined(PC3)
|
|
|
919 |
142 # define PORTC3 PC3
|
|
|
920 |
143 #endif
|
|
|
921 |
144 #if defined(PC4)
|
|
|
922 |
145 # define PORTC4 PC4
|
|
|
923 |
146 #endif
|
|
|
924 |
147 #if defined(PC5)
|
|
|
925 |
148 # define PORTC5 PC5
|
|
|
926 |
149 #endif
|
|
|
927 |
150 #if defined(PC6)
|
|
|
928 |
151 # define PORTC6 PC6
|
|
|
929 |
152 #endif
|
|
|
930 |
153 #if defined(PC7)
|
|
|
931 |
154 # define PORTC7 PC7
|
|
|
932 |
155 #endif
|
|
|
933 |
156
|
|
|
934 |
157 /* PORT D */
|
|
|
935 |
158
|
|
|
936 |
159 #if defined(PD0)
|
|
|
937 |
160 # define PORTD0 PD0
|
|
|
938 |
161 #endif
|
|
|
939 |
162 #if defined(PD1)
|
|
|
940 |
163 # define PORTD1 PD1
|
|
|
941 |
164 #endif
|
|
|
942 |
165 #if defined(PD2)
|
|
|
943 |
166 # define PORTD2 PD2
|
|
|
944 |
167 #endif
|
|
|
945 |
168 #if defined(PD3)
|
|
|
946 |
169 # define PORTD3 PD3
|
|
|
947 |
170 #endif
|
|
|
948 |
171 #if defined(PD4)
|
|
|
949 |
172 # define PORTD4 PD4
|
|
|
950 |
173 #endif
|
|
|
951 |
174 #if defined(PD5)
|
|
|
952 |
175 # define PORTD5 PD5
|
|
|
953 |
176 #endif
|
|
|
954 |
177 #if defined(PD6)
|
|
|
955 |
178 # define PORTD6 PD6
|
|
|
956 |
179 #endif
|
|
|
957 |
180 #if defined(PD7)
|
|
|
958 |
181 # define PORTD7 PD7
|
|
|
959 |
182 #endif
|
|
|
960 |
183
|
182 |
kaklik |
961 |
GAS LISTING /tmp/ccCMjSjd.s page 17
|
174 |
kaklik |
962 |
|
|
|
963 |
|
|
|
964 |
184 /* PORT E */
|
|
|
965 |
185
|
|
|
966 |
186 #if defined(PE0)
|
|
|
967 |
187 # define PORTE0 PE0
|
|
|
968 |
188 #endif
|
|
|
969 |
189 #if defined(PE1)
|
|
|
970 |
190 # define PORTE1 PE1
|
|
|
971 |
191 #endif
|
|
|
972 |
192 #if defined(PE2)
|
|
|
973 |
193 # define PORTE2 PE2
|
|
|
974 |
194 #endif
|
|
|
975 |
195 #if defined(PE3)
|
|
|
976 |
196 # define PORTE3 PE3
|
|
|
977 |
197 #endif
|
|
|
978 |
198 #if defined(PE4)
|
|
|
979 |
199 # define PORTE4 PE4
|
|
|
980 |
200 #endif
|
|
|
981 |
201 #if defined(PE5)
|
|
|
982 |
202 # define PORTE5 PE5
|
|
|
983 |
203 #endif
|
|
|
984 |
204 #if defined(PE6)
|
|
|
985 |
205 # define PORTE6 PE6
|
|
|
986 |
206 #endif
|
|
|
987 |
207 #if defined(PE7)
|
|
|
988 |
208 # define PORTE7 PE7
|
|
|
989 |
209 #endif
|
|
|
990 |
210
|
|
|
991 |
211 /* PORT F */
|
|
|
992 |
212
|
|
|
993 |
213 #if defined(PF0)
|
|
|
994 |
214 # define PORTF0 PF0
|
|
|
995 |
215 #endif
|
|
|
996 |
216 #if defined(PF1)
|
|
|
997 |
217 # define PORTF1 PF1
|
|
|
998 |
218 #endif
|
|
|
999 |
219 #if defined(PF2)
|
|
|
1000 |
220 # define PORTF2 PF2
|
|
|
1001 |
221 #endif
|
|
|
1002 |
222 #if defined(PF3)
|
|
|
1003 |
223 # define PORTF3 PF3
|
|
|
1004 |
224 #endif
|
|
|
1005 |
225 #if defined(PF4)
|
|
|
1006 |
226 # define PORTF4 PF4
|
|
|
1007 |
227 #endif
|
|
|
1008 |
228 #if defined(PF5)
|
|
|
1009 |
229 # define PORTF5 PF5
|
|
|
1010 |
230 #endif
|
|
|
1011 |
231 #if defined(PF6)
|
|
|
1012 |
232 # define PORTF6 PF6
|
|
|
1013 |
233 #endif
|
|
|
1014 |
234 #if defined(PF7)
|
|
|
1015 |
235 # define PORTF7 PF7
|
|
|
1016 |
236 #endif
|
|
|
1017 |
237
|
|
|
1018 |
238 /* PORT G */
|
|
|
1019 |
239
|
|
|
1020 |
240 #if defined(PG0)
|
182 |
kaklik |
1021 |
GAS LISTING /tmp/ccCMjSjd.s page 18
|
174 |
kaklik |
1022 |
|
|
|
1023 |
|
|
|
1024 |
241 # define PORTG0 PG0
|
|
|
1025 |
242 #endif
|
|
|
1026 |
243 #if defined(PG1)
|
|
|
1027 |
244 # define PORTG1 PG1
|
|
|
1028 |
245 #endif
|
|
|
1029 |
246 #if defined(PG2)
|
|
|
1030 |
247 # define PORTG2 PG2
|
|
|
1031 |
248 #endif
|
|
|
1032 |
249 #if defined(PG3)
|
|
|
1033 |
250 # define PORTG3 PG3
|
|
|
1034 |
251 #endif
|
|
|
1035 |
252 #if defined(PG4)
|
|
|
1036 |
253 # define PORTG4 PG4
|
|
|
1037 |
254 #endif
|
|
|
1038 |
255 #if defined(PG5)
|
|
|
1039 |
256 # define PORTG5 PG5
|
|
|
1040 |
257 #endif
|
|
|
1041 |
258 #if defined(PG6)
|
|
|
1042 |
259 # define PORTG6 PG6
|
|
|
1043 |
260 #endif
|
|
|
1044 |
261 #if defined(PG7)
|
|
|
1045 |
262 # define PORTG7 PG7
|
|
|
1046 |
263 #endif
|
|
|
1047 |
264
|
|
|
1048 |
265 /* PORT H */
|
|
|
1049 |
266
|
|
|
1050 |
267 #if defined(PH0)
|
|
|
1051 |
268 # define PORTH0 PH0
|
|
|
1052 |
269 #endif
|
|
|
1053 |
270 #if defined(PH1)
|
|
|
1054 |
271 # define PORTH1 PH1
|
|
|
1055 |
272 #endif
|
|
|
1056 |
273 #if defined(PH2)
|
|
|
1057 |
274 # define PORTH2 PH2
|
|
|
1058 |
275 #endif
|
|
|
1059 |
276 #if defined(PH3)
|
|
|
1060 |
277 # define PORTH3 PH3
|
|
|
1061 |
278 #endif
|
|
|
1062 |
279 #if defined(PH4)
|
|
|
1063 |
280 # define PORTH4 PH4
|
|
|
1064 |
281 #endif
|
|
|
1065 |
282 #if defined(PH5)
|
|
|
1066 |
283 # define PORTH5 PH5
|
|
|
1067 |
284 #endif
|
|
|
1068 |
285 #if defined(PH6)
|
|
|
1069 |
286 # define PORTH6 PH6
|
|
|
1070 |
287 #endif
|
|
|
1071 |
288 #if defined(PH7)
|
|
|
1072 |
289 # define PORTH7 PH7
|
|
|
1073 |
290 #endif
|
|
|
1074 |
291
|
|
|
1075 |
292 /* PORT J */
|
|
|
1076 |
293
|
|
|
1077 |
294 #if defined(PJ0)
|
|
|
1078 |
295 # define PORTJ0 PJ0
|
|
|
1079 |
296 #endif
|
|
|
1080 |
297 #if defined(PJ1)
|
182 |
kaklik |
1081 |
GAS LISTING /tmp/ccCMjSjd.s page 19
|
174 |
kaklik |
1082 |
|
|
|
1083 |
|
|
|
1084 |
298 # define PORTJ1 PJ1
|
|
|
1085 |
299 #endif
|
|
|
1086 |
300 #if defined(PJ2)
|
|
|
1087 |
301 # define PORTJ2 PJ2
|
|
|
1088 |
302 #endif
|
|
|
1089 |
303 #if defined(PJ3)
|
|
|
1090 |
304 # define PORTJ3 PJ3
|
|
|
1091 |
305 #endif
|
|
|
1092 |
306 #if defined(PJ4)
|
|
|
1093 |
307 # define PORTJ4 PJ4
|
|
|
1094 |
308 #endif
|
|
|
1095 |
309 #if defined(PJ5)
|
|
|
1096 |
310 # define PORTJ5 PJ5
|
|
|
1097 |
311 #endif
|
|
|
1098 |
312 #if defined(PJ6)
|
|
|
1099 |
313 # define PORTJ6 PJ6
|
|
|
1100 |
314 #endif
|
|
|
1101 |
315 #if defined(PJ7)
|
|
|
1102 |
316 # define PORTJ7 PJ7
|
|
|
1103 |
317 #endif
|
|
|
1104 |
318
|
|
|
1105 |
319 /* PORT K */
|
|
|
1106 |
320
|
|
|
1107 |
321 #if defined(PK0)
|
|
|
1108 |
322 # define PORTK0 PK0
|
|
|
1109 |
323 #endif
|
|
|
1110 |
324 #if defined(PK1)
|
|
|
1111 |
325 # define PORTK1 PK1
|
|
|
1112 |
326 #endif
|
|
|
1113 |
327 #if defined(PK2)
|
|
|
1114 |
328 # define PORTK2 PK2
|
|
|
1115 |
329 #endif
|
|
|
1116 |
329
|
|
|
1117 |
330 #if __AVR_ARCH__ != 1
|
|
|
1118 |
331 # if XRAMEND < 0x100 && !defined(__COMPILING_AVR_LIBC__)
|
|
|
1119 |
332 # undef SP
|
|
|
1120 |
333 # define SP _SFR_IO8(0x3D)
|
|
|
1121 |
334 # undef SPH
|
|
|
1122 |
335 # endif
|
|
|
1123 |
336 #endif
|
|
|
1124 |
337
|
|
|
1125 |
338 #include <avr/version.h>
|
|
|
1126 |
1 /* Copyright (c) 2005, Joerg Wunsch -*- c -*-
|
|
|
1127 |
2 All rights reserved.
|
|
|
1128 |
3
|
|
|
1129 |
4 Redistribution and use in source and binary forms, with or without
|
|
|
1130 |
5 modification, are permitted provided that the following conditions are met:
|
|
|
1131 |
6
|
|
|
1132 |
7 * Redistributions of source code must retain the above copyright
|
|
|
1133 |
8 notice, this list of conditions and the following disclaimer.
|
|
|
1134 |
9
|
|
|
1135 |
10 * Redistributions in binary form must reproduce the above copyright
|
|
|
1136 |
11 notice, this list of conditions and the following disclaimer in
|
|
|
1137 |
12 the documentation and/or other materials provided with the
|
|
|
1138 |
13 distribution.
|
|
|
1139 |
14
|
|
|
1140 |
15 * Neither the name of the copyright holders nor the names of
|
182 |
kaklik |
1141 |
GAS LISTING /tmp/ccCMjSjd.s page 20
|
174 |
kaklik |
1142 |
|
|
|
1143 |
|
|
|
1144 |
16 contributors may be used to endorse or promote products derived
|
|
|
1145 |
17 from this software without specific prior written permission.
|
|
|
1146 |
18
|
|
|
1147 |
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
1148 |
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
1149 |
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
1150 |
22 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
1151 |
23 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
1152 |
24 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
1153 |
25 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
1154 |
26 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
1155 |
27 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
1156 |
28 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
1157 |
29 POSSIBILITY OF SUCH DAMAGE. */
|
|
|
1158 |
30
|
|
|
1159 |
31 /* $Id: version.h.in,v 1.1 2005/09/12 20:18:12 joerg_wunsch Exp $ */
|
|
|
1160 |
32
|
|
|
1161 |
33 /** \defgroup avr_version <avr/version.h>: avr-libc version macros
|
|
|
1162 |
34 \code #include <avr/version.h> \endcode
|
|
|
1163 |
35
|
|
|
1164 |
36 This header file defines macros that contain version numbers and
|
|
|
1165 |
37 strings describing the current version of avr-libc.
|
|
|
1166 |
38
|
|
|
1167 |
39 The version number itself basically consists of three pieces that
|
|
|
1168 |
40 are separated by a dot: the major number, the minor number, and
|
|
|
1169 |
41 the revision number. For development versions (which use an odd
|
|
|
1170 |
42 minor number), the string representation additionally gets the
|
|
|
1171 |
43 date code (YYYYMMDD) appended.
|
|
|
1172 |
44
|
|
|
1173 |
45 This file will also be included by \c <avr/io.h>. That way,
|
|
|
1174 |
46 portable tests can be implemented using \c <avr/io.h> that can be
|
|
|
1175 |
47 used in code that wants to remain backwards-compatible to library
|
|
|
1176 |
48 versions prior to the date when the library version API had been
|
|
|
1177 |
49 added, as referenced but undefined C preprocessor macros
|
|
|
1178 |
50 automatically evaluate to 0.
|
|
|
1179 |
51 */
|
|
|
1180 |
52
|
|
|
1181 |
53 #ifndef _AVR_VERSION_H_
|
|
|
1182 |
54 #define _AVR_VERSION_H_
|
|
|
1183 |
55
|
|
|
1184 |
56 /** \ingroup avr_version
|
|
|
1185 |
57 String literal representation of the current library version. */
|
|
|
1186 |
58 #define __AVR_LIBC_VERSION_STRING__ "1.4.4"
|
|
|
1187 |
59
|
|
|
1188 |
60 /** \ingroup avr_version
|
|
|
1189 |
61 Numerical representation of the current library version.
|
|
|
1190 |
62
|
|
|
1191 |
63 In the numerical representation, the major number is multiplied by
|
|
|
1192 |
64 10000, the minor number by 100, and all three parts are then
|
|
|
1193 |
65 added. It is intented to provide a monotonically increasing
|
|
|
1194 |
66 numerical value that can easily be used in numerical checks.
|
|
|
1195 |
67 */
|
|
|
1196 |
68 #define __AVR_LIBC_VERSION__ 10404UL
|
|
|
1197 |
69
|
|
|
1198 |
70 /** \ingroup avr_version
|
|
|
1199 |
71 String literal representation of the release date. */
|
|
|
1200 |
72 #define __AVR_LIBC_DATE_STRING__ "20060420"
|
182 |
kaklik |
1201 |
GAS LISTING /tmp/ccCMjSjd.s page 21
|
174 |
kaklik |
1202 |
|
|
|
1203 |
|
|
|
1204 |
73
|
|
|
1205 |
74 /** \ingroup avr_version
|
|
|
1206 |
75 Numerical representation of the release date. */
|
|
|
1207 |
76 #define __AVR_LIBC_DATE_ 20060420UL
|
|
|
1208 |
77
|
|
|
1209 |
78 /** \ingroup avr_version
|
|
|
1210 |
79 Library major version number. */
|
|
|
1211 |
80 #define __AVR_LIBC_MAJOR__ 1
|
|
|
1212 |
81
|
|
|
1213 |
82 /** \ingroup avr_version
|
|
|
1214 |
83 Library minor version number. */
|
|
|
1215 |
84 #define __AVR_LIBC_MINOR__ 4
|
|
|
1216 |
85
|
|
|
1217 |
86 /** \ingroup avr_version
|
|
|
1218 |
87 Library revision number. */
|
|
|
1219 |
88 #define __AVR_LIBC_REVISION__ 4
|
|
|
1220 |
89
|
|
|
1221 |
90 #endif /* _AVR_VERSION_H_ */
|
|
|
1222 |
91 ...
|
|
|
1223 |
339
|
151 |
kaklik |
1224 |
54 #include "Events.h"
|
|
|
1225 |
1 #ifndef EVENTS_H
|
|
|
1226 |
2 #define EVENTS_H
|
|
|
1227 |
3
|
|
|
1228 |
4 /*
|
|
|
1229 |
5 Copyright (C) 2004 John Orlando
|
|
|
1230 |
6
|
|
|
1231 |
7 AVRcam: a small real-time image processing engine.
|
|
|
1232 |
8
|
|
|
1233 |
9 This program is free software; you can redistribute it and/or
|
|
|
1234 |
10 modify it under the terms of the GNU General Public
|
|
|
1235 |
11 License as published by the Free Software Foundation; either
|
|
|
1236 |
12 version 2 of the License, or (at your option) any later version.
|
|
|
1237 |
13
|
|
|
1238 |
14 This program is distributed in the hope that it will be useful,
|
|
|
1239 |
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
1240 |
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
1241 |
17 General Public License for more details.
|
|
|
1242 |
18
|
|
|
1243 |
19 You should have received a copy of the GNU General Public
|
|
|
1244 |
20 License along with this program; if not, write to the Free Software
|
|
|
1245 |
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
1246 |
22
|
|
|
1247 |
23 For more information on the AVRcam, please contact:
|
|
|
1248 |
24
|
|
|
1249 |
25 john@jrobot.net
|
|
|
1250 |
26
|
|
|
1251 |
27 or go to www.jrobot.net for more details regarding the system.
|
|
|
1252 |
28 */
|
|
|
1253 |
29 /***********************************************************
|
|
|
1254 |
30 Module Name: Events.h
|
|
|
1255 |
31 Module Date: 05/23/2004
|
|
|
1256 |
32 Module Auth: John Orlando
|
|
|
1257 |
33
|
|
|
1258 |
34 Description: This file provides the external interface
|
|
|
1259 |
35 to the events that can be published/processed in the
|
|
|
1260 |
36 system. It is specifically by itself (and nothing
|
182 |
kaklik |
1261 |
GAS LISTING /tmp/ccCMjSjd.s page 22
|
174 |
kaklik |
1262 |
|
|
|
1263 |
|
151 |
kaklik |
1264 |
37 else should be defined in here) so that both .c and
|
|
|
1265 |
38 .S (assembly) files can include this file without
|
|
|
1266 |
39 a problem.
|
|
|
1267 |
40
|
|
|
1268 |
41 Revision History:
|
|
|
1269 |
42 Date Rel Ver. Notes
|
|
|
1270 |
43 4/10/2004 0.1 Module created
|
|
|
1271 |
44 6/30/2004 1.0 Initial release for Circuit Cellar
|
|
|
1272 |
45 contest.
|
|
|
1273 |
46 *******************************************************/
|
|
|
1274 |
47
|
|
|
1275 |
48 /* Definitions */
|
|
|
1276 |
49 /* Originally, all events were passed in a bitmask...however,
|
|
|
1277 |
50 an event FIFO was finally used, but the coding of the event
|
|
|
1278 |
51 definitions were never translated back....doesn't make a
|
|
|
1279 |
52 difference, but looks a little weird */
|
|
|
1280 |
53 #define EV_SERIAL_DATA_RECEIVED 0x01
|
|
|
1281 |
54 #define EV_DUMP_FRAME 0x02
|
|
|
1282 |
55 #define EV_PROCESS_FRAME_COMPLETE 0x04
|
|
|
1283 |
55
|
|
|
1284 |
56 .extern fastEventBitmask ; This is the flag used to indicate to the rest
|
|
|
1285 |
57 ; of the system that the line is complete
|
|
|
1286 |
58
|
|
|
1287 |
59 #define HREF_INTERRUPT_ENABLE_MASK 0x80
|
|
|
1288 |
60 #define HREF_INTERRUPT_DISABLE_MASK 0x7F
|
|
|
1289 |
61 #define ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0x04
|
|
|
1290 |
62 #define DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0xFB
|
|
|
1291 |
63 #define G_PORT _SFR_IO_ADDR(PINC)
|
|
|
1292 |
64 #define RB_PORT _SFR_IO_ADDR(PINB)
|
|
|
1293 |
65 #define PIXEL_RUN_START_INITIAL 0x50 ; This value causes our pixel counter (TCNT1)
|
|
|
1294 |
66 ; to overflow after 176 (horizontal) pixels
|
|
|
1295 |
67
|
|
|
1296 |
68 #define RED_MEM_OFFSET 0x00
|
|
|
1297 |
69 #define GREEN_MEM_OFFSET 0x10
|
|
|
1298 |
70 #define BLUE_MEM_OFFSET 0x20
|
|
|
1299 |
71
|
|
|
1300 |
72 ; A pixelBlock is defined as a contiguous group of 4 pixels that are combined
|
|
|
1301 |
73 ; together to form a specific color. Typically, this is formed by sampling a
|
|
|
1302 |
74 ; a green value, followed by a red and blue value (since we are dealing
|
|
|
1303 |
75 ; with Bayer color data). We could optionally sample a second green with
|
|
|
1304 |
76 ; the red and average the greens, because the eye is more sensitive to
|
|
|
1305 |
77 ; green, but for speed we don't do this. These three values (RGB) are then
|
|
|
1306 |
78 ; used as indices into the color membership lookup table (memLookup) to
|
|
|
1307 |
79 ; determine which color the pixelBlock maps into. The memLookup table is
|
|
|
1308 |
80 ; manually generated for now (though it will hopefully be modified over
|
|
|
1309 |
81 ; the serial interface eventually).
|
|
|
1310 |
82 ;
|
|
|
1311 |
83 ; Here is a pixel block:
|
|
|
1312 |
84 ; ...G G G G... (row x)
|
|
|
1313 |
85 ; ...B R B R... (row x+1)
|
|
|
1314 |
86 ; | | | |--this is skipped
|
|
|
1315 |
87 ; | | |--this is skipped
|
|
|
1316 |
88 ; | |--this is sampled
|
|
|
1317 |
89 ; |--this is sampled
|
|
|
1318 |
90
|
|
|
1319 |
91 ; As pixel blocks are sampled, the red, green, and blue values are
|
|
|
1320 |
92 ; used to index into their respective color maps. The color maps
|
182 |
kaklik |
1321 |
GAS LISTING /tmp/ccCMjSjd.s page 23
|
174 |
kaklik |
1322 |
|
|
|
1323 |
|
151 |
kaklik |
1324 |
93 ; return values that can be logically ANDed together so that a
|
|
|
1325 |
94 ; particular RGB triplet will result in a single bit being set
|
|
|
1326 |
95 ; after the AND operation. This single bit indicates which color
|
|
|
1327 |
96 ; the RGB triplet represents. It is also possible for no bits to
|
|
|
1328 |
97 ; be set after the AND process, indicating that the RGB triplet
|
|
|
1329 |
98 ; does not map to any of the colors configured in the color map.
|
|
|
1330 |
99 ; This isn't quite as fast as a pure RGB lookup table, but
|
|
|
1331 |
100 ; it then again it doesn't require 2^12 (4-bits for each color
|
|
|
1332 |
101 ; channel) bytes to store the lookup table. It takes just a few
|
|
|
1333 |
102 ; more cycles, and only requires 48 bytes of precious RAM (16
|
|
|
1334 |
103 ; per color channel, since our resolution on each color channel
|
|
|
1335 |
104 ; is only 4-bits). Not bad....for more information, see:
|
|
|
1336 |
105 ; http://www.cs.cmu.edu/~trb/papers/wirevision00.pdf for more
|
|
|
1337 |
106 ; information on this color segmentation technique.
|
|
|
1338 |
107
|
|
|
1339 |
108 ; One other note: this code does depend on the colorMap residing
|
|
|
1340 |
109 ; at a well-defined position in memory; specifically, it mus
|
|
|
1341 |
110 ; start at a 256-byte boundary so that the lowest byte in the
|
|
|
1342 |
111 ; map is set to 0x00. Currently, the colorMap is forced to
|
|
|
1343 |
112 ; start at RAM location 0x300. This could potentially be changed
|
|
|
1344 |
113 ; by the developer if needed, but offsets would have to be added
|
|
|
1345 |
114 ; in to the colorMap look-up code below to make it work.
|
|
|
1346 |
115
|
|
|
1347 |
116
|
|
|
1348 |
117 ; These are the registers that will be used throughout this
|
|
|
1349 |
118 ; module for acquiring each line of pixel data
|
|
|
1350 |
119 pixelCount = 16
|
|
|
1351 |
120 pixelRunStart = 17
|
|
|
1352 |
121 lastColor = 18
|
|
|
1353 |
122 tmp1 = 19 ; be sure to not use tmp1 and color simultaneously
|
|
|
1354 |
123 tmp2 = 20
|
|
|
1355 |
124 color = 19
|
|
|
1356 |
125 greenData = 20
|
|
|
1357 |
126 blueData = 21
|
|
|
1358 |
127 colorMapLow = 22
|
|
|
1359 |
128 colorMapHigh = 23
|
|
|
1360 |
129 prevLineBuffLow = 22 ; overlaps with memLookupLow (but orthogonal)
|
|
|
1361 |
130 prevLineBuffHigh = 23 ; overlaps with memLookupHigh (but orthogonal)
|
|
|
1362 |
131 currLineBuffLow = 24
|
|
|
1363 |
132 currLineBuffHigh = 25
|
|
|
1364 |
133
|
|
|
1365 |
134 .section .text
|
|
|
1366 |
135
|
|
|
1367 |
136 ; These are the global assembly function names that are accessed via other
|
|
|
1368 |
137 ; C functions
|
|
|
1369 |
138 .global CamIntAsm_waitForNewTrackingFrame
|
|
|
1370 |
139 .global CamIntAsm_waitForNewDumpFrame
|
|
|
1371 |
140 .global CamIntAsm_acquireDumpLine
|
|
|
1372 |
141 .global CamIntAsm_acquireTrackingLine
|
|
|
1373 |
142 .global SIG_INTERRUPT0
|
|
|
1374 |
143 .global SIG_INTERRUPT1
|
|
|
1375 |
144 .global SIG_OVERFLOW0
|
|
|
1376 |
145 .global SIG_OVERFLOW1
|
|
|
1377 |
146
|
|
|
1378 |
147 ;*****************************************************************
|
|
|
1379 |
148 ; Function Name: CamIntAsm_waitForNewTrackingFrame
|
|
|
1380 |
149 ; Function Description: This function is responsible for
|
182 |
kaklik |
1381 |
GAS LISTING /tmp/ccCMjSjd.s page 24
|
174 |
kaklik |
1382 |
|
|
|
1383 |
|
151 |
kaklik |
1384 |
150 ; going to sleep until a new frame begins (indicated by
|
|
|
1385 |
151 ; VSYNC transitioning from low to high. This will wake
|
|
|
1386 |
152 ; the "VSYNC sleep" up and allow it to continue with
|
|
|
1387 |
153 ; the acquireLine function, where the system waits for
|
|
|
1388 |
154 ; an "HREF sleep" that we use to synchronize with the
|
|
|
1389 |
155 ; data.
|
|
|
1390 |
156 ; Inputs: r25 - MSB of currentLineBuffer
|
|
|
1391 |
157 ; r24 - LSB of currentLineBuffer
|
|
|
1392 |
158 ; r23 - MSB of colorMap
|
|
|
1393 |
159 ; r22 - LSB of colorMap
|
|
|
1394 |
160 ; Outputs: none
|
|
|
1395 |
161 ; NOTES: This function doesn't really return...it sorta just
|
|
|
1396 |
162 ; floats into the acquireLine function after the "VSYNC sleep"
|
|
|
1397 |
163 ; is awoken, then begins processing the line data. Once
|
|
|
1398 |
164 ; 176 pixels are sampled (and the counter overflows), then
|
|
|
1399 |
165 ; an interrupt will occur, the 'T' bit in the SREG will be
|
|
|
1400 |
166 ; set, and the function will return.
|
|
|
1401 |
167 ;*****************************************************************
|
|
|
1402 |
168
|
|
|
1403 |
169 CamIntAsm_waitForNewTrackingFrame:
|
|
|
1404 |
170:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
|
|
|
1405 |
171:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1406 |
172:CamInterfaceAsm.S **** sleep
|
|
|
1407 |
173
|
|
|
1408 |
174 ;*****************************************************************
|
|
|
1409 |
175 ; REMEMBER...everything from here on out is critically timed to be
|
|
|
1410 |
176 ; synchronized with the flow of pixel data from the camera...
|
|
|
1411 |
177 ;*****************************************************************
|
|
|
1412 |
178
|
|
|
1413 |
179 CamIntAsm_acquireTrackingLine:
|
|
|
1414 |
180:CamInterfaceAsm.S **** brts _cleanUp
|
|
|
1415 |
181 ;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
|
|
|
1416 |
182 ;cbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1417 |
183
|
|
|
1418 |
184:CamInterfaceAsm.S **** in tmp1,_SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
|
|
|
1419 |
185:CamInterfaceAsm.S **** ori tmp1, 0x07 ; feed Timer1
|
|
|
1420 |
186:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCCR1B),tmp1
|
|
|
1421 |
187 ; The line is about to start...
|
|
|
1422 |
188:CamInterfaceAsm.S **** ldi pixelCount,0 ; Initialize the RLE stats...
|
|
|
1423 |
189:CamInterfaceAsm.S **** ldi pixelRunStart,PIXEL_RUN_START_INITIAL ; Remember, we always calculate
|
|
|
1424 |
190 ; the pixel run length as
|
|
|
1425 |
191 ; TCNT1L - pixelRunStart
|
|
|
1426 |
192
|
|
|
1427 |
193:CamInterfaceAsm.S **** ldi lastColor,0x00 ; clear out the last color before we start
|
|
|
1428 |
194
|
|
|
1429 |
195:CamInterfaceAsm.S **** mov XH,currLineBuffHigh ; Load the pointer to the current line
|
|
|
1430 |
196:CamInterfaceAsm.S **** mov XL,currLineBuffLow ; buffer into the X pointer regs
|
|
|
1431 |
197
|
|
|
1432 |
198:CamInterfaceAsm.S **** mov ZH,colorMapHigh ; Load the pointers to the membership
|
|
|
1433 |
199:CamInterfaceAsm.S **** mov ZL,colorMapLow ; lookup tables (ZL and YL will be overwritten
|
|
|
1434 |
200:CamInterfaceAsm.S **** mov YH,colorMapHigh ; as soon as we start reading data) to Z and Y
|
|
|
1435 |
201
|
|
|
1436 |
202:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(TIMSK) ; enable TIMER1 to start counting
|
|
|
1437 |
203:CamInterfaceAsm.S **** ori tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses and interrupt on
|
|
|
1438 |
204:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TIMSK),tmp1 ; overflow
|
|
|
1439 |
205
|
|
|
1440 |
206:CamInterfaceAsm.S **** ldi tmp1,PIXEL_RUN_START_INITIAL ; set up the TCNT1 to overflow (and
|
182 |
kaklik |
1441 |
GAS LISTING /tmp/ccCMjSjd.s page 25
|
174 |
kaklik |
1442 |
|
|
|
1443 |
|
151 |
kaklik |
1444 |
207:CamInterfaceAsm.S **** ldi tmp2,0xFF ; interrupts) after 176 pixels
|
|
|
1445 |
208:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCNT1H),tmp2
|
|
|
1446 |
209:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCNT1L),tmp1
|
|
|
1447 |
210
|
|
|
1448 |
211:CamInterfaceAsm.S **** mov YL,colorMapLow
|
|
|
1449 |
212
|
|
|
1450 |
213:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(GICR) ; enable the HREF interrupt...remember, we
|
|
|
1451 |
214 ; only use this interrupt to synchronize
|
|
|
1452 |
215 ; the beginning of the line
|
|
|
1453 |
216:CamInterfaceAsm.S **** ori tmp1, HREF_INTERRUPT_ENABLE_MASK
|
|
|
1454 |
217:CamInterfaceAsm.S **** out _SFR_IO_ADDR(GICR), tmp1
|
|
|
1455 |
218
|
|
|
1456 |
219 ;*******************************************************************************************
|
|
|
1457 |
220 ; Track Frame handler
|
|
|
1458 |
221 ;*******************************************************************************************
|
|
|
1459 |
222
|
|
|
1460 |
223 _trackFrame:
|
|
|
1461 |
224:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1462 |
225:CamInterfaceAsm.S **** sleep ; ...And we wait...
|
|
|
1463 |
226
|
|
|
1464 |
227 ; Returning from the interrupt/sleep wakeup will consume
|
|
|
1465 |
228 ; 14 clock cycles (7 to wakeup from idle sleep, 3 to vector, and 4 to return)
|
|
|
1466 |
229
|
|
|
1467 |
230 ; Disable the HREF interrupt
|
|
|
1468 |
231:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1469 |
232:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(GICR)
|
|
|
1470 |
233:CamInterfaceAsm.S **** andi tmp1, HREF_INTERRUPT_DISABLE_MASK
|
|
|
1471 |
234:CamInterfaceAsm.S **** out _SFR_IO_ADDR(GICR), tmp1
|
|
|
1472 |
235
|
|
|
1473 |
236 ; A couple of NOPs are needed here to sync up the pixel data...the number (2)
|
|
|
1474 |
237 ; of NOPs was determined emperically by trial and error.
|
|
|
1475 |
238:CamInterfaceAsm.S **** nop
|
|
|
1476 |
239:CamInterfaceAsm.S **** nop
|
|
|
1477 |
240 _acquirePixelBlock: ; Clock Cycle Count
|
|
|
1478 |
241:CamInterfaceAsm.S **** in ZL,RB_PORT ; sample the red value (PINB) (1)
|
|
|
1479 |
242:CamInterfaceAsm.S **** in YL,G_PORT ; sample the green value (PINC) (1)
|
|
|
1480 |
243:CamInterfaceAsm.S **** andi YL,0x0F ; clear the high nibble (1)
|
|
|
1481 |
244:CamInterfaceAsm.S **** ldd color,Z+RED_MEM_OFFSET ; lookup the red membership (2)
|
|
|
1482 |
245:CamInterfaceAsm.S **** in ZL,RB_PORT ; sample the blue value (PINB) (1)
|
|
|
1483 |
246:CamInterfaceAsm.S **** ldd greenData,Y+GREEN_MEM_OFFSET; lookup the green membership (2)
|
|
|
1484 |
247:CamInterfaceAsm.S **** ldd blueData,Z+BLUE_MEM_OFFSET ; lookup the blue membership (2)
|
|
|
1485 |
248:CamInterfaceAsm.S **** and color,greenData ; mask memberships together (1)
|
|
|
1486 |
249:CamInterfaceAsm.S **** and color,blueData ; to produce the final color (1)
|
|
|
1487 |
250:CamInterfaceAsm.S **** brts _cleanUpTrackingLine ; if some interrupt routine has (1...not set)
|
|
|
1488 |
251 ; come in and set our T flag in
|
|
|
1489 |
252 ; SREG, then we need to hop out
|
|
|
1490 |
253 ; and blow away this frames data (common cleanup)
|
|
|
1491 |
254:CamInterfaceAsm.S **** cp color,lastColor ; check to see if the run continues (1)
|
|
|
1492 |
255:CamInterfaceAsm.S **** breq _acquirePixelBlock ; (2...equal)
|
|
|
1493 |
256 ; ___________
|
|
|
1494 |
257 ; 16 clock cycles
|
|
|
1495 |
258 ; (16 clock cycles = 1 uS = 1 pixelBlock time)
|
|
|
1496 |
259
|
|
|
1497 |
260 ; Toggle the debug line to indicate a color change
|
|
|
1498 |
261:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1499 |
262:CamInterfaceAsm.S **** nop
|
|
|
1500 |
263:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
|
182 |
kaklik |
1501 |
GAS LISTING /tmp/ccCMjSjd.s page 26
|
174 |
kaklik |
1502 |
|
|
|
1503 |
|
151 |
kaklik |
1504 |
264
|
|
|
1505 |
265:CamInterfaceAsm.S **** mov tmp2,pixelRunStart ; get the count value of the
|
|
|
1506 |
266 ; current pixel run
|
|
|
1507 |
267:CamInterfaceAsm.S **** in pixelCount,_SFR_IO_ADDR(TCNT1L) ; get the current TCNT1 value
|
|
|
1508 |
268:CamInterfaceAsm.S **** mov pixelRunStart,pixelCount ; reload pixelRunStart for the
|
|
|
1509 |
269 ; next run
|
|
|
1510 |
270:CamInterfaceAsm.S **** sub pixelCount,tmp2 ; pixelCount = TCNT1L - pixelRunStart
|
|
|
1511 |
271
|
|
|
1512 |
272:CamInterfaceAsm.S **** st X+,lastColor ; record the color run in the current line buffer
|
|
|
1513 |
273:CamInterfaceAsm.S **** st X+,pixelCount ; with its length
|
|
|
1514 |
274:CamInterfaceAsm.S **** mov lastColor,color ; set lastColor so we can figure out when it changes
|
|
|
1515 |
275
|
|
|
1516 |
276:CamInterfaceAsm.S **** nop ; waste one more cycle for a total of 16
|
|
|
1517 |
277:CamInterfaceAsm.S **** rjmp _acquirePixelBlock
|
|
|
1518 |
278
|
|
|
1519 |
279 ; _cleanUpTrackingLine is used to write the last run length block off to the currentLineBuffer so
|
|
|
1520 |
280 ; that all 176 pixels in the line are accounted for.
|
|
|
1521 |
281 _cleanUpTrackingLine:
|
|
|
1522 |
282:CamInterfaceAsm.S **** ldi pixelCount,0xFF ; the length of the last run is ALWAYS 0xFF minus the last
|
|
|
1523 |
283:CamInterfaceAsm.S **** sub pixelCount,pixelRunStart ; pixelRunStart
|
|
|
1524 |
284
|
|
|
1525 |
285:CamInterfaceAsm.S **** inc pixelCount ; increment pixelCount since we actually need to account
|
|
|
1526 |
286 ; for the overflow of TCNT1
|
|
|
1527 |
287
|
|
|
1528 |
288:CamInterfaceAsm.S **** st X+,color ; record the color run in the current line buffer
|
|
|
1529 |
289:CamInterfaceAsm.S **** st X,pixelCount
|
|
|
1530 |
290:CamInterfaceAsm.S **** rjmp _cleanUp
|
|
|
1531 |
291
|
|
|
1532 |
292 _cleanUpDumpLine:
|
|
|
1533 |
293 ; NOTE: If serial data is received, to interrupt the tracking of a line, we'll
|
|
|
1534 |
294 ; get a EV_SERIAL_DATA_RECEIVED event, and the T bit set so we will end the
|
|
|
1535 |
295 ; line's processing...however, the PCLK will keep on ticking for the rest of
|
|
|
1536 |
296 ; the frame/line, which will cause the TCNT to eventually overflow and
|
|
|
1537 |
297 ; interrupt us, generating a EV_ACQUIRE_LINE_COMPLETE event. We don't want
|
|
|
1538 |
298 ; this, so we need to actually turn off the PCLK counting each time we exit
|
|
|
1539 |
299 ; this loop, and only turn it on when we begin acquiring lines....
|
|
|
1540 |
300 ; NOT NEEDED FOR NOW...
|
|
|
1541 |
301 ;in tmp1, _SFR_IO_ADDR(TIMSK) ; disable TIMER1 to stop counting
|
|
|
1542 |
302 ;andi tmp1, DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses
|
|
|
1543 |
303 ;out _SFR_IO_ADDR(TIMSK),tmp1
|
|
|
1544 |
304
|
|
|
1545 |
305 _cleanUp:
|
|
|
1546 |
306 ; Disable the external clocking of the Timer1 counter
|
|
|
1547 |
307:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(TCCR1B)
|
|
|
1548 |
308:CamInterfaceAsm.S **** andi tmp1, 0xF8
|
|
|
1549 |
309:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCCR1B),tmp1
|
|
|
1550 |
310
|
|
|
1551 |
311 ; Toggle the debug line to indicate the line is complete
|
|
|
1552 |
312:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1553 |
313:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1554 |
314:CamInterfaceAsm.S **** clt ; clear out the T bit since we have detected
|
|
|
1555 |
315 ; the interruption and are exiting to handle it
|
|
|
1556 |
316 _exit:
|
|
|
1557 |
317:CamInterfaceAsm.S **** ret
|
|
|
1558 |
318
|
|
|
1559 |
319 ;*****************************************************************
|
|
|
1560 |
320 ; Function Name: CamIntAsm_waitForNewDumpFrame
|
182 |
kaklik |
1561 |
GAS LISTING /tmp/ccCMjSjd.s page 27
|
174 |
kaklik |
1562 |
|
|
|
1563 |
|
151 |
kaklik |
1564 |
321 ; Function Description: This function is responsible for
|
|
|
1565 |
322 ; going to sleep until a new frame begins (indicated by
|
|
|
1566 |
323 ; VSYNC transitioning from low to high. This will wake
|
|
|
1567 |
324 ; the "VSYNC sleep" up and allow it to continue with
|
|
|
1568 |
325 ; acquiring a line of pixel data to dump out to the UI.
|
|
|
1569 |
326 ; Inputs: r25 - MSB of currentLineBuffer
|
|
|
1570 |
327 ; r24 - LSB of currentLineBuffer
|
|
|
1571 |
328 ; r23 - MSB of prevLineBuffer
|
|
|
1572 |
329 ; r22 - LSB of prevLineBuffer
|
|
|
1573 |
330 ; Outputs: none
|
|
|
1574 |
331 ; NOTES: This function doesn't really return...it sorta just
|
|
|
1575 |
332 ; floats into the acquireDumpLine function after the "VSYNC sleep"
|
|
|
1576 |
333 ; is awoken.
|
|
|
1577 |
334 ;*****************************************************************
|
|
|
1578 |
335 CamIntAsm_waitForNewDumpFrame:
|
|
|
1579 |
336:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
|
|
|
1580 |
337:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1581 |
338:CamInterfaceAsm.S **** sleep
|
|
|
1582 |
339
|
|
|
1583 |
340 ;*****************************************************************
|
|
|
1584 |
341 ; REMEMBER...everything from here on out is critically timed to be
|
|
|
1585 |
342 ; synchronized with the flow of pixel data from the camera...
|
|
|
1586 |
343 ;*****************************************************************
|
|
|
1587 |
344
|
|
|
1588 |
345 CamIntAsm_acquireDumpLine:
|
|
|
1589 |
346:CamInterfaceAsm.S **** brts _cleanUp
|
|
|
1590 |
347 ;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
|
|
|
1591 |
348 ;cbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1592 |
349
|
|
|
1593 |
350:CamInterfaceAsm.S **** mov XH,currLineBuffHigh ; Load the pointer to the current line
|
|
|
1594 |
351:CamInterfaceAsm.S **** mov XL,currLineBuffLow ; buffer into the X pointer regs
|
|
|
1595 |
352
|
|
|
1596 |
353:CamInterfaceAsm.S **** mov YH,prevLineBuffHigh ; Load the pointer to the previous line
|
|
|
1597 |
354:CamInterfaceAsm.S **** mov YL,prevLineBuffLow ; buffer into the Y pointer regs
|
|
|
1598 |
355
|
|
|
1599 |
356:CamInterfaceAsm.S **** ldi tmp1,PIXEL_RUN_START_INITIAL ; set up the TCNT1 to overflow (and
|
|
|
1600 |
357:CamInterfaceAsm.S **** ldi tmp2,0xFF ; interrupts) after 176 pixels
|
|
|
1601 |
358:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCNT1H),tmp2
|
|
|
1602 |
359:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCNT1L),tmp1
|
|
|
1603 |
360
|
|
|
1604 |
361:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
|
|
|
1605 |
362:CamInterfaceAsm.S **** ori tmp1, 0x07 ; feed Timer1
|
|
|
1606 |
363:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCCR1B),tmp1
|
|
|
1607 |
364:CamInterfaceAsm.S **** nop
|
|
|
1608 |
365
|
|
|
1609 |
366:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(TIMSK) ; enable TIMER1 to start counting
|
|
|
1610 |
367:CamInterfaceAsm.S **** ori tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses and interrupt on
|
|
|
1611 |
368:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TIMSK),tmp1 ; overflow
|
|
|
1612 |
369
|
|
|
1613 |
370:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(GICR) ; enable the HREF interrupt...remember, we
|
|
|
1614 |
371 ; only use this interrupt to synchronize
|
|
|
1615 |
372 ; the beginning of the line
|
|
|
1616 |
373:CamInterfaceAsm.S **** ori tmp1, HREF_INTERRUPT_ENABLE_MASK
|
|
|
1617 |
374:CamInterfaceAsm.S **** out _SFR_IO_ADDR(GICR), tmp1
|
|
|
1618 |
375
|
|
|
1619 |
376 ;*******************************************************************************************
|
|
|
1620 |
377 ; Dump Frame handler
|
182 |
kaklik |
1621 |
GAS LISTING /tmp/ccCMjSjd.s page 28
|
174 |
kaklik |
1622 |
|
|
|
1623 |
|
151 |
kaklik |
1624 |
378 ;*******************************************************************************************
|
|
|
1625 |
379
|
|
|
1626 |
380 _dumpFrame:
|
|
|
1627 |
381:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1628 |
382:CamInterfaceAsm.S **** sleep ; ...And we wait...
|
|
|
1629 |
383
|
|
|
1630 |
384:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
|
|
|
1631 |
385:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(GICR) ; disable the HREF interrupt
|
|
|
1632 |
386:CamInterfaceAsm.S **** andi tmp1, HREF_INTERRUPT_DISABLE_MASK ; so we don't get interrupted
|
|
|
1633 |
387:CamInterfaceAsm.S **** out _SFR_IO_ADDR(GICR), tmp1 ; while dumping the line
|
|
|
1634 |
388
|
|
|
1635 |
389:CamInterfaceAsm.S **** nop ; Remember...if we ever remove the "cbi" instruction above,
|
|
|
1636 |
390 ; we need to add two more NOPs to cover this
|
|
|
1637 |
391
|
|
|
1638 |
392 ; Ok...the following loop needs to run in 8 clock cycles, so we can get every
|
|
|
1639 |
393 ; pixel in the line...this shouldn't be a problem, since the PCLK timing was
|
|
|
1640 |
394 ; reduced by a factor of 2 whenever we go to dump a line (this is to give us
|
|
|
1641 |
395 ; enough time to do the sampling and storing of the pixel data). In addition,
|
|
|
1642 |
396 ; it is assumed that we will have to do some minor processing on the data right
|
|
|
1643 |
397 ; before we send it out, like mask off the top 4-bits of each, and then pack both
|
|
|
1644 |
398 ; low nibbles into a single byte for transmission...we just don't have time to
|
|
|
1645 |
399 ; do that here (only 8 instruction cycles :-) )
|
|
|
1646 |
400 _sampleDumpPixel:
|
|
|
1647 |
401:CamInterfaceAsm.S **** in tmp1,G_PORT ; sample the G value (1)
|
|
|
1648 |
402:CamInterfaceAsm.S **** in tmp2,RB_PORT ; sample the R/B value (1)
|
|
|
1649 |
403:CamInterfaceAsm.S **** st X+,tmp1 ; store to the currLineBuff and inc ptrs(2)
|
|
|
1650 |
404:CamInterfaceAsm.S **** st Y+,tmp2 ; store to the prevLineBuff and inc ptrs(2)
|
|
|
1651 |
405:CamInterfaceAsm.S **** brtc _sampleDumpPixel ; loop back unless flag is set (2...if not set)
|
|
|
1652 |
406 ; ___________
|
|
|
1653 |
407 ; 8 cycles normally
|
|
|
1654 |
408
|
|
|
1655 |
409 ; if we make it here, it means the T flag is set, and we must have been interrupted
|
|
|
1656 |
410 ; so we need to exit (what if we were interrupted for serial? should we disable it?)
|
|
|
1657 |
411:CamInterfaceAsm.S **** rjmp _cleanUpDumpLine
|
|
|
1658 |
412
|
|
|
1659 |
413 ;***********************************************************
|
|
|
1660 |
414 ; Function Name: <interrupt handler for External Interrupt0>
|
|
|
1661 |
415 ; Function Description: This function is responsible
|
|
|
1662 |
416 ; for handling a rising edge on the Ext Interrupt 0. This
|
|
|
1663 |
417 ; routine simply returns, since we just want to wake up
|
|
|
1664 |
418 ; whenever the VSYNC transitions (meaning the start of a new
|
|
|
1665 |
419 ; frame).
|
|
|
1666 |
420 ; Inputs: none
|
|
|
1667 |
421 ; Outputs: none
|
|
|
1668 |
422 ;***********************************************************
|
|
|
1669 |
423 SIG_INTERRUPT0:
|
|
|
1670 |
424 ; This will wake us up when VSYNC transitions high...we just want to return
|
|
|
1671 |
425:CamInterfaceAsm.S **** reti
|
|
|
1672 |
426
|
|
|
1673 |
427 ;***********************************************************
|
|
|
1674 |
428 ; Function Name: <interrupt handler for External Interrupt1>
|
|
|
1675 |
429 ; Function Description: This function is responsible
|
|
|
1676 |
430 ; for handling a falling edge on the Ext Interrupt 1. This
|
|
|
1677 |
431 ; routine simply returns, since we just want to wake up
|
|
|
1678 |
432 ; whenever the HREF transitions (meaning the pixels
|
|
|
1679 |
433 ; are starting after VSYNC transitioned, and we need to
|
|
|
1680 |
434 ; start acquiring the pixel blocks
|
182 |
kaklik |
1681 |
GAS LISTING /tmp/ccCMjSjd.s page 29
|
174 |
kaklik |
1682 |
|
|
|
1683 |
|
151 |
kaklik |
1684 |
435 ; Inputs: none
|
|
|
1685 |
436 ; Outputs: none
|
|
|
1686 |
437 ;***********************************************************
|
|
|
1687 |
438 SIG_INTERRUPT1:
|
|
|
1688 |
439 ; This will wake us up when HREF transitions high...we just want to return
|
|
|
1689 |
440:CamInterfaceAsm.S **** reti
|
|
|
1690 |
441
|
|
|
1691 |
442 ;***********************************************************
|
|
|
1692 |
443 ; Function Name: <interrupt handler for Timer0 overflow>
|
|
|
1693 |
444 ; Function Description: This function is responsible
|
|
|
1694 |
445 ; for handling the Timer0 overflow (hooked up to indicate
|
|
|
1695 |
446 ; when we have reached the number of HREFs required in a
|
|
|
1696 |
447 ; single frame). We set the T flag in the SREG to
|
|
|
1697 |
448 ; indicate to the _acquirePixelBlock routine that it needs
|
|
|
1698 |
449 ; to exit, and then set the appropriate action to take in
|
|
|
1699 |
450 ; the eventList of the Executive module.
|
|
|
1700 |
451 ; Inputs: none
|
|
|
1701 |
452 ; Outputs: none
|
|
|
1702 |
453 ; Note: Originally, the HREF pulses were also going to
|
|
|
1703 |
454 ; be counted by a hardware counter, but it didn't end up
|
|
|
1704 |
455 ; being necessary
|
|
|
1705 |
456 ;***********************************************************
|
|
|
1706 |
457 ;SIG_OVERFLOW0:
|
|
|
1707 |
458 ; set ; set the T bit in SREG
|
|
|
1708 |
459 ; lds tmp1,eventBitmask
|
|
|
1709 |
460 ; ori tmp1,EV_ACQUIRE_FRAME_COMPLETE
|
|
|
1710 |
461 ; sts eventBitmask,tmp1
|
|
|
1711 |
462 ; reti
|
|
|
1712 |
463
|
|
|
1713 |
464 ;***********************************************************
|
|
|
1714 |
465 ; Function Name: <interrupt handler for Timer1 overflow>
|
|
|
1715 |
466 ; Function Description: This function is responsible
|
|
|
1716 |
467 ; for handling the Timer1 overflow (hooked up to indicate
|
|
|
1717 |
468 ; when we have reached the end of a line of pixel data,
|
|
|
1718 |
469 ; since PCLK is hooked up to overflow TCNT1 after 176
|
|
|
1719 |
470 ; pixels). This routine generates an acquire line complete
|
|
|
1720 |
471 ; event in the fastEventBitmask, which is streamlined for
|
|
|
1721 |
472 ; efficiency reasons.
|
|
|
1722 |
473 ;***********************************************************
|
|
|
1723 |
474 SIG_OVERFLOW1:
|
|
|
1724 |
475:CamInterfaceAsm.S **** lds tmp1,fastEventBitmask ; set a flag indicating
|
|
|
1725 |
476:CamInterfaceAsm.S **** ori tmp1,FEV_ACQUIRE_LINE_COMPLETE ; a line is complete
|
|
|
1726 |
477:CamInterfaceAsm.S **** sts fastEventBitmask,tmp1
|
|
|
1727 |
478:CamInterfaceAsm.S **** set ; set the T bit in SREG
|
|
|
1728 |
479 ;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
|
|
|
1729 |
480 ;cbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
|
|
|
1730 |
481
|
|
|
1731 |
482:CamInterfaceAsm.S **** reti
|
|
|
1732 |
483
|
|
|
1733 |
484 ; This is the default handler for all interrupts that don't
|
|
|
1734 |
485 ; have handler routines specified for them.
|
|
|
1735 |
486 .global __vector_default
|
|
|
1736 |
487 __vector_default:
|
|
|
1737 |
488:CamInterfaceAsm.S **** reti
|
|
|
1738 |
489
|
|
|
1739 |
490 .end
|
182 |
kaklik |
1740 |
GAS LISTING /tmp/ccCMjSjd.s page 30
|
174 |
kaklik |
1741 |
|
|
|
1742 |
|
|
|
1743 |
DEFINED SYMBOLS
|
|
|
1744 |
*ABS*:00000000 CamInterfaceAsm.S
|
|
|
1745 |
CamInterfaceAsm.S:119 *ABS*:00000010 pixelCount
|
|
|
1746 |
CamInterfaceAsm.S:120 *ABS*:00000011 pixelRunStart
|
|
|
1747 |
CamInterfaceAsm.S:121 *ABS*:00000012 lastColor
|
|
|
1748 |
CamInterfaceAsm.S:122 *ABS*:00000013 tmp1
|
|
|
1749 |
CamInterfaceAsm.S:123 *ABS*:00000014 tmp2
|
|
|
1750 |
CamInterfaceAsm.S:124 *ABS*:00000013 color
|
|
|
1751 |
CamInterfaceAsm.S:125 *ABS*:00000014 greenData
|
|
|
1752 |
CamInterfaceAsm.S:126 *ABS*:00000015 blueData
|
|
|
1753 |
CamInterfaceAsm.S:127 *ABS*:00000016 colorMapLow
|
|
|
1754 |
CamInterfaceAsm.S:128 *ABS*:00000017 colorMapHigh
|
|
|
1755 |
CamInterfaceAsm.S:129 *ABS*:00000016 prevLineBuffLow
|
|
|
1756 |
CamInterfaceAsm.S:130 *ABS*:00000017 prevLineBuffHigh
|
|
|
1757 |
CamInterfaceAsm.S:131 *ABS*:00000018 currLineBuffLow
|
|
|
1758 |
CamInterfaceAsm.S:132 *ABS*:00000019 currLineBuffHigh
|
|
|
1759 |
CamInterfaceAsm.S:169 .text:00000000 CamIntAsm_waitForNewTrackingFrame
|
|
|
1760 |
CamInterfaceAsm.S:335 .text:0000008e CamIntAsm_waitForNewDumpFrame
|
|
|
1761 |
CamInterfaceAsm.S:345 .text:00000094 CamIntAsm_acquireDumpLine
|
|
|
1762 |
CamInterfaceAsm.S:179 .text:00000006 CamIntAsm_acquireTrackingLine
|
|
|
1763 |
CamInterfaceAsm.S:423 .text:000000d4 __vector_1
|
|
|
1764 |
CamInterfaceAsm.S:438 .text:000000d6 __vector_2
|
|
|
1765 |
CamInterfaceAsm.S:474 .text:000000d8 __vector_8
|
|
|
1766 |
CamInterfaceAsm.S:305 .text:00000080 _cleanUp
|
|
|
1767 |
CamInterfaceAsm.S:223 .text:00000034 _trackFrame
|
|
|
1768 |
CamInterfaceAsm.S:240 .text:00000044 _acquirePixelBlock
|
|
|
1769 |
CamInterfaceAsm.S:281 .text:00000074 _cleanUpTrackingLine
|
|
|
1770 |
CamInterfaceAsm.S:292 .text:00000080 _cleanUpDumpLine
|
|
|
1771 |
CamInterfaceAsm.S:316 .text:0000008c _exit
|
|
|
1772 |
CamInterfaceAsm.S:380 .text:000000ba _dumpFrame
|
|
|
1773 |
CamInterfaceAsm.S:400 .text:000000c8 _sampleDumpPixel
|
|
|
1774 |
CamInterfaceAsm.S:487 .text:000000e6 __vector_default
|
|
|
1775 |
|
|
|
1776 |
UNDEFINED SYMBOLS
|
|
|
1777 |
__vector_9
|
|
|
1778 |
fastEventBitmask
|