Subversion Repositories svnkaklik

Rev

Rev 410 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

GAS LISTING /tmp/ccowxWMg.s                     page 1


   1                    # 1 "CamInterfaceAsm.S"
   2                    # 1 "<built-in>"
   1                    ;
   0                    
   0                    
   2                    ;    Copyright (C) 2004    John Orlando
   3                    ;    
   4                    ;   AVRcam: a small real-time image processing engine.
   5                    
   6                    ;    This program is free software; you can redistribute it and/or
   7                    ;    modify it under the terms of the GNU General Public
   8                    ;    License as published by the Free Software Foundation; either
   9                    ;    version 2 of the License, or (at your option) any later version.
  10                    
  11                    ;    This program is distributed in the hope that it will be useful,
  12                    ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13                    ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14                    ;    General Public License for more details.
  15                    
  16                    ;    You should have received a copy of the GNU General Public
  17                    ;    License along with this program; if not, write to the Free Software
  18                    ;    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19                    
  20                    ;   For more information on the AVRcam, please contact:
  21                    
  22                    ;   john@jrobot.net
  23                    
  24                    ;   or go to www.jrobot.net for more details regarding the system.
  25                    ;**********************************************************************
  26                    ;       Module Name: CanInterfaceAsm.S
  27                    ;       Module Date: 04/14/2004
  28                    ;       Module Auth: John Orlando
  29                    ;
  30                    ;       Description: This module provides the low-level interface
  31                    ;       to the OV6620 camera hardware.  It is responsible for
  32                    ;       acquiring each pixel block (R,G,B), performing the mapping
  33                    ;       into an actual color (orange, purple, etc), run-length
  34                    ;       encoding the data, and storing the info off to the appropriate
  35                    ;       line buffer.  This routine is synchronized with the pixel data
  36                    ;       so that no polling of the camera data needs to be done (the
  37                    ;       OV6620 is clocked off of the same crystal source as the mega8,
  38                    ;       thus providing inherent synchronization between the two).
  39                    ;
  40                    ;       Revision History:
  41                    ;       Date        Rel Ver.    Notes
  42                    ;       4/10/2004      0.1     Module created
  43                    ;       6/30/2004      1.0     Initial release for Circuit Cellar
  44                    ;                              contest.
  45                    ;       1/16/2005      1.4     Fixed issue with the TCCR1B register
  46                    ;                              where PCLK was getting routed to the
  47                    ;                              timer1 even when it wasn't needed.
  48                    ;                              This caused excessive counter overflow
  49                    ;                              interrupts, and caused problems.  Now,
  50                    ;                              the "PCLK" pipe feeds timer1 when needed,
  51                    ;                              and is turned off when it isn't needed.
  52                    
  53                    #include <avr/io.h>
GAS LISTING /tmp/ccowxWMg.s                    page 2


   1                    /* Copyright (c) 2002,2003,2005,2006, Marek Michalkiewicz, Joerg Wunsch
   2                       All rights reserved.
   3                    
   4                       Redistribution and use in source and binary forms, with or without
   5                       modification, are permitted provided that the following conditions are met:
   6                    
   7                       * Redistributions of source code must retain the above copyright
   8                         notice, this list of conditions and the following disclaimer.
   9                    
  10                       * Redistributions in binary form must reproduce the above copyright
  11                         notice, this list of conditions and the following disclaimer in
  12                         the documentation and/or other materials provided with the
  13                         distribution.
  14                    
  15                       * Neither the name of the copyright holders nor the names of
  16                         contributors may be used to endorse or promote products derived
  17                         from this software without specific prior written permission.
  18                    
  19                      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20                      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21                      IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22                      ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23                      LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24                      CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25                      SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26                      INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27                      CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28                      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29                      POSSIBILITY OF SUCH DAMAGE. */
  30                    
  31                    /* $Id: io.h,v 1.24.2.9 2006/09/13 20:41:41 arcanum Exp $ */
  32                    
  33                    /** \defgroup avr_io <avr/io.h>: AVR device-specific IO definitions
  34                        \code #include <avr/io.h> \endcode
  35                    
  36                        This header file includes the apropriate IO definitions for the
  37                        device that has been specified by the <tt>-mmcu=</tt> compiler
  38                        command-line switch.  This is done by diverting to the appropriate
  39                        file <tt>&lt;avr/io</tt><em>XXXX</em><tt>.h&gt;</tt> which should
  40                        never be included directly.  Some register names common to all
  41                        AVR devices are defined directly within <tt>&lt;avr/io.h&gt;</tt>,
  42                        but most of the details come from the respective include file.
  43                    
  44                        Note that this file always includes
  45                        \code #include <avr/sfr_defs.h> \endcode
  46                        See \ref avr_sfr for the details.
  47                    
  48                        Included are definitions of the IO register set and their
  49                        respective bit values as specified in the Atmel documentation.
  50                        Note that Atmel is not very consistent in its naming conventions,
  51                        so even identical functions sometimes get different names on
  52                        different devices.
  53                    
  54                        Also included are the specific names useable for interrupt
  55                        function definitions as documented
  56                        \ref avr_signames "here".
  57                    
GAS LISTING /tmp/ccowxWMg.s                    page 3


  58                        Finally, the following macros are defined:
  59                    
  60                        - \b RAMEND
  61                        <br>
  62                        A constant describing the last on-chip RAM location.
  63                        <br>
  64                        - \b XRAMEND
  65                        <br>
  66                        A constant describing the last possible location in RAM.
  67                        This is equal to RAMEND for devices that do not allow for
  68                        external RAM.
  69                        <br>
  70                        - \b E2END
  71                        <br>
  72                        A constant describing the address of the last EEPROM cell.
  73                        <br>
  74                        - \b FLASHEND
  75                        <br>
  76                        A constant describing the last byte address in flash ROM.
  77                        <br>
  78                        - \b SPM_PAGESIZE
  79                        <br>
  80                        For devices with bootloader support, the flash pagesize
  81                        (in bytes) to be used for the \c SPM instruction. */
  82                    
  83                    #ifndef _AVR_IO_H_
  84                    #define _AVR_IO_H_
  85                    
  86                    #include <avr/sfr_defs.h>
   1                    /* Copyright (c) 2002, Marek Michalkiewicz <marekm@amelek.gda.pl>
   2                       All rights reserved.
   3                    
   4                       Redistribution and use in source and binary forms, with or without
   5                       modification, are permitted provided that the following conditions are met:
   6                    
   7                       * Redistributions of source code must retain the above copyright
   8                         notice, this list of conditions and the following disclaimer.
   9                    
  10                       * Redistributions in binary form must reproduce the above copyright
  11                         notice, this list of conditions and the following disclaimer in
  12                         the documentation and/or other materials provided with the
  13                         distribution.
  14                    
  15                       * Neither the name of the copyright holders nor the names of
  16                         contributors may be used to endorse or promote products derived
  17                         from this software without specific prior written permission.
  18                    
  19                       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20                       AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21                       IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22                       ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23                       LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24                       CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25                       SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26                       INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27                       CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28                       ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
GAS LISTING /tmp/ccowxWMg.s                    page 4


  29                       POSSIBILITY OF SUCH DAMAGE.  */
  30                    
  31                    /* avr/sfr_defs.h - macros for accessing AVR special function registers */
  32                    
  33                    /* $Id: sfr_defs.h,v 1.16.2.2 2006/05/17 08:25:10 joerg_wunsch Exp $ */
  34                    
  35                    #ifndef _AVR_SFR_DEFS_H_
  36                    #define _AVR_SFR_DEFS_H_ 1
  37                    
  38                    /** \defgroup avr_sfr_notes Additional notes from <avr/sfr_defs.h>
  39                        \ingroup avr_sfr
  40                    
  41                       The \c <avr/sfr_defs.h> file is included by all of the \c <avr/ioXXXX.h>
  42                       files, which use macros defined here to make the special function register
  43                       definitions look like C variables or simple constants, depending on the
  44                       <tt>_SFR_ASM_COMPAT</tt> define.  Some examples from \c <avr/iocanxx.h> to
  45                       show how to define such macros:
  46                    
  47                    \code
  48                    #define PORTA   _SFR_IO8(0x02)
  49                    #define EEAR    _SFR_IO16(0x21)
  50                    #define UDR0    _SFR_MEM8(0xC6)
  51                    #define TCNT3   _SFR_MEM16(0x94)
  52                    #define CANIDT  _SFR_MEM32(0xF0)
  53                    \endcode
  54                    
  55                       If \c _SFR_ASM_COMPAT is not defined, C programs can use names like
  56                       <tt>PORTA</tt> directly in C expressions (also on the left side of
  57                       assignment operators) and GCC will do the right thing (use short I/O
  58                       instructions if possible).  The \c __SFR_OFFSET definition is not used in
  59                       any way in this case.
  60                    
  61                       Define \c _SFR_ASM_COMPAT as 1 to make these names work as simple constants
  62                       (addresses of the I/O registers).  This is necessary when included in
  63                       preprocessed assembler (*.S) source files, so it is done automatically if
  64                       \c __ASSEMBLER__ is defined.  By default, all addresses are defined as if
  65                       they were memory addresses (used in \c lds/sts instructions).  To use these
  66                       addresses in \c in/out instructions, you must subtract 0x20 from them.
  67                    
  68                       For more backwards compatibility, insert the following at the start of your
  69                       old assembler source file:
  70                    
  71                    \code
  72                    #define __SFR_OFFSET 0
  73                    \endcode
  74                    
  75                       This automatically subtracts 0x20 from I/O space addresses, but it's a
  76                       hack, so it is recommended to change your source: wrap such addresses in
  77                       macros defined here, as shown below.  After this is done, the
  78                       <tt>__SFR_OFFSET</tt> definition is no longer necessary and can be removed.
  79                    
  80                       Real example - this code could be used in a boot loader that is portable
  81                       between devices with \c SPMCR at different addresses.
  82                    
  83                    \verbatim
  84                    <avr/iom163.h>: #define SPMCR _SFR_IO8(0x37)
  85                    <avr/iom128.h>: #define SPMCR _SFR_MEM8(0x68)
GAS LISTING /tmp/ccowxWMg.s                    page 5


  86                    \endverbatim
  87                    
  87                    
  88                    #ifndef __AVR_HAVE_MOVW__
  89                    #  if  defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
  90                    #   define __AVR_HAVE_MOVW__ 1
  91                    #  endif
  92                    #endif
  93                    
  94                    #ifndef __AVR_HAVE_LPMX__
  95                    # if  defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
  96                    #  define __AVR_HAVE_LPMX__ 1
  97                    # endif
  98                    #endif
  99                    
 100                    /*
 101                     * Registers common to all AVR devices.
 102                     */
 103                    
 104                    #if __AVR_ARCH__ != 1
 105                    /*
 106                     * AVR architecture 1 has no RAM, thus no stack pointer.
 107                     *
 108                     * All other archs do have a stack pointer.  Some devices have only
 109                     * less than 256 bytes of possible RAM locations (128 Bytes of SRAM
 110                     * and no option for external RAM), thus SPH is officially "reserved"
 111                     * for them.  We catch this case below after including the
 112                     * device-specific ioXXXX.h file, by examining XRAMEND, and
 113                     * #undef-ining SP and SPH in that case.
 114                     */
 115                    /* Stack Pointer */
 116                    #define SP        _SFR_IO16(0x3D)
 117                    #define SPL       _SFR_IO8(0x3D)
 118                    #define SPH       _SFR_IO8(0x3E)
 119                    #endif /* #if __AVR_ARCH__ != 1 */
 120                    
 121                    /* Status REGister */
 122                    #define SREG      _SFR_IO8(0x3F)
 123                    
 124                    /* Status Register - SREG */
 125                    #define    SREG_I       7
 126                    #define    SREG_T       6
 127                    #define    SREG_H       5
 128                    #define    SREG_S       4
 129                    #define    SREG_V       3
 130                    #define    SREG_N       2
 131                    #define    SREG_Z       1
 132                    #define    SREG_C       0
 133                    
 134                    /* Pointer definition */
 135                    #if __AVR_ARCH__ != 1
 136                    /* avr1 has only the Z pointer */
 137                    #define    XL           r26
 138                    #define    XH           r27
 139                    #define    YL           r28
 140                    #define    YH           r29
 141                    #endif /* #if __AVR_ARCH__ != 1 */
GAS LISTING /tmp/ccowxWMg.s                    page 6


 142                    #define    ZL           r30
 143                    #define    ZH           r31
 144                    
 145                    /*
 146                     * Only few devices come without EEPROM.  In order to assemble the
 147                     * EEPROM library components without defining a specific device, we
 148                     * keep the EEPROM-related definitions here.
 149                     */
 150                    #if defined(__COMPILING_AVR_LIBC__)
 151                    
 152                    /* EEPROM Control Register */
 153                    #define EECR    _SFR_IO8(0x1C)
 154                    
 155                    /* EEPROM Data Register */
 156                    #define EEDR    _SFR_IO8(0x1D)
 157                    
 158                    /* EEPROM Address Register */
 159                    #define EEAR    _SFR_IO16(0x1E)
 160                    #define EEARL   _SFR_IO8(0x1E)
 161                    #define EEARH   _SFR_IO8(0x1F)
 162                    
 163                    /* EEPROM Control Register */
 164                    #define    EERIE        3
 165                    #define    EEMWE        2
 166                    #define    EEWE         1
 167                    #define    EERE         0
 168                    
 169                    #endif /* __COMPILING_AVR_LIBC__ */
 170                    
 171                    #if defined (__AVR_AT94K__)
 172                    #  include <avr/ioat94k.h>
 173                    #elif defined (__AVR_AT43USB320__)
 174                    #  include <avr/io43u32x.h>
 175                    #elif defined (__AVR_AT43USB355__)
 176                    #  include <avr/io43u35x.h>
 177                    #elif defined (__AVR_AT76C711__)
 178                    #  include <avr/io76c711.h>
 179                    #elif defined (__AVR_AT86RF401__)
 180                    #  include <avr/io86r401.h>
 181                    #elif defined (__AVR_AT90PWM2__)
 182                    #  include <avr/io90pwmx.h>
 183                    #elif defined (__AVR_AT90PWM3__)
 184                    #  include <avr/io90pwmx.h>
 185                    #elif defined (__AVR_ATmega128__)
 186                    #  include <avr/iom128.h>
 187                    #elif defined (__AVR_ATmega1280__)
 188                    #  include <avr/iom1280.h>
 189                    #elif defined (__AVR_ATmega1281__)
 190                    #  include <avr/iom1281.h>
 191                    #elif defined (__AVR_ATmega2560__)
 192                    #  include <avr/iom2560.h>
 193                    #elif defined (__AVR_ATmega2561__)
 194                    #  include <avr/iom2561.h>
 195                    #elif defined (__AVR_AT90CAN32__)
 196                    #  include <avr/iocan32.h>
 197                    #elif defined (__AVR_AT90CAN64__)
 198                    #  include <avr/iocan64.h>
GAS LISTING /tmp/ccowxWMg.s                    page 7


 199                    #elif defined (__AVR_AT90CAN128__)
 200                    #  include <avr/iocan128.h>
 201                    #elif defined (__AVR_AT90USB646__)
 202                    #  include <avr/iousb646.h>
 203                    #elif defined (__AVR_AT90USB647__)
 204                    #  include <avr/iousb647.h>
 205                    #elif defined (__AVR_AT90USB1286__)
 206                    #  include <avr/iousb1286.h>
 207                    #elif defined (__AVR_AT90USB1287__)
 208                    #  include <avr/iousb1287.h>
 209                    #elif defined (__AVR_ATmega64__)
 210                    #  include <avr/iom64.h>
 211                    #elif defined (__AVR_ATmega640__)
 212                    #  include <avr/iom640.h>
 213                    #elif defined (__AVR_ATmega644__)
 214                    #  include <avr/iom644.h>
 215                    #elif defined (__AVR_ATmega644P__)
 216                    #  include <avr/iom644.h>
 217                    #elif defined (__AVR_ATmega645__)
 218                    #  include <avr/iom645.h>
 219                    #elif defined (__AVR_ATmega6450__)
 220                    #  include <avr/iom6450.h>
 221                    #elif defined (__AVR_ATmega649__)
 222                    #  include <avr/iom649.h>
 223                    #elif defined (__AVR_ATmega6490__)
 224                    #  include <avr/iom6490.h>
 225                    #elif defined (__AVR_ATmega103__)
 226                    #  include <avr/iom103.h>
 227                    #elif defined (__AVR_ATmega32__)
 228                    #  include <avr/iom32.h>
 229                    #elif defined (__AVR_ATmega323__)
 230                    #  include <avr/iom323.h>
 231                    #elif defined (__AVR_ATmega324P__)
 232                    #  include <avr/iom324.h>
 233                    #elif defined (__AVR_ATmega325__)
 234                    #  include <avr/iom325.h>
 235                    #elif defined (__AVR_ATmega3250__)
 236                    #  include <avr/iom3250.h>
 237                    #elif defined (__AVR_ATmega329__)
 238                    #  include <avr/iom329.h>
 239                    #elif defined (__AVR_ATmega3290__)
 240                    #  include <avr/iom3290.h>
 241                    #elif defined (__AVR_ATmega406__)
 242                    #  include <avr/iom406.h>
 243                    #elif defined (__AVR_ATmega16__)
 244                    #  include <avr/iom16.h>
 245                    #elif defined (__AVR_ATmega161__)
 246                    #  include <avr/iom161.h>
 247                    #elif defined (__AVR_ATmega162__)
 248                    #  include <avr/iom162.h>
 249                    #elif defined (__AVR_ATmega163__)
 250                    #  include <avr/iom163.h>
 251                    #elif defined (__AVR_ATmega164P__)
 252                    #  include <avr/iom164.h>
 253                    #elif defined (__AVR_ATmega165__)
 254                    #  include <avr/iom165.h>
 255                    #elif defined (__AVR_ATmega165P__)
GAS LISTING /tmp/ccowxWMg.s                    page 8


 256                    #  include <avr/iom165p.h>
 257                    #elif defined (__AVR_ATmega168__)
 258                    #  include <avr/iom168.h>
 259                    #elif defined (__AVR_ATmega169__)
 260                    #  include <avr/iom169.h>
 261                    #elif defined (__AVR_ATmega169P__)
 262                    #  include <avr/iom169p.h>
 263                    #elif defined (__AVR_ATmega8__)
 264                    #  include <avr/iom8.h>
   1                    /* Copyright (c) 2002, Marek Michalkiewicz
   2                       All rights reserved.
   3                    
   4                       Redistribution and use in source and binary forms, with or without
   5                       modification, are permitted provided that the following conditions are met:
   6                    
   7                       * Redistributions of source code must retain the above copyright
   8                         notice, this list of conditions and the following disclaimer.
   9                    
  10                       * Redistributions in binary form must reproduce the above copyright
  11                         notice, this list of conditions and the following disclaimer in
  12                         the documentation and/or other materials provided with the
  13                         distribution.
  14                    
  15                       * Neither the name of the copyright holders nor the names of
  16                         contributors may be used to endorse or promote products derived
  17                         from this software without specific prior written permission.
  18                    
  19                      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20                      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21                      IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22                      ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23                      LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24                      CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25                      SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26                      INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27                      CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28                      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29                      POSSIBILITY OF SUCH DAMAGE. */
  30                    
  31                    /* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */
  32                    
  33                    /* avr/iom8.h - definitions for ATmega8 */
  34                    
  35                    #ifndef _AVR_IOM8_H_
  36                    #define _AVR_IOM8_H_ 1
  37                    
  38                    /* This file should only be included from <avr/io.h>, never directly. */
  39                    
  40                    #ifndef _AVR_IO_H_
  41                    #  error "Include <avr/io.h> instead of this file."
  42                    #endif
  43                    
  44                    #ifndef _AVR_IOXXX_H_
  45                    #  define _AVR_IOXXX_H_ "iom8.h"
  46                    #else
  47                    #  error "Attempt to include more than one <avr/ioXXX.h> file."
  48                    #endif 
GAS LISTING /tmp/ccowxWMg.s                    page 9


  49                    
  50                    /* I/O registers */
  51                    
  52                    /* TWI stands for "Two Wire Interface" or "TWI Was I2C(tm)" */
  53                    #define TWBR    _SFR_IO8(0x00)
  54                    #define TWSR    _SFR_IO8(0x01)
  55                    #define TWAR    _SFR_IO8(0x02)
  56                    #define TWDR    _SFR_IO8(0x03)
  57                    
  58                    /* ADC */
  59                    #define ADCW    _SFR_IO16(0x04)
  60                    #ifndef __ASSEMBLER__
  61                    #define ADC     _SFR_IO16(0x04)
  62                    #endif
  63                    #define ADCL    _SFR_IO8(0x04)
  64                    #define ADCH    _SFR_IO8(0x05)
  65                    #define ADCSR   _SFR_IO8(0x06)
  66                    #define ADCSRA  _SFR_IO8(0x06)  /* Changed in 2486H-AVR-09/02 */
  67                    #define ADMUX   _SFR_IO8(0x07)
  68                    
  69                    /* analog comparator */
  70                    #define ACSR    _SFR_IO8(0x08)
  71                    
  72                    /* USART */
  73                    #define UBRRL   _SFR_IO8(0x09)
  74                    #define UCSRB   _SFR_IO8(0x0A)
  75                    #define UCSRA   _SFR_IO8(0x0B)
  76                    #define UDR     _SFR_IO8(0x0C)
  77                    
  78                    /* SPI */
  79                    #define SPCR    _SFR_IO8(0x0D)
  80                    #define SPSR    _SFR_IO8(0x0E)
  81                    #define SPDR    _SFR_IO8(0x0F)
  82                    
  83                    /* Port D */
  84                    #define PIND    _SFR_IO8(0x10)
  85                    #define DDRD    _SFR_IO8(0x11)
  86                    #define PORTD   _SFR_IO8(0x12)
  87                    
  88                    /* Port C */
  89                    #define PINC    _SFR_IO8(0x13)
  90                    #define DDRC    _SFR_IO8(0x14)
  91                    #define PORTC   _SFR_IO8(0x15)
  92                    
  93                    /* Port B */
  94                    #define PINB    _SFR_IO8(0x16)
  95                    #define DDRB    _SFR_IO8(0x17)
  96                    #define PORTB   _SFR_IO8(0x18)
  97                    
  98                    /* EEPROM Control Register */
  99                    #define EECR    _SFR_IO8(0x1C)
 100                    
 101                    /* EEPROM Data Register */
 102                    #define EEDR    _SFR_IO8(0x1D)
 103                    
 104                    /* EEPROM Address Register */
 105                    #define EEAR    _SFR_IO16(0x1E)
GAS LISTING /tmp/ccowxWMg.s                    page 10


 106                    #define EEARL   _SFR_IO8(0x1E)
 107                    #define EEARH   _SFR_IO8(0x1F)
 108                    
 109                    #define UCSRC   _SFR_IO8(0x20)
 110                    #define UBRRH   _SFR_IO8(0x20)
 111                    
 112                    #define WDTCR   _SFR_IO8(0x21)
 113                    #define ASSR    _SFR_IO8(0x22)
 114                    
 115                    /* Timer 2 */
 116                    #define OCR2    _SFR_IO8(0x23)
 117                    #define TCNT2   _SFR_IO8(0x24)
 118                    #define TCCR2   _SFR_IO8(0x25)
 119                    
 120                    /* Timer 1 */
 121                    #define ICR1    _SFR_IO16(0x26)
 122                    #define ICR1L   _SFR_IO8(0x26)
 123                    #define ICR1H   _SFR_IO8(0x27)
 124                    #define OCR1B   _SFR_IO16(0x28)
 125                    #define OCR1BL  _SFR_IO8(0x28)
 126                    #define OCR1BH  _SFR_IO8(0x29)
 127                    #define OCR1A   _SFR_IO16(0x2A)
 128                    #define OCR1AL  _SFR_IO8(0x2A)
 129                    #define OCR1AH  _SFR_IO8(0x2B)
 130                    #define TCNT1   _SFR_IO16(0x2C)
 131                    #define TCNT1L  _SFR_IO8(0x2C)
 132                    #define TCNT1H  _SFR_IO8(0x2D)
 133                    #define TCCR1B  _SFR_IO8(0x2E)
 134                    #define TCCR1A  _SFR_IO8(0x2F)
 135                    
 136                    #define SFIOR   _SFR_IO8(0x30)
 137                    
 138                    #define OSCCAL  _SFR_IO8(0x31)
 139                    
 140                    /* Timer 0 */
 141                    #define TCNT0   _SFR_IO8(0x32)
 142                    #define TCCR0   _SFR_IO8(0x33)
 143                    
 144                    #define MCUCSR  _SFR_IO8(0x34)
 145                    #define MCUCR   _SFR_IO8(0x35)
 146                    
 147                    #define TWCR    _SFR_IO8(0x36)
 148                    
 149                    #define SPMCR   _SFR_IO8(0x37)
 150                    
 151                    #define TIFR    _SFR_IO8(0x38)
 152                    #define TIMSK   _SFR_IO8(0x39)
 153                    
 154                    #define GIFR    _SFR_IO8(0x3A)
 155                    #define GIMSK   _SFR_IO8(0x3B)
 156                    #define GICR    _SFR_IO8(0x3B)   /* Changed in 2486H-AVR-09/02 */
 157                    
 158                    /* 0x3C reserved (OCR0?) */
 159                    
 160                    /* 0x3D..0x3E SP */
 161                    
 162                    /* 0x3F SREG */
GAS LISTING /tmp/ccowxWMg.s                    page 11


 163                    
 164                    /* Interrupt vectors */
 165                    
 166                    /* External Interrupt Request 0 */
 167                    #define INT0_vect                       _VECTOR(1)
 168                    #define SIG_INTERRUPT0                  _VECTOR(1)
 169                    
 170                    /* External Interrupt Request 1 */
 171                    #define INT1_vect                       _VECTOR(2)
 172                    #define SIG_INTERRUPT1                  _VECTOR(2)
 173                    
 174                    /* Timer/Counter2 Compare Match */
 175                    #define TIMER2_COMP_vect                _VECTOR(3)
 176                    #define SIG_OUTPUT_COMPARE2             _VECTOR(3)
 177                    
 178                    /* Timer/Counter2 Overflow */
 179                    #define TIMER2_OVF_vect                 _VECTOR(4)
 180                    #define SIG_OVERFLOW2                   _VECTOR(4)
 181                    
 182                    /* Timer/Counter1 Capture Event */
 183                    #define TIMER1_CAPT_vect                _VECTOR(5)
 184                    #define SIG_INPUT_CAPTURE1              _VECTOR(5)
 185                    
 186                    /* Timer/Counter1 Compare Match A */
 187                    #define TIMER1_COMPA_vect               _VECTOR(6)
 188                    #define SIG_OUTPUT_COMPARE1A            _VECTOR(6)
 189                    
 190                    /* Timer/Counter1 Compare Match B */
 191                    #define TIMER1_COMPB_vect               _VECTOR(7)
 192                    #define SIG_OUTPUT_COMPARE1B            _VECTOR(7)
 193                    
 194                    /* Timer/Counter1 Overflow */
 195                    #define TIMER1_OVF_vect                 _VECTOR(8)
 196                    #define SIG_OVERFLOW1                   _VECTOR(8)
 197                    
 198                    /* Timer/Counter0 Overflow */
 199                    #define TIMER0_OVF_vect                 _VECTOR(9)
 200                    #define SIG_OVERFLOW0                   _VECTOR(9)
 201                    
 202                    /* Serial Transfer Complete */
 203                    #define SPI_STC_vect                    _VECTOR(10)
 204                    #define SIG_SPI                         _VECTOR(10)
 205                    
 206                    /* USART, Rx Complete */
 207                    #define USART_RXC_vect                  _VECTOR(11)
 208                    #define SIG_UART_RECV                   _VECTOR(11)
 209                    
 210                    /* USART Data Register Empty */
 211                    #define USART_UDRE_vect                 _VECTOR(12)
 212                    #define SIG_UART_DATA                   _VECTOR(12)
 213                    
 214                    /* USART, Tx Complete */
 215                    #define USART_TXC_vect                  _VECTOR(13)
 216                    #define SIG_UART_TRANS                  _VECTOR(13)
 217                    
 218                    /* ADC Conversion Complete */
 219                    #define ADC_vect                        _VECTOR(14)
GAS LISTING /tmp/ccowxWMg.s                    page 12


 220                    #define SIG_ADC                         _VECTOR(14)
 221                    
 222                    /* EEPROM Ready */
 223                    #define EE_RDY_vect                     _VECTOR(15)
 224                    #define SIG_EEPROM_READY                _VECTOR(15)
 225                    
 226                    /* Analog Comparator */
 227                    #define ANA_COMP_vect                   _VECTOR(16)
 228                    #define SIG_COMPARATOR                  _VECTOR(16)
 229                    
 230                    /* 2-wire Serial Interface */
 231                    #define TWI_vect                        _VECTOR(17)
 232                    #define SIG_2WIRE_SERIAL                _VECTOR(17)
 233                    
 234                    /* Store Program Memory Ready */
 235                    #define SPM_RDY_vect                    _VECTOR(18)
 236                    #define SIG_SPM_READY                   _VECTOR(18)
 237                    
 238                    #define _VECTORS_SIZE 38
 239                    
 240                    /* Bit numbers */
 241                    
 242                    /* GIMSK / GICR */
 243                    #define INT1    7
 244                    #define INT0    6
 245                    #define IVSEL   1
 246                    #define IVCE    0
 247                    
 248                    /* GIFR */
 249                    #define INTF1   7
 250                    #define INTF0   6
 251                    
 252                    /* TIMSK */
 253                    #define OCIE2   7
 254                    #define TOIE2   6
 255                    #define TICIE1  5
 256                    #define OCIE1A  4
 257                    #define OCIE1B  3
 258                    #define TOIE1   2
 259                    /* bit 1 reserved (OCIE0?) */
 260                    #define TOIE0   0
 261                    
 262                    /* TIFR */
 263                    #define OCF2    7
 264                    #define TOV2    6
 265                    #define ICF1    5
 265                    #elif defined (__AVR_ATmega48__)
 266                    #  include <avr/iom48.h>
 267                    #elif defined (__AVR_ATmega88__)
 268                    #  include <avr/iom88.h>
 269                    #elif defined (__AVR_ATmega8515__)
 270                    #  include <avr/iom8515.h>
 271                    #elif defined (__AVR_ATmega8535__)
 272                    #  include <avr/iom8535.h>
 273                    #elif defined (__AVR_AT90S8535__)
 274                    #  include <avr/io8535.h>
 275                    #elif defined (__AVR_AT90C8534__)
GAS LISTING /tmp/ccowxWMg.s                    page 13


 276                    #  include <avr/io8534.h>
 277                    #elif defined (__AVR_AT90S8515__)
 278                    #  include <avr/io8515.h>
 279                    #elif defined (__AVR_AT90S4434__)
 280                    #  include <avr/io4434.h>
 281                    #elif defined (__AVR_AT90S4433__)
 282                    #  include <avr/io4433.h>
 283                    #elif defined (__AVR_AT90S4414__)
 284                    #  include <avr/io4414.h>
 285                    #elif defined (__AVR_ATtiny22__)
 286                    #  include <avr/iotn22.h>
 287                    #elif defined (__AVR_ATtiny26__)
 288                    #  include <avr/iotn26.h>
 289                    #elif defined (__AVR_AT90S2343__)
 290                    #  include <avr/io2343.h>
 291                    #elif defined (__AVR_AT90S2333__)
 292                    #  include <avr/io2333.h>
 293                    #elif defined (__AVR_AT90S2323__)
 294                    #  include <avr/io2323.h>
 295                    #elif defined (__AVR_AT90S2313__)
 296                    #  include <avr/io2313.h>
 297                    #elif defined (__AVR_ATtiny2313__)
 298                    #  include <avr/iotn2313.h>
 299                    #elif defined (__AVR_ATtiny13__)
 300                    #  include <avr/iotn13.h>
 301                    #elif defined (__AVR_ATtiny25__)
 302                    #  include <avr/iotn25.h>
 303                    #elif defined (__AVR_ATtiny45__)
 304                    #  include <avr/iotn45.h>
 305                    #elif defined (__AVR_ATtiny85__)
 306                    #  include <avr/iotn85.h>
 307                    #elif defined (__AVR_ATtiny24__)
 308                    #  include <avr/iotn24.h>
 309                    #elif defined (__AVR_ATtiny44__)
 310                    #  include <avr/iotn44.h>
 311                    #elif defined (__AVR_ATtiny84__)
 312                    #  include <avr/iotn84.h>
 313                    #elif defined (__AVR_ATtiny261__)
 314                    #  include <avr/iotn261.h>
 315                    #elif defined (__AVR_ATtiny461__)
 316                    #  include <avr/iotn461.h>
 317                    #elif defined (__AVR_ATtiny861__)
 318                    #  include <avr/iotn861.h>
 319                    /* avr1: the following only supported for assembler programs */
 320                    #elif defined (__AVR_ATtiny28__)
 321                    #  include <avr/iotn28.h>
 322                    #elif defined (__AVR_AT90S1200__)
 323                    #  include <avr/io1200.h>
 324                    #elif defined (__AVR_ATtiny15__)
 325                    #  include <avr/iotn15.h>
 326                    #elif defined (__AVR_ATtiny12__)
 327                    #  include <avr/iotn12.h>
 328                    #elif defined (__AVR_ATtiny11__)
 329                    #  include <avr/iotn11.h>
 330                    #else
 331                    #  if !defined(__COMPILING_AVR_LIBC__)
 332                    #    warning "device type not defined"
GAS LISTING /tmp/ccowxWMg.s                    page 14


 333                    #  endif
 334                    #endif
 335                    
 336                    #include <avr/portpins.h>
   1                    /* Copyright (c) 2003  Theodore A. Roth
   2                       All rights reserved.
   3                    
   4                       Redistribution and use in source and binary forms, with or without
   5                       modification, are permitted provided that the following conditions are met:
   6                    
   7                       * Redistributions of source code must retain the above copyright
   8                         notice, this list of conditions and the following disclaimer.
   9                    
  10                       * Redistributions in binary form must reproduce the above copyright
  11                         notice, this list of conditions and the following disclaimer in
  12                         the documentation and/or other materials provided with the
  13                         distribution.
  14                    
  15                       * Neither the name of the copyright holders nor the names of
  16                         contributors may be used to endorse or promote products derived
  17                         from this software without specific prior written permission.
  18                    
  19                      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20                      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21                      IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22                      ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23                      LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24                      CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25                      SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26                      INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27                      CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28                      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29                      POSSIBILITY OF SUCH DAMAGE. */
  30                    
  31                    /* $Id: portpins.h,v 1.3.4.1 2006/03/10 16:22:38 aesok Exp $ */
  32                    
  33                    #ifndef _AVR_PORTPINS_H_
  34                    #define _AVR_PORTPINS_H_ 1
  35                    
  36                    /* This file should only be included from <avr/io.h>, never directly. */
  37                    
  38                    #ifndef _AVR_IO_H_
  39                    #  error "Include <avr/io.h> instead of this file."
  40                    #endif
  41                    
  42                    /* Define Generic PORTn, DDn, and PINn values. */
  43                    
  44                    /* Port Data Register (generic) */
  45                    #define    PORT7        7
  46                    #define    PORT6        6
  47                    #define    PORT5        5
  48                    #define    PORT4        4
  49                    #define    PORT3        3
  50                    #define    PORT2        2
  51                    #define    PORT1        1
  52                    #define    PORT0        0
  53                    
GAS LISTING /tmp/ccowxWMg.s                    page 15


  54                    /* Port Data Direction Register (generic) */
  55                    #define    DD7          7
  56                    #define    DD6          6
  57                    #define    DD5          5
  58                    #define    DD4          4
  59                    #define    DD3          3
  60                    #define    DD2          2
  61                    #define    DD1          1
  62                    #define    DD0          0
  63                    
  64                    /* Port Input Pins (generic) */
  65                    #define    PIN7         7
  66                    #define    PIN6         6
  67                    #define    PIN5         5
  68                    #define    PIN4         4
  69                    #define    PIN3         3
  70                    #define    PIN2         2
  71                    #define    PIN1         1
  72                    #define    PIN0         0
  73                    
  74                    /* Define PORTxn values for all possible port pins. */
  75                    
  76                    /* PORT A */
  77                    
  78                    #if defined(PA0)
  79                    #  define PORTA0 PA0
  80                    #endif
  81                    #if defined(PA1)
  82                    #  define PORTA1 PA1
  83                    #endif
  84                    #if defined(PA2)
  85                    #  define PORTA2 PA2
  86                    #endif
  87                    #if defined(PA3)
  88                    #  define PORTA3 PA3
  89                    #endif
  90                    #if defined(PA4)
  91                    #  define PORTA4 PA4
  92                    #endif
  93                    #if defined(PA5)
  94                    #  define PORTA5 PA5
  95                    #endif
  96                    #if defined(PA6)
  97                    #  define PORTA6 PA6
  98                    #endif
  99                    #if defined(PA7)
 100                    #  define PORTA7 PA7
 101                    #endif
 102                    
 103                    /* PORT B */
 104                    
 105                    #if defined(PB0)
 106                    #  define PORTB0 PB0
 107                    #endif
 108                    #if defined(PB1)
 109                    #  define PORTB1 PB1
 110                    #endif
GAS LISTING /tmp/ccowxWMg.s                    page 16


 111                    #if defined(PB2)
 112                    #  define PORTB2 PB2
 113                    #endif
 114                    #if defined(PB3)
 115                    #  define PORTB3 PB3
 116                    #endif
 117                    #if defined(PB4)
 118                    #  define PORTB4 PB4
 119                    #endif
 120                    #if defined(PB5)
 121                    #  define PORTB5 PB5
 122                    #endif
 123                    #if defined(PB6)
 124                    #  define PORTB6 PB6
 125                    #endif
 126                    #if defined(PB7)
 127                    #  define PORTB7 PB7
 128                    #endif
 129                    
 130                    /* PORT C */
 131                    
 132                    #if defined(PC0)
 133                    #  define PORTC0 PC0
 134                    #endif
 135                    #if defined(PC1)
 136                    #  define PORTC1 PC1
 137                    #endif
 138                    #if defined(PC2)
 139                    #  define PORTC2 PC2
 140                    #endif
 141                    #if defined(PC3)
 142                    #  define PORTC3 PC3
 143                    #endif
 144                    #if defined(PC4)
 145                    #  define PORTC4 PC4
 146                    #endif
 147                    #if defined(PC5)
 148                    #  define PORTC5 PC5
 149                    #endif
 150                    #if defined(PC6)
 151                    #  define PORTC6 PC6
 152                    #endif
 153                    #if defined(PC7)
 154                    #  define PORTC7 PC7
 155                    #endif
 156                    
 157                    /* PORT D */
 158                    
 159                    #if defined(PD0)
 160                    #  define PORTD0 PD0
 161                    #endif
 162                    #if defined(PD1)
 163                    #  define PORTD1 PD1
 164                    #endif
 165                    #if defined(PD2)
 166                    #  define PORTD2 PD2
 167                    #endif
GAS LISTING /tmp/ccowxWMg.s                    page 17


 168                    #if defined(PD3)
 169                    #  define PORTD3 PD3
 170                    #endif
 171                    #if defined(PD4)
 172                    #  define PORTD4 PD4
 173                    #endif
 174                    #if defined(PD5)
 175                    #  define PORTD5 PD5
 176                    #endif
 177                    #if defined(PD6)
 178                    #  define PORTD6 PD6
 179                    #endif
 180                    #if defined(PD7)
 181                    #  define PORTD7 PD7
 182                    #endif
 183                    
 184                    /* PORT E */
 185                    
 186                    #if defined(PE0)
 187                    #  define PORTE0 PE0
 188                    #endif
 189                    #if defined(PE1)
 190                    #  define PORTE1 PE1
 191                    #endif
 192                    #if defined(PE2)
 193                    #  define PORTE2 PE2
 194                    #endif
 195                    #if defined(PE3)
 196                    #  define PORTE3 PE3
 197                    #endif
 198                    #if defined(PE4)
 199                    #  define PORTE4 PE4
 200                    #endif
 201                    #if defined(PE5)
 202                    #  define PORTE5 PE5
 203                    #endif
 204                    #if defined(PE6)
 205                    #  define PORTE6 PE6
 206                    #endif
 207                    #if defined(PE7)
 208                    #  define PORTE7 PE7
 209                    #endif
 210                    
 211                    /* PORT F */
 212                    
 213                    #if defined(PF0)
 214                    #  define PORTF0 PF0
 215                    #endif
 216                    #if defined(PF1)
 217                    #  define PORTF1 PF1
 218                    #endif
 219                    #if defined(PF2)
 220                    #  define PORTF2 PF2
 221                    #endif
 222                    #if defined(PF3)
 223                    #  define PORTF3 PF3
 224                    #endif
GAS LISTING /tmp/ccowxWMg.s                    page 18


 225                    #if defined(PF4)
 226                    #  define PORTF4 PF4
 227                    #endif
 228                    #if defined(PF5)
 229                    #  define PORTF5 PF5
 230                    #endif
 231                    #if defined(PF6)
 232                    #  define PORTF6 PF6
 233                    #endif
 234                    #if defined(PF7)
 235                    #  define PORTF7 PF7
 236                    #endif
 237                    
 238                    /* PORT G */
 239                    
 240                    #if defined(PG0)
 241                    #  define PORTG0 PG0
 242                    #endif
 243                    #if defined(PG1)
 244                    #  define PORTG1 PG1
 245                    #endif
 246                    #if defined(PG2)
 247                    #  define PORTG2 PG2
 248                    #endif
 249                    #if defined(PG3)
 250                    #  define PORTG3 PG3
 251                    #endif
 252                    #if defined(PG4)
 253                    #  define PORTG4 PG4
 254                    #endif
 255                    #if defined(PG5)
 256                    #  define PORTG5 PG5
 257                    #endif
 258                    #if defined(PG6)
 259                    #  define PORTG6 PG6
 260                    #endif
 261                    #if defined(PG7)
 262                    #  define PORTG7 PG7
 263                    #endif
 264                    
 265                    /* PORT H */
 266                    
 267                    #if defined(PH0)
 268                    #  define PORTH0 PH0
 269                    #endif
 270                    #if defined(PH1)
 271                    #  define PORTH1 PH1
 272                    #endif
 273                    #if defined(PH2)
 274                    #  define PORTH2 PH2
 275                    #endif
 276                    #if defined(PH3)
 277                    #  define PORTH3 PH3
 278                    #endif
 279                    #if defined(PH4)
 280                    #  define PORTH4 PH4
 281                    #endif
GAS LISTING /tmp/ccowxWMg.s                    page 19


 282                    #if defined(PH5)
 283                    #  define PORTH5 PH5
 284                    #endif
 285                    #if defined(PH6)
 286                    #  define PORTH6 PH6
 287                    #endif
 288                    #if defined(PH7)
 289                    #  define PORTH7 PH7
 290                    #endif
 291                    
 292                    /* PORT J */
 293                    
 294                    #if defined(PJ0)
 295                    #  define PORTJ0 PJ0
 296                    #endif
 297                    #if defined(PJ1)
 298                    #  define PORTJ1 PJ1
 299                    #endif
 300                    #if defined(PJ2)
 301                    #  define PORTJ2 PJ2
 302                    #endif
 303                    #if defined(PJ3)
 304                    #  define PORTJ3 PJ3
 305                    #endif
 306                    #if defined(PJ4)
 307                    #  define PORTJ4 PJ4
 308                    #endif
 309                    #if defined(PJ5)
 310                    #  define PORTJ5 PJ5
 311                    #endif
 312                    #if defined(PJ6)
 313                    #  define PORTJ6 PJ6
 314                    #endif
 315                    #if defined(PJ7)
 316                    #  define PORTJ7 PJ7
 317                    #endif
 318                    
 319                    /* PORT K */
 320                    
 321                    #if defined(PK0)
 322                    #  define PORTK0 PK0
 323                    #endif
 324                    #if defined(PK1)
 325                    #  define PORTK1 PK1
 326                    #endif
 327                    #if defined(PK2)
 328                    #  define PORTK2 PK2
 329                    #endif
 330                    #if defined(PK3)
 331                    #  define PORTK3 PK3
 332                    #endif
 333                    #if defined(PK4)
 334                    #  define PORTK4 PK4
 335                    #endif
 336                    #if defined(PK5)
 337                    #  define PORTK5 PK5
 337                    
GAS LISTING /tmp/ccowxWMg.s                    page 20


 338                    #if __AVR_ARCH__ != 1
 339                    #  if XRAMEND < 0x100 && !defined(__COMPILING_AVR_LIBC__)
 340                    #    undef SP
 341                    #    define SP     _SFR_IO8(0x3D)
 342                    #    undef SPH
 343                    #  endif
 344                    #endif
 345                    
 346                    #include <avr/version.h>
   1                    /* Copyright (c) 2005, Joerg Wunsch                               -*- c -*-
   2                       All rights reserved.
   3                    
   4                       Redistribution and use in source and binary forms, with or without
   5                       modification, are permitted provided that the following conditions are met:
   6                    
   7                       * Redistributions of source code must retain the above copyright
   8                         notice, this list of conditions and the following disclaimer.
   9                    
  10                       * Redistributions in binary form must reproduce the above copyright
  11                         notice, this list of conditions and the following disclaimer in
  12                         the documentation and/or other materials provided with the
  13                         distribution.
  14                    
  15                       * Neither the name of the copyright holders nor the names of
  16                         contributors may be used to endorse or promote products derived
  17                         from this software without specific prior written permission.
  18                    
  19                      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20                      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21                      IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22                      ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23                      LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24                      CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25                      SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26                      INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27                      CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28                      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29                      POSSIBILITY OF SUCH DAMAGE. */
  30                    
  31                    /* $Id: version.h.in,v 1.1 2005/09/12 20:18:12 joerg_wunsch Exp $ */
  32                    
  33                    /** \defgroup avr_version <avr/version.h>: avr-libc version macros
  34                        \code #include <avr/version.h> \endcode
  35                    
  36                        This header file defines macros that contain version numbers and
  37                        strings describing the current version of avr-libc.
  38                    
  39                        The version number itself basically consists of three pieces that
  40                        are separated by a dot: the major number, the minor number, and
  41                        the revision number.  For development versions (which use an odd
  42                        minor number), the string representation additionally gets the
  43                        date code (YYYYMMDD) appended.
  44                    
  45                        This file will also be included by \c <avr/io.h>.  That way,
  46                        portable tests can be implemented using \c <avr/io.h> that can be
  47                        used in code that wants to remain backwards-compatible to library
  48                        versions prior to the date when the library version API had been
GAS LISTING /tmp/ccowxWMg.s                    page 21


  49                        added, as referenced but undefined C preprocessor macros
  50                        automatically evaluate to 0.
  51                    */
  52                    
  53                    #ifndef _AVR_VERSION_H_
  54                    #define _AVR_VERSION_H_
  55                    
  56                    /** \ingroup avr_version
  57                        String literal representation of the current library version. */
  58                    #define __AVR_LIBC_VERSION_STRING__ "1.4.5"
  59                    
  60                    /** \ingroup avr_version
  61                        Numerical representation of the current library version.
  62                    
  63                        In the numerical representation, the major number is multiplied by
  64                        10000, the minor number by 100, and all three parts are then
  65                        added.  It is intented to provide a monotonically increasing
  66                        numerical value that can easily be used in numerical checks.
  67                     */
  68                    #define __AVR_LIBC_VERSION__        10405UL
  69                    
  70                    /** \ingroup avr_version
  71                        String literal representation of the release date. */
  72                    #define __AVR_LIBC_DATE_STRING__    "20061009"
  73                    
  74                    /** \ingroup avr_version
  75                        Numerical representation of the release date. */
  76                    #define __AVR_LIBC_DATE_            20061009UL
  77                    
  78                    /** \ingroup avr_version
  79                        Library major version number. */
  80                    #define __AVR_LIBC_MAJOR__          1
  81                    
  82                    /** \ingroup avr_version
  83                        Library minor version number. */
  84                    #define __AVR_LIBC_MINOR__          4
  85                    
  86                    /** \ingroup avr_version
  87                        Library revision number. */
  88                    #define __AVR_LIBC_REVISION__       5
  89                    
  90                    #endif /* _AVR_VERSION_H_ */
  91                    ...
 347                    
  54                    #include "Events.h"
   1                    #ifndef EVENTS_H
   2                    #define EVENTS_H
   3                    
   4                    /*
   5                        Copyright (C) 2004    John Orlando
   6                        
   7                       AVRcam: a small real-time image processing engine.
   8                    
   9                        This program is free software; you can redistribute it and/or
  10                        modify it under the terms of the GNU General Public
  11                        License as published by the Free Software Foundation; either
  12                        version 2 of the License, or (at your option) any later version.
GAS LISTING /tmp/ccowxWMg.s                    page 22


  13                    
  14                        This program is distributed in the hope that it will be useful,
  15                        but WITHOUT ANY WARRANTY; without even the implied warranty of
  16                        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17                        General Public License for more details.
  18                    
  19                        You should have received a copy of the GNU General Public
  20                        License along with this program; if not, write to the Free Software
  21                        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22                    
  23                       For more information on the AVRcam, please contact:
  24                    
  25                       john@jrobot.net
  26                    
  27                       or go to www.jrobot.net for more details regarding the system.
  28                    */
  29                    /*********************************************************** 
  30                            Module Name: Events.h
  31                            Module Date: 05/23/2004
  32                            Module Auth: John Orlando
  33                            
  34                            Description: This file provides the external interface
  35                            to the events that can be published/processed in the
  36                            system.  It is specifically by itself (and nothing
  37                            else should be defined in here) so that both .c and
  38                            .S (assembly) files can include this file without
  39                            a problem.
  40                        
  41                        Revision History:
  42                        Date        Rel Ver.    Notes
  43                        4/10/2004      0.1     Module created
  44                        6/30/2004      1.0     Initial release for Circuit Cellar
  45                                               contest.
  46                        *******************************************************/
  47                    
  48                    /* Definitions */
  49                    /* Originally, all events were passed in a bitmask...however,
  50                    an event FIFO was finally used, but the coding of the event
  51                    definitions were never translated back....doesn't make a
  52                    difference, but looks a little weird */
  53                    #define EV_SERIAL_DATA_RECEIVED         0x01
  54                    #define EV_DUMP_FRAME                           0x02
  55                    #define EV_PROCESS_FRAME_COMPLETE       0x04
  55                                    
  56                                    .extern fastEventBitmask    ; This is the flag used to indicate to the rest
  57                                                                                            ; of the system that the line is complete
  58                                                                                    
  59                    #define HREF_INTERRUPT_ENABLE_MASK   0x80
  60                    #define HREF_INTERRUPT_DISABLE_MASK  0x7F
  61                    #define ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK  0x04
  62                    #define DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0xFB
  63                    #define G_PORT                                          _SFR_IO_ADDR(PINC)  
  64                    #define RB_PORT                                         _SFR_IO_ADDR(PINB)  
  65                    #define PIXEL_RUN_START_INITIAL     0x50        ; This value causes our pixel counter (TCNT1)
  66                                                                                                                    ; to overflow after 176 (horizontal) pixels
  67                    
  68                    #define RED_MEM_OFFSET                          0x00
GAS LISTING /tmp/ccowxWMg.s                    page 23


  69                    #define GREEN_MEM_OFFSET                        0x10
  70                    #define BLUE_MEM_OFFSET                         0x20
  71                    
  72                    ; A pixelBlock is defined as a contiguous group of 4 pixels that are combined 
  73                    ; together to form a specific color.  Typically, this is formed by sampling a
  74                    ; a green value, followed by a red and blue value (since we are dealing
  75                    ; with Bayer color data).  We could optionally sample a second green with
  76                    ; the red and average the greens, because the eye is more sensitive to
  77                    ; green, but for speed we don't do this.  These three values (RGB) are then
  78                    ; used as indices into the color membership lookup table (memLookup) to
  79                    ; determine which color the pixelBlock maps into.  The memLookup table is
  80                    ; manually generated for now (though it will hopefully be modified over
  81                    ; the serial interface eventually).
  82                    ;
  83                    ; Here is a pixel block:
  84                    ; ...G  G  G  G...  (row x)
  85                    ; ...B  R  B  R...  (row x+1)
  86                    ;    |  |  |  |--this is skipped 
  87                    ;    |  |  |--this is skipped
  88                    ;    |  |--this is sampled
  89                    ;    |--this is sampled
  90                    
  91                    ; As pixel blocks are sampled, the red, green, and blue values are
  92                    ; used to index into their respective color maps.  The color maps
  93                    ; return values that can be logically ANDed together so that a 
  94                    ; particular RGB triplet will result in a single bit being set
  95                    ; after the AND operation.  This single bit indicates which color
  96                    ; the RGB triplet represents.  It is also possible for no bits to
  97                    ; be set after the AND process, indicating that the RGB triplet
  98                    ; does not map to any of the colors configured in the color map.
  99                    ; This isn't quite as fast as a pure RGB lookup table, but
 100                    ; it then again it doesn't require 2^12 (4-bits for each color
 101                    ; channel) bytes to store the lookup table.  It takes just a few
 102                    ; more cycles, and only requires 48 bytes of precious RAM (16
 103                    ; per color channel, since our resolution on each color channel
 104                    ; is only 4-bits).  Not bad....for more information, see:
 105                    ; http://www.cs.cmu.edu/~trb/papers/wirevision00.pdf for more
 106                    ; information on this color segmentation technique.
 107                    
 108                    ; One other note: this code does depend on the colorMap residing
 109                    ; at a well-defined position in memory; specifically, it mus
 110                    ; start at a 256-byte boundary so that the lowest byte in the
 111                    ; map is set to 0x00.  Currently, the colorMap is forced to
 112                    ; start at RAM location 0x300.  This could potentially be changed
 113                    ; by the developer if needed, but offsets would have to be added
 114                    ; in to the colorMap look-up code below to make it work.
 115                    
 116                    
 117                    ; These are the registers that will be used throughout this
 118                    ; module for acquiring each line of pixel data
 119                    pixelCount                      = 16
 120                    pixelRunStart           = 17
 121                    lastColor               = 18
 122                    tmp1                            = 19    ; be sure to not use tmp1 and color simultaneously
 123                    tmp2                            = 20
 124                    color                   = 19
 125                    greenData               = 20
GAS LISTING /tmp/ccowxWMg.s                    page 24


 126                    blueData                = 21
 127                    colorMapLow                     = 22
 128                    colorMapHigh            = 23
 129                    prevLineBuffLow         = 22    ; overlaps with memLookupLow (but orthogonal)
 130                    prevLineBuffHigh        = 23    ; overlaps with memLookupHigh (but orthogonal)
 131                    currLineBuffLow     = 24
 132                    currLineBuffHigh        = 25
 133                    
 134                            .section .text
 135                    
 136                    ; These are the global assembly function names that are accessed via other
 137                    ; C functions
 138                            .global CamIntAsm_waitForNewTrackingFrame
 139                                    .global CamIntAsm_waitForNewDumpFrame
 140                                    .global CamIntAsm_acquireDumpLine
 141                                    .global CamIntAsm_acquireTrackingLine
 142                                    .global SIG_INTERRUPT0
 143                                    .global SIG_INTERRUPT1
 144                                    .global SIG_OVERFLOW0
 145                                    .global SIG_OVERFLOW1
 146                                    
 147                    ;*****************************************************************              
 148                    ;       Function Name: CamIntAsm_waitForNewTrackingFrame
 149                    ;       Function Description: This function is responsible for
 150                    ;       going to sleep until a new frame begins (indicated by
 151                    ;       VSYNC transitioning from low to high.  This will wake
 152                    ;       the "VSYNC sleep" up and allow it to continue with 
 153                    ;       the acquireLine function, where the system waits for
 154                    ;       an "HREF sleep" that we use to synchronize with the
 155                    ;       data.  
 156                    ;       Inputs:  r25 - MSB of currentLineBuffer
 157                    ;                r24 - LSB of currentLineBuffer
 158                    ;                                r23 - MSB of colorMap
 159                    ;                                r22 - LSB of colorMap
 160                    ;       Outputs: none
 161                    ;       NOTES: This function doesn't really return...it sorta just
 162                    ;       floats into the acquireLine function after the "VSYNC sleep"
 163                    ;       is awoken, then begins processing the line data.  Once
 164                    ;               176 pixels are sampled (and the counter overflows), then
 165                    ;               an interrupt will occur, the 'T' bit in the SREG will be
 166                    ;               set, and the function will return.
 167                    ;*****************************************************************
 168                                    
 169                    CamIntAsm_waitForNewTrackingFrame:
 170:CamInterfaceAsm.S ****             sbi             _SFR_IO_ADDR(PORTD),PD6  ; For testing...
 171:CamInterfaceAsm.S ****             cbi             _SFR_IO_ADDR(PORTD),PD6         
 172:CamInterfaceAsm.S ****             sleep
 173                    
 174                    ;*****************************************************************
 175                    ; REMEMBER...everything from here on out is critically timed to be
 176                    ; synchronized with the flow of pixel data from the camera...
 177                    ;*****************************************************************
 178                    
 179                    CamIntAsm_acquireTrackingLine:
 180:CamInterfaceAsm.S ****             brts    _cleanUp
 181                                    ;sbi            _SFR_IO_ADDR(PORTD),PD6 ; For testing...
 182                                    ;cbi            _SFR_IO_ADDR(PORTD),PD6
GAS LISTING /tmp/ccowxWMg.s                    page 25


 183                            
 184:CamInterfaceAsm.S ****         in      tmp1,_SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
 185:CamInterfaceAsm.S ****         ori     tmp1, 0x07                 ; feed Timer1
 186:CamInterfaceAsm.S ****         out     _SFR_IO_ADDR(TCCR1B),tmp1 
 187                                                                                                    ; The line is about to start...         
 188:CamInterfaceAsm.S ****             ldi     pixelCount,0                    ; Initialize the RLE stats...
 189:CamInterfaceAsm.S ****             ldi             pixelRunStart,PIXEL_RUN_START_INITIAL   ; Remember, we always calculate
 190                                                                                                                                    ; the pixel run length as
 191                                                                                                                                    ; TCNT1L - pixelRunStart
 192                                    
 193:CamInterfaceAsm.S ****             ldi             lastColor,0x00                          ; clear out the last color before we start
 194                                    
 195:CamInterfaceAsm.S ****             mov     XH,currLineBuffHigh     ; Load the pointer to the current line
 196:CamInterfaceAsm.S ****             mov             XL,currLineBuffLow              ; buffer into the X pointer regs                 
 197                                    
 198:CamInterfaceAsm.S ****             mov     ZH,colorMapHigh         ; Load the pointers to the membership
 199:CamInterfaceAsm.S ****             mov             ZL,colorMapLow                  ; lookup tables (ZL and YL will be overwritten
 200:CamInterfaceAsm.S ****             mov     YH,colorMapHigh                 ; as soon as we start reading data) to Z and Y
 201                                    
 202:CamInterfaceAsm.S ****             in              tmp1, _SFR_IO_ADDR(TIMSK)                       ; enable TIMER1 to start counting
 203:CamInterfaceAsm.S ****             ori             tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK       ; external PCLK pulses and interrupt on 
 204:CamInterfaceAsm.S ****             out             _SFR_IO_ADDR(TIMSK),tmp1                        ; overflow
 205                                    
 206:CamInterfaceAsm.S ****             ldi     tmp1,PIXEL_RUN_START_INITIAL    ; set up the TCNT1 to overflow (and
 207:CamInterfaceAsm.S ****             ldi     tmp2,0xFF                                               ; interrupts) after 176 pixels          
 208:CamInterfaceAsm.S ****             out     _SFR_IO_ADDR(TCNT1H),tmp2               
 209:CamInterfaceAsm.S ****             out     _SFR_IO_ADDR(TCNT1L),tmp1                               
 210                                    
 211:CamInterfaceAsm.S ****             mov             YL,colorMapLow          
 212                                    
 213:CamInterfaceAsm.S ****             in              tmp1, _SFR_IO_ADDR(GICR)        ; enable the HREF interrupt...remember, we
 214                                                                                                            ; only use this interrupt to synchronize
 215                                                                                                            ; the beginning of the line
 216:CamInterfaceAsm.S ****             ori     tmp1, HREF_INTERRUPT_ENABLE_MASK
 217:CamInterfaceAsm.S ****             out             _SFR_IO_ADDR(GICR), tmp1
 218                                    
 219                    ;*******************************************************************************************
 220                    ;   Track Frame handler 
 221                    ;*******************************************************************************************            
 222                                    
 223                    _trackFrame:            
 224:CamInterfaceAsm.S ****             sbi             _SFR_IO_ADDR(PORTD),PD6
 225:CamInterfaceAsm.S ****             sleep   ; ...And we wait...
 226                                    
 227                            ; Returning from the interrupt/sleep wakeup will consume
 228                            ; 14 clock cycles (7 to wakeup from idle sleep, 3 to vector, and 4 to return)   
 229                    
 230                            ; Disable the HREF interrupt
 231:CamInterfaceAsm.S ****             cbi             _SFR_IO_ADDR(PORTD),PD6
 232:CamInterfaceAsm.S ****             in              tmp1, _SFR_IO_ADDR(GICR)
 233:CamInterfaceAsm.S ****             andi    tmp1, HREF_INTERRUPT_DISABLE_MASK
 234:CamInterfaceAsm.S ****             out             _SFR_IO_ADDR(GICR), tmp1
 235                                    
 236                            ; A couple of NOPs are needed here to sync up the pixel data...the number (2)
 237                            ; of NOPs was determined emperically by trial and error.
 238:CamInterfaceAsm.S ****             nop
 239:CamInterfaceAsm.S ****             nop
GAS LISTING /tmp/ccowxWMg.s                    page 26


 240                    _acquirePixelBlock:                                                     ;                                                       Clock Cycle Count
 241:CamInterfaceAsm.S ****             in              ZL,RB_PORT                              ; sample the red value (PINB)           (1)
 242:CamInterfaceAsm.S ****             in              YL,G_PORT                               ; sample the green value (PINC)         (1)
 243:CamInterfaceAsm.S ****             andi    YL,0x0F                                 ; clear the high nibble                         (1)
 244:CamInterfaceAsm.S ****             ldd             color,Z+RED_MEM_OFFSET          ; lookup the red membership                     (2)
 245:CamInterfaceAsm.S ****             in              ZL,RB_PORT                              ; sample the blue value (PINB)          (1)
 246:CamInterfaceAsm.S ****             ldd             greenData,Y+GREEN_MEM_OFFSET; lookup the green membership               (2)
 247:CamInterfaceAsm.S ****             ldd             blueData,Z+BLUE_MEM_OFFSET      ; lookup the blue membership            (2)
 248:CamInterfaceAsm.S ****             and             color,greenData                         ; mask memberships together                     (1)
 249:CamInterfaceAsm.S ****             and             color,blueData                          ; to produce the final color            (1)
 250:CamInterfaceAsm.S ****             brts    _cleanUpTrackingLine            ; if some interrupt routine has         (1...not set)
 251                                                                                                            ; come in and set our T flag in 
 252                                                                                                            ; SREG, then we need to hop out
 253                                                                                                            ; and blow away this frames data (common cleanup)                                                                       
 254:CamInterfaceAsm.S ****             cp              color,lastColor                 ; check to see if the run continues     (1)
 255:CamInterfaceAsm.S ****             breq    _acquirePixelBlock              ;                                                                       (2...equal)
 256                                                                                                            ;                                                                       ___________
 257                                                                                                            ;                                                               16 clock cycles                 
 258                                                                                                            ; (16 clock cycles = 1 uS = 1 pixelBlock time)
 259                                    
 260                                    ; Toggle the debug line to indicate a color change
 261:CamInterfaceAsm.S ****             sbi     _SFR_IO_ADDR(PORTD),PD6
 262:CamInterfaceAsm.S ****             nop
 263:CamInterfaceAsm.S ****             cbi             _SFR_IO_ADDR(PORTD),PD6
 264                                    
 265:CamInterfaceAsm.S ****             mov             tmp2,pixelRunStart                              ; get the count value of the
 266                                                                                                                    ; current pixel run
 267:CamInterfaceAsm.S ****             in              pixelCount,_SFR_IO_ADDR(TCNT1L) ; get the current TCNT1 value 
 268:CamInterfaceAsm.S ****             mov     pixelRunStart,pixelCount                ; reload pixelRunStart for the
 269                                                                                                                    ; next run
 270:CamInterfaceAsm.S ****             sub             pixelCount,tmp2                         ; pixelCount = TCNT1L - pixelRunStart
 271                                                                                                    
 272:CamInterfaceAsm.S ****             st              X+,lastColor                    ; record the color run in the current line buffer
 273:CamInterfaceAsm.S ****             st              X+,pixelCount                   ; with its length
 274:CamInterfaceAsm.S ****             mov             lastColor,color                 ; set lastColor so we can figure out when it changes
 275                                    
 276:CamInterfaceAsm.S ****             nop                                                             ; waste one more cycle for a total of 16
 277:CamInterfaceAsm.S ****             rjmp    _acquirePixelBlock      
 278                                    
 279                    ; _cleanUpTrackingLine is used to write the last run length block off to the currentLineBuffer so
 280                    ; that all 176 pixels in the line are accounted for.
 281                    _cleanUpTrackingLine:           
 282:CamInterfaceAsm.S ****             ldi             pixelCount,0xFF         ; the length of the last run is ALWAYS 0xFF minus the last
 283:CamInterfaceAsm.S ****             sub             pixelCount,pixelRunStart        ; pixelRunStart
 284                                    
 285:CamInterfaceAsm.S ****             inc             pixelCount                              ; increment pixelCount since we actually need to account
 286                                                                                                    ; for the overflow of TCNT1
 287                                                                                                    
 288:CamInterfaceAsm.S ****             st              X+,color                                ; record the color run in the current line buffer
 289:CamInterfaceAsm.S ****             st              X,pixelCount            
 290:CamInterfaceAsm.S ****             rjmp    _cleanUp
 291                                    
 292                    _cleanUpDumpLine:               
 293                                    ; NOTE: If serial data is received, to interrupt the tracking of a line, we'll
 294                                    ; get a EV_SERIAL_DATA_RECEIVED event, and the T bit set so we will end the
 295                                    ; line's processing...however, the PCLK will keep on ticking for the rest of
 296                                    ; the frame/line, which will cause the TCNT to eventually overflow and
GAS LISTING /tmp/ccowxWMg.s                    page 27


 297                                    ; interrupt us, generating a EV_ACQUIRE_LINE_COMPLETE event.  We don't want
 298                                    ; this, so we need to actually turn off the PCLK counting each time we exit
 299                                    ; this loop, and only turn it on when we begin acquiring lines....
 300                            ; NOT NEEDED FOR NOW...
 301                                    ;in             tmp1, _SFR_IO_ADDR(TIMSK)                       ; disable TIMER1 to stop counting
 302                                    ;andi   tmp1, DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK      ; external PCLK pulses
 303                                    ;out            _SFR_IO_ADDR(TIMSK),tmp1
 304                    
 305                    _cleanUp:
 306                            ; Disable the external clocking of the Timer1 counter 
 307:CamInterfaceAsm.S ****         in      tmp1, _SFR_IO_ADDR(TCCR1B)
 308:CamInterfaceAsm.S ****         andi    tmp1, 0xF8
 309:CamInterfaceAsm.S ****         out     _SFR_IO_ADDR(TCCR1B),tmp1
 310                                    
 311                                    ; Toggle the debug line to indicate the line is complete
 312:CamInterfaceAsm.S ****             sbi     _SFR_IO_ADDR(PORTD),PD6
 313:CamInterfaceAsm.S ****             cbi             _SFR_IO_ADDR(PORTD),PD6
 314:CamInterfaceAsm.S ****             clt                             ; clear out the T bit since we have detected
 315                                                                    ; the interruption and are exiting to handle it
 316                    _exit:
 317:CamInterfaceAsm.S ****             ret
 318                                    
 319                    ;*****************************************************************              
 320                    ;       Function Name: CamIntAsm_waitForNewDumpFrame
 321                    ;       Function Description: This function is responsible for
 322                    ;       going to sleep until a new frame begins (indicated by
 323                    ;       VSYNC transitioning from low to high.  This will wake
 324                    ;       the "VSYNC sleep" up and allow it to continue with 
 325                    ;       acquiring a line of pixel data to dump out to the UI.
 326                    ;       Inputs:  r25 - MSB of currentLineBuffer
 327                    ;                r24 - LSB of currentLineBuffer
 328                    ;                                r23 - MSB of prevLineBuffer
 329                    ;                                r22 - LSB of prevLineBuffer
 330                    ;       Outputs: none
 331                    ;       NOTES: This function doesn't really return...it sorta just
 332                    ;       floats into the acquireDumpLine function after the "VSYNC sleep"
 333                    ;       is awoken.
 334                    ;*****************************************************************              
 335                    CamIntAsm_waitForNewDumpFrame:
 336:CamInterfaceAsm.S ****             sbi             _SFR_IO_ADDR(PORTD),PD6  ; For testing...
 337:CamInterfaceAsm.S ****             cbi             _SFR_IO_ADDR(PORTD),PD6
 338:CamInterfaceAsm.S ****             sleep
 339                    
 340                    ;*****************************************************************
 341                    ; REMEMBER...everything from here on out is critically timed to be
 342                    ; synchronized with the flow of pixel data from the camera...
 343                    ;*****************************************************************
 344                    
 345                    CamIntAsm_acquireDumpLine:
 346:CamInterfaceAsm.S ****             brts    _cleanUp
 347                                    ;sbi            _SFR_IO_ADDR(PORTD),PD6 ; For testing...
 348                                    ;cbi            _SFR_IO_ADDR(PORTD),PD6
 349                                    
 350:CamInterfaceAsm.S ****             mov     XH,currLineBuffHigh     ; Load the pointer to the current line
 351:CamInterfaceAsm.S ****             mov             XL,currLineBuffLow              ; buffer into the X pointer regs
 352                    
 353:CamInterfaceAsm.S ****             mov             YH,prevLineBuffHigh             ; Load the pointer to the previous line
GAS LISTING /tmp/ccowxWMg.s                    page 28


 354:CamInterfaceAsm.S ****             mov             YL,prevLineBuffLow      ; buffer into the Y pointer regs
 355                                    
 356:CamInterfaceAsm.S ****             ldi     tmp1,PIXEL_RUN_START_INITIAL    ; set up the TCNT1 to overflow (and
 357:CamInterfaceAsm.S ****             ldi     tmp2,0xFF                                               ; interrupts) after 176 pixels          
 358:CamInterfaceAsm.S ****             out     _SFR_IO_ADDR(TCNT1H),tmp2               
 359:CamInterfaceAsm.S ****             out     _SFR_IO_ADDR(TCNT1L),tmp1               
 360                                    
 361:CamInterfaceAsm.S ****         in      tmp1, _SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
 362:CamInterfaceAsm.S ****         ori     tmp1, 0x07                 ; feed Timer1
 363:CamInterfaceAsm.S ****         out     _SFR_IO_ADDR(TCCR1B),tmp1
 364:CamInterfaceAsm.S ****         nop
 365                            
 366:CamInterfaceAsm.S ****             in              tmp1, _SFR_IO_ADDR(TIMSK)                       ; enable TIMER1 to start counting
 367:CamInterfaceAsm.S ****             ori             tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK       ; external PCLK pulses and interrupt on 
 368:CamInterfaceAsm.S ****             out             _SFR_IO_ADDR(TIMSK),tmp1                        ; overflow                      
 369                                    
 370:CamInterfaceAsm.S ****             in              tmp1, _SFR_IO_ADDR(GICR)        ; enable the HREF interrupt...remember, we
 371                                                                                                            ; only use this interrupt to synchronize
 372                                                                                                            ; the beginning of the line
 373:CamInterfaceAsm.S ****             ori     tmp1, HREF_INTERRUPT_ENABLE_MASK
 374:CamInterfaceAsm.S ****             out             _SFR_IO_ADDR(GICR), tmp1
 375                                    
 376                    ;*******************************************************************************************
 377                    ;   Dump Frame handler 
 378                    ;*******************************************************************************************            
 379                                    
 380                    _dumpFrame:             
 381:CamInterfaceAsm.S ****             sbi             _SFR_IO_ADDR(PORTD),PD6
 382:CamInterfaceAsm.S ****             sleep   ; ...And we wait...
 383                    
 384:CamInterfaceAsm.S ****             cbi             _SFR_IO_ADDR(PORTD),PD6
 385:CamInterfaceAsm.S ****             in              tmp1, _SFR_IO_ADDR(GICR)                        ; disable the HREF interrupt
 386:CamInterfaceAsm.S ****             andi    tmp1, HREF_INTERRUPT_DISABLE_MASK       ; so we don't get interrupted
 387:CamInterfaceAsm.S ****             out             _SFR_IO_ADDR(GICR), tmp1                        ; while dumping the line
 388                            
 389:CamInterfaceAsm.S ****             nop             ; Remember...if we ever remove the "cbi" instruction above,
 390                                                    ; we need to add two more NOPs to cover this
 391                        
 392                    ; Ok...the following loop needs to run in 8 clock cycles, so we can get every
 393                    ; pixel in the line...this shouldn't be a problem, since the PCLK timing was
 394                    ; reduced by a factor of 2 whenever we go to dump a line (this is to give us
 395                    ; enough time to do the sampling and storing of the pixel data).  In addition,
 396                    ; it is assumed that we will have to do some minor processing on the data right
 397                    ; before we send it out, like mask off the top 4-bits of each, and then pack both
 398                    ; low nibbles into a single byte for transmission...we just don't have time to
 399                    ; do that here (only 8 instruction cycles :-)  )
 400                    _sampleDumpPixel:
 401:CamInterfaceAsm.S ****             in              tmp1,G_PORT                             ; sample the G value                                    (1)
 402:CamInterfaceAsm.S ****             in              tmp2,RB_PORT                    ; sample the R/B value                                  (1)
 403:CamInterfaceAsm.S ****             st              X+,tmp1                                 ; store to the currLineBuff and inc ptrs(2)
 404:CamInterfaceAsm.S ****             st              Y+,tmp2                                 ; store to the prevLineBuff and inc ptrs(2)
 405:CamInterfaceAsm.S ****             brtc    _sampleDumpPixel                ; loop back unless flag is set                  (2...if not set)
 406                                                                                                    ;                                                                       ___________
 407                                                                                                    ;                                                                       8 cycles normally
 408                                                                                                                                                                            
 409                                    ; if we make it here, it means the T flag is set, and we must have been interrupted
 410                                    ; so we need to exit (what if we were interrupted for serial? should we disable it?)
GAS LISTING /tmp/ccowxWMg.s                    page 29


 411:CamInterfaceAsm.S ****             rjmp    _cleanUpDumpLine
 412                    
 413                    ;***********************************************************
 414                    ;       Function Name: <interrupt handler for External Interrupt0> 
 415                    ;       Function Description: This function is responsible
 416                    ;       for handling a rising edge on the Ext Interrupt 0.  This
 417                    ;       routine simply returns, since we just want to wake up
 418                    ;       whenever the VSYNC transitions (meaning the start of a new
 419                    ;       frame).
 420                    ;       Inputs:  none
 421                    ;       Outputs: none
 422                    ;***********************************************************
 423                    SIG_INTERRUPT0:
 424                    ; This will wake us up when VSYNC transitions high...we just want to return
 425:CamInterfaceAsm.S ****             reti
 426                                    
 427                    ;***********************************************************
 428                    ;       Function Name: <interrupt handler for External Interrupt1> 
 429                    ;       Function Description: This function is responsible
 430                    ;       for handling a falling edge on the Ext Interrupt 1.  This
 431                    ;       routine simply returns, since we just want to wake up
 432                    ;       whenever the HREF transitions (meaning the pixels 
 433                    ;       are starting after VSYNC transitioned, and we need to
 434                    ;       start acquiring the pixel blocks
 435                    ;       Inputs:  none
 436                    ;       Outputs: none
 437                    ;***********************************************************    
 438                    SIG_INTERRUPT1:
 439                    ; This will wake us up when HREF transitions high...we just want to return
 440:CamInterfaceAsm.S ****             reti
 441                                    
 442                    ;***********************************************************
 443                    ;       Function Name: <interrupt handler for Timer0 overflow>
 444                    ;       Function Description: This function is responsible
 445                    ;       for handling the Timer0 overflow (hooked up to indicate
 446                    ;       when we have reached the number of HREFs required in a
 447                    ;       single frame).  We set the T flag in the SREG to
 448                    ;       indicate to the _acquirePixelBlock routine that it needs
 449                    ;       to exit, and then set the appropriate action to take in
 450                    ;       the eventList of the Executive module.
 451                    ;       Inputs:  none
 452                    ;       Outputs: none
 453                    ;   Note: Originally, the HREF pulses were also going to
 454                    ;   be counted by a hardware counter, but it didn't end up
 455                    ;   being necessary
 456                    ;***********************************************************
 457                    ;SIG_OVERFLOW0:
 458                    ;               set                             ; set the T bit in SREG
 459                    ;               lds             tmp1,eventBitmask
 460                    ;               ori             tmp1,EV_ACQUIRE_FRAME_COMPLETE
 461                    ;               sts             eventBitmask,tmp1
 462                    ;               reti
 463                                    
 464                    ;***********************************************************
 465                    ;       Function Name: <interrupt handler for Timer1 overflow>
 466                    ;       Function Description: This function is responsible
 467                    ;       for handling the Timer1 overflow (hooked up to indicate
GAS LISTING /tmp/ccowxWMg.s                    page 30


 468                    ;       when we have reached the end of a line of pixel data,
 469                    ;       since PCLK is hooked up to overflow TCNT1 after 176 
 470                    ;       pixels).  This routine generates an acquire line complete
 471                    ;       event in the fastEventBitmask, which is streamlined for
 472                    ;       efficiency reasons.
 473                    ;***********************************************************
 474                    SIG_OVERFLOW1:                          
 475:CamInterfaceAsm.S ****             lds             tmp1,fastEventBitmask                   ; set a flag indicating
 476:CamInterfaceAsm.S ****             ori             tmp1,FEV_ACQUIRE_LINE_COMPLETE  ; a line is complete
 477:CamInterfaceAsm.S ****             sts             fastEventBitmask,tmp1
 478:CamInterfaceAsm.S ****             set             ; set the T bit in SREG 
 479                                    ;sbi            _SFR_IO_ADDR(PORTD),PD6 ; For testing...
 480                                    ;cbi            _SFR_IO_ADDR(PORTD),PD6 ; For testing...
 481                    
 482:CamInterfaceAsm.S ****             reti
 483                    
 484                    ; This is the default handler for all interrupts that don't
 485                    ; have handler routines specified for them.
 486                            .global __vector_default              
 487                    __vector_default:
 488:CamInterfaceAsm.S ****         reti
 489                    
 490                            .end
GAS LISTING /tmp/ccowxWMg.s                    page 31


DEFINED SYMBOLS
                            *ABS*:00000000 CamInterfaceAsm.S
   CamInterfaceAsm.S:119    *ABS*:00000010 pixelCount
   CamInterfaceAsm.S:120    *ABS*:00000011 pixelRunStart
   CamInterfaceAsm.S:121    *ABS*:00000012 lastColor
   CamInterfaceAsm.S:122    *ABS*:00000013 tmp1
   CamInterfaceAsm.S:123    *ABS*:00000014 tmp2
   CamInterfaceAsm.S:124    *ABS*:00000013 color
   CamInterfaceAsm.S:125    *ABS*:00000014 greenData
   CamInterfaceAsm.S:126    *ABS*:00000015 blueData
   CamInterfaceAsm.S:127    *ABS*:00000016 colorMapLow
   CamInterfaceAsm.S:128    *ABS*:00000017 colorMapHigh
   CamInterfaceAsm.S:129    *ABS*:00000016 prevLineBuffLow
   CamInterfaceAsm.S:130    *ABS*:00000017 prevLineBuffHigh
   CamInterfaceAsm.S:131    *ABS*:00000018 currLineBuffLow
   CamInterfaceAsm.S:132    *ABS*:00000019 currLineBuffHigh
   CamInterfaceAsm.S:169    .text:00000000 CamIntAsm_waitForNewTrackingFrame
   CamInterfaceAsm.S:335    .text:0000008e CamIntAsm_waitForNewDumpFrame
   CamInterfaceAsm.S:345    .text:00000094 CamIntAsm_acquireDumpLine
   CamInterfaceAsm.S:179    .text:00000006 CamIntAsm_acquireTrackingLine
   CamInterfaceAsm.S:423    .text:000000d4 __vector_1
   CamInterfaceAsm.S:438    .text:000000d6 __vector_2
   CamInterfaceAsm.S:474    .text:000000d8 __vector_8
   CamInterfaceAsm.S:305    .text:00000080 _cleanUp
   CamInterfaceAsm.S:223    .text:00000034 _trackFrame
   CamInterfaceAsm.S:240    .text:00000044 _acquirePixelBlock
   CamInterfaceAsm.S:281    .text:00000074 _cleanUpTrackingLine
   CamInterfaceAsm.S:292    .text:00000080 _cleanUpDumpLine
   CamInterfaceAsm.S:316    .text:0000008c _exit
   CamInterfaceAsm.S:380    .text:000000ba _dumpFrame
   CamInterfaceAsm.S:400    .text:000000c8 _sampleDumpPixel
   CamInterfaceAsm.S:487    .text:000000e6 __vector_default

UNDEFINED SYMBOLS
__vector_9
fastEventBitmask