Subversion Repositories svnkaklik

Compare Revisions

No changes between revisions

Ignore whitespace Rev 507 → Rev 508

/programy/C/avr/LX200/COPYING
0,0 → 1,340
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
 
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
 
Preamble
 
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
 
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
 
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
 
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
 
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
 
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
 
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
 
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
 
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
 
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
 
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
 
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
 
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
 
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
 
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
 
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
 
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
 
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
 
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
 
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
 
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
 
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
 
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
 
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
 
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
 
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
 
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
 
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
 
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
 
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
 
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
 
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
 
NO WARRANTY
 
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
 
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
 
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
 
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
 
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
 
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
 
Also add information on how to contact you by electronic and paper mail.
 
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
 
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
 
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
 
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
 
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
 
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
 
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
/programy/C/avr/LX200/Makefile
0,0 → 1,115
PRG = eq6
OBJ = eq6.o paddle.o combine.o stepper.o driver.o serial.o \
pguide.o sr.o
MCU_TARGET = atmega162
 
OPTIMIZE = -O2
 
DEFS =
LIBS =
 
# You should not have to change anything below here.
 
CC = avr-gcc
 
# Override is only needed by avr-lib build system.
 
override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS)
override LDFLAGS = -Wl,-Map,$(PRG).map
 
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
 
all: $(PRG).cof lst text eeprom
 
$(PRG).elf: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
 
$(PRG).cof: $(PRG).elf
$(OBJCOPY) \
--debugging \
-O coff-ext-avr \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000 \
$(PRG).elf $(PRG).cof
 
 
release:
$(MAKE) clean
$(MAKE) DEFS=-DCLK_RATE=8000000
mv eq6.hex eq6_8MHz.sav
$(MAKE) clean
$(MAKE) DEFS=-DCLK_RATE=16000000
mv eq6.hex eq6_16MHz.sav
$(MAKE) clean
mv eq6_8MHz.sav eq6_8MHz.hex
mv eq6_16MHz.sav eq6_16MHz.hex
 
 
clean:
rm -rf *.o $(PRG).elf *.eps *.png *.pdf *.bak
rm -rf *.lst *.map $(EXTRA_CLEAN_FILES)
 
lst: $(PRG).lst
 
%.lst: %.elf
$(OBJDUMP) -h -S $< > $@
 
# Rules for building the .text rom images
 
text: hex bin srec
 
hex: $(PRG).hex
bin: $(PRG).bin
srec: $(PRG).srec
 
%.hex: %.elf
$(OBJCOPY) -j .text -j .data -O ihex $< $@
 
%.srec: %.elf
$(OBJCOPY) -j .text -j .data -O srec $< $@
 
%.bin: %.elf
$(OBJCOPY) -j .text -j .data -O binary $< $@
 
# Rules for building the .eeprom rom images
 
eeprom: ehex ebin esrec
 
ehex: $(PRG)_eeprom.hex
ebin: $(PRG)_eeprom.bin
esrec: $(PRG)_eeprom.srec
 
%_eeprom.hex: %.elf
$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@
 
%_eeprom.srec: %.elf
$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@
 
%_eeprom.bin: %.elf
$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O binary $< $@
 
# Every thing below here is used by avr-libc's build system and can be ignored
# by the casual user.
 
FIG2DEV = fig2dev
EXTRA_CLEAN_FILES = *.hex *.bin *.srec
 
dox: eps png pdf
 
eps: $(PRG).eps
png: $(PRG).png
pdf: $(PRG).pdf
 
%.eps: %.fig
$(FIG2DEV) -L eps $< $@
 
%.pdf: %.fig
$(FIG2DEV) -L pdf $< $@
 
%.png: %.fig
$(FIG2DEV) -L png $< $@
 
/programy/C/avr/LX200/combine.c
0,0 → 1,101
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: combine.c,v 1.5 2004/04/05 06:42:15 dbh Exp $
*/
 
#include <avr/io.h>
#include "combine.h"
#include "stepper.h"
 
/* Instance of rate input/output variables. Normally we would pass these via
* pointers, but this is a small code/data/environment, so they're
* accessed globally
*/
struct rateInput_s rateInput = {SPEED_0_X, SPEED_0_X, SPEED_0_X, SPEED_0_X, SPEED_0_X, SPEED_0_X, SPEED_0_X};
struct rateOutput_s rateOutput = {SPEED_0_X, SPEED_0_X};
 
/* TEST: defeat tracking for testing */
uint8_t noTrack = 0;
 
/* updateMountSpeed() takes the various speed inputs from the paddle,
* serial port, and guiding inputs and determines the actual RA and
* DEC rates
*
* Passed:
* nothing
*
* Returns:
* nothing
*
* Notes:
* Updates rateOutput global structure
*/
void
updateMountSpeed(void)
{
int8_t guideRate;
 
/* Determine the DEC rate. This is the simple one! */
if (rateInput.paddleDecRate != SPEED_0_X)
guideRate = rateInput.paddleDecRate;
else if (rateInput.serialDecRate != SPEED_0_X)
guideRate = rateInput.serialDecRate;
else if (rateInput.guideDecRate != SPEED_0_X)
guideRate = rateInput.guideDecRate;
else
guideRate = SPEED_0_X;
 
rateOutput.decRate = guideRate;
setDecSpeed(rateOutput.decRate);
 
/* Determine the RA rate. This is complicated by the need to perform
* tracking as well as guiding on this axis
*/
if (rateInput.paddleRaRate != SPEED_0_X)
guideRate = rateInput.paddleRaRate;
else if (rateInput.serialRaRate != SPEED_0_X)
guideRate = rateInput.serialRaRate;
else if (rateInput.guideRaRate != SPEED_0_X)
guideRate = rateInput.guideRaRate;
else
guideRate = SPEED_0_X;
 
/* Now we need to add the traking rate to the guiding rate. Fractional
* guiding rates simply adjust the tracking rate, x1 guiding
* doubles/stops the motion, higher tracking rate override the
* guiding rate.
*/
if (noTrack || (guideRate > SPEED_1_X) || (guideRate < -SPEED_1_X))
rateOutput.raRate = guideRate;
else if ((guideRate < SPEED_1_X) && (guideRate > -SPEED_1_X))
rateOutput.raRate = rateInput.siderialRate + guideRate;
else if ((guideRate == SPEED_1_X) && (rateInput.siderialRate == SPEED_1_X))
rateOutput.raRate = SPEED_2_X;
else if ((guideRate == -SPEED_1_X) && (rateInput.siderialRate == -SPEED_1_X))
rateOutput.raRate = -SPEED_2_X;
else
rateOutput.raRate = SPEED_0_X;
 
/* The RA axis needs to turn in the opposite direction of the
* DEC axis. This is the simplest place to do it
*/
setRaSpeed(-rateOutput.raRate);
 
/* All done! */
}
/programy/C/avr/LX200/combine.h
0,0 → 1,77
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: combine.h,v 1.4 2004/04/05 06:42:15 dbh Exp $
*/
#ifndef _COMBINE_H_
#define _COMBINE_H_
 
#include <inttypes.h>
 
/* This file gives the "public" interface for the "combining" function
* that takes the various inputs (siderial rate, paddle buttons, serial
* input, guider input) to derive speeds for the RA and DEC axis
*/
 
/* Speed definitions */
#define SPEED_0_X 0
#define SPEED_0_33_X 1
#define SPEED_0_67_X 2
#define SPEED_1_X 3
#define SPEED_1_33_X 4
#define SPEED_1_67_X 5
#define SPEED_2_X 6
#define SPEED_4_X 7
#define SPEED_8_X 8
#define SPEED_16_X 9
#define SPEED_SPIN 10
 
#define SPEED_SIDERIAL SPEED_1_X
 
struct rateInput_s
{
int8_t siderialRate;
 
int8_t paddleRaRate;
int8_t paddleDecRate;
 
int8_t serialRaRate;
int8_t serialDecRate;
 
int8_t guideRaRate;
int8_t guideDecRate;
};
 
extern struct rateInput_s rateInput;
 
struct rateOutput_s
{
int8_t raRate;
int8_t decRate;
};
 
extern struct rateOutput_s rateOutput;
 
void updateMountSpeed(void);
 
/* TEST: defeat tracking for testing */
extern uint8_t noTrack;
 
#endif /* _COMBINE_H_ */
 
/programy/C/avr/LX200/driver.c
0,0 → 1,197
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: driver.c,v 1.4 2004/04/04 06:54:05 dbh Exp $
*/
 
/* This file contains the code that takes the excitation values for each
* coil (determined by the stepper module) and performs a crude PWM
* and generates the output values for the stepper drivers.
*
* This module has it's own timer at a high frequency timer, so efficiency
* is an important issue.
*/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
 
#include "eq6.h"
#include "stepper.h"
#include "driver.h"
 
/* Like the stepper.h module this one is heavily table-driven. Basically
* each excitation value corresponds to 4, 8 bit lists of values are used
* for 8 clock cycles. This gives a crude PWM system.
*
* The hardware is orginized such that both "ends" of a coil are in
* adjacent bits, so each pair of 8 bits is interleaved into a single
* 16 bit word where the bits are used two at a time.
*
* Note: The high side and low side tables here were different - basically if
* a high side was driven for one coil, the low side should be driven for the
* other.
*
* However the low side bits are reversed because of the bit numbers running
* in the opposite direction for Port A (low side) vs Port C (high side), so
* it turns out that the same table can be used for both!
*
* Of course the bits for the coils are composed in the opposite direction
* too, but that happens below
*/
uint8_t driveTbl[] =
{
[EX_M_1] = 0xaa,
[EX_M_0_67] = 0x2a,
[EX_M_0_4] = 0x22,
[EX_M_0_2] = 0x02,
[EX_0] = 0x00,
[EX_P_0_2] = 0x01,
[EX_P_0_4] = 0x11,
[EX_P_0_67] = 0x15,
[EX_P_1] = 0x55
};
 
#define PWM_RATE 48000 /* PWM update speed */
#define PWM_STEPS 4 /* Steps per PWM cycle */
 
/* driverInit() initializes the port used by the stepper motors and the timer
* used to update the stepper driver state
*
* Passed:
* Nothing
*
* Returns:
* Nothing
*
*/
void
driverInit(void)
{
/* Set up port A and C as outputs and set them to a safe default state
* i.e. no outputs driven
*/
PORTA = 0x00; // Disable high-side drivers
DDRA = 0xff; // Set as outputs
 
PORTC = 0xff; // Disable low-side drivers
DDRC = 0xff; // Set as outputs
 
/* Setup the "magic" relay bit as an output */
 
MAGIC_PORT &= ~_BV(MAGIC_BIT);
MAGIC_DDR |= _BV(MAGIC_BIT);
 
/* Setup timer 0 to generate interrupts for PWM */
OCR0 = (CLK_RATE / PWM_RATE / 8);
TCCR0 = _BV(WGM01) | _BV(CS01); // Divied by 8, CTC mode
 
/* Enable interrupt generation from timer 0 */
TIMSK |= _BV(OCIE0);
}
 
/* driverInt() is called whenever a timer 0 overflow interrupt occurs
*
* Passed:
* Nothing
*
* Returns:
* Nothing
*/
SIGNAL(SIG_OUTPUT_COMPARE0)
{
static uint8_t raCoil1States;
static uint8_t raCoil2States;
static uint8_t decCoil1States;
static uint8_t decCoil2States;
 
static uint8_t ctr = PWM_STEPS - 1;
 
uint8_t highSidePort;
uint8_t lowSidePort;
 
// PORTA = ~excitation.ra;
// PORTC = ~excitation.dec;
 
/* Increment the step count. Reinitialize the states entries
* if the counter wraps around
*/
if (++ctr == PWM_STEPS)
{
uint8_t tmp;
 
ctr = 0;
 
/* Update states */
tmp = _GET_C1(raExcitation.excitation);
raCoil1States = driveTbl[tmp];
 
tmp = _GET_C2(raExcitation.excitation);
raCoil2States = driveTbl[tmp];
 
tmp = _GET_C1(decExcitation.excitation);
decCoil1States = driveTbl[tmp];
 
tmp = _GET_C2(decExcitation.excitation);
decCoil2States = driveTbl[tmp];
 
/* Update magic relay state */
if (raExcitation.useRelay)
MAGIC_PORT &= ~_BV(MAGIC_BIT);
else
MAGIC_PORT |= _BV(MAGIC_BIT);
}
 
/* Build the high_side driver output value */
highSidePort = decCoil2States & 0x3;
highSidePort <<= 2;
 
highSidePort |= decCoil1States & 0x3;
highSidePort <<= 2;
 
highSidePort |= raCoil2States & 0x3;
highSidePort <<= 2;
 
highSidePort |= raCoil1States & 0x3;
 
/* Build the low-side driver states. Note that, due to the
* reverse pin pordering for Port A vs Port C that these are built in
* the opposite direction
*/
lowSidePort = raCoil1States & 0x3;
lowSidePort <<= 2;
raCoil1States >>= 2;
 
lowSidePort |= raCoil2States & 0x3;
lowSidePort <<= 2;
raCoil2States >>= 2;
 
lowSidePort |= decCoil1States & 0x3;
lowSidePort <<= 2;
decCoil1States >>= 2;
 
lowSidePort |= decCoil2States & 0x3;
decCoil2States >>= 2;
 
/* Potential safety check: rev (PortA) & PortC == 0 */
 
/* Write the values to the output ports */
PORTC = highSidePort;
PORTA = ~lowSidePort;
}
/programy/C/avr/LX200/driver.h
0,0 → 1,39
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: driver.h,v 1.1.1.1 2004/02/22 08:12:42 dbh Exp $
*/
 
#ifndef _DRIVER_H_
#define _DRIVER_H_
 
/* This file contains the interface for the actual stepper motor driver */
 
/* Bit use to connect to the "magic" relay that determines which
* set ot RA coils are connected. This allows low current operation when
* not slewing at high speed
*/
#define MAGIC_PORT PORTB
#define MAGIC_DDR DDRB
#define MAGIC_BIT PB4
 
/* Interface prototypes */
void driverInit(void);
 
#endif /* _DRIVER_H_ */
 
/programy/C/avr/LX200/eq6-mnt.txt
0,0 → 1,156
EQ6 Mount controller analysis (v1 - 10 Jan 2004)
 
Darren Hutchinson
dbh@gbdt.com.au
 
$Id: eq6-mnt.txt,v 1.3 2004/03/07 07:44:59 dbh Exp $
 
Overview:
 
CPU: AT87F51
Clock speed: 3.52 MHz (measured at pin 18 of CPU)
Firmware: MotorDrive DW3505010
 
RA connector
1 RA coil A Driven RA=2,8,16x
2 RA coil C Driven RA=2,8,16x
3 RA coil A Driven RA=1x, 22R to 1, 178R to 4
4 RA coli B Driven RA=Any, 157R to 1, 178R to 3
5 RA coil C Driven RA=1x 173R to 6, 155R to 2
6 RA coil D Driven RA=Any 173R to 5, 22R to 2
 
DEC connector
1 DEC coil A A/B are coil with 16R3 resistance
2 DEC coil B
3 DEC coil C C/D are coil with 16R3 resistance
4 DEC coil D
 
Drive waveforms:
 
RA 0X: Coils not driven
RA 1X: Driven +12V for 114 ms, 0V for 114 ms, not driven for 38ms b/w
driven states, overall time is 302ms [OSC only accurate to 2ms]
 
Each coil driven at 90deg to other coil.
 
Timing correct for half step mode
 
RA 2X: Driven +12V for 75ms, 0V for 76ms, overall time is 151 ms, each coil
at 90deg to other coil
RA 8X: Overall period is 38ms, no undriven time,
coils at 90deg
RA 16X: Overall period is 12.8 ms, no undriven time, coils at 90deg
 
- Timing indicates full step mode
- No evidence of velocity ramp in x2, x8, x16 mode
- RA 1X timinig is correct assuming 180 tooth worm and 1:132 transfer gear
& gearbox reduction ratio
 
DEC 0X: Outputs not driven
DEC 2X: Overall period 151 ms, no undriven time
DEC 8X: Overall period 37.8ms, no undriven time, coils at 90 deg
DEC 16X: Overall period 12.6ms, no undriven time, coils at 90 deg
 
- Timing indicates full step mode
- No evidence of velocity ramp in x16, x8, or x2 mode
 
Drive circuit:
 
The drive circuit is a fairly plain "H" driver with one quirk that may, or
may not, be intentional design from Synta.
 
The half-"H" is built from a pair on PNP/NPN transistors operating in
common-emitter mode. This is somewhat unusual as circuits intended to
drive high currents typically operate in common collector mode.
 
Anyway, the PNP transistor that pulls the output high has a base current of
about 11 mA (depending on the supply voltage). With a transistor hfe of
40 this should give an output current of at least 500 mA.
 
The other part of the bridge is another issue. The identical circuit is used to
drive the base of this NPN transistor, but in this case it will only give
the transistor 1.2 mA, leading to a lower current.
 
The rated hfe of the transistor only guarantees a current of about 50 mA, but
the hfe is typically much higher. In the unit measured the coil current seemed
to be limited to about 250 mA.
 
This may be an attempt to limit the current in fault conditions where
both the NPN and PNP transistors are active, or it may just be bad circuit
design.
 
In any case there are two practical effects:
 
First the transistor may not be saturated, so it will run hot.
Second the coil current is limited, giving less torque.
 
Both of these effect mean that the existing electronics would be
a poor choice as the basis of a GOTO design (but I guess you knew
that ....)
 
MCU Pin Label Use
1 P1.0 1 = RA at 1x, 0 = RA != 1x
2 P1.1 Same as P1.0
3 P1.2 Same as P1.0
4 P1.3 Same as P1.0
5 P1.4 Same as P1.0 but connected to relay (1 = relay off, 0 = on)
6 P1.5 Same as P1.0
7 P1.6 Same as P1.0
8 P1.7 Same as P1.0
9 RST R/C reset circuit, C = 22uF, R = 5K1, active high
10 RXD Data from controller via 1K resistor
11 TXD No data
12 INT0 0V
13 INT1 +5V
14 T0 +5V
15 T1 +5V
16 *WR +5V
17 *RD +5V
18 XTAL xtal out (freq meas point)
19 XTAL Xtal in
20 GND 0V
21 P2.0 1 = RA coil A to +12v, 0 = No effect
22 P2.1 1 = RA coil B to +12v , 0 = No effect
23 P2.2 1 = RA coil C to +12v , 0 = No effect
24 P2.3 1 = RA coil D to +12v, 0 = No effect
25 P2.4 1 = DEC coil A to +12v, 0 = No effect
26 P2.5 1 = DEC coil B to +12v, 0 = No effect
27 P2.6 1 = DEC coil C to +12v, 0 = No effect
28 P2.7 1 = DEC coil D to +12v, 0 = No effect
29 *PSEN +5V
30 ALE Toggle at 602 KHz (high 540 ns, low 1.1 us) [~6 clk / ALE ]
31 *EA +5V
32 P0.7 1 = No effect, 0 = RA coil A to 0V
33 P0.6 1 = No effect, 0 = RA coil B to 0V
34 P0.5 1 = No effect, 0 = RA coil C to 0V
35 P0.4 1 = No effect, 0 = RA coil D to 0V
36 P0.3 1 = No effect, 0 = DEC coil A to 0V
37 P0.2 1 = No effect, 0 = DEC coil B to 0V
38 P0.1 1 = No effect, 0 = DEC coil C to 0V
39 P0.0 1 = No effect, 0 = DEC coil D to 0V
40 Vcc +5V
 
Controller connector port:
 
Pin numbers from RIGHT looking into socket with tab up (as numbered on
controller board)
 
1: Switched +12V from hand controller
2: Ground
3: Data from hand controller via 1K resistor
4: Short to pin 1
5: +12V from source via diode
6: Short to pin 5
 
Notes:
 
- Northern hemisphere selected during measurements
- Relay is 5V, but appears to be driven via a resistor from the 12V supply
- Finder LED has buffering (Q2)
- Controller is series diode protected from reverse power connection
 
Mechanical details:
 
14mm from PCB to inside of cover plate
5mm from PCB to top of MCU socket
9mm from PCB to top of MCU
/programy/C/avr/LX200/eq6-serial.txt
0,0 → 1,125
EQ-6/Atlas handpaddle protocol (v3 - 11 Jan 2004).
 
Darren Hutchinson
dbh@gbdt.com.au
 
$Id: eq6-serial.txt,v 1.3 2004/03/07 07:44:59 dbh Exp $
 
Introduction:
 
The EQ-6/Atlas hand controller is used to control the operation of the
Atlas/EQ-6 mount. The hand controller also acts as a power switch for
the mount.
 
The communication bewteen the controller and the mount is
unidirectional, with data being sent from the controller to the mount
over a single wire. The other wires provide ground, +12V from the mount
to the controller, and switched 12V back to the mount.
 
Cable pinout TBD.
 
Physical format:
 
The signal is a 0/5V signal, with a '1' represented by 5 V. Start bits
are '0', stop bits are '1'
 
Data format:
 
The data is a set of 6 asynchronous words with a format of 1 start bit,
9 data bits, and 1 stop bit. The bits are transmitted at rate of 935
bits per second. The six words are transmitted every 76.2 ms.
 
Note that there is no indication in the data of which word is actually
the first in the set of words. The ordering below is a guess based on
the distribution of extra stop bits in the set of words.
 
The distribution of extra stop bits between the six words depends on
which keys are pressed but it seems unlikely that this is detected or
used by the mount.
 
The six words are divided into two sets of three, one set for RA, the
other for DEC. Each set contains a sync word, a direction word, and a
speed word.
 
All words below are shown with the most significant bit on the left. The
least significant bit is transmitted first, immediately after the start
bit. All RA words have bit 8 set to 0, all DEC words have bit 8 set to 1.
 
Word 1: RA sync
 
This word is always the bit pattern 001111110 (0x07e).
 
B0: Always 0
B1 - B6: Always 1
B7 - B8: Always 0
 
Word 2: RA direction
 
This word determines the rotation direction of the RA axis,
 
B0: 0 = RA left, 1 = RA right.
B1 - Bit 8: Always 0
 
Note: When no keys are pressed Bit 0 is 0 when the controller is set for
southern hemisphere operation, and 1 when set for northern hemisphere
operation.
 
Word 3: RA speed
 
This word determines the speed of the RA axis in multiples of the
sideral rate. There seems to be some logic in the controller for the x2
speed to help with guiding:
 
B3 - 0 Rate
0000 x0 (RA button for opposite direction to hemisphere RA in x2 mode)
0001 x1 (No RA button pressed)
0010 x2 (RA button for same direction to hemisphere RA in x2 mode)
0100 x8
1000 x16
 
B8 to B4: All 0
 
Word 4: DEC sync (?)
 
This word seems to be used to synchronize the start of the DEC
information, but it could be used for something else
 
B0 - B7: All 0
B9: Always '1'
 
Word 5: DEC direction
 
This word determines the direction of DEC axis rotation.
 
B0: 0 = DEC UP, 1 = DEC DOWN
B1 - B7: All 0
B8: Always 1
 
Word 6: DEC speed:
 
This word determines the spped of rotation of the DEC axis.
 
B3 - B0 Speed
0000 x0 (no motion)
0010 x2
0100 x8
1000 x16
 
B7 - B4: All 0
B8: Always 1
 
Notes:
 
- The DEC reverse and RA reverse seem to be inputs to the controller MCU
but only control the interpretation of the buttons and are not sent
directly to the mount.
 
- see eq6-mnt.txt for pinout of cable
 
Further work:
 
- Need to determine correct "first word" in set by monitoring data from
startup
- Need to check for any special startup words by monitoring data from
startup
 
/programy/C/avr/LX200/eq6.c
0,0 → 1,86
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: eq6.c,v 1.4 2004/04/04 10:32:50 dbh Exp $
*/
 
#include <avr/interrupt.h>
 
#include "eq6.h"
#include "paddle.h"
#include "stepper.h"
#include "driver.h"
#include "serial.h"
#include "pguide.h"
#include "sr.h"
 
volatile uint32_t idleCtr;
 
/* main() is called after the basic system initialization. This
* initialises the program modules (these are, generally, interrupt
* driver), and then waits for the end of civilization as we know it
*
* Passed:
* Nothing
*
* Returns:
* Nothing
*
* Notes:
* There is little to do here but wait.
*/
int
main(void)
{
DDRA = 0xff;
DDRC = 0xff;
PORTA = 0x0;
PORTC = 0x0;
 
/* Initialize the modules */
paddleInit();
stepperInit();
driverInit();
serialInit();
pguideInit();
 
/* Load save data (if any) from the EEPROM */
srLoadState();
setupRateTable(transRatio);
setTrackRate(0);
setTrackRate(trackingRate);
 
/* Enable interrupts */
sei();
 
/* Increment the idle counter to get some idea of the system
* idle time
*/
for (;;)
{
if (doSave)
{
doSave = 0;
srSaveState();
}
}
 
/* NOTREACHED */
return 0;
}
/programy/C/avr/LX200/eq6.h
0,0 → 1,43
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: eq6.h,v 1.3 2004/04/04 10:32:50 dbh Exp $
*/
 
#ifndef _EQ6_H_
#define _EQ6_H_
 
#include <inttypes.h>
 
/* Define the default clock rate used by the software
* replacement firmware
*/
#define DEF_CLK_RATE (8L * 1000L * 1000L) // 8 MHz
 
#ifndef CLK_RATE
#define CLK_RATE DEF_CLK_RATE
#endif /* CLK_RATE */
 
/* Set the default transmission (gearbox) ratio used by the software. The
* value set via the serial port will override this.
*
* Note: this does not include the worm/worm gear ratio
*/
#define DEF_TRANS_RATIO 132
 
#endif /* _EQ6_H_ */
/programy/C/avr/LX200/eq6_cof.aps
0,0 → 1,0
<AVRStudio><MANAGEMENT><ProjectName>eq6_cof</ProjectName><Created>22-Feb-2004 13:09:53</Created><LastEdit>10-Apr-2004 17:56:42</LastEdit><ICON>Object.bmp</ICON><ProjectType>1</ProjectType><Created>22-Feb-2004 13:09:53</Created><Version>4</Version><Build>310</Build><ProjectTypeName>Atmel AVR Assembler</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>H:\atlas\eq6_ver1\eq6.cof</ObjectFile><EntryFile></EntryFile><SaveFolder>H:\atlas\eq6_ver1\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega162</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><Item>51</Item><Item>636</Item><Item>547</Item><Item>34</Item><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0><Variables>pEntry</Variables></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><FilesInProject><Object><OpenString>Object File (*.hex)|*.hex;|AllFiles(*.*)|*.*</OpenString><File>H:\atlas\eq6_ver1\eq6.cof</File></Object></FilesInProject><Files><File00000><FileId>00000</FileId><Path>h:\atlas\eq6_ver1/</Path><Name>eq6.c</Name><Status>259</Status></File00000><File00001><FileId>00001</FileId><Path>h:\atlas\eq6_ver1/</Path><Name>paddle.c</Name><Status>258</Status></File00001><File00002><FileId>00002</FileId><Path>h:\atlas\eq6_ver1/</Path><Name>combine.c</Name><Status>258</Status></File00002><File00003><FileId>00003</FileId><Path>h:\atlas\eq6_ver1/</Path><Name>stepper.c</Name><Status>259</Status></File00003><File00004><FileId>00004</FileId><Path>h:\atlas\eq6_ver1/</Path><Name>driver.c</Name><Status>258</Status></File00004><File00005><FileId>00005</FileId><Path>h:\atlas\eq6_ver1/</Path><Name>serial.c</Name><Status>258</Status></File00005><File00006><FileId>00006</FileId><Path>h:\atlas\eq6_ver1/</Path><Name>pguide.c</Name><Status>258</Status></File00006><File00007><FileId>00007</FileId><Path>h:\atlas\eq6_ver1/</Path><Name>sr.c</Name><Status>258</Status></File00007><File00008><FileId>00008</FileId><Path>H:\atlas\eq6_ver1\</Path><Name>&lt;built-in&gt;</Name><Status>258</Status></File00008></Files><Workspace><File00000><Position>3407 3085 3905 3329</Position><LineCol>47 0</LineCol></File00000><File00003><Position>3429 3107 4004 3420</Position><LineCol>0 0</LineCol></File00003></Workspace><Events><Breakpoints><File00000></File00000><File00001></File00001><File00002></File00002><File00003><B0><Line>325</Line><Value>}</Value><Enabeled>TRUE</Enabeled></B0></File00003><File00004></File00004><File00005></File00005><File00006></File00006><File00007></File00007><File00008></File00008></Breakpoints><Tracepoints><File00000></File00000><File00001></File00001><File00002></File00002><File00003></File00003><File00004></File00004><File00005></File00005><File00006></File00006><File00007></File00007><File00008></File00008></Tracepoints><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio>
/programy/C/avr/LX200/lx200.kontrollerlab
0,0 → 1,70
<!DOCTYPE KontrollerLab>
<PROJECT VERSION="0.8.0-beta1" >
<FILES>
<FILE SHOWN="FALSE" NAME="combine.c" />
<FILE SHOWN="FALSE" NAME="combine.h" />
<FILE SHOWN="FALSE" NAME="driver.c" />
<FILE SHOWN="FALSE" NAME="driver.h" />
<FILE SHOWN="FALSE" NAME="eq6.c" />
<FILE SHOWN="FALSE" NAME="eq6.h" />
<FILE SHOWN="FALSE" NAME="paddle.c" />
<FILE SHOWN="FALSE" NAME="paddle.h" />
<FILE SHOWN="FALSE" NAME="pguide.c" />
<FILE SHOWN="FALSE" NAME="pguide.h" />
<FILE SHOWN="FALSE" NAME="serial.c" />
<FILE SHOWN="FALSE" NAME="serial.h" />
<FILE SHOWN="FALSE" NAME="sr.c" />
<FILE SHOWN="FALSE" NAME="sr.h" />
<FILE VIEWS="0,0,1024,445,5," SHOWN="TRUE" NAME="stepper.c" />
<FILE SHOWN="FALSE" NAME="stepper.h" />
</FILES>
<SETTINGS>
<ASSEMBLER_COMMAND VALUE="avr-gcc" />
<BUILD_SYSTEM VALUE="BUILT_IN_BUILD" />
<CLOCK VALUE="8e+06" />
<COMPILER_CALL_PROLOGUES VALUE="FALSE" />
<COMPILER_COMMAND VALUE="avr-gcc" />
<COMPILER_F_CPU VALUE="FALSE" />
<COMPILER_GDEBUG VALUE="FALSE" />
<COMPILER_OPT_LEVEL VALUE="s" />
<COMPILER_STRICT_PROTOTYPES VALUE="TRUE" />
<COMPILER_WALL VALUE="TRUE" />
<CPU VALUE="ATMega162" />
<HEX_FILE VALUE="project.hex" />
<LINKER_COMMAND VALUE="avr-gcc" />
<LINKER_FLAGS VALUE="" />
<MAKE_CLEAN_TARGET VALUE="clean" />
<MAKE_COMMAND VALUE="make" />
<MAKE_DEFAULT_TARGET VALUE="all" />
<MAP_FILE VALUE="project.map" />
<OBJCOPY_COMMAND VALUE="avr-objcopy" />
</SETTINGS>
<DEBUGGER_SETTINGS/>
<PROGRAMMERCONFIG>
<AVRDUDE_CONNECTION_PORT VALUE="/dev/parport0" />
<AVRDUDE_COUNT_ERASE VALUE="FALSE" />
<AVRDUDE_DISABLE_AUTO_ERASE VALUE="FALSE" />
<AVRDUDE_OVERRIDE_INVALID_SIGNATURE VALUE="FALSE" />
<AVRDUDE_PROGRAMMER_TYPE VALUE="dapa" />
<AVRDUDE_TEST_MODE VALUE="FALSE" />
<PROGRAMMER_COMMAND VALUE="avrdude" />
<PROGRAMMER_NAME VALUE="AVRDUDE" />
<UISP_PARALLEL_AT89S VALUE="FALSE" />
<UISP_PARALLEL_DISABLE_RETRIES VALUE="FALSE" />
<UISP_PARALLEL_EEPROM_MAX_WRITE_DELAY VALUE="2777" />
<UISP_PARALLEL_FLASH_MAX_WRITE_DELAY VALUE="2777" />
<UISP_PARALLEL_NO_DATA_POLLING VALUE="FALSE" />
<UISP_PARALLEL_PORT VALUE="" />
<UISP_PARALLEL_RESET_HIGH_TIME VALUE="0" />
<UISP_PARALLEL_SCK_HIGH_LOW_TIME VALUE="0" />
<UISP_PARALLEL_VOLTAGE VALUE="0" />
<UISP_PROGRAMMER_TYPE VALUE="" />
<UISP_SERIAL_PORT VALUE="" />
<UISP_SERIAL_SPEED VALUE="9600" />
<UISP_SPECIFY_PART VALUE="FALSE" />
<UISP_STK500_AREF_VOLTAGE VALUE="0" />
<UISP_STK500_OSCILLATOR_FREQUENCY VALUE="14.1" />
<UISP_STK500_USE_HIGH_VOLTAGE VALUE="FALSE" />
<UISP_STK500_VTARGET_VOLTAGE VALUE="0" />
</PROGRAMMERCONFIG>
</PROJECT>
/programy/C/avr/LX200/paddle.c
0,0 → 1,246
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: paddle.c,v 1.4 2004/03/03 07:37:11 dbh Exp $
*/
 
/* This file handles the interface to the EQ-6/Atlas hand paddle.
*
* This paddle generates a continuous serial stream containing information
* about the state of the paddle. Unlike many simple paddles the EQ-6 has a
* small microprocessor to handle the various functions (debouncing, switch
* refersal, etc)
*
* See the file eq6-serial.txt for further information on the prototcol
* used by the hand paddle.
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
 
#include "paddle.h"
#include "eq6.h"
#include "combine.h"
 
uint8_t paddleGuideRate = SPEED_1_X;
 
/* paddleInit() initializes the serial port used for the EQ6/Atlas
* hand paddle. The communication with this port is only in one
* direction (from paddle to mount).
*
* Passed:
* Nothing
*
* Returns:
* Nothing.
*/
void
paddleInit(void)
{
// The handpaddle is connected to UART port #0 (pin 10)
 
// Set serial rate
UBRR0H = (CLK_RATE / PADDLE_RATE / 16 - 1) >> 8;
UBRR0L = (CLK_RATE / PADDLE_RATE / 16 - 1) & 0xff;
 
/* Setup registers
* 9 bits, RX enable
*/
UCSR0B = 0; // Disable all interrupts
UCSR0C = _BV(URSEL0) | _BV(UCSZ01) | _BV(UCSZ00);
UCSR0B = _BV(RXCIE0) | _BV(UCSZ02) | _BV(RXEN0);
}
 
/* paddleInt() is called whenever a character is received on USART0.
* These characters are send by the hand paddle
*
* Passed:
* Nothing
*
* Returns:
* Nothing
*
* Notes:
* This function inplemented a state machine to properly
* synchronize with the incoming character stream.
*
* Interrupts are disabled during processing
*/
SIGNAL(SIG_USART0_RECV)
{
uint8_t lowerByte;
uint8_t b8;
 
static void *pLabel = &&wait_for_sync;
 
static uint8_t raDir = 0;
static uint8_t raSpeed = 0;
static uint8_t decDir = 0;
 
static uint8_t oldRaDir = (uint8_t)-1;
static uint8_t oldRaSpeed = (uint8_t)-1;
static uint8_t oldDecDir = (uint8_t)-1;
static uint8_t oldDecSpeed = (uint8_t)-1;
 
/* Read the nine bits of transferred data. We don't do this
* during initialization as the order is important!
*/
b8 = UCSR0B & _BV(RXB80);
lowerByte = UDR0;
 
/* Jump to the code that handles the current reception system. Note that
* this feature is GCC specific.
*/
goto *pLabel;
 
/* Wait for the RA sync byte
*/
wait_for_sync:
if ((b8 == 0) && (lowerByte == RA_SYNC))
pLabel = &&get_ra_direction;
return;
 
/* Get the RA direction - this will have b8 == 0
*/
get_ra_direction:
if (b8 == 0)
{
raDir = lowerByte & _BV(RA_DIR_BIT);
pLabel = &&get_ra_speed;
}
else
pLabel = &&wait_for_sync;
return;
 
/* Get the RA speed - this will have b8 == 0
*/
get_ra_speed:
if (b8 == 0)
{
raSpeed = lowerByte & RA_SPEED_MASK;
pLabel = &&get_dec_sync;
}
else
pLabel = &&wait_for_sync;
return;
 
/* Get the mystery fourth byte
*/
get_dec_sync:
if (b8 != 0)
{
pLabel = &&get_dec_direction;
}
else
pLabel = &&wait_for_sync;
return;
 
/* Get the DEC direction - this will have b8 != 0
*/
get_dec_direction:
if (b8 != 0)
{
decDir = lowerByte & _BV(DEC_DIR_BIT);
pLabel = &&get_dec_speed;
}
else
pLabel = &&wait_for_sync;
return;
 
/* Get the RA speed - this will have b8 == 0
*/
get_dec_speed:
// We've got all the words - the next state will always be wait for sync
pLabel = &&wait_for_sync;
lowerByte &= DEC_SPEED_MASK;
 
/* If the parity is correct and any of the bytes are different then
* process them
*/
if ( b8 != 0
&& ( (oldRaDir != raDir)
|| (oldRaSpeed != raSpeed)
|| (oldDecDir != decDir)
|| (oldDecSpeed != lowerByte)))
{
/* Update "old" indications */
oldRaDir = raDir;
oldRaSpeed = raSpeed;
oldDecDir = decDir;
oldDecSpeed = lowerByte;
/* Process the data from the paddle
* - if the RA speed is one then setup the siderial speed
* - convert the RA speed/direction into a device independent form
* - convert the DEC speed/direction into a device independent form
*/
if (raSpeed == RA_SPEED_0)
{
rateInput.paddleRaRate = -paddleGuideRate;
/* This is a little trick because the "direction" bit doesn't
* work then the speed is zero. Do a pre-invert if the
* siderial rate is for the northern hemisphere
*/
if (rateInput.siderialRate == SPEED_SIDERIAL)
rateInput.paddleRaRate = -rateInput.paddleRaRate;
}
else if (raSpeed == RA_SPEED_1)
{
rateInput.paddleRaRate = SPEED_0_X;
rateInput.siderialRate = raDir ? SPEED_SIDERIAL : -SPEED_SIDERIAL;
}
else if (raSpeed == RA_SPEED_2)
rateInput.paddleRaRate = paddleGuideRate;
else if (raSpeed == RA_SPEED_8)
rateInput.paddleRaRate = SPEED_8_X;
else if (raSpeed == RA_SPEED_16)
rateInput.paddleRaRate = SPEED_16_X;
 
#if 0
/* The direction of the RA keys is reversed when operating in
* the southern hemisphere, so modify them back
*/
if ((raDir == 0) ^ (rateInput.siderialRate == SPEED_SIDERIAL))
rateInput.paddleRaRate = -rateInput.paddleRaRate;
#else
/* Use the keys as returned by the paddle. These are reversed when
* operating in the southern hemisphere. This ensures that the
* "right" key always increases the RA angle
*/
if (raDir == 0)
rateInput.paddleRaRate = -rateInput.paddleRaRate;
#endif
 
if (lowerByte == DEC_SPEED_0)
rateInput.paddleDecRate = SPEED_0_X;
else if (lowerByte == DEC_SPEED_2)
rateInput.paddleDecRate = paddleGuideRate;
else if (lowerByte == DEC_SPEED_8)
rateInput.paddleDecRate = SPEED_8_X;
else if (lowerByte == DEC_SPEED_16)
rateInput.paddleDecRate = SPEED_16_X;
 
if (decDir != 0)
rateInput.paddleDecRate = -rateInput.paddleDecRate;
 
/* Ok, all parsed. Force an update of the combined speed
*/
updateMountSpeed();
}
}
/programy/C/avr/LX200/paddle.h
0,0 → 1,109
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: paddle.h,v 1.2 2004/03/03 07:37:11 dbh Exp $
*/
 
#ifndef _PADDLE_H_
#define _PADDLE_H_
 
/* This file describes the data in the EQ6/Atlas hand paddle serial stream.
*
* This is a one-directional serial stream at 935 bits/sec. This is a fairly
* wierd speed that seems to be used to give an overall serial stream time
* of 76.2ms [basically the full-step time for siderial rate, which is
* half of the actual half-step rate].
*
* See the file eq6-serial.txt for further details.
*/
#include <inttypes.h>
 
/* Define the serial rate used by the paddle
*/
#define PADDLE_RATE 935L /* Bit rate for the paddle */
 
/* The serial stream is a set of 6, 9 bit words. The first three words
* are for RA control, the second three words are for DEC control.
*
* Note that the ordering here is arbitary (through reverse engineering), but
* seems sensible.
*
* Word1: RA sync (B8 = 0)
* Word2: RA direction (B8 = 0)
* Word3: RA speed (B8 = 0)
* Word4: ??? (Assumed to be DEC sync) (B8 = 1)
* Word5: DEC direction (B8 = 1)
* Word6: DEC speed (B8 = 1)
*
*/
 
/* Word #1 - RA SYNC
*/
#define RA_SYNC 0x7e
 
/* Word #2 - RA DIRECTION
*/
#define RA_DIR_BIT 0 // RA Direction bit
#define RA_DIR_LEFT 0
#define RA_DIR_RIGHT (1 << RA_DIR_BIT)
 
/* Note: Will be 0 for southern hemispere siderial, 1 for northern siderial
*/
 
 
/* Word #3 - RA SPEED
*/
#define RA_SPEED_MASK 0x0f // Speed bits
#define RA_SPEED_0 0x00 // x2, opposite direction to siderial
#define RA_SPEED_1 0x01 // No RA button pressed
#define RA_SPEED_2 0x02 // x2, same direction as siderial
#define RA_SPEED_8 0x04 // siderial x8
#define RA_SPEED_16 0x08 // siderial x16
 
/* Word #4 - ???. This word always seems to be zero. Assume it's a sync word
* unless we hear something different
*/
#define DEC_SYNC 0x00
 
/* Word #5 - DEC DIRECTION
*/
#define DEC_DIR_BIT 0 // DEC Direction bit
#define DEC_DIR_UP 0
#define DEC_DIR_DOWN (1 << DEC_DIR_BIT)
 
/* Word #6 - DEC SPEED
*/
#define DEC_SPEED_MASK 0x0f // Speed bits
#define DEC_SPEED_0 0x00 // No buttons pressed
#define DEC_SPEED_2 0x02 // siderial x2
#define DEC_SPEED_8 0x04 // siderial x8
#define DEC_SPEED_16 0x08 // siderial x16
 
/* Prototypes for paddle.c functions that can be called from outside
*/
extern void paddleInit(void);
 
extern uint8_t paddleDecRate;
extern uint8_t paddleRaRate;
extern uint8_t siderialRate;
 
/* Configuration variable - sets whether the 2X rate for the paddle should
* be considered as 1X or 0.3X
*/
extern uint8_t paddleGuideRate;
#endif /* _PADDLE_H_ */
/programy/C/avr/LX200/pguide.c
0,0 → 1,125
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: pguide.c,v 1.1.1.1 2004/02/22 08:12:42 dbh Exp $
*/
 
/* This file contains the code that takes inputs from a parallel output
* guider (such as the SBIG ST-4) and uses them to make guiding
* adjustments.
*/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
 
#include "eq6.h"
#include "combine.h"
#include "pguide.h"
 
#define GUIDE_BITS (_BV(G_UP) | _BV(G_DN) | _BV(G_RT) | _BV(G_LT))
 
/* This module polls the input bits from the guider, applies some
* crude debouncing, and then applies the requested speed adjustment.
*
* This code assumes that the inputs are active low (i.e. they are connected
* to a relay or optocoupler connecting the "active" input to ground).
*
* The polling rate is generated by a 8-bit timer with /256
*/
 
/* pguideInit() initializes the timer used to poll the parallel guiding
* input bits and sets those bit as inputs.
*
* Passed:
* Nothing
*
* Returns:
* Nothing
*
*/
void
pguideInit(void)
{
/* Set guide bits as inputs with pullups */
GUIDE_DDR &= ~GUIDE_BITS;
GUIDE_PORT |= GUIDE_BITS;
 
/* Setup timer 2 to generate interrupts for PWM to the selected
* rate (in CTC mode)
*/
OCR2 = (CLK_RATE / GUIDE_RATE / 1024);
TCCR2 = _BV(WGM21) | _BV(CS22) | _BV(CS20);
 
/* Enable interrupt generation from timer 2 */
TIMSK |= _BV(OCIE2);
}
 
/* pguideInt() is called whenever a timer 2 overflow interrupt occurs
*
* Passed:
* Nothing
*
* Returns:
* Nothing
*/
SIGNAL(SIG_OUTPUT_COMPARE2)
{
uint8_t guideBits;
 
static uint8_t lastState = GUIDE_BITS;
static uint8_t lastUsed = GUIDE_BITS;
 
/* Get the guide bits */
guideBits = GUIDE_PIN & GUIDE_BITS;
 
/* See if they're the same as the last set. If they are then we
* assume that the guide bits are stable
*/
if (guideBits != lastState)
{
/* Bits are changing */
lastState = guideBits;
}
else if (lastUsed != lastState)
{
/* They're stable and different from the last used set, so
* update the guiding information
*/
 
if ((guideBits & _BV(G_UP)) == 0)
rateInput.guideDecRate = SPEED_0_33_X;
else if ((guideBits & _BV(G_DN)) == 0)
rateInput.guideDecRate = -SPEED_0_33_X;
else
rateInput.guideDecRate = SPEED_0_X;
 
if ((guideBits & _BV(G_RT)) == 0)
rateInput.guideRaRate = SPEED_0_33_X;
else if ((guideBits & _BV(G_LT)) == 0)
rateInput.guideRaRate = -SPEED_0_33_X;
else
rateInput.guideRaRate = SPEED_0_X;
/* Update the overall rate */
updateMountSpeed();
 
/* Update the last used state ('cuz we used it) */
lastUsed = lastState;
}
}
/programy/C/avr/LX200/pguide.h
0,0 → 1,49
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: pguide.h,v 1.1.1.1 2004/02/22 08:12:42 dbh Exp $
*/
#ifndef _PGUIDE_H_
#define _PGUIDE_H_
 
/* This file has the definitions used to poll the parallel guiding input
* pins.
*
* These pins are pulled high by the internal CPU pullups and should be
* driven low by the guiding input
*/
#define GUIDE_PORT PORTD
#define GUIDE_PIN PIND
#define GUIDE_DDR DDRD
 
#define G_UP PD4
#define G_DN PD5
#define G_RT PD6
#define G_LT PD7
 
/* Define the polling rate (in HZ). For the current software the
* range is 30Hz to 7800Hz @ 8 MHz, and 60Hz to 15KHz @ 16MHz.
*
* A good value would be about 200 Hz (ie. 5ms debounce time)
*/
#define GUIDE_RATE 200
 
/* Prototypes */
void pguideInit(void);
 
#endif /* _PGUIDE_H_ */
/programy/C/avr/LX200/project.hex
0,0 → 1,269
:100000000C9438000C9455000C9455000C94550039
:100010000C9455000C9455000C9455000C9455000C
:100020000C9455000C9455000C9441020C9455000E
:100030000C9455000C944B070C9455000C945500EF
:100040000C94AA000C9455000C9455000C94680173
:100050000C9486020C9455000C9455000C94550099
:100060000C9455000C9455000C9455000C945500BC
:1000700011241FBECFEFD4E0DEBFCDBF11E0A0E062
:10008000B1E0E8E2F0E102C005900D92A039B107BD
:10009000D9F711E0A0E9B1E001C01D92A53FB10779
:1000A000E1F70E9438010C9412080C940000809132
:1000B0009201882331F480919401882311F4809176
:1000C0009601809398010E94FC05909191019923DB
:1000D00031F490919301992311F4909195018091BD
:1000E0009901882359F494304CF49D3F3CF0892FBA
:1000F0008E5F853030F480919001980F9093970136
:1001000014C0933031F480919001833061F486E023
:1001100007C09D3F41F4809190018D3F21F48AEF0B
:100120008093970102C01092970180919701819569
:100130000E94F10508951BBA8FEF8ABB85BB84BB73
:10014000C498BC9A84E181BF8AE083BF89B781608B
:1001500089BF08951F920F920FB60F9211242F930B
:100160003F934F935F936F937F938F939F93AF933F
:10017000BF93EF93FF9380910D018F5F80930D01EB
:10018000843079F510920D01A091ED01EA2FE295EE
:10019000EF70F0E0E050FF4F808180939D01B0E070
:1001A000AF70B070A050BF4F8C9180939C01A09114
:1001B000F101EA2FE295EF70F0E0E050FF4F80810F
:1001C00080939B01B0E0AF70B070A050BF4F8C9196
:1001D00080939A018091EE01882311F0C49801C0A8
:1001E000C49A50919A01E52FE37040919B01742FBE
:1001F00073702E2F220F220F272B30919C01632F1B
:100200006370220F220F262B90919D01220F220F47
:10021000892F8370282B9695969590939D01880F32
:10022000880F862B3695369530939C01880F880F62
:10023000872B4695469540939B01880F880F8E2B00
:100240005695569550939A0125BB80958BBBFF918F
:10025000EF91BF91AF919F918F917F916F915F913E
:100260004F913F912F910F900FBE0F901F901895B7
:100270008FEF8ABB84BB1BBA15BA0E945E010E9435
:10028000F9040E949B000E947D020E9433020E949A
:10029000A204809118010E949C0580E00E94C00584
:1002A0008091B3010E94C00578948091B9018823A0
:1002B000E1F31092B9010E944704F7CF82E080BDBC
:1002C00085E189B91AB886E880BD84E98AB90895BC
:1002D0001F920F920FB60F9211240F931F932F931B
:1002E0003F934F938F939F93EF93FF931AB11270A5
:1002F0000CB1E0911301F09114010994112309F05C
:10030000A4C00E3709F0A1C087E891E007C011230F
:10031000F9F401700093A00183E991E09093140136
:100320008093130192C0112399F40F7000939F01E1
:100330008BE991E0F3CF112359F080EA91E0EECF01
:10034000112331F0017000939E018BEA91E0E6CF1A
:100350008EE791E0E3CF8EE791E0909314018093D4
:100360001301112309F471C0202F2F703091A001C7
:1003700080911201831789F49091110180919F015E
:10038000981759F49091100180919E01981729F4C3
:1003900080910F01821709F458C0309312018091A7
:1003A0009F018093110140919E0140931001209381
:1003B0000F01882369F490910E01892F8195809314
:1003C0009101809190018330E9F4909391011AC0DA
:1003D000813051F410929101332311F48DEF01C05B
:1003E00083E0809390010EC0823019F480910E0159
:1003F00007C0843011F488E003C0883019F489E024
:1004000080939101332329F4809191018195809308
:100410009101222319F4109292010EC0223019F496
:1004200080910E0107C0243011F488E003C0283009
:1004300019F489E080939201442329F0809192017C
:100440008195809392010E945700FF91EF919F91B7
:100450008F914F913F912F911F910F910F900FBE50
:100460000F901F90189581B38F7081BB82B3806FFE
:1004700082BB87E282BD8DE087BD89B7806189BF7D
:1004800008951F920F920FB60F9211242F938F93FE
:100490009F9390B3907F80911601981719F09093D5
:1004A000160123C0809115018917F9F0292F94FDB9
:1004B00002C081E003C095FD04C08FEF80939601D8
:1004C00002C01092960126FD02C081E003C097FD94
:1004D00004C08FEF8093950102C0109295010E9495
:1004E000570080911601809315019F918F912F9154
:1004F0000F900FBE0F901F9018951CBE83E380B91C
:1005000011B886E88CBF88E981B908951F920F92CF
:100510000FB60F9211242F933F934F938F939F9376
:10052000EF93FF9343B18091A101882309F0EEC0BE
:10053000443409F478C0453410F54A3368F4403344
:1005400008F044C0433209F459C04D3209F45DC08B
:10055000463009F064C1D2C04E3309F45DC04F3358
:1005600038F44A3309F4CCC04C3309F058C151C0B7
:10057000423409F46AC0433409F051C10FC1443513
:1005800009F4A5C0453580F44C3409F452C04D340B
:1005900020F4473409F043C190C04D3409F477C0CA
:1005A000423509F03CC142C0473609F49DC0483687
:1005B00030F44535A9F1423609F031C13DC04D3620
:1005C00009F44FC0443709F02AC193C08091B001AB
:1005D0009091B1019C01220F331F220F331F220F74
:1005E000331F880F991F280F391F240F311D2053E7
:1005F00030403093B1012093B00136C11092B10167
:100600001092B0011092AF012FC181E08093AF0131
:100610002BC11092B20128C181E08093B20124C1A4
:100620008091B201AAC08091B201ABC08091B201A9
:10063000ACC08091B201ADC08091B0019091B10188
:100640009093CF018093CE0108C08091B00190912A
:10065000B1019093E0018093DF0181E08093B901C3
:1006600003C11092D0011092D1018091B0019091FC
:10067000B101892B91F38091AF01882321F081E0B2
:100680008093D101EACF81E08093D001E6CF109230
:10069000E1011092E2018091B0019091B101892BAA
:1006A000E1F28091AF01882321F081E08093E201A3
:1006B000D4CF81E08093E101D0CF8091B201882333
:1006C00011F483E001C081E080930E01C6CF8091D8
:1006D000AF01882321F08091B001819502C0809103
:1006E000B0010E94C005B9CF8091B001809318017C
:1006F000B4CF8091B2018093B401B6C080E590C0C0
:1007000081E08093A1011092A201AEC08091A2016C
:10071000433281F0E82FF0E0ED55FE4F40838F5FCC
:100720008093A201883009F09FC08FE383B91092B3
:10073000A1019AC01092A101882309F495C090915B
:10074000A301913549F1923509F44BC09D3409F06C
:1007500066C0823009F088C08091A4018E3661F0B5
:100760008F3624F4853609F057C00EC0833741F028
:10077000873709F051C00CC081E08093AE0182C080
:1007800081E08093AD017EC081E08093AB017AC0AF
:1007900081E08093AC0176C0813039F41092AB01D6
:1007A0001092AC011092AD0110C08230C1F5809161
:1007B000A4018E3651F08F361CF4853669F50BC0D6
:1007C000833731F0873741F509C01092AE015AC026
:1007D0001092AD0157C01092AB0154C01092AC0101
:1007E00051C0823009F040C08091A401873451F09B
:1007F00088341CF4833481F407C08D3439F0833598
:1008000059F408C081E003C083E001C088E0809310
:10081000170138C089E0FBCF8FE383B933C08FE382
:1008200083B922C08091170107C08091AD01882350
:1008300031F08091170181958093940102C010924C
:1008400094018091AB01882319F08091170107C0B2
:100850008091AC01882331F08091170181958093BC
:10086000930102C0109293010E945700FF91EF91F3
:100870009F918F914F913F912F910F900FBE0F90AD
:100880001F9018958091AE01882361F6CECFDF933B
:10089000CF93CDB7DEB72C970FB6F894DEBF0FBE5F
:1008A000CDBFF8948091D00189838091D1018A8352
:1008B0008091CE019091CF019C838B838091E10147
:1008C0008D838091E2018E838091DF019091E00120
:1008D00098878F8380910E0189878091B3018A87E1
:1008E000809118018B87789490E0FE0131969E01EB
:1008F000245F3F4F8191980FE217F307D9F79C8748
:10090000FE0131964E2F54E096E09E01245F3F4F4A
:100910008E2F841BE199FECF1FBA8EBB80818DBBC9
:10092000F8945CBB9CBB7894E217F30711F0319606
:10093000EFCF2C960FB6F894DEBF0FBECDBFCF9190
:10094000DF910895DF93CF93CDB7DEB72C970FB625
:10095000F894DEBF0FBECDBFFE0131964E2F91E061
:100960009E01245F3F4F8E2F841BE199FECF1FBA5B
:100970008EBB9CBB8DB38083E217F30711F03196D9
:10098000F2CF90E0FE0131969E01245F3F4F8191AE
:10099000980FE217F307D9F78C85891709F5898134
:1009A0008093D0018A818093D1018B819C81909327
:1009B000CF018093CE018D818093E1018E81809360
:1009C000E2018F8198859093E0018093DF01898512
:1009D00080930E018A858093B3018B8580931801E3
:1009E0002C960FB6F894DEBF0FBECDBFCF91DF912E
:1009F00008951092ED011092EE018DEE91E090932A
:100A0000CD018093CC011092F10181EF91E09093A0
:100A1000DE018093DD0189B7806489BF08956F92FC
:100A20007F928F929F92AF92BF92CF92DF92EF927E
:100A3000FF920F931F93CF93DF93EC01E62ECA0131
:100A4000B9010E94B6075B016C01FF2400E010E0D1
:100A5000C801B7010E94B6077B018C019595879567
:100A6000779567956A0D7B1D8C1D9D1DA8019701CB
:100A70000E94D507922E832E742E652E622F732F1F
:100A8000842F952FA80197010E94B6079B01AC0106
:100A90002A193B094C095D09C601B5010E94D50719
:100AA00079018A01292D382D472D562DC901DA01EA
:100AB000883E23E0920720E0A20720E0B20724F45A
:100AC00088EE93E0A0E0B0E09983888317FD11C021
:100AD0001C8280E0E81680E0F80681E0080780E0EC
:100AE00018071CF020E030E001C097013B832A8307
:100AF00014C081E08C8321E0E21620E0F2062FEFA3
:100B000002072FEF12071CF480E090E004C0882752
:100B100099278E199F099B838A83DF91CF911F911B
:100B20000F91FF90EF90DF90CF90BF90AF909F908C
:100B30008F907F906F900895FF920F931F93F82EE0
:100B40000AEB11E024E930E541E050E0682FC801EC
:100B50000E940F0520E831E541E050E06F2DC8010B
:100B600005960E940F052DED3CE541E050E06F2D0C
:100B7000C8010A960E940F051F910F91FF900895DA
:100B80008093B30187FF04C081E0809399010895A9
:100B9000833030F510929901992787FD9095FC01DB
:100BA000EE0FFF1FEE0FFF1FE80FF91FE654FE4F79
:100BB000808191819BBD8ABD1DBC1CBC1FBC89E08E
:100BC0008EBD1092F0011092EF018281938190937B
:100BD000F4018093F30184818093C9011092CA01CA
:100BE0000895982F8091DA01882319F481E0809389
:100BF000DA019093CB010895982F8091EB0188231F
:100C000019F481E08093EB019093DC010895E62FC5
:100C1000F0E0EE0FFF1FE758FE4F2081FC01278711
:100C20000895CF93DF93EC0189859A85892B21F470
:100C300087E296E09A8789878D81882329F08E81C3
:100C4000882311F01E821D82E985FA850994888126
:100C5000882381F48E81882309F062C08091790114
:100C60008F87E981FA811082E981FA81118287E216
:100C700096E015C018160CF490C052C088818823E5
:100C800089F48D81882381F4809179018F87E981AE
:100C9000FA811082E981FA8111828EE396E09A87C7
:100CA0008987F6C087FDB2C08B819C81892B79F240
:100CB00020918E011C861B8680918D018F8721FDDE
:100CC00003C089E591E009C08091B401882319F43B
:100CD00089E191E002C089E391E09E878D87E981F7
:100CE000FA812170218387E796E09A878987A98115
:100CF000BA818F81ED85FE85E80FF11D80818C938F
:100D00008F818F5F8F718F838B859C8501969C87E8
:100D10008B872B813C812817390708F498CFB8C0FE
:100D20008B819C81892B09F4A9CF20918E011C868F
:100D30001B8680918D018F8721FD03C089E591E09D
:100D400009C08091B401882319F489E191E002C0BF
:100D500089E391E09E878D87E981FA812170218363
:100D600084EB96E09A878987A981BA818F81ED8586
:100D7000FE85E80FF11D80818C938F8181508F71EA
:100D80008F838B859C8501969C878B872B813C81EB
:100D90002817390708F472CF7BC0E82FFF27E7FD3B
:100DA000F095EE0FFF1FE758FE4F2181E82FF0E08E
:100DB000EE0FFF1FE758FE4F80818F8721FD03C094
:100DC00089E591E009C08091B401882319F489E193
:100DD00091E002C089E391E09E878D87E981FA81E5
:100DE0002170218385EF96E03CC098858881981713
:100DF00009F02DCFA981BA818F81ED85FE85E80F9D
:100E0000F11D80818C938F818F5F40C0E82FFF2779
:100E1000E7FDF095EE0FFF1FF095E195FF4FE758C6
:100E2000FE4F21818195E82FF0E0EE0FFF1FE7587C
:100E3000FE4F80818F8721FD03C089E591E009C0C5
:100E40008091B401882319F489E191E002C089E31B
:100E500091E09E878D87E981FA812170218386E365
:100E600097E09A8789878881888712C098858881CA
:100E7000981709F003CFA981BA818F81ED85FE858E
:100E8000E80FF11D80818C938F8181508F718F834A
:100E9000DF91CF9108951F920F920FB60F921124F8
:100EA0002F933F938F939F932091EF013091F00107
:100EB0002F5F3F4F3093F0012093EF018091C901E4
:100EC0009091CA01892B71F08091F3019091F40106
:100ED000009741F02817390728F01092F00110927E
:100EE000EF013BC09091DA01992369F08091DB0119
:100EF0008F5F8093DB01891730F01092DB018BEC60
:100F000091E00E9411069091EB01992369F0809184
:100F1000EC018F5F8093EC01891730F01092EC01A7
:100F20008CED91E00E9411068091C9019091CA0157
:100F3000892B99F42091F3013091F40121153105A9
:100F400061F08091EF019091F0018217930728F0F2
:100F50001092F0011092EF01C5CF9F918F913F91B8
:100F60002F910F900FBE0F901F901895629FD00188
:100F7000739FF001829FE00DF11D649FE00DF11D54
:100F8000929FF00D839FF00D749FF00D659FF00D03
:100F90009927729FB00DE11DF91F639FB00DE11DF0
:100FA000F91FBD01CF011124089597FB092E0526D5
:100FB0000ED057FD04D014D00AD0001C38F4509540
:100FC0004095309521953F4F4F4F5F4F0895F6F76D
:100FD00090958095709561957F4F8F4F9F4F0895A5
:100FE000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F2D
:100FF000EE1FFF1FA217B307E407F50720F0A21B9F
:10100000B30BE40BF50B661F771F881F991F1A940B
:1010100069F760957095809590959B01AC01BD0135
:08102000CF010895F894FFCF01
:1010280000011115550000000002222AAA0303FF3F
:10103800FFFFFF7E01F0F00184041424344443428E
:101048004140494A4B4C3C2C1C0C9CACBCCCCBCAF8
:10105800C9C0C1C2C3C4B4A4944444444440404039
:10106800404C4C4C4C0C0C0C0CCCCCCCCCC0C0C068
:10107800C0C4C4C4C40404040444444444444444AC
:10108800444C4C4C4C4C4C4C4CCCCCCCCCCCCCCC20
:10109800CCC4C4C4C4C4C4C4C4010290024802304D
:1010A8000224021C0218030C0306030301030000B8
:00000001FF
/programy/C/avr/LX200/project.map
0,0 → 1,460
Archive member included because of file (symbol)
 
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mulsi3.o)
stepper.o (__mulsi3)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o)
stepper.o (__divmodsi4)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o (exit)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
combine.o (__do_copy_data)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
combine.o (__do_clear_bss)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodsi4.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o) (__udivmodsi4)
 
Allocating common symbols
Common symbol size file
 
trackRateTable 0xf stepper.o
doSave 0x1 sr.o
doDropInt 0x2 stepper.o
idleCtr 0x4 eq6.o
raState 0x11 stepper.o
decState 0x11 stepper.o
raExcitation 0x2 stepper.o
adjCtr 0x2 stepper.o
decExcitation 0x2 stepper.o
adjLimit 0x2 stepper.o
 
Memory Configuration
 
Name Origin Length Attributes
text 0x00000000 0x00020000 xr
data 0x00800060 0x0000ffa0 rw !x
eeprom 0x00810000 0x00010000 rw !x
fuse 0x00820000 0x00000400 rw !x
lock 0x00830000 0x00000400 rw !x
signature 0x00840000 0x00000400 rw !x
*default* 0x00000000 0xffffffff
 
Linker script and memory map
 
Address of section .data set to 0x800100
LOAD /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o
LOAD combine.o
LOAD driver.o
LOAD eq6.o
LOAD paddle.o
LOAD pguide.o
LOAD serial.o
LOAD sr.o
LOAD stepper.o
LOAD /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a
LOAD /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a
LOAD /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a
 
.hash
*(.hash)
 
.dynsym
*(.dynsym)
 
.dynstr
*(.dynstr)
 
.gnu.version
*(.gnu.version)
 
.gnu.version_d
*(.gnu.version_d)
 
.gnu.version_r
*(.gnu.version_r)
 
.rel.init
*(.rel.init)
 
.rela.init
*(.rela.init)
 
.rel.text
*(.rel.text)
*(.rel.text.*)
*(.rel.gnu.linkonce.t*)
 
.rela.text
*(.rela.text)
*(.rela.text.*)
*(.rela.gnu.linkonce.t*)
 
.rel.fini
*(.rel.fini)
 
.rela.fini
*(.rela.fini)
 
.rel.rodata
*(.rel.rodata)
*(.rel.rodata.*)
*(.rel.gnu.linkonce.r*)
 
.rela.rodata
*(.rela.rodata)
*(.rela.rodata.*)
*(.rela.gnu.linkonce.r*)
 
.rel.data
*(.rel.data)
*(.rel.data.*)
*(.rel.gnu.linkonce.d*)
 
.rela.data
*(.rela.data)
*(.rela.data.*)
*(.rela.gnu.linkonce.d*)
 
.rel.ctors
*(.rel.ctors)
 
.rela.ctors
*(.rela.ctors)
 
.rel.dtors
*(.rel.dtors)
 
.rela.dtors
*(.rela.dtors)
 
.rel.got
*(.rel.got)
 
.rela.got
*(.rela.got)
 
.rel.bss
*(.rel.bss)
 
.rela.bss
*(.rela.bss)
 
.rel.plt
*(.rel.plt)
 
.rela.plt
*(.rela.plt)
 
.text 0x00000000 0x1028
*(.vectors)
.vectors 0x00000000 0x70 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o
0x00000000 __vectors
0x00000000 __vector_default
*(.vectors)
*(.progmem.gcc*)
*(.progmem*)
0x00000070 . = ALIGN (0x2)
0x00000070 __trampolines_start = .
*(.trampolines)
.trampolines 0x00000070 0x0 linker stubs
*(.trampolines*)
0x00000070 __trampolines_end = .
*(.jumptables)
*(.jumptables*)
*(.lowtext)
*(.lowtext*)
0x00000070 __ctors_start = .
*(.ctors)
0x00000070 __ctors_end = .
0x00000070 __dtors_start = .
*(.dtors)
0x00000070 __dtors_end = .
SORT(*)(.ctors)
SORT(*)(.dtors)
*(.init0)
.init0 0x00000070 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o
0x00000070 __init
*(.init0)
*(.init1)
*(.init1)
*(.init2)
.init2 0x00000070 0xc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o
*(.init2)
*(.init3)
*(.init3)
*(.init4)
.init4 0x0000007c 0x16 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
0x0000007c __do_copy_data
.init4 0x00000092 0x10 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
0x00000092 __do_clear_bss
*(.init4)
*(.init5)
*(.init5)
*(.init6)
*(.init6)
*(.init7)
*(.init7)
*(.init8)
*(.init8)
*(.init9)
.init9 0x000000a2 0x8 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o
*(.init9)
*(.text)
.text 0x000000aa 0x4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o
0x000000aa __vector_22
0x000000aa __vector_1
0x000000aa __vector_24
0x000000aa __vector_12
0x000000aa __bad_interrupt
0x000000aa __vector_6
0x000000aa __vector_3
0x000000aa __vector_23
0x000000aa __vector_25
0x000000aa __vector_11
0x000000aa __vector_17
0x000000aa __vector_7
0x000000aa __vector_27
0x000000aa __vector_5
0x000000aa __vector_4
0x000000aa __vector_9
0x000000aa __vector_2
0x000000aa __vector_21
0x000000aa __vector_15
0x000000aa __vector_8
0x000000aa __vector_26
0x000000aa __vector_14
0x000000aa __vector_18
.text 0x000000ae 0x88 combine.o
0x000000ae updateMountSpeed
.text 0x00000136 0x13a driver.o
0x00000136 driverInit
0x00000154 __vector_16
.text 0x00000270 0x4c eq6.o
0x00000270 main
.text 0x000002bc 0x1aa paddle.o
0x000002bc paddleInit
0x000002d0 __vector_19
.text 0x00000466 0x94 pguide.o
0x00000466 pguideInit
0x00000482 __vector_10
.text 0x000004fa 0x394 serial.o
0x000004fa serialInit
0x0000050c __vector_20
.text 0x0000088e 0x164 sr.o
0x0000088e srSaveState
0x00000944 srLoadState
.text 0x000009f2 0x57a stepper.o
0x00000b38 setupRateTable
0x00000bf8 setDecSpeed
0x00000c22 stepperProcess
0x00000e96 __vector_13
0x00000b80 setTrackRate
0x00000c0e setTickRate
0x000009f2 stepperInit
0x00000be2 setRaSpeed
.text 0x00000f6c 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mulsi3.o)
.text 0x00000f6c 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o)
.text 0x00000f6c 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
.text 0x00000f6c 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
.text 0x00000f6c 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
.text 0x00000f6c 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodsi4.o)
0x00000f6c . = ALIGN (0x2)
*(.text.*)
.text.libgcc 0x00000f6c 0x3e /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mulsi3.o)
0x00000f6c __mulsi3
.text.libgcc 0x00000faa 0x36 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o)
0x00000faa __divmodsi4
.text.libgcc 0x00000fe0 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
.text.libgcc 0x00000fe0 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc 0x00000fe0 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc 0x00000fe0 0x44 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodsi4.o)
0x00000fe0 __udivmodsi4
0x00001024 . = ALIGN (0x2)
*(.fini9)
.fini9 0x00001024 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
0x00001024 exit
0x00001024 _exit
*(.fini9)
*(.fini8)
*(.fini8)
*(.fini7)
*(.fini7)
*(.fini6)
*(.fini6)
*(.fini5)
*(.fini5)
*(.fini4)
*(.fini4)
*(.fini3)
*(.fini3)
*(.fini2)
*(.fini2)
*(.fini1)
*(.fini1)
*(.fini0)
.fini0 0x00001024 0x4 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
*(.fini0)
0x00001028 _etext = .
 
.data 0x00800100 0x90 load address 0x00001028
0x00800100 PROVIDE (__data_start, .)
*(.data)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o
.data 0x00800100 0x0 combine.o
.data 0x00800100 0xe driver.o
0x00800100 driveTbl
.data 0x0080010e 0x0 eq6.o
.data 0x0080010e 0x7 paddle.o
0x0080010e paddleGuideRate
.data 0x00800115 0x2 pguide.o
.data 0x00800117 0x1 serial.o
.data 0x00800118 0x0 sr.o
.data 0x00800118 0x77 stepper.o
0x00800119 microTable
0x00800179 rateConvert
0x00800139 halfTable
0x00800159 fullTable
0x00800118 transRatio
.data 0x0080018f 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mulsi3.o)
.data 0x0080018f 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o)
.data 0x0080018f 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
.data 0x0080018f 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
.data 0x0080018f 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
.data 0x0080018f 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodsi4.o)
*(.data*)
*(.rodata)
*(.rodata*)
*(.gnu.linkonce.d*)
0x00800190 . = ALIGN (0x2)
*fill* 0x0080018f 0x1 00
0x00800190 _edata = .
0x00800190 PROVIDE (__data_end, .)
 
.bss 0x00800190 0x65 load address 0x000010b8
0x00800190 PROVIDE (__bss_start, .)
*(.bss)
.bss 0x00800190 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o
.bss 0x00800190 0xa combine.o
0x00800197 rateOutput
0x00800190 rateInput
0x00800199 noTrack
.bss 0x0080019a 0x4 driver.o
.bss 0x0080019e 0x0 eq6.o
.bss 0x0080019e 0x3 paddle.o
.bss 0x008001a1 0x0 pguide.o
.bss 0x008001a1 0x12 serial.o
.bss 0x008001b3 0x0 sr.o
.bss 0x008001b3 0x2 stepper.o
0x008001b4 doHalfStep
0x008001b3 trackingRate
.bss 0x008001b5 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mulsi3.o)
.bss 0x008001b5 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o)
.bss 0x008001b5 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
.bss 0x008001b5 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
.bss 0x008001b5 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
.bss 0x008001b5 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodsi4.o)
*(.bss*)
*(COMMON)
COMMON 0x008001b5 0x4 eq6.o
0x008001b5 idleCtr
COMMON 0x008001b9 0x1 sr.o
0x008001b9 doSave
COMMON 0x008001ba 0x3b stepper.o
0x008001ba trackRateTable
0x008001c9 doDropInt
0x008001cb raState
0x008001dc decState
0x008001ed raExcitation
0x008001ef adjCtr
0x008001f1 decExcitation
0x008001f3 adjLimit
0x008001f5 PROVIDE (__bss_end, .)
0x00001028 __data_load_start = LOADADDR (.data)
0x000010b8 __data_load_end = (__data_load_start + SIZEOF (.data))
 
.noinit 0x008001f5 0x0
0x008001f5 PROVIDE (__noinit_start, .)
*(.noinit*)
0x008001f5 PROVIDE (__noinit_end, .)
0x008001f5 _end = .
0x008001f5 PROVIDE (__heap_start, .)
 
.eeprom 0x00810000 0x0
*(.eeprom*)
0x00810000 __eeprom_end = .
 
.fuse
*(.fuse)
*(.lfuse)
*(.hfuse)
*(.efuse)
 
.lock
*(.lock*)
 
.signature
*(.signature*)
 
.stab 0x00000000 0x6b4
*(.stab)
.stab 0x00000000 0x6b4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o
 
.stabstr 0x00000000 0x54
*(.stabstr)
.stabstr 0x00000000 0x54 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm162.o
 
.stab.excl
*(.stab.excl)
 
.stab.exclstr
*(.stab.exclstr)
 
.stab.index
*(.stab.index)
 
.stab.indexstr
*(.stab.indexstr)
 
.comment
*(.comment)
 
.debug
*(.debug)
 
.line
*(.line)
 
.debug_srcinfo
*(.debug_srcinfo)
 
.debug_sfnames
*(.debug_sfnames)
 
.debug_aranges
*(.debug_aranges)
 
.debug_pubnames
*(.debug_pubnames)
 
.debug_info
*(.debug_info)
*(.gnu.linkonce.wi.*)
 
.debug_abbrev
*(.debug_abbrev)
 
.debug_line
*(.debug_line)
 
.debug_frame
*(.debug_frame)
 
.debug_str
*(.debug_str)
 
.debug_loc
*(.debug_loc)
 
.debug_macinfo
*(.debug_macinfo)
OUTPUT(project.out elf32-avr)
LOAD linker stubs
/programy/C/avr/LX200/project.out
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:executable
+*
\ No newline at end of property
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/C/avr/LX200/serial.c
0,0 → 1,416
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: serial.c,v 1.10 2004/04/04 10:32:50 dbh Exp $
*/
 
#include <inttypes.h>
#include <avr/io.h>
 
#include "eq6.h"
#include "serial.h"
#include "combine.h"
#include "stepper.h"
#include "paddle.h"
#include "sr.h"
 
/* This file accepts serial data from a serial guider and performs the
* requested guiding operation.
*
* This interface is also is designed to support future mount management
* operations via the same serial interface
*
* The current protocol is:
*
* [0-9] Add the number to the "accumulator"
* - Denote accumulator as negative
* # Clear the accumulator and flag
* < Clear the flag
* > Set the flag
* U Copy flag state to the DEC UP key
* D Copy flag state to the DEC DOWN key
* L Copy flag state to the RA left key
* R Copy flag state to the RA right key
* C Release all keys
*
* B Set DEC backlash to accum
* M Set DEC backlash mode (+ = finish pos, 0 = none, - = finish neg)
* b Set RA backlash to accum
* m Set RA backlash mode (see DEC backlash)
*
* G Set 2X paddle to guiding speed (0.3x) if flag set, 1X if clear
*
* t Use halfStep for slow step if flag set, microStep if clear (TEST)
*
* T Set the tracking rate as-per the accumulator
* -1 = No tracking (Terrestial)
* 0 = Sidereal
* 1 = Solar / Planetary
* 2 = Lunar
*
* g Set transmission (gearbox) ratio
*
* The '#' and accumulator support future value-based entries
*
* A subset of LX200 commands are supported for compatibility
* with various autoguiding programs.
*
* :Me# :Mw# :Ms# :Mn# Start slewing East(right), West(left),
* North (up), South (down)
* :Qe# :Qw# :Qs# :Qn# :Q# Halt selected or all slews
* :RG# :RC# :RM# :RS# Set guiding rate for LX200 motions
* G = 0.3x
* C = 1x
* M = 8x
* S = 16x
*
* ACK Returns alignment mode (always 'P' polar)
*/
#include <avr/interrupt.h>
#include <inttypes.h>
 
#include "paddle.h"
#include "eq6.h"
#include "combine.h"
 
/* serialInit() initializes the serial port used for the
* serial guider input.
*
* Passed:
* Nothing
*
* Returns:
* Nothing.
*/
void
serialInit(void)
{
// The serial guider is attached to USART1
 
// Set serial rate
UBRR1H = (CLK_RATE / GUIDE_BAUD / 16 - 1) >> 8;
UBRR1L = (CLK_RATE / GUIDE_BAUD / 16 - 1) & 0xff;
 
/* Setup registers
* 8 bits, no parity, RX enable, TX enable. Only the Rx interrupts are
* enabled at this point.
*/
UCSR1B = 0; // Disable all interrupts
UCSR1C = _BV(URSEL1) | _BV(UCSZ11) | _BV(UCSZ10);
UCSR1B = _BV(RXCIE1) | _BV(RXEN1) | _BV(TXEN1);
}
 
/* serialInt() is called whenever a character is received on USART1.
* These characters are send by the serial guider
*
* Passed:
* Nothing
*
* Returns:
* Nothing
*
* Notes:
* Interrupts are disabled during processing
*/
SIGNAL(SIG_USART1_RECV)
{
/* Variables for flags/accumulator */
static uint8_t flag = 0;
static uint16_t accum = 0;
static uint8_t sign = 0;
 
/* Variable holding current guiding rate */
static int8_t guideRate = SPEED_0_33_X;
 
/* Flags holding current requested slewing directions */
static uint8_t upFlag;
static uint8_t downFlag;
static uint8_t leftFlag;
static uint8_t rightFlag;
 
/* LX200 command state */
#define LX200_CMD_LEN 8
static char lxCmd[LX200_CMD_LEN];
static uint8_t lxPos;
 
uint8_t ch;
uint8_t dirChg;
 
static uint8_t lxMode;
 
 
/* Get the character from the port. This will dismiss the interrupt
*/
dirChg = 0;
ch = UDR1;
/* UDR1 = ch; /* Echo for debugging */
 
/* This code processes commands when a LX200 command is not currently
* being processed.
*/
if (lxMode == 0)
{
switch(ch)
{
case '0' ... '9':
/* Add it to the accumulator */
accum = (accum * 10) + ch - '0';
break;
 
case '#':
/* Clear the accumulator */
accum = 0;
sign = 0;
break;
 
case '-':
/* Set the sign of the accumulator to negative */
sign = 1;
break;
 
case '<':
/* Clear the flag */
flag = 0;
break;
 
case '>':
/* Set the flag */
flag = 1;
break;
 
case 'U':
/* Guide UP (DEC) */
upFlag = flag;
dirChg = 1;
break;
 
case 'D':
/* Guide DOWN (DEC) */
downFlag = flag;
dirChg = 1;
break;
 
case 'R':
/* Guide RIGHT (RA) */
rightFlag = flag;
dirChg = 1;
break;
 
case 'L':
/* Guide LEFT (RA) */
leftFlag = flag;
dirChg = 1;
break;
 
case 'C':
/* Clear all keys */
upFlag = downFlag = leftFlag = rightFlag = 0;
dirChg = 1;
break;
 
case 'b':
/* Set RA backlash steps */
raState.backlash = accum;
doSave = 1;
break;
 
case 'B':
/* Set DEC backlash steps */
decState.backlash = accum;
doSave = 1;
break;
 
case 'm':
/* Set RA backlash mode */
raState.finNeg = raState.finPos = 0;
if (accum != 0)
{
if (sign)
raState.finNeg = 1;
else
raState.finPos = 1;
}
doSave = 1;
break;
 
case 'M':
/* Set DEC backlash mode */
decState.finNeg = decState.finPos = 0;
if (accum != 0)
{
if (sign)
decState.finNeg = 1;
else
decState.finPos = 1;
}
doSave = 1;
break;
 
case 'G':
/* Set the speed for the 2x paddle button. This has
* no effect on the rate used for serial commands
*/
paddleGuideRate = flag ? SPEED_0_33_X : SPEED_1_X;
doSave = 1;
break;
 
case 'T':
/* Set the tracking speed */
setTrackRate(sign ? -accum : accum);
doSave = 1;
break;
 
case 'g': /* Set transmission (gearbox) ratio */
transRatio = accum;
doSave = 1;
break;
 
case 't':
/* *TEST* Allow half step table to be specified instead of
* the microstep table
*/
doHalfStep = flag;
break;
 
case '\006': /* LX200: ACK */
UDR1 = 'P';
break;
 
case ':': /* LX200: Start command */
/* This indicates the start of a LX200 command */
lxMode = 1;
lxPos = 0;
break;
 
default:
/* OK, now we're confused .... */
UDR1 = '?';
break;
}
}
else
{
/* This section of code supports the LX200 commands. They
* have a fundimentally different syntax to the existing
* commands, so they are implemented in this code seperately
* for clarity.
*/
if (ch != '#')
{
/* Add this to the command characters so far */
lxCmd[lxPos++] = ch;
if (lxPos == LX200_CMD_LEN)
{
/* Too much data for any command */
UDR1 = '?';
lxMode = 0;
}
}
else
{
/* We are going back to native mode after this */
lxMode = 0;
 
if (lxPos >= 1)
{
/* We have a complete LX200 command (without the delimiters).
* Do what it asks
*/
switch(lxCmd[0])
{
case 'M': // Start guiding in specified direction
if (lxPos == 2)
{
// We have the right number of chars */
switch (lxCmd[1])
{
case 'n': upFlag = 1; break;
case 's': downFlag = 1; break;
case 'e': rightFlag = 1; break;
case 'w': leftFlag = 1; break;
default: UDR1 = '?'; break;
}
 
dirChg = 1;
}
break;
 
case 'Q': // Stop guiding in specified direction
if (lxPos == 1)
{
// Stop slewing
upFlag = downFlag = leftFlag = rightFlag = 0;
dirChg = 1;
}
else if (lxPos == 2)
{
// Stop slewing is specified direction
switch (lxCmd[1])
{
case 'n': upFlag = 0; break;
case 's': downFlag = 0; break;
case 'e': rightFlag = 0; break;
case 'w': leftFlag = 0; break;
default: UDR1 = '?'; break;
}
 
dirChg = 1;
} else
UDR1 = '?';
break;
 
case 'R': // Set guiding speed
if (lxPos == 2)
{
switch (lxCmd[1])
{
case 'G': guideRate = SPEED_0_33_X; break;
case 'C': guideRate = SPEED_1_X; break;
case 'M': guideRate = SPEED_8_X; break;
case 'S': guideRate = SPEED_16_X; break;
default: UDR1 = '?'; break;
}
dirChg = 1;
}
break;
default:
UDR1 = '?';
}
}
}
}
 
/* Update the serial guiding rate data if it has changed */
if (dirChg)
{
if (upFlag)
rateInput.serialDecRate = guideRate;
else if (downFlag)
rateInput.serialDecRate = -guideRate;
else
rateInput.serialDecRate = SPEED_0_X;
 
if (rightFlag)
rateInput.serialRaRate = guideRate;
else if (leftFlag)
rateInput.serialRaRate = -guideRate;
else
rateInput.serialRaRate = SPEED_0_X;
}
updateMountSpeed();
}
/programy/C/avr/LX200/serial.h
0,0 → 1,33
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: serial.h,v 1.1.1.1 2004/02/22 08:12:42 dbh Exp $
*/
 
#ifndef _SERIAL_H_
#define _SERIAL_H_
 
/* Define the constants for the guiding input
*/
#define GUIDE_BAUD 9600
 
/* Initialization function */
void serialInit(void);
 
#endif /* _SERIAL_H_ */
 
/programy/C/avr/LX200/sr.c
0,0 → 1,194
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: sr.c,v 1.4 2004/04/04 10:32:50 dbh Exp $
*/
 
/* This file contains the code to save and restore the "configurable
* parameters" of the program. These are held in the internal EEPROM
*
* These functions are expected to be executed with interrupts enabled and
* will not return until complete.
*/
 
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
 
#include "stepper.h"
#include "paddle.h"
 
/* Define the staging structure used to save configurable parameters */
struct sr_s
{
uint8_t raFinPos;
uint8_t raFinNeg;
uint16_t raBacklash;
 
uint8_t decFinPos;
uint8_t decFinNeg;
uint16_t decBacklash;
 
uint8_t paddleGuideRate;
 
int8_t trackingRate;
uint8_t transRatio;
 
uint8_t csum; // Two's complement of other fields
};
 
volatile uint8_t doSave;
 
/* srSaveState() collects the configurable parameters from all over the
* system and saves them into the EEPROM
*
* Passed
* Nothing
*
* Returns
* Nothing
*
* Notes:
* This function assumes that the interrupts are enabled on
* entry.
*/
void
srSaveState(void)
{
struct sr_s state;
uint8_t i;
uint8_t *p;
 
/* Turn off the interrupts while we "snapshot" the current
* state
*/
cli();
 
/* Copy the current state */
state.raFinPos = raState.finPos;
state.raFinNeg = raState.finNeg;
state.raBacklash = raState.backlash;
 
state.decFinPos = decState.finPos;
state.decFinNeg = decState.finNeg;
state.decBacklash = decState.backlash;
 
state.paddleGuideRate = paddleGuideRate;
state.trackingRate = trackingRate;
state.transRatio = transRatio;
 
/* Reenable interrupts */
sei();
 
/* Calculate the checksum of the structure */
for (p = (uint8_t *)&state, i = 0 ; p != (uint8_t *)&state.csum ; )
i += *p++;
state.csum = i;
 
/* Write the complete structure into the EEPROM */
for (i = 0, p = (uint8_t *)&state ; i < sizeof(state) ; ++i, ++p)
{
/* Wait for EEWE to become zero (ie. EEPROM not writting) */
while (EECR & _BV(EEWE))
;
/* Setup the address */
EEARH = 0;
EEARL = i;
/* Put the data in place */
EEDR = *p;
 
/* Perform the write */
cli();
EECR = _BV(EEMWE);
EECR = _BV(EEMWE) | _BV(EEWE);
sei();
}
 
/* All done */
}
 
/* srLoadState() reads the configurable parameters from EEPROM and copies
* them to where they need to do.
*
* The data is protected by a checksum calculated when the data was
* saved.
*
* Passed
* Nothing
*
* Returns
* Nothing
*
* Notes:
* This interrupt does not change the interrupt state and does
* not return until all the data is read
*/
void
srLoadState(void)
{
struct sr_s state;
uint8_t i;
uint8_t *p;
 
/* Read the state data from the EEPROM */
for (i = 0, p = (uint8_t *)&state ; i < sizeof(state) ; ++i, ++p)
{
/* Wait for EEWE to become zero (ie. EEPROM not writting) */
while (EECR & _BV(EEWE))
;
/* Setup the address */
EEARH = 0;
EEARL = i;
 
/* Read the data. The device will stall until the data is
* ready
*/
EECR = _BV(EERE);
 
/* Get the data */
*p = EEDR;
}
 
/* Calculate the checksum of the structure. If it doesn't
* match then the data is either corrupt or not initialized
*
* Either way keep the current data
*/
for (p = (uint8_t *)&state, i = 0 ; p != (uint8_t *)&state.csum ; )
i += *p++;
if (state.csum != i)
return;
/* Copy the restored data to the current state */
raState.finPos = state.raFinPos;
raState.finNeg = state.raFinNeg;
raState.backlash = state.raBacklash;
 
decState.finPos = state.decFinPos;
decState.finNeg = state.decFinNeg;
decState.backlash = state.decBacklash;
paddleGuideRate = state.paddleGuideRate;
trackingRate = state.trackingRate;
transRatio = state.transRatio;
 
/* All done */
}
/programy/C/avr/LX200/sr.h
0,0 → 1,31
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: sr.h,v 1.2 2004/04/04 10:32:50 dbh Exp $
*/
#ifndef _SR_H_
#define _SR_H_
 
void srSaveState(void);
void srLoadState(void);
 
/* Flag to request parameter save */
extern volatile uint8_t doSave;
 
#endif /* _SR_H_ */
 
/programy/C/avr/LX200/stepper.c
0,0 → 1,765
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: stepper.c,v 1.9 2004/04/05 06:42:15 dbh Exp $
*/
 
/* This file converts the RA and DEC speed indications into drive values for
* the stepper motor coils.
*/
 
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
 
#include "eq6.h"
#include "combine.h"
 
#include "stepper.h"
 
int8_t trackingRate = 0;
uint8_t transRatio = DEF_TRANS_RATIO;
 
#define STEPS_PER_CYCLE 32L /* Steps per cycle (complete set of phases) */
#define CYCLES_PER_ROTN 12L /* Cycles per stepper motor rotation */
#define SIDERIAL_LCM (long)(3 * 16) /* Divides to give all speeds */
#define WORM_RATIO 180L /* Tooth on worm gear */
 
#define SECS_PER_SDAY 86164L /* 23h, 56m, 4s [Sidereal] */
#define SECS_PER_DAY 86400L /* 24h, 0m, 0s [Solar] */
#define SECS_PER_LDAY 89309L /* 1 + 1/27.3 sidereal days */
 
/* Structure holding information used to generate stepper pulses
* that generate motion at the siderial, solar, and lunar tracking
* rates
*/
struct trackRate_s
{
uint16_t div; // tint
uint16_t adj; // add/drop one int every ....
uint8_t doDropInt; // drop ints if true, add extra ints if false
} trackRateTable[3];
 
/* Define the stepping table. This defines the excitation to be used
* over a complete "cycle" of the stepper motor
*
* These are signed, four bit values. Coil 1 is the LSN, Coil 2 is the MSN
*/
 
#if 1
/* Step table. Values scaled such that one coil is always fully driven.
* Gives lots of torque, but the actual travel is lumpy
*/
uint8_t microTable[STEPS_PER_CYCLE] =
{
_EX_ENTRY(EX_0, EX_P_1), _EX_ENTRY(EX_P_0_2, EX_P_1),
_EX_ENTRY(EX_P_0_4, EX_P_1), _EX_ENTRY(EX_P_0_67, EX_P_1),
_EX_ENTRY(EX_P_1, EX_P_1), _EX_ENTRY(EX_P_1, EX_P_0_67),
_EX_ENTRY(EX_P_1, EX_P_0_4), _EX_ENTRY(EX_P_1, EX_P_0_2),
 
_EX_ENTRY(EX_P_1, EX_0), _EX_ENTRY(EX_P_1, EX_M_0_2),
_EX_ENTRY(EX_P_1, EX_M_0_4), _EX_ENTRY(EX_P_1, EX_M_0_67),
_EX_ENTRY(EX_P_1, EX_M_1), _EX_ENTRY(EX_P_0_67, EX_M_1),
_EX_ENTRY(EX_P_0_4, EX_M_1), _EX_ENTRY(EX_P_0_2, EX_M_1),
 
_EX_ENTRY(EX_0, EX_M_1), _EX_ENTRY(EX_M_0_2, EX_M_1),
_EX_ENTRY(EX_M_0_4, EX_M_1), _EX_ENTRY(EX_M_0_67, EX_M_1),
_EX_ENTRY(EX_M_1, EX_M_1), _EX_ENTRY(EX_M_1, EX_M_0_67),
_EX_ENTRY(EX_M_1, EX_M_0_4), _EX_ENTRY(EX_M_1, EX_M_0_2),
 
_EX_ENTRY(EX_M_1, EX_0), _EX_ENTRY(EX_M_1, EX_P_0_2),
_EX_ENTRY(EX_M_1, EX_P_0_4), _EX_ENTRY(EX_M_1, EX_P_0_67),
_EX_ENTRY(EX_M_1, EX_P_1), _EX_ENTRY(EX_M_0_67, EX_P_1),
_EX_ENTRY(EX_M_0_4, EX_P_1), _EX_ENTRY(EX_M_0_2, EX_P_1),
};
#else
/* Conventional microstep table. Torque vector with magnitude 1. Gives
* less torque that the first table, but the change in smoothness doesn't
* seem to be worth the loss of torque
*/
uint8_t microTable[STEPS_PER_CYCLE] =
{
_EX_ENTRY(EX_0, EX_P_1), _EX_ENTRY(EX_P_0_2, EX_P_1),
_EX_ENTRY(EX_P_0_2, EX_P_1), _EX_ENTRY(EX_P_0_4, EX_P_0_67),
_EX_ENTRY(EX_P_0_67, EX_P_0_67), _EX_ENTRY(EX_P_0_67, EX_P_0_4),
_EX_ENTRY(EX_P_1, EX_P_0_2), _EX_ENTRY(EX_P_1, EX_P_0_2),
 
_EX_ENTRY(EX_P_1, EX_0), _EX_ENTRY(EX_P_1, EX_M_0_2),
_EX_ENTRY(EX_P_1, EX_M_0_2), _EX_ENTRY(EX_P_0_67, EX_M_0_4),
_EX_ENTRY(EX_P_0_67, EX_M_0_67), _EX_ENTRY(EX_P_0_4, EX_M_0_67),
_EX_ENTRY(EX_P_0_2, EX_M_1), _EX_ENTRY(EX_P_0_2, EX_M_1),
 
_EX_ENTRY(EX_0, EX_M_1), _EX_ENTRY(EX_M_0_2, EX_M_1),
_EX_ENTRY(EX_M_0_2, EX_M_1), _EX_ENTRY(EX_M_0_4, EX_M_0_67),
_EX_ENTRY(EX_M_0_67, EX_M_0_67), _EX_ENTRY(EX_M_0_67, EX_M_0_4),
_EX_ENTRY(EX_M_1, EX_M_0_2), _EX_ENTRY(EX_M_1, EX_M_0_2),
 
_EX_ENTRY(EX_M_1, EX_0), _EX_ENTRY(EX_M_1, EX_P_0_2),
_EX_ENTRY(EX_M_1, EX_P_0_2), _EX_ENTRY(EX_M_0_67, EX_P_0_4),
_EX_ENTRY(EX_M_0_67, EX_P_0_67), _EX_ENTRY(EX_M_0_4, EX_P_0_67),
_EX_ENTRY(EX_M_0_2, EX_P_1), _EX_ENTRY(EX_M_0_2, EX_P_1)
};
#endif /* 0 */
 
uint8_t halfTable[STEPS_PER_CYCLE] =
{
_EX_ENTRY(EX_P_1, EX_P_1), _EX_ENTRY(EX_P_1, EX_P_1),
_EX_ENTRY(EX_P_1, EX_P_1), _EX_ENTRY(EX_P_1, EX_P_1),
 
_EX_ENTRY(EX_P_1, EX_0), _EX_ENTRY(EX_P_1, EX_0),
_EX_ENTRY(EX_P_1, EX_0), _EX_ENTRY(EX_P_1, EX_0),
 
_EX_ENTRY(EX_P_1, EX_M_1), _EX_ENTRY(EX_P_1, EX_M_1),
_EX_ENTRY(EX_P_1, EX_M_1), _EX_ENTRY(EX_P_1, EX_M_1),
 
_EX_ENTRY(EX_0, EX_M_1), _EX_ENTRY(EX_0, EX_M_1),
_EX_ENTRY(EX_0, EX_M_1), _EX_ENTRY(EX_0, EX_M_1),
 
_EX_ENTRY(EX_M_1, EX_M_1), _EX_ENTRY(EX_M_1, EX_M_1),
_EX_ENTRY(EX_M_1, EX_M_1), _EX_ENTRY(EX_M_1, EX_M_1),
 
_EX_ENTRY(EX_M_1, EX_0), _EX_ENTRY(EX_M_1, EX_0),
_EX_ENTRY(EX_M_1, EX_0), _EX_ENTRY(EX_M_1, EX_0),
 
_EX_ENTRY(EX_M_1, EX_P_1), _EX_ENTRY(EX_M_1, EX_P_1),
_EX_ENTRY(EX_M_1, EX_P_1), _EX_ENTRY(EX_M_1, EX_P_1),
 
_EX_ENTRY(EX_0, EX_P_1), _EX_ENTRY(EX_0, EX_P_1),
_EX_ENTRY(EX_0, EX_P_1), _EX_ENTRY(EX_0, EX_P_1),
};
 
uint8_t fullTable[STEPS_PER_CYCLE] =
{
_EX_ENTRY(EX_P_1, EX_P_1), _EX_ENTRY(EX_P_1, EX_P_1),
_EX_ENTRY(EX_P_1, EX_P_1), _EX_ENTRY(EX_P_1, EX_P_1),
_EX_ENTRY(EX_P_1, EX_P_1), _EX_ENTRY(EX_P_1, EX_P_1),
_EX_ENTRY(EX_P_1, EX_P_1), _EX_ENTRY(EX_P_1, EX_P_1),
 
_EX_ENTRY(EX_P_1, EX_M_1), _EX_ENTRY(EX_P_1, EX_M_1),
_EX_ENTRY(EX_P_1, EX_M_1), _EX_ENTRY(EX_P_1, EX_M_1),
_EX_ENTRY(EX_P_1, EX_M_1), _EX_ENTRY(EX_P_1, EX_M_1),
_EX_ENTRY(EX_P_1, EX_M_1), _EX_ENTRY(EX_P_1, EX_M_1),
 
_EX_ENTRY(EX_M_1, EX_M_1), _EX_ENTRY(EX_M_1, EX_M_1),
_EX_ENTRY(EX_M_1, EX_M_1), _EX_ENTRY(EX_M_1, EX_M_1),
_EX_ENTRY(EX_M_1, EX_M_1), _EX_ENTRY(EX_M_1, EX_M_1),
_EX_ENTRY(EX_M_1, EX_M_1), _EX_ENTRY(EX_M_1, EX_M_1),
 
_EX_ENTRY(EX_M_1, EX_P_1), _EX_ENTRY(EX_M_1, EX_P_1),
_EX_ENTRY(EX_M_1, EX_P_1), _EX_ENTRY(EX_M_1, EX_P_1),
_EX_ENTRY(EX_M_1, EX_P_1), _EX_ENTRY(EX_M_1, EX_P_1),
_EX_ENTRY(EX_M_1, EX_P_1), _EX_ENTRY(EX_M_1, EX_P_1)
};
 
/* Setup the table of divisors of the siderial interrupt use to
* achieve the required tracking rate.
*/
struct
{
uint8_t divisor; // Siderial interrupts per step
uint8_t flags; // Control flags
#define USE_RELAY 0 // Activate the magic relay [RA only]
#define USE_MICRO 1 // Use the microstep table
} rateConvert[] =
{
[SPEED_0_X] = {1, _BV(USE_MICRO)}, // Special value
[SPEED_0_33_X] = {3 * SIDERIAL_LCM, _BV(USE_MICRO)},
[SPEED_0_67_X] = {(3 * SIDERIAL_LCM) / 2, _BV(USE_MICRO)},
[SPEED_1_X] = {SIDERIAL_LCM, _BV(USE_MICRO)},
[SPEED_1_33_X] = {(3 * SIDERIAL_LCM) / 4, _BV(USE_MICRO)},
[SPEED_1_67_X] = {(3 * SIDERIAL_LCM) / 5, _BV(USE_MICRO)},
[SPEED_2_X] = {SIDERIAL_LCM / 2, _BV(USE_MICRO) | _BV(USE_RELAY)},
[SPEED_4_X] = {SIDERIAL_LCM / 4, _BV(USE_MICRO) | _BV(USE_RELAY)},
[SPEED_8_X] = {SIDERIAL_LCM / 8, _BV(USE_MICRO) | _BV(USE_RELAY)},
[SPEED_16_X] = {SIDERIAL_LCM / 16, _BV(USE_RELAY)},
 
[SPEED_SPIN] = {SIDERIAL_LCM / 16, 0}
};
 
/* Create the instance of the stepper excitation info
*/
struct excitation_s raExcitation;
struct excitation_s decExcitation;
 
/* Define instances of stepper state info
*/
struct stepState_s raState;
struct stepState_s decState;
uint8_t doHalfStep = 0;
 
/* Info for tracking rate correction */
uint16_t adjCtr;
uint16_t adjLimit;
uint16_t doDropInt;
 
/* stepperInit() initializes the state of the stepper code.
*
* The current implementation uses a single 16-bit timer with a fixed
* period shared between RA and DEC.
*
* Passed:
* Nothing
*
* Returns:
* Nothing
*
* Notes:
* An alternate implementation would use a pair of 16 bit timers with
* their timeouts set to the step period. This would minimize the
* number of interrupts, but would take an extra timer.
*
* The current implementation is preferred until we're sure the extra
* timer isn't needed elsewhere or until there is a performance
* problem caused by the extra interrupt load caused by having
* multiple interrupts per step.
*/
void
stepperInit(void)
{
/* Initialize the excitation state */
raExcitation.excitation = EX_0;
raExcitation.useRelay = 0;
raState.pExcite = &raExcitation;
decExcitation.excitation = EX_0;
decState.pExcite = &decExcitation;
 
/* Initialize the siderial rate timer */
 
TIMSK |= _BV(OCIE1A);
}
 
 
/* calculateRateEntry() creates an entry in the rate table
*
* Passed:
* pEntry Pointer to entry
* transRatio Transmission (gearbox) ratio
* secPerDay Seconds per sideral/lunar/solar dat
*
* Returns:
* nothing
*/
static void
calculateRateEntry( struct trackRate_s *pEntry,
uint8_t transRatio,
uint32_t secsPerDay)
{
/* To do this calculation would (without optimization) would need about
* 40 bit arithmetic, which isn't available in this copmiler.
*
* To get the required precision down to below 32 bits the
* numerator and denominator are divided through by 1280.
*
* This gives an exact result for 8/16 MHz with a 180 tooth wormgear
*
* The formula gives the clock divisor for the siderial clock interrupt
* divisor:
*
* (CLK_RATE * SECS_PER_SDAY) / (MECH_DIV * STEPS_PER_CYCLE * SIDERIAL_LCM)
*
* This, by itself, does not give great accuracy because the divisor is
* an integer. With a typical divisor of about 1500 there is a maximum error
* of about 1 / 3000 (0.033%).
*
* For most purposes this should be accurate enough, but the accuracy can
* be improved by adding or dropping the occasional interrupt.
*
* This function calculates both the divisor and how often to
* drop an timer interrupt, or to insert an extra one to improve the
* timer accuracy
*/
#define CLK_FACTOR 1280L // Common divisor for numerator & divisor
#define WORM_CLK_LCM (WORM_RATIO * CYCLES_PER_ROTN * SIDERIAL_LCM)
#define SCALED_CLK (CLK_RATE / CLK_FACTOR)
 
#define MIN_DIV 1000 /* Minimum allowed divisor to avoid
* interrupt saturation
*/
long top;
long bottom;
long div; // Clock divisor for interrupt generation
long adj; // Add/drop adjustment
long adj_denom;
 
top = SCALED_CLK * secsPerDay;
bottom = (WORM_CLK_LCM / CLK_FACTOR) * transRatio * STEPS_PER_CYCLE;
 
/* Calculate divisor, round to nearest integer */
div = (top + (bottom / 2)) / bottom;
 
/* Calculate adjustment */
adj = SCALED_CLK * secsPerDay;
adj_denom = (div * bottom) - (SCALED_CLK * secsPerDay);
 
adj /= adj_denom;
 
/* Fill in the entry */
pEntry->div = (div > MIN_DIV) ? div : MIN_DIV;
if (adj >= 0)
{
pEntry->doDropInt = 0;
pEntry->adj = (adj >= (1L << 16)) ? 0 : adj;
}
else
{
pEntry->doDropInt = 1;
pEntry->adj = (adj <= -(1L << 16)) ? 0 : -adj;
}
}
 
/* setupRateTable() fills the tracking rate table with values
* that are correct for the transmission ratio of the system.
*
* Passed
* transRatio Transmission (gearbox) ratio
*
* Returns
* nothing
*/
void
setupRateTable(uint8_t transRatio)
{
calculateRateEntry(&trackRateTable[0], transRatio, SECS_PER_SDAY);
calculateRateEntry(&trackRateTable[1], transRatio, SECS_PER_DAY);
calculateRateEntry(&trackRateTable[2], transRatio, SECS_PER_LDAY);
}
 
/* setTrackRate() sets the tracking rate used by the stepper module.
*
* Passed:
* rate The tracking rate (index)
*
* Returns:
* Nothing
*
* Note:
* If an illegal rate is entered the current rate will not be changed
*/
void
setTrackRate(int8_t rate)
{
/* If the track rate is <0 then disable siderial rate use in
* combine.c and return, leaving the current clock steup
*/
trackingRate = rate;
 
if (rate < 0)
{
noTrack = 1;
return;
}
 
/* Do nothing if the rate is not supported */
if (rate >= (sizeof(trackRateTable) / sizeof(struct trackRate_s)))
return;
/* Enable tracking */
noTrack = 0;
 
/* Update the tracking rate timer */
OCR1A = trackRateTable[rate].div;
TCNT1 = 0;
TCCR1A = 0;
TCCR1B = _BV(WGM12) | _BV(CS10);
 
/* Update adjustment data */
adjCtr = 0;
adjLimit = trackRateTable[rate].adj;
doDropInt = trackRateTable[rate].doDropInt;
}
 
/* setSpeed() is called by by the combiner to set the requested speed
* for the axis
*
* Passed:
* pState Axis state
* rate Requested rate
*
* Returns:
* Nothing
*
* Notes:
* setRaSpeed() and setDecSpeed() are wrappers used by the combiner
*/
static void
setSpeed(struct stepState_s *pState, int8_t speed)
{
/* If the current speed is zero then start the clock */
if (pState->clkDivRatio == 0)
pState->clkDivRatio = 1; // Almost immediate clock
 
pState->reqSpeed = speed;
}
 
void
setRaSpeed(int8_t speed)
{
setSpeed(&raState, speed);
}
 
void
setDecSpeed(int8_t speed)
{
setSpeed(&decState, speed);
}
 
/* setTickRate() is called by the state machine to set the clock interrupt
* rate.
*
* Passed
* pState The axis state
* tickRate The clock rate to set
*
* Returns
* nothing
*/
void
setTickRate(struct stepState_s *pState, uint8_t tickRate)
{
pState->clkDivRatio = rateConvert[tickRate].divisor;
}
/* stepperProcess is the state machine that makes this whole thing
* work! It is executed each axis interrupt to run the state machine
* that handles operation and backlash processing.
*
* Like the other state machines in the program it takes advantage
* of the GNU computed goto to operate very efficiently.
*
* Passed
* pState The axis state
*
* Returns
* Nothing
*/
#define _GET_TABLE(f) ((f) ? (doHalfStep ? halfTable : microTable) : fullTable)
 
void
stepperProcess(struct stepState_s *pState)
{
// Step up the initial state pointer
if (pState->pState == 0)
pState->pState = &&enter_idle_pos;
 
/* Make sure both finPos and finNeg are not set - that will
* lead to a loop as the code tries to meet both!
*/
if (pState->finPos && pState->finNeg)
pState->finPos = pState->finNeg = 0;
 
// Jump to the current state
goto *pState->pState;
 
/* There are six states in the machine
*
* - idle_pos Idle (last move in positive direction)
* - spin_pos Taking up backlash in positive direction
* - move_pos Moving in the positive direction
*
* There are "negative" versions of these states.
*
* Just to make things simple we use the "idle" state as a central
* decision point.
*/
 
enter_idle_pos:
/* We're about to move into the idle_pos state. We end up here if
* we're stopping or changing direction
*/
if (pState->reqSpeed == SPEED_0_X)
{
/* We're going to stop - if we're in the correct direction then
* stop, else start spinning in the other direction
*/
if (pState->finNeg)
goto enter_spin_neg;
else
{
/* Stop now! */
setTickRate(pState, SPEED_0_X);
pState->pExcite->excitation = EX_0;
pState->pExcite->useRelay = 0;
 
// For this state just call the entry point each interrupt
pState->pState = &&enter_idle_pos;
}
}
else if (pState->reqSpeed > SPEED_0_X)
{
/* We're now moving in the positive direction. As we are
* already engaged in the positive direction we can start
* running
*/
goto enter_move_pos;
}
else
{
/* Must be a negative move direction. Take up the backlash
* in the negative direction
*/
goto enter_spin_neg;
}
 
return;
 
enter_idle_neg:
/* We're about to move into the idle_neg state. We end up here if
* we're stopping or changing direction
*/
if (pState->reqSpeed == SPEED_0_X)
{
/* We're going to stop - if we're in the correct direction then
* stop, else start spinning in the other direction
*/
if (pState->finPos)
goto enter_spin_pos;
else
{
/* Stop now! */
setTickRate(pState, SPEED_0_X);
pState->pExcite->excitation = EX_0;
pState->pExcite->useRelay = 0;
 
// For this state just call the entry point each interrupt
pState->pState = &&enter_idle_neg;
}
}
else if (pState->reqSpeed < SPEED_0_X)
{
/* We're now moving in the negative direction. As we are
* already engaged in the negative direction we can start
* running
*/
goto enter_move_neg;
}
else
{
/* Must be a positive move direction. Take up the backlash
* in the positive direction
*/
goto enter_spin_pos;
}
return;
 
enter_spin_pos:
/* Spin in the positive direction to take up backlash in the
* gear chain
*/
if (pState->backlash == 0)
{
/* No backlash - go to the idle_pos state which will take us
* to the correct place
*/
goto enter_idle_pos;
}
else
{
uint8_t flags = rateConvert[SPEED_SPIN].flags;
/* There is a backlash setting - get ready to spin! */
pState->count = 0;
 
setTickRate(pState, SPEED_SPIN);
pState->pTable = _GET_TABLE(flags & _BV(USE_MICRO));
pState->pExcite->useRelay = flags & _BV(USE_RELAY);
pState->pState = &&run_spin_pos;
// Fall through to run the spin state
}
 
run_spin_pos:
// Update excitation value
pState->pExcite->excitation = pState->pTable[pState->stepCtr];
pState->stepCtr = (pState->stepCtr + 1) & (STEPS_PER_CYCLE - 1);
 
/* Check the count. If we've spun enough then go back to the
* idle_pos state which will send us the right way
*/
if (++pState->count > pState->backlash)
goto enter_idle_pos;
return;
 
enter_spin_neg:
/* Spin in the negative direction to take up backlash in the
* gear chain
*/
if (pState->backlash == 0)
{
/* No backlash - go to the idle_neg state which will take us
* to the correct place
*/
goto enter_idle_neg;
}
else
{
uint8_t flags = rateConvert[SPEED_SPIN].flags;
/* There is a backlash setting - get ready to spin! */
pState->count = 0;
 
setTickRate(pState, SPEED_SPIN);
pState->pTable = _GET_TABLE(flags & _BV(USE_MICRO));
pState->pExcite->useRelay = flags & _BV(USE_RELAY);
pState->pState = &&run_spin_neg;
 
// Fall through to run the spin state
}
 
run_spin_neg:
// Update excitation value
pState->pExcite->excitation = pState->pTable[pState->stepCtr];
pState->stepCtr = (pState->stepCtr - 1) & (STEPS_PER_CYCLE - 1);
 
/* Check the count. If we've spun enough then go back to the
* idle_neg state which will send us the right way
*/
if (++pState->count > pState->backlash)
goto enter_idle_neg;
 
return;
 
enter_move_pos:
/* Start moving in the positive direction. Save the requested
* speed as the current speed so we can detect changes in the
* requested speed
*/
if (pState->reqSpeed > SPEED_0_X)
{
uint8_t flags = rateConvert[pState->reqSpeed].flags;
setTickRate(pState, pState->reqSpeed);
pState->pTable = _GET_TABLE(flags & _BV(USE_MICRO));
pState->pExcite->useRelay = flags & _BV(USE_RELAY);
pState->pState = &&run_move_pos;
pState->curSpeed = pState->reqSpeed;
 
/* Fall through to move action */
}
else
{
/* We're not going in the positive direction any more */
goto enter_idle_pos;
}
return;
 
run_move_pos:
if (pState->curSpeed == pState->reqSpeed)
{
/* We're still moving at the same speed. Do it
*/
pState->pExcite->excitation = pState->pTable[pState->stepCtr];
pState->stepCtr = (pState->stepCtr + 1) & (STEPS_PER_CYCLE - 1);
}
else
{
/* Go baxk to idle_pos that will decide the next state */
goto enter_idle_pos;
}
return;
 
enter_move_neg:
/* Start moving in the negative direction. Save the requested
* speed as the current speed so we can detect changes in the
* requested speed
*/
if (pState->reqSpeed < SPEED_0_X)
{
uint8_t flags = rateConvert[-pState->reqSpeed].flags;
setTickRate(pState, -pState->reqSpeed);
pState->pTable = _GET_TABLE(flags & _BV(USE_MICRO));
pState->pExcite->useRelay = flags & _BV(USE_RELAY);
pState->pState = &&run_move_neg;
pState->curSpeed = pState->reqSpeed;
 
/* Fall through to move action */
}
else
{
/* We're not going in the negative direction any more. Stop and
* continue from there
*/
goto enter_idle_neg;
}
return;
 
run_move_neg:
if (pState->curSpeed == pState->reqSpeed)
{
/* We're still moving at the same speed. Do it
*/
pState->pExcite->excitation = pState->pTable[pState->stepCtr];
pState->stepCtr = (pState->stepCtr - 1) & (STEPS_PER_CYCLE - 1);
}
else
{
/* Go back to the idle_neg. It will determine the next state */
goto enter_idle_neg;
}
return;
}
 
/* stepperInt() is called each siderial interrupt. This is divided down
* in software to derive the actual stepper timing.
*
* Passed:
* Nothing
*
* Returns:
* Nothing
*/
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
/* Update the tracking rate adjustment counter */
++adjCtr;
 
/* If we're dropping then drop if necessary */
if (doDropInt && adjLimit && adjCtr >= adjLimit)
{
/* Drop interrupt */
adjCtr = 0;
return;
}
 
do_again:
/* Run the state machine for the DEC and RA axis */
if (raState.clkDivRatio != 0 && ++raState.divCtr >= raState.clkDivRatio)
{
// Execute the RA state machine
raState.divCtr = 0;
stepperProcess(&raState);
}
 
if (decState.clkDivRatio != 0 && ++decState.divCtr >= decState.clkDivRatio)
{
// Execute the DEC state machine
decState.divCtr = 0;
stepperProcess(&decState);
}
 
/* If we need to "insert" an interrupt do it now */
if (!doDropInt && adjLimit && adjCtr >= adjLimit)
{
adjCtr = 0;
goto do_again;
}
}
/programy/C/avr/LX200/stepper.h
0,0 → 1,103
/*
* Copyright (C) 2004 Darren Hutchinson (dbh@gbdt.com.au)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
* License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
* $Id: stepper.h,v 1.7 2004/04/05 06:42:15 dbh Exp $
*/
 
#ifndef _STEPPER_H_
#define _STEPPER_H_
 
/* Define the encoding used to hold the exictation values for each
* stepper coil.
*/
#define _EX_ENTRY(c1, c2) (((c1) << 4) | (c2))
#define _GET_C1(e) ((e) >> 4)
#define _GET_C2(e) ((e) & 0xf)
 
#define EX_0 0x0 // Inactive
#define EX_P_0_2 0x1 // +0.2 active
#define EX_P_0_4 0x2 // +0.4 active
#define EX_P_0_67 0x3 // +0.67 active
#define EX_P_1 0x4 // +Active
 
#define EX_M_0_2 0x9 // -0.2 active
#define EX_M_0_4 0xa // -0.4 active
#define EX_M_0_67 0xb // -0.67 active
#define EX_M_1 0xc // -Active
 
/* Define the struture used to pass excitation information from
* the stepper module to the excitation module
*/
struct excitation_s
{
uint8_t excitation;
uint8_t useRelay;
};
 
extern struct excitation_s raExcitation;
extern struct excitation_s decExcitation;
 
/* Define a structure to hold the current "state" for each axis. This
* allows up to use the same code for both axis, so I don't feel
* tempted to skimp on the features
*/
struct stepState_s
{
// Input (from the combiner)
int8_t reqSpeed; // Rate requested
 
// Output (to the driver)
struct excitation_s *pExcite;
 
// Configuration
uint16_t backlash; // #steps to counteract backlash
uint8_t finPos; // Finish movement in positive direction
uint8_t finNeg; // Finish movement in negative direction
 
// Machine state
uint8_t stepCtr; // Current step in cycle
int8_t curSpeed; // Current rate (when moving after spin)
void *pState; // State pointer
uint16_t count; // Counter used in states
 
uint8_t *pTable; // Current step table
 
// Support function state
uint8_t clkDivRatio; // Current clock div
uint8_t divCtr; // Clock division counter
};
 
/* These are held in stepper.c */
extern struct stepState_s raState;
extern struct stepState_s decState;
extern int8_t trackingRate;
extern uint8_t transRatio;
 
/* Prototypes */
void stepperInit(void);
void setRaSpeed(int8_t speed);
void setDecSpeed(int8_t speed);
 
void setupRateTable(uint8_t transRatio);
void setTrackRate(int8_t rate);
 
/* DEBUG: Uses half step instread of microstep if true */
extern uint8_t doHalfStep;
 
#endif /* _STEPPER_H_ */
 
/programy/C/avr/akcelerometr/.hfuse
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/programy/C/avr/akcelerometr/.lfuse
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/programy/C/avr/akcelerometr/a2dtest.c
19,28 → 19,27
#include <math.h>
 
#include "global.h" // include our global settings
#include "uart.h" // include uart function library
#include "uart2.h" // include uart function library
#include "rprintf.h" // include printf function library
#include "timer.h" // include timer function library (timing, PWM, etc)
#include "a2d.h" // include A/D converter function library
 
//----- Begin Code ------------------------------------------------------------
#define BUFLEN 32
#define BUFLEN 64
 
int main(void)
{
u08 i=0;
s16 x=0,y=0;
double fi;
s16 fia;
u16 fib;
u16 i,x,y;
double fi, err, fibuf[BUFLEN];
s16 fia, erra;
u16 fib, errb;
 
// initialize our libraries
// initialize the UART (serial port)
uartInit();
uartSetBaudRate(9600);
uartSetBaudRate(0,9600);
// make all rprintf statements use uart for output
rprintfInit(uartSendByte);
rprintfInit(uart0SendByte);
// initialize the timer system
timerInit();
// turn on and initialize A/D converter
47,9 → 46,9
a2dInit();
// configure a2d port (PORTA) as input
// so we can receive analog signals
DDRC = 0x00;
DDRA = 0x00;
// make sure pull-up resistors are turned off
PORTC = 0x00;
PORTA = 0x00;
 
// set the a2d prescaler (clock division ratio)
// - a lower prescale setting will make the a2d converter go faster
68,19 → 67,28
 
while(1)
{
fi=0;
err=0;
for(i=0; i<BUFLEN; i++)
{
x += a2dConvert10bit(0);
y += a2dConvert10bit(1);
{
x = a2dConvert10bit(ADC_CH_ADC0);
y = a2dConvert10bit(ADC_CH_ADC1);
fibuf[i] = atan2((double)x-511,(double)y-511); // record computed angles to buffer for post processing
}
x = x/BUFLEN - 512;
y = y/BUFLEN - 512;
for(i=0; i<BUFLEN; i++) fi += fibuf[i]; // sum recorded angles
 
fi = atan2(y,x) * 180.0 / PI;
fi = ((fi/BUFLEN)+PI) * 180.0 / PI; // average recorded angles and convert product to degrees
 
for(i=0; i<BUFLEN; i++) err += (fibuf[i]-fi)*(fibuf[i]-fi); // sum cubic errors
err = sqrt(err/(BUFLEN-1))/sqrt(BUFLEN); // compute average cubic error
erra = floor(err);
errb = floor((err - erra)*1000);
fia = floor(fi);
fib = floor((fi - fia));
rprintf("X:%d Y:%d fi:%d.%d \r\n", x, y, fia, fib);
fib = floor((fi - fia)*1000);
 
rprintf("fi:%d.%d +- %d.%d \r\n", fia, fib, erra, errb);
}
return 0;
}
/programy/C/avr/akcelerometr/gmetr.kontrollerlab
1,7 → 1,7
<!DOCTYPE KontrollerLab>
<PROJECT VERSION="0.8.0-beta1" >
<FILES>
<FILE VIEWS="0,0,1024,482,5," SHOWN="TRUE" NAME="a2dtest.c" />
<FILE VIEWS="0,0,1024,445,5," SHOWN="TRUE" NAME="a2dtest.c" />
<FILE SHOWN="FALSE" NAME="avrlibdefs.h" />
<FILE SHOWN="FALSE" NAME="avrlibtypes.h" />
<FILE SHOWN="FALSE" NAME="a2d.c" />
13,10 → 13,8
<FILE SHOWN="FALSE" NAME="rprintf.h" />
<FILE SHOWN="FALSE" NAME="timer.c" />
<FILE SHOWN="FALSE" NAME="timer.h" />
<FILE VIEWS="4,480,1,1,6," SHOWN="TRUE" NAME="uart.c" />
<FILE SHOWN="FALSE" NAME="uart.h" />
<FILE SHOWN="FALSE" NAME="vt100.c" />
<FILE SHOWN="FALSE" NAME="vt100.h" />
<FILE SHOWN="FALSE" NAME="uart2.c" />
<FILE SHOWN="FALSE" NAME="uart2.h" />
</FILES>
<SETTINGS>
<ASSEMBLER_COMMAND VALUE="avr-gcc" />
29,7 → 27,7
<COMPILER_OPT_LEVEL VALUE="s" />
<COMPILER_STRICT_PROTOTYPES VALUE="TRUE" />
<COMPILER_WALL VALUE="TRUE" />
<CPU VALUE="ATMega8" />
<CPU VALUE="ATMega64" />
<HEX_FILE VALUE="project.hex" />
<LINKER_COMMAND VALUE="avr-gcc" />
<LINKER_FLAGS VALUE="" />
/programy/C/avr/akcelerometr/project.hex
1,480 → 1,674
:100000004AC064C063C05DC6D1C53EC603C61FC634
:10001000B0C568C55BC0AFC659C0E2C615C156C001
:1000200055C054C053C0084AD73B3BCE016E84BC78
:10003000BFFDC12F3D6C74319ABD56833DDA3D0042
:10004000C77F11BED9E4BB4C3E916BAAAABE00008B
:1000500000803F583A256420593A25642066693A61
:1000600025642E2564200D0A0030313233343536B4
:10007000373839414243444546000000010008003A
:1000800040000001000400000100080020004000C2
:1000900080000001000411241FBECFE5D4E0DEBFC4
:1000A000CDBF11E0A0E6B0E0EAEDFCE102C00590B2
:1000B0000D92A836B107D9F712E0A8E6B1E001C069
:1000C0001D92AA3DB107E1F702D005CE99CF9F92CC
:1000D000AF92BF92CF92DF92EF92FF920F931F9356
:1000E000CF93DF93EBD660E875E280E090E00BD62B
:1000F00083EA96E060D139D360D014BA15BA87E0AC
:100100006FD080E072D0CC24DD2410E0C0E0D0E0DD
:1001100033E5A32E30E0B32E9924939409C080E0F8
:1001200079D0C80FD91F81E075D0C80ED91E1F5FC6
:100130001032A8F3CE0160E270E0E3DAEB01C050C8
:10014000D240C60160E270E0DCDAC12C2EEFD22E84
:10015000C60ED71EBE01882777FD8095982F5FD8E1
:100160007B018C01B601882777FD8095982F57D8A1
:10017000A80197015CDB20E030E044E353E4B5D60E
:100180002BED3FE049E450E4A5D70ADC1F921F9213
:10019000A0D87F936F93DF92CF92DF93CF93BF92DC
:1001A000AF929F9254D210E08DB79EB70B960FB6C8
:1001B000F8949EBF0FBE8DBFB2CF379A359886B1E7
:1001C000887F866086B987B18F73806487B93D98D0
:1001D000339A1092B9027894089533983798089515
:1001E00096B1987F982B96B9089597B18295880F0C
:1001F000880F807C9F73982B97B9089597B18F7162
:10020000907E892B87B90895349A369A089586B1DD
:10021000807408951092B90297B18F71907E892BE6
:1002200087B9349A369A3699FECF24B145B1942FC6
:1002300080E030E0282B392BC9010895EBDF96953B
:1002400087959695879508951F920F920FB60F92F6
:1002500011248F938FEF8093B9028F910F900FBE6F
:100260000F901F901895FC018FB7F89471836083ED
:100270005383428317821682158214828FBF08959A
:10028000CF93DF93DC014FB7F894EC018C819D8113
:10029000892B11F4E0E01CC0FD0186819781ED916E
:1002A000FC911197E80FF91FE0810196ED019F8302
:1002B0008E832A813B818217930720F0821B930B48
:1002C0009F838E83ED018C819D8101979D838C831B
:1002D0004FBF8E2FDF91CF910895FC014FB7F89457
:1002E0008481958168177907B0F486819781860F9C
:1002F000971F97838683228133818217930720F08B
:10030000821B930B9783868384819581861B970B31
:100310009583848302C0158214824FBF0895FC0127
:10032000CB012FB7F8942FBF26813781628173816B
:10033000820F931FD2D90190F081E02DE80FF91FB1
:10034000808108951F93CF93DF93EC01162F4FB751
:10035000F8942C813D816A817B812617370790F4C0
:100360008E819F81820F931FB8D9E881F981E80FB0
:10037000F91F10838C819D8101969D838C834FBFD3
:100380008FEF02C04FBF80E0DF91CF911F910895A2
:10039000FC018FB7F8948FBF2281338184819581CE
:1003A000281B390BC9010895FC018FB7F8941582F9
:1003B00014828FBF08959093690180936801089516
:1003C0001F93182F8A3031F4E0916801F091690190
:1003D0008DE00995E0916801F0916901812F0995FF
:1003E0001F910895CF93DF93EC01009719F405C096
:1003F0002196E6DF88818823D9F7DF91CF91089590
:10040000EF92FF920F931F93CF93DF938C017A01AA
:100410000097E1F020E030E02617370738F4F801C4
:1004200081918F012F5F3F4F8823B1F7C0E0D0E06B
:100430000AC0F8018081882319F00F5F1F4F01C0A7
:1004400080E2BEDF2196CE15DF0598F3DF91CF91D4
:100450001F910F91FF90EF900895CF93DF93EC01E0
:10046000009711F406C0ACDFFE0121968491882329
:10047000D1F7DF91CF9108958AE0A2DF0895E82FA8
:10048000F0E0EF70F070E759FF4FE4918E2F98DFA6
:1004900008951F93182F82958F70F1DF812FEFDF62
:1004A0001F9108951F93182F892FF3DF812FF1DFFC
:1004B0001F910895EF92FF920F931F937B018C0180
:1004C000C801AA27BB27EEDFC701ECDF1F910F9100
:1004D000FF90EF9008952F923F924F925F926F920C
:1004E0007F928F929F92AF92BF92CF92DF92EF92C4
:1004F000FF920F931F93DF93CF93CDB7DEB7A397F0
:100500000FB6F894DEBF0FBECDBF4AA32BA33701B1
:100510004801442351F017FF08C0EE24FF2487014F
:10052000E618F7080809190902C084017301262E8C
:10053000262F215090E03AA1311191E0291B29A3E7
:1005400018A2A82EBB24A7FCB094CB2CDB2CC8018E
:10055000B701A6019501E8D8FB01EF70F070E759EB
:10056000FF4F64916F8FC801B701A6019501DCD8D8
:10057000C901DA017C018D019EE1492E512C4C0EFE
:100580005D1E39A023C0E114F10401051105B9F085
:10059000C801B701A6019501C7D8FB01EF70F07043
:1005A000E759FF4F6491F2016083C801B701A601CA
:1005B0009501BAD8C901DA017C018D0103C02BA1D4
:1005C000F20120833A940894410851083320D9F667
:1005D000CE014F968C0139A1031B11098AA18823F2
:1005E000D9F097FE05C08DE2F80182938F0114C007
:1005F000C8010197611471048104910419F08C0100
:100600008BE202C08C0180E2F801808305C0F80112
:1006100081918F01D5DE2A942220C9F7A3960FB6C7
:10062000F894DEBF0FBECDBFCF91DF911F910F9128
:10063000FF90EF90DF90CF90BF90AF909F908F9002
:100640007F906F905F904F903F902F9008957F9292
:100650008F929F92AF92BF92CF92DF92EF92FF92D2
:100660000F931F93DF93CF93CDB7DEB77888C988F8
:10067000DA8853E1E52EF12CEC0EFD1E13C0882321
:1006800081F480E090E0CF91DF911F910F91FF9076
:10069000EF90DF90CF90BF90AF909F908F907F9022
:1006A00008958EDE96012F5F3F4F772021F0F601EF
:1006B0006901849103C0F601808169018532F9F6F0
:1006C0002F5F3F4F772021F0F6016901849103C02D
:1006D000F60180816901843629F0883781F08336FC
:1006E00001F706C000E117E24AE0A42EB12C0CC0CD
:1006F000F701808122E030E0E20EF31ED2CF00E06D
:1007000010E130E1A32EB12C22E0822E912C8E0C30
:100710009F1CF701E080F1808436A1F4F7FE0FC042
:10072000F094E194F108F3948DE24ADE08C0C80128
:100730006AE070E0D2D78B016230710518F0E016E4
:10074000F106A8F3C701B801C8D7862F98DEC70104
:10075000B801C3D77C01C801B501BFD78B016115B2
:10076000710581F774019ECF089580E090E0FC014F
:10077000EE0FFF1FE659FE4F11821082019687305F
:100780009105A9F783B7887F826083BF12BE89B7BE
:10079000816089BF1092BA021092BB021092BC0213
:1007A0001092BD028EB5887F83608EBD1DBC1CBCBF
:1007B00089B7846089BF85B5887F846085BD14BC96
:1007C00089B7806489BF1092C2021092C30210924E
:1007D000C4021092C5027894089583B7887F82601E
:1007E00083BF12BE89B7816089BF1092BA0210928E
:1007F000BB021092BC021092BD0208958EB5887F94
:1008000083608EBD1DBC1CBC89B7846089BF089500
:1008100085B5887F846085BD14BC89B7806489BF35
:100820001092C2021092C3021092C4021092C5022A
:10083000089593B7987F982B93BF08959EB5987F9E
:10084000982B9EBD089595B5987F982B95BD0895DA
:1008500083B7E82FF0E0E770F070EE0FFF1FE65867
:10086000FF4F25913491C90108958EB5E82FF0E02E
:10087000E770F070EE0FFF1FE658FF4F259134919F
:10088000C901089585B5E82FF0E0E770F070EE0F2C
:10089000FF1FEA57FF4F25913491C9010895873012
:1008A00040F4E82FF0E0EE0FFF1FE659FE4F718392
:1008B00060830895873040F4E82FF0E0EE0FFF1FCB
:1008C000E659FE4F118210820895EF92FF920F9326
:1008D0001F93CF93DF93EC0112B71092BE021092D8
:1008E000BF021092C0021092C10283B7E82FF0E05D
:1008F000E770F070EE0FFF1FE658FF4F259134911F
:1009000040E050E060E072E18AE790E02FD7B90163
:10091000CA01693B2DE8720726E0820720E09207B2
:1009200090F437E2C131D30770F49E0140E050E00B
:10093000B5D628EE33E040E050E0F6D6C901DA0142
:10094000BC01CD011FC028EE33E040E050E0ECD602
:10095000CA01B9019E0140E050E0A0D613C08091C9
:10096000BE029091BF02A091C002B091C10285B7B2
:100970008F7885BF85B7806885BF889585B78F7765
:1009800085BF08C09B01AC01210F311D411D511DC8
:1009900079018A012091BE023091BF024091C002CC
:1009A0005091C10282B790E0A0E0B0E0542F432FF5
:1009B000322F2227822B932BA42BB52B8E159F052C
:1009C000A007B10760F2DF91CF911F910F91FF90C7
:1009D000EF9008951092BA021092BB021092BC02DE
:1009E0001092BD0208952091BA023091BB0240914D
:1009F000BC025091BD02B901CA0108951092C20211
:100A00001092C3021092C4021092C5020895209160
:100A1000C2023091C3024091C4025091C502B90193
:100A2000CA010895893031F48FB582608FBD8FB5CA
:100A30008E7F0AC08A3019F48FB5826002C08FB5EC
:100A40008D7F8FBD8FB581608FBD1BBC1ABC19BC5B
:100A500018BC08952FB52E7F2FBD2FB522602FBD56
:100A60002EB528602EBD2EB520612EBD97BD86BD4A
:100A70001BBC1ABC19BC18BC08958FB58D7F8FBDE7
:100A80008FB58E7F8FBD8FB58F778FBD8FB58F7BE5
:100A90008FBD8FB58F7D8FBD8FB58F7E8FBD089534
:100AA0008FB580688FBD8FB58F7B8FBD08958FB553
:100AB00080628FBD8FB58F7E8FBD08958FB58F7784
:100AC0008FBD8FB58F7B8FBD08958FB58F7D8FBD07
:100AD0008FB58F7E8FBD08959BBD8ABD089599BD4A
:100AE00088BD08951F920F920FB60F9211248F9315
:100AF0009F93AF93BF93EF93FF938091BA0290912E
:100B0000BB02A091BC02B091BD020196A11DB11D16
:100B10008093BA029093BB02A093BC02B093BD0233
:100B20008091BE029091BF02A091C002B091C1021B
:100B30000196A11DB11D8093BE029093BF02A093A8
:100B4000C002B093C10280916A0190916B01892B20
:100B500029F0E0916A01F0916B010995FF91EF9105
:100B6000BF91AF919F918F910F900FBE0F901F90EB
:100B700018951F920F920FB60F9211248F939F9387
:100B8000EF93FF9380916C0190916D01892B29F077
:100B9000E0916C01F0916D010995FF91EF919F91AA
:100BA0008F910F900FBE0F901F9018951F920F926C
:100BB0000FB60F9211248F939F93AF93BF93EF9330
:100BC000FF938091C2029091C302A091C402B091A0
:100BD000C5020196A11DB11D8093C2029093C3026C
:100BE000A093C402B093C5028091740190917501E5
:100BF000892B29F0E0917401F09175010995FF911D
:100C0000EF91BF91AF919F918F910F900FBE0F9079
:100C10001F9018951F920F920FB60F9211248F9369
:100C20009F93EF93FF9380916E0190916F01892BB9
:100C300029F0E0916E01F0916F010995FF91EF911C
:100C40009F918F910F900FBE0F901F9018951F923C
:100C50000F920FB60F9211248F939F93EF93FF93F0
:100C60008091700190917101892B29F0E0917001C0
:100C7000F09171010995FF91EF919F918F910F90E4
:100C80000FBE0F901F9018951F920F920FB60F92E4
:100C900011248F939F93EF93FF9380917201909112
:100CA0007301892B29F0E0917201F091730109958C
:100CB000FF91EF919F918F910F900FBE0F901F901A
:100CC00018951F920F920FB60F9211248F939F9336
:100CD000EF93FF938091760190917701892B29F012
:100CE000E0917601F09177010995FF91EF919F9145
:100CF0008F910F900FBE0F901F9018959093B80290
:100D00008093B70208959B01AC01605C7D4B804FDE
:100D10009F4FF3E0660F771F881F991FFA95D1F751
:100D2000E4E0220F331F441F551FEA95D1F7FCD48E
:100D30002150304029B930BD089587EC92E00895E4
:100D400080ED92E00895982F8091C6028823E1F308
:100D50009CB91092C60208951092CC021092CB0258
:100D600008958091CB029091CC02892B11F080E004
:100D700008958FEF08951F920F920FB60F921124CE
:100D80006F938F939F93EF93FF936CB18091B70212
:100D90009091B802892B39F0E091B702F091B80236
:100DA000862F09950EC087EC92E0CCDA882349F4AF
:100DB0008091D8029091D90201969093D9028093A4
:100DC000D802FF91EF919F918F916F910F900FBE7D
:100DD0000F901F901895682F80ED92E0B3DA089578
:100DE0001F920F920FB60F9211248F939F938091B1
:100DF000CF02882369F08091D4029091D502892B8B
:100E000029F080ED92E03CDA8CB905C01092CF0257
:100E10008FEF8093C6029F918F910F900FBE0F901E
:100E20001F9018958FEF8093CF0280ED92E028DA23
:100E3000982F8091C6028823E1F39CB91092C602D4
:100E40000895CF93DF93EC018091C9029091CA027B
:100E5000892B61F08091CB029091CC02892B31F0EB
:100E600087EC92E00DDA88838FEF01C080E0DF919C
:100E7000CF910895DF93CF930F92CDB7DEB7CE0118
:100E80000196DFDF882319F42FEF3FEF03C089813C
:100E9000282F30E0C9010F90CF91DF9108954FEFD7
:100EA00050E068E771E087EC92E0DDD940E450E083
:100EB00067E772E080ED92E0D6D90895F0DF1092F6
:100EC000B8021092B70288ED8AB960E875E280E056
:100ED00090E019DF8FEF8093C6021092CF0210923C
:100EE000D9021092D80278940895A0E2B0E0EAE71F
:100EF000F7E057C469837A838B839C832D833E8379
:100F00004F835887BE01675F7F4FCE01019656D34E
:100F1000BE016F5E7F4FCE01059650D3998592300A
:100F200088F089898230C8F0943019F4823051F405
:100F300004C0843029F4923081F480E690E0C6C089
:100F4000923049F420E09A858A89981321E02A8713
:100F5000CE010996BBC0823049F420E09A858A8987
:100F6000981321E02A8BCE014196B0C02D843E8497
:100F70004F8458886D887E888F88988CEE24FF2453
:100F80008701AA24BB24650140E050E060E070E0E6
:100F9000E0E0F0E0C10181709070892BE9F0E60C8F
:100FA000F71C081D191D9A01AB012A0D3B1D4C1D94
:100FB0005D1D80E090E0A0E0B0E0E614F7040805D5
:100FC000190520F481E090E0A0E0B0E0BA01A901A9
:100FD000480F591F6A1F7B1FAA0CBB1CCC1CDD1CB1
:100FE00097FE08C081E090E0A0E0B0E0A82AB92A0E
:100FF000CA2ADB2A3196E032F10549F0660C771CEB
:10100000881C991C5694479437942794C3CFFA852B
:10101000EA892B893C898B859C85280F391F2E5F97
:101020003F4F17C0CA0181709070892B61F01695EF
:101030000795F794E79480E090E0A0E0B0E8E82A14
:10104000F92A0A2B1B2B76956795579547952F5FA5
:101050003F4F77FDE7CF0CC0440F551F661F771F2A
:1010600017FD4160EE0CFF1C001F111F2150304086
:10107000403090E0590790E0690790E4790760F309
:101080002B8F3C8FDB01CA018F779070A070B070FE
:1010900080349105A105B10561F447FD0AC0E11452
:1010A000F1040105110529F0405C5F4F6F4F7F4F40
:1010B00040781A8EFE1711F081E08A8F4D8F5E8F77
:1010C0006F8F78A383E0898FCE014996A2D1A09635
:1010D000E2E183C3A8E1B0E0EFE6F8E06AC3698328
:1010E0007A838B839C832D833E834F835887B9E01B
:1010F000EB2EF12CEC0EFD1EB701CE0101965ED257
:101100008E010F5E1F4FB801CE01059657D229857B
:10111000223008F47CC03989323010F4B8017AC02A
:101120008A859A8989278A87243011F0223031F400
:10113000231709F06CC060E670E06CC0343039F4FD
:101140001D861E861F86188A1C861B8604C03230A8
:1011500021F484E08987B7015DC02B853C858B89AC
:101160009C89281B390B3C872B87ED84FE840F85D7
:101170001889AD88BE88CF88D88CEA14FB040C058A
:101180001D0540F4EE0CFF1C001F111F21503040C4
:101190003C872B8720E030E040E050E080E090E0AA
:1011A000A0E0B0E46FE170E0EA14FB040C051D055B
:1011B00040F0282B392B4A2B5B2BEA18FB080C0933
:1011C0001D09B695A79597958795EE0CFF1C001FF6
:1011D000111F6150704041F7DA01C9018F7790709B
:1011E000A070B07080349105A105B10561F427FDB0
:1011F0000AC0E114F1040105110529F0205C3F4FFC
:101200004F4F5F4F20782D873E874F87588BBE0109
:10121000675F7F4FCB01FDD06896EAE0E6C2A8E0A9
:10122000B0E0E4E1F9E0C6C29B01AC0183E0898350
:10123000DA01C9018827B7FD83959927AA27BB271B
:10124000B82E211531054105510519F482E0898335
:1012500039C08823A9F0203080E0380780E04807B3
:1012600080E8580729F460E070E080E09FEC2EC031
:10127000EE24FF248701E21AF30A040B150B02C0C7
:1012800079018A018EE1C82ED12CDC82CB82ED82DD
:10129000FE820F831887C801B7016CD0019718161A
:1012A000190684F4082E04C0EE0CFF1C001F111F49
:1012B0000A94D2F7ED82FE820F831887C81AD90AE2
:1012C000DC82CB82BA82CE010196A3D02896E9E0D7
:1012D0008DC2ACE0B0E0EEE6F9E073C269837A83D8
:1012E0008B839C83BE016B5F7F4FCE01019666D1DD
:1012F0008D81823061F1823050F1843021F48E8111
:10130000882351F12EC02F81388537FD20C06E8192
:101310002F3131051CF06623F9F023C08EE190E0F7
:10132000821B930B29853A854B855C8504C05695B5
:101330004795379527958A95D2F76623B1F0509552
:101340004095309521953F4F4F4F5F4F0EC020E0A5
:1013500030E040E050E009C02FEF3FEF4FEF5FE794
:1013600004C020E030E040E050E8B901CA012C960A
:10137000E2E043C2EF92FF920F931F937B018C0137
:1013800080E0E81680E0F80681E0080780E01807B2
:1013900088F48FEFE816F1040105110531F028F00B
:1013A00088E090E0A0E0B0E017C080E090E0A0E02E
:1013B000B0E012C080E0E81680E0F80680E00807A0
:1013C00081E0180728F088E190E0A0E0B0E004C0D8
:1013D00080E190E0A0E0B0E020E230E040E050E0CA
:1013E000281B390B4A0B5B0B04C016950795F79425
:1013F000E7948A95D2F7F701E859FF4F8081281BBF
:10140000310941095109C9011F910F91FF90EF90D6
:101410000895DF92EF92FF920F931F93FC01E480F7
:10142000F58006811781D1808081823048F480E088
:1014300090E0A0E1B0E0E82AF92A0A2B1B2BA5C016
:10144000843009F49FC0823021F4EE24FF24870108
:1014500005C0E114F1040105110519F4E0E0F0E024
:1014600096C0628173819FEF623879070CF05BC090
:1014700022E83FEF261B370B2A3131052CF020E004
:1014800030E040E050E02AC0B801A701022E04C0BD
:1014900076956795579547950A94D2F781E090E045
:1014A000A0E0B0E004C0880F991FAA1FBB1F2A95B7
:1014B000D2F70197A109B1098E219F21A023B12361
:1014C0000097A105B10521F081E090E0A0E0B0E037
:1014D0009A01AB01282B392B4A2B5B2BDA01C9016E
:1014E0008F779070A070B07080349105A105B10520
:1014F00039F427FF09C0205C3F4F4F4F5F4F04C0B6
:10150000215C3F4F4F4F5F4FE0E0F0E02030A0E024
:101510003A07A0E04A07A0E45A0710F0E1E0F0E043
:1015200079018A0127C06038710564F5FB01E15833
:10153000FF4FD801C7018F779070A070B0708034D2
:101540009105A105B10539F4E7FE0DC080E490E0F6
:10155000A0E0B0E004C08FE390E0A0E0B0E0E80ECF
:10156000F91E0A1F1B1F17FF05C016950795F79454
:10157000E794319687E016950795F794E7948A9556
:10158000D1F705C0EE24FF248701EFEFF0E06E2FC6
:10159000679566276795902F9F77D794DD24D7941A
:1015A0008E2F8695492F462B582F5D29B701CA01EA
:1015B0001F910F91FF90EF90DF900895FC01DB01E8
:1015C000408151812281622F6F7770E0221F222794
:1015D000221F9381892F880F822B282F30E0991F9B
:1015E0009927991FFD0191832115310581F5411539
:1015F00051056105710511F482E032C082E89FEF68
:10160000FD01938382839A01AB0167E0220F331FB0
:10161000441F551F6A95D1F783E08C930AC0220FAF
:10162000331F441F551FFD018281938101979383CE
:1016300082832030F0E03F07F0E04F07F0E45F07DF
:1016400070F3FD01248335834683578308952F3F2C
:10165000310581F4411551056105710519F484E0E6
:101660008C93089564FF03C081E08C9301C01C92A9
:10167000FD010FC02F573040FD013383228383E0EB
:101680008C9387E0440F551F661F771F8A95D1F70B
:10169000706444835583668377830895629FD00185
:1016A000739FF001829FE00DF11D649FE00DF11D1D
:1016B000929FF00D839FF00D749FF00D659FF00DCC
:1016C0009927729FB00DE11DF91F639FB00DE11DB9
:1016D000F91FBD01CF0111240895AA1BBB1B51E1C5
:1016E00007C0AA1FBB1FA617B70710F0A61BB70B92
:1016F000881F991F5A95A9F780959095BC01CD0137
:10170000089597FB092E07260AD077FD04D0E5DF60
:1017100006D000201AF4709561957F4F0895F6F772
:10172000909581959F4F0895A1E21A2EAA1BBB1B8D
:10173000FD010DC0AA1FBB1FEE1FFF1FA217B3079D
:10174000E407F50720F0A21BB30BE40BF50B661FB3
:10175000771F881F991F1A9469F760957095809577
:1017600090959B01AC01BD01CF01089597FB092E17
:1017700005260ED057FD04D0D7DF0AD0001C38F460
:1017800050954095309521953F4F4F4F5F4F0895AD
:10179000F6F790958095709561957F4F8F4F9F4F8D
:1017A00008952F923F924F925F926F927F928F9205
:1017B0009F92AF92BF92CF92DF92EF92FF920F93E0
:1017C0001F93CF93DF93CDB7DEB7CA1BDB0B0FB6EA
:1017D000F894DEBF0FBECDBF09942A8839884888A7
:1017E0005F846E847D848C849B84AA84B984C8843D
:1017F000DF80EE80FD800C811B81AA81B981CE0F34
:10180000D11D0FB6F894DEBF0FBECDBFED01089518
:1018100033D158F080E891E009F49EEF34D128F0FC
:1018200040E851E059F45EEF09C0FEC07DC1E92FE8
:10183000E07841D168F3092E052AC1F3261737074E
:101840004807590738F00E2E07F8E02569F0E02523
:10185000E0640AC0EF6307F8009407FADB01B901FE
:101860009D01DC01CA01AD01EF9341D013D10AD033
:101870005F91552331F02BED3FE049E450FD49ECF9
:10188000C6C10895DF93DD27B92FBF7740E85FE336
:101890001616170648075B0710F4D92F4CD19F93F3
:1018A0008F937F936F93AFD1E6E2F0E0C0D0F2D098
:1018B0002F913F914F915F914FD1DD2349F0905887
:1018C000A2EA2AED3FE049EC5FE3D0785D27B0D192
:1018D000DF91E0C0D8D040F0CFD030F021F45F3FAE
:1018E00019F071C0511121C19FC0E5D098F399231F
:1018F000C9F35523B1F3951B550BBB27AA276217D4
:101900007307840738F09F5F5F4F220F331F441F18
:10191000AA1FA9F333D00E2E3AF0E0E830D0915050
:101920005040E695001CCAF729D0FE2F27D0660F3D
:10193000771F881FBB1F261737074807AB07B0E87C
:1019400009F0BB0B802DBF01FF2793585F4F2AF092
:101950009E3F510568F037C0E8C05F3FECF3983E0A
:10196000DCF3869577956795B795F7959F5FC9F7EF
:10197000880F911D9695879597F90895E1E0660F78
:10198000771F881FBB1F621773078407BA0720F0F1
:10199000621B730B840BBA0BEE1F88F7E09508955A
:1019A000ACD080F09F3740F491110EF0BEC060E0E3
:1019B00070E080E89FEB089526F41B16611D711DF1
:1019C000811D07C021C097F99F6780E870E060E043
:1019D0000895882371F4772321F09850872B762F70
:1019E00007C0662311F499270DC09051862B70E033
:1019F00060E02AF09A95660F771F881FDAF7880F44
:101A00009695879597F908959F3F49F0915028F44E
:101A1000869577956795B7959F5F80389F4F880F1C
:101A20009695879597F908959FEF80EC0895DF9339
:101A3000CF931F930F93FF92EF92DF927B018C0164
:101A4000689405C0DA2EEF0187D0FE01E894A591D5
:101A50002591359145915591AEF3EF01E9D0FE0105
:101A60009701A801DA9479F7DF90EF90FF900F913A
:101A70001F91CF91DF91089500240A94161617063E
:101A800018060906089500240A941216130614066F
:101A900005060895092E0394000C11F4882352F0D2
:101AA000BB0F40F4BF2B11F460FF04C06F5F7F4F8A
:101AB0008F4F9F4F089557FD9058440F551F59F071
:101AC0005F3F71F04795880F97FB991F61F09F3F2B
:101AD00079F087950895121613061406551FF2CF54
:101AE0004695F1DF08C0161617061806991FF1CFA4
:101AF00086957105610508940895E5DFA0F0BEE7BD
:101B0000B91788F4BB279F3860F41616B11D672FEC
:101B1000782F8827985FF7CF869577956795B11DC1
:101B200093959639C8F30895E894BB2766277727DD
:101B3000CB0197F908959B01AC0160E070E080E86B
:101B40009FE3C8CA99DF28F09EDF18F0952309F0BB
:101B50003ACF6ACF1124E9CFAEDFA0F3959FD1F33E
:101B6000950F50E0551F629FF001729FBB27F00D4B
:101B7000B11D639FAA27F00DB11DAA1F649F6627A0
:101B8000B00DA11D661F829F2227B00DA11D621FEF
:101B9000739FB00DA11D621F839FA00D611D221FA9
:101BA000749F3327A00D611D231F849F600D211D8D
:101BB000822F762F6A2F11249F5750408AF0E1F030
:101BC00088234AF0EE0FFF1FBB1F661F771F881F79
:101BD00091505040A9F79E3F510570F0F4CEA5CF2B
:101BE0005F3FECF3983EDCF3869577956795B79564
:101BF000F795E7959F5FC1F7FE2B880F911D96958E
:101C0000879597F908959B01AC016FC95058BB2780
:101C1000AA270ED03FCF30DF30F035DF20F031F48F
:101C20009F3F11F41EF400CF0EF4E095E7FBCBCEFE
:101C3000E92F41DF80F3BA1762077307840795071E
:101C400018F071F49EF570CF0EF4E0950B2EBA2FBC
:101C5000A02D0B01B90190010C01CA01A0011124B2
:101C6000FF27591B99F0593F50F4503E68F11A165E
:101C7000F040A22F232F342F4427585FF3CF4695EF
:101C800037952795A795F0405395C9F77EF41F1611
:101C9000BA0B620B730B840BBAF09150A1F0FF0FDB
:101CA000BB1F661F771F881FC2F70EC0BA0F621FC7
:101CB000731F841F48F4879577956795B795F795B7
:101CC0009E3F08F0B3CF9395880F08F09927EE0F49
:0A1CD000979587950895F894FFCFCB
:101CDA0000000000000000000001020203030303E9
:101CEA0004040404040404040505050505050505A2
:101CFA000505050505050505060606060606060682
:101D0A000606060606060606060606060606060669
:101D1A000606060606060606070707070707070751
:101D2A000707070707070707070707070707070739
:101D3A000707070707070707070707070707070729
:101D4A000707070707070707070707070707070719
:101D5A000707070707070707080808080808080801
:101D6A0008080808080808080808080808080808E9
:101D7A0008080808080808080808080808080808D9
:101D8A0008080808080808080808080808080808C9
:101D9A0008080808080808080808080808080808B9
:101DAA0008080808080808080808080808080808A9
:101DBA000808080808080808080808080808080899
:101DCA000808080808080808080808080808080889
:081DDA000808080808080808C1
:100000000C947E000C949B000C949B000C949B0021
:100010000C949B000C949B000C949B000C949B00F4
:100020000C949B000C94B6070C940E070C94990743
:100030000C945F070C947C070C94F1060C94420717
:100040000C94AA060C949B000C948F080C949B00B3
:100050000C9463090C943E020C949B000C949B003E
:100060000C949B000C949B000C949B000C949B00A4
:100070000C949B000C949B000C9480080C949B00A7
:100080000C9454090C949B000C949B00084AD73B99
:100090003BCE016E84BCBFFDC12F3D6C74319ABD57
:1000A00056833DDA3D00C77F11BED9E4BB4C3E917B
:1000B0006BAAAABE000000803F66693A25642E251F
:1000C0006420202B2D2025642E2564200D0A00306D
:1000D00031323334353637383941424344454600AE
:1000E00000000100080040000001000400000100C1
:1000F00008002000400080000001000411241FBE01
:10010000CFEFD0E1DEBFCDBF12E0A0E0B1E0E8EF7D
:10011000F8E202C005900D92A830B107D9F713E0BC
:10012000A8E0B2E001C01D92A337B107E1F70E9439
:100130009D000C947A140C9400002F923F924F92E1
:100140005F926F927F928F929F92AF92BF92CF9267
:10015000DF92EF92FF920F931F93DF93CF93CDB770
:10016000DEB7C650D1400FB6F894DEBF0FBECDBF8C
:100170000E945B0A40E855E260E070E080E00E9487
:10018000DE078EE298E00E94F7020E94E8040E94D7
:10019000F6011ABA1BBA87E00E94090280E00E94A9
:1001A0000E02882499249E012F5F3E4FCB5FDE4FC5
:1001B00039832883C550D14037C080E00E94230294
:1001C0007C0181E00E942302A0E0B0E0BC01CD01EF
:1001D0000E94B90E20E030E84FEF53E40E94D50BA7
:1001E0005B016C0100E010E0C801B7010E94B90E8C
:1001F00020E030E84FEF53E40E94D50BA6019501B3
:100200000E94D611F401EE0FFF1FEE0FFF1F21E039
:1002100030E02C0F3D1FE20FF31F60837183828358
:1002200093830894811C911C30E48316910428F276
:100230006E010894C11CD11C460160E070E080E0B2
:1002400090E0F40121913191419151914F010E942F
:10025000060CCB5FDE4F28813981C550D140821614
:10026000930679F720E030E040E85CE30E94330C2D
:100270002BED3FE049E450E40E94060C20E030E022
:1002800044E353E40E94330C2BED3FE049E450E497
:100290000E942D0DCF5FDE4F688379838A839B8315
:1002A000C150D1400F2EF0E0EF2EF0E0FF2EF0E035
:1002B0000F2FF0E01F2FF02DCF5FDE4F2881398107
:1002C0004A815B81C150D140F60161917191819168
:1002D00091916F010E94D50B9B01AC010E94330CE0
:1002E0009B01AC01C801B7010E94060C7B018C0187
:1002F000C814D90409F720E030E04CE752E40E942A
:100300002D0D0E94C61320E030E040E05EE30E9425
:10031000330C7B018C010E948F120E94650E1B0121
:100320002C01B101882777FD8095982F0E94070E38
:100330009B01AC01C801B7010E94D50B20E030E061
:100340004AE754E40E94330C0E948F123B014C0197
:10035000CF5FDE4F688179818A819B81C150D14016
:100360000E948F120E94650E5B016C01B501882707
:1003700077FD8095982F0E94070E9B01AC01CF5FFF
:10038000DE4F688179818A819B81C150D1400E9472
:10039000D50B20E030E04AE754E40E94330C0E9481
:1003A0008F127B018C01C401B3010E94600A7F930C
:1003B0006F933F922F92C801B7010E94600A7F930A
:1003C0006F93BF92AF9229EB30E03F932F9381E080
:1003D0008F930E945304882499248DB79EB70B965F
:1003E0000FB6F8949EBF0FBE8DBF1ECF379A3598BB
:1003F00086B1887F866086B987B18F73806487B93C
:100400003D98339A10923E03789408953398379824
:10041000089596B1987F982B96B9089597B18295D3
:10042000880F880F807C9F73982B97B9089597B198
:100430008F71907E892B87B90895349A369A0895E2
:1004400086B18074089510923E0397B18F71907EAB
:10045000892B87B9349A369A3699FECF24B145B1A3
:10046000942F80E030E0282B392BC90108950E9499
:100470002302969587959695879508951F920F92DA
:100480000FB60F9211248F938FEF80933E038F91BD
:100490000F900FBE0F901F901895FC018FB7F89426
:1004A000718360835383428317821682158214827C
:1004B0008FBF0895CF93DF93DC014FB7F894EC0121
:1004C0008C819D81892B11F4E0E01CC0FD018681A7
:1004D0009781ED91FC911197E80FF91FE08101964A
:1004E000ED019F838E832A813B818217930720F041
:1004F000821B930B9F838E83ED018C819D810197DD
:100500009D838C834FBF8E2FDF91CF910895FC0187
:100510004FB7F8948481958168177907B0F4868184
:100520009781860F971F9783868322813381821755
:10053000930720F0821B930B978386838481958198
:10054000861B970B9583848302C0158214824FBF4C
:100550000895FC01CB012FB7F8942FBF2681378176
:1005600062817381820F931F0E943F110190F0817D
:10057000E02DE80FF91F808108951F93CF93DF933B
:10058000EC01162F4FB7F8942C813D816A817B8155
:100590002617370798F48E819F81820F931F0E9440
:1005A0003F11E881F981E80FF91F10838C819D814B
:1005B00001969D838C834FBF8FEF02C04FBF80E0B9
:1005C000DF91CF911F910895FC018FB7F8948FBFF1
:1005D0002281338184819581281B390BC9010895BB
:1005E000FC018FB7F894158214828FBF0895909301
:1005F00009028093080208951F93182F8A3031F45E
:10060000E0910802F09109028DE00995E09108025D
:10061000F0910902812F09951F910895CF93DF93DF
:10062000EC01009721F406C021960E94FC0288810B
:100630008823D1F7DF91CF910895EF92FF920F9326
:100640001F93CF93DF938C017A010097E9F020E0AC
:1006500030E02617370738F4F80181918F012F5FBA
:100660003F4F8823B1F7C0E0D0E00BC0F801808194
:10067000882319F00F5F1F4F01C080E20E94FC0227
:100680002196CE15DF0590F3DF91CF911F910F9149
:10069000FF90EF900895CF93DF93EC01009719F44A
:1006A00007C00E94FC02FE01219684918823C9F7AD
:1006B000DF91CF9108958AE00E94FC020895E82F0F
:1006C000F0E0EF70F070E153FF4FE4918E2F0E9445
:1006D000FC0208951F93182F82958F700E945F036C
:1006E000812F0E945F031F9108951F93182F892F58
:1006F0000E946A03812F0E946A031F910895EF925E
:10070000FF920F931F937B018C01C801AA27BB277F
:100710000E947503C7010E9475031F910F91FF90FE
:10072000EF9008952F923F924F925F926F927F9237
:100730008F929F92AF92BF92CF92DF92EF92FF92F1
:100740000F931F93DF93CF93CDB7DEB7A3970FB669
:10075000F894DEBF0FBECDBF4AA32BA337014801DB
:10076000442351F017FF08C0EE24FF248701E61848
:10077000F7080809190902C084017301262E262FE3
:10078000215090E03AA1311191E0291B29A318A230
:10079000A82EBB24A7FCB094CB2CDB2CC801B7013E
:1007A000A60195010E945311FB01EF70F070E15317
:1007B000FF4F64916F8FC801B701A60195010E9498
:1007C0005311C901DA017C018D019EE1492E512CA2
:1007D0004C0E5D1E39A025C0E114F1040105110580
:1007E000C9F0C801B701A60195010E945311FB0190
:1007F000EF70F070E153FF4F6491F2016083C80124
:10080000B701A60195010E945311C901DA017C01CB
:100810008D0103C02BA1F20120833A940894410872
:1008200051083320C9F6CE014F968C0139A1031B24
:1008300011098AA18823E1F097FE05C08DE2F80135
:1008400082938F0115C0C80101976114710481045E
:10085000910419F08C018BE202C08C0180E2F80156
:10086000808306C0F80181918F010E94FC022A94C6
:100870002220C1F7A3960FB6F894DEBF0FBECDBFFE
:10088000CF91DF911F910F91FF90EF90DF90CF906C
:10089000BF90AF909F908F907F906F905F904F90A0
:1008A0003F902F9008957F928F929F92AF92BF9228
:1008B000CF92DF92EF92FF920F931F93DF93CF932C
:1008C000CDB7DEB77888C988DA8853E1E52EF12CF8
:1008D000EC0EFD1E14C0882381F480E090E0CF91DF
:1008E000DF911F910F91FF90EF90DF90CF90BF901D
:1008F000AF909F908F907F9008950E94FC02960188
:100900002F5F3F4F772021F0F6016901849103C0EA
:10091000F601808169018532F1F62F5F3F4F772024
:1009200021F0F6016901849103C0F601808169011B
:10093000843629F0883781F08336F9F606C000E165
:1009400017E24AE0A42EB12C0CC0F701808122E00E
:1009500030E0E20EF31ED1CF00E010E130E1A32E33
:10096000B12C22E0822E912C8E0C9F1CF701E0808E
:10097000F1808436B1F4F7FE11C0F094E194F108EF
:10098000F3948DE20E94FC0209C0C8016AE070E0A5
:100990000E943F118B016230710518F0E016F106DC
:1009A000A0F3C701B8010E943F11862F0E945F0388
:1009B000C701B8010E943F117C01C801B5010E9426
:1009C0003F118B016115710561F7740198CF08958E
:1009D00080E090E0FC01EE0FFF1FE65FFD4F11820B
:1009E0001082019688309105A9F783B7887F8260CD
:1009F00083BF12BE87B7816087BF10923F031092FA
:100A0000400310924103109242038EB5887F8360A9
:100A10008EBD1DBC1CBC87B7846087BF85B5887F31
:100A2000846085BD14BC87B7806487BF109247037C
:100A3000109248031092490310924A037894089543
:100A400083B7887F826083BF12BE87B7816087BF0C
:100A500010923F0310924003109241031092420300
:100A600008958EB5887F83608EBD1DBC1CBC87B782
:100A7000846087BF089585B5887F846085BD14BC78
:100A800087B7806487BF1092470310924803109283
:100A9000490310924A03089593B7987F982B93BF08
:100AA00008959EB5987F982B9EBD089595B5987F23
:100AB000982B95BD089583B7E82FF0E0E770F070AC
:100AC000EE0FFF1FE052FF4F25913491C9010895A9
:100AD0008EB5E82FF0E0E770F070EE0FFF1FE052E8
:100AE000FF4F25913491C901089585B5E82FF0E0B5
:100AF000E770F070EE0FFF1FE451FF4F2591349126
:100B0000C9010895883040F4E82FF0E0EE0FFF1F90
:100B1000E65FFD4F718360830895883040F4E82FCD
:100B2000F0E0EE0FFF1FE65FFD4F11821082089587
:100B3000EF92FF920F931F93CF93DF93EC0112B7C5
:100B400010924303109244031092450310924603FF
:100B500083B7E82FF0E0E770F070EE0FFF1FE05270
:100B6000FF4F2591349140E050E060E072E18AE768
:100B700090E00E947511B901CA01693B2DE8720726
:100B800026E0820720E09207A0F437E2C131D307C4
:100B900080F49E0140E050E00E94201128EE33E0F6
:100BA00040E050E00E945311C901DA01BC01CD01BF
:100BB00021C028EE33E040E050E00E945311CA010A
:100BC000B9019E0140E050E00E94201113C08091C5
:100BD000430390914403A0914503B091460385B728
:100BE000837E85BF85B7806285BF889585B78F7DF9
:100BF00085BF08C09B01AC01210F311D411D511D56
:100C000079018A01209143033091440340914503C7
:100C10005091460382B790E0A0E0B0E0542F432FFC
:100C2000322F2227822B932BA42BB52B8E159F05B9
:100C3000A007B10760F2DF91CF911F910F91FF9054
:100C4000EF90089510923F031092400310924103D9
:100C500010924203089520913F0330914003409148
:100C6000410350914203B901CA010895109247030C
:100C7000109248031092490310924A03089520915C
:100C80004703309148034091490350914A03B90109
:100C9000CA010895893031F48FB582608FBD8FB558
:100CA0008E7F0AC08A3019F48FB5826002C08FB57A
:100CB0008D7F8FBD8FB581608FBD1BBC1ABC19BCE9
:100CC00018BC08952FB52E7F2FBD2FB522602FBDE4
:100CD0002EB528602EBD2EB520612EBD97BD86BDD8
:100CE0001BBC1ABC19BC18BC08958FB58D7F8FBD75
:100CF0008FB58E7F8FBD8FB58F778FBD8FB58F7B73
:100D00008FBD8FB58F7D8FBD8FB58F7E8FBD0895C1
:100D10008FB580688FBD8FB58F7B8FBD08958FB5E0
:100D200080628FBD8FB58F7E8FBD08958FB58F7711
:100D30008FBD8FB58F7B8FBD08958FB58F7D8FBD94
:100D40008FB58F7E8FBD08959BBD8ABD089599BDD7
:100D500088BD08951F920F920FB60F9211248F93A2
:100D60009F93AF93BF93EF93FF9380913F03909135
:100D70004003A0914103B09142030196A11DB11D12
:100D800080933F0390934003A0934103B0934203A9
:100D90008091430390914403A0914503B091460391
:100DA0000196A11DB11D8093430390934403A0932A
:100DB0004503B093460380910A0290910B02892B60
:100DC00029F0E0910A02F0910B020995FF91EF9151
:100DD000BF91AF919F918F910F900FBE0F901F9079
:100DE00018951F920F920FB60F9211248F939F9315
:100DF000EF93FF9380910C0290910D02892B29F0C3
:100E0000E0910C02F0910D020995FF91EF919F91F5
:100E10008F910F900FBE0F901F9018951F920F92F9
:100E20000FB60F9211248F939F93AF93BF93EF93BD
:100E3000FF938091470390914803A0914903B0919B
:100E40004A030196A11DB11D809347039093480367
:100E5000A0934903B0934A03809114029091150224
:100E6000892B29F0E0911402F09115020995FF9168
:100E7000EF91BF91AF919F918F910F900FBE0F9007
:100E80001F9018951F920F920FB60F9211248F93F7
:100E90009F93EF93FF938091180290911902892BF1
:100EA00029F0E0911802F09119020995FF91EF9154
:100EB0009F918F910F900FBE0F901F9018951F92CA
:100EC0000F920FB60F9211248F939F93EF93FF937E
:100ED00080910E0290910F02892B29F0E0910E0271
:100EE000F0910F020995FF91EF919F918F910F90D3
:100EF0000FBE0F901F9018951F920F920FB60F9272
:100F000011248F939F93EF93FF9380911002909100
:100F10001102892B29F0E0911002F091110209953C
:100F2000FF91EF919F918F910F900FBE0F901F90A7
:100F300018951F920F920FB60F9211248F939F93C3
:100F4000EF93FF938091120290911302892B29F065
:100F5000E0911202F09113020995FF91EF919F9198
:100F60008F910F900FBE0F901F9018951F920F92A8
:100F70000FB60F9211248F939F93EF93FF9380915D
:100F8000160290911702892B29F0E0911602F09138
:100F900017020995FF91EF919F918F910F900FBECE
:100FA0000F901F901895823040F4E82FF0E0EE0F7C
:100FB000FF1FE65CFC4F7183608308951F93182F19
:100FC0009A01AB01CA01B901605C7D4B804F9F4F14
:100FD000F3E0660F771F881F991FFA95D1F7E4E0B9
:100FE000220F331F441F551FEA95D1F70E9453115A
:100FF00021503040112329F020939900309398001C
:1010000003C029B9309390001F910895282F30E034
:10101000A3E0220F331FAA95E1F7235B3C4FC901E0
:101020000895282F30E0B3E0220F331FBA95E1F77F
:10103000215A3C4FC9010895E82F882339F0809147
:101040009B0085FFFCCF60939C0003C05D9BFECF9F
:101050006CB9F0E0E55BFC4F108208955D9BFECF1C
:101060008CB910924B030895982F80919B0085FFB7
:10107000FCCF90939C0010924C03089520E0E82F41
:10108000F0E083E0EE0FFF1F8A95E1F7EF5AFC4F87
:1010900080819181892B09F421E0822F0895CF93DB
:1010A000DF93882319F060919C0001C06CB1282F58
:1010B00030E0E901CC0FDD1FFE01E65CFC4F8081D2
:1010C0009181892B31F00190F081E02D862F0995D7
:1010D00014C093E0220F331F9A95E1F7C901835B97
:1010E0009C4F0E94BD02882341F4FE01E159FC4F50
:1010F00080819181019691838083DF91CF910895C2
:101100001F920F920FB60F9211248F9381E00E94CD
:101110004F088F910F900FBE0F901F9018951F9240
:101120000F920FB60F9211248F9380E00E944F0808
:101130008F910F900FBE0F901F9018958F929F92D6
:10114000AF92BF92CF92DF92EF92FF920F931F93D5
:10115000CF93DF93882EDB01E82EFF24F70113E005
:10116000EE0FFF1F1A95E1F7ED59FC4F20813181F9
:10117000240F351FF70173E0EE0FFF1F7A95E1F79B
:10118000EF59FC4F8081918128173907D0F541151F
:101190005105B9F19C90670163E0CC0CDD1C6A95A8
:1011A000E1F78FE593E0C80ED91E8D01C0E0D0E0D5
:1011B0005A010894A108B10806C0F8016081C6016F
:1011C0000E94BD0221960F5F1F4FCA15DB05A8F3D1
:1011D000F701E35AFC4F8FEF8083882039F080912C
:1011E0009B0085FFFCCF90929C0003C05D9BFECFCF
:1011F0009CB88BE493E0E80EF91EF70110828FEFA4
:1012000001C080E0DF91CF911F910F91FF90EF908F
:10121000DF90CF90BF90AF909F908F90089590E017
:1012200023E0880F991F2A95E1F7815A9C4F0E946D
:10123000BD020895682F87E693E00E94BD020895DD
:10124000682F8FE593E00E94BD020895CF93DF934E
:10125000282FA82FB0E0ED01C35ADC4F88818823E6
:10126000E1F0FD0133E0EE0FFF1F3A95E1F7ED5994
:10127000FC4F80819181892B79F0222339F087E618
:1012800093E00E945A0280939C000BC08FE593E08C
:101290000E945A028CB905C01882A55BBC4F8FEF23
:1012A0008C93DF91CF9108951F920F920FB60F92FA
:1012B00011248F9381E00E9426098F910F900FBE19
:1012C0000F901F9018951F920F920FB60F92112436
:1012D0008F9380E00E9426098F910F900FBE0F9090
:1012E0001F9018951F93CF93DF93182FC82FD0E02E
:1012F000FE01E35AFC4F8FEF8083CE0143E0880F5D
:10130000991F4A95E1F7815A9C4F0E945A02982FE3
:10131000112339F080919B0085FFFCCF90939C00B6
:1013200003C05D9BFECF9CB9C55BDC4F1882DF918B
:10133000CF911F910895CF93DF93EB01282F30E0D9
:10134000F90173E0EE0FFF1F7A95E1F7E15BFC4FC7
:1013500080819181892BC9F0F90163E0EE0FFF1FB5
:101360006A95E1F7EF5AFC4F80819181892B69F0F2
:1013700053E0220F331F5A95E1F7C901835B9C4F5D
:101380000E945A0288838FEF01C080E0DF91CF91E5
:101390000895DF93CF930F92CDB7DEB7BE016F5F95
:1013A0007F4F81E00E949B09882319F42FEF3FEFC4
:1013B00003C08981282F30E0C9010F90CF91DF91C0
:1013C0000895DF93CF930F92CDB7DEB7BE016F5F65
:1013D0007F4F80E00E949B09882319F42FEF3FEF95
:1013E00003C08981282F30E0C9010F90CF91DF9190
:1013F000089590E0E3E0880F991FEA95E1F7835B99
:101400009C4F0E94F002089540E850E06AEA72E0C2
:1014100085E593E00E944D0240E150E06AE273E00E
:1014200087E693E00E944D0208950E94040A1092FC
:101430003D0310923C0388ED80939A0040E855E20A
:1014400060E070E081E00E94DE078FEF80934C0344
:1014500010925E03109272031092710378940895B3
:1014600040E850E06AE172E08DE493E00E944D02B2
:1014700040E150E06AE972E08FE593E00E944D029E
:1014800008950E94300A10923B0310923A0388EDAF
:101490008AB940E855E260E070E080E00E94DE0733
:1014A0008FEF80934B0310925D03109270031092A4
:1014B0006F03789408950E94410A0E94150A0895C6
:1014C000EF92FF920F931F937B018C0120E030E09D
:1014D00040E05FE40E94D70D88238CF020E030E0EC
:1014E00040E05FE4C801B7010E94D50B0E94650E81
:1014F0009B01AC01205030404040504806C0C8011C
:10150000B7010E94650E9B01AC01B901CA011F9190
:101510000F91FF90EF900895A0E0B0E0E2E9FAE0CB
:101520000C949011DC012B01FA019C91923008F48B
:1015300036C1EB018881823008F430C1943061F407
:10154000843009F02CC1FD0191818981981709F43B
:1015500026C1A0E0B1E023C1843009F41FC182306C
:10156000A9F4923009F01BC19A01AD0188E0EA01AB
:101570000990AE01E90109929E018150C1F7E20193
:101580008981ED0199818923818306C1923009F413
:1015900005C1ED012A803B80EB018A819B81ED0131
:1015A000AC80BD80CE80DF80EB01EC80FD800E81C1
:1015B0001F819101281B390BB90137FF04C0662731
:1015C0007727621B730B603271050CF061C0121635
:1015D00013066CF537014801062E04C096948794D3
:1015E000779467940A94D2F721E030E040E050E02D
:1015F00004C0220F331F441F551F6A95D2F7215094
:101600003040404050402E213F214023512321159E
:1016100031054105510521F021E030E040E050E086
:1016200079018A01E628F728082919293CC0232BCB
:10163000D1F1260E371E35014601062E04C09694C0
:101640008794779467940A94D2F721E030E040E0E1
:1016500050E004C0220F331F441F551F6A95D2F774
:1016600021503040404050402A213B214C215D21F7
:10167000211531054105510521F021E030E040E020
:1016800050E059016A01A628B728C828D9280BC0FC
:10169000821593052CF01C01AA24BB24650103C00C
:1016A000EE24FF248701ED019981E20189819817D9
:1016B00009F445C0992339F0A80197012A193B097B
:1016C0004C095D0906C0A60195012E193F09400B82
:1016D000510B57FD08C01182338222822483358347
:1016E000468357831DC081E081833382228288270D
:1016F0009927DC01821B930BA40BB50B8483958384
:10170000A683B7830DC0220F331F441F551F2483A8
:1017100035834683578382819381019793838283A4
:101720002481358146815781DA01C9010197A109D8
:10173000B1098F5F9F4FAF4FBF4328F30BC0918319
:1017400033822282EA0CFB1C0C1D1D1DE482F582F3
:101750000683178383E08083248135814681578106
:1017600057FF1AC0C901AA2797FDA095BA2F81700B
:101770009070A070B0705695479537952795822B3D
:10178000932BA42BB52B84839583A683B783828167
:101790009381019693838283DF0101C0D201CD0141
:1017A000CDB7DEB7E2E10C94AC11A0E2B0E0EBED16
:1017B000FBE00C949C1169837A838B839C832D833B
:1017C0003E834F835887E9E0EE2EF12CEC0EFD1E90
:1017D000B701CE0101960E9456108E010F5E1F4F79
:1017E000B801CE0105960E9456108A8991E089279A
:1017F0008A8BAE01475E5F4FB801C7010E948C0A19
:101800000E94810FA096E6E00C94B811A0E2B0E02F
:10181000ECE0FCE00C949C1169837A838B839C83BD
:101820002D833E834F835887F9E0EF2EF12CEC0E89
:10183000FD1EB701CE0101960E9456108E010F5E6B
:101840001F4FB801CE0105960E945610AE01475EAB
:101850005F4FB801C7010E948C0A0E94810FA096B9
:10186000E6E00C94B811A0E2B0E0E9E3FCE00C94EF
:10187000901169837A838B839C832D833E834F836E
:101880005887BE01675F7F4FCE0101960E945610B8
:10189000BE016F5E7F4FCE0105960E94561099855E
:1018A000923088F089898230C8F0943019F48230FF
:1018B00051F404C0843029F4923081F480E091E046
:1018C000C6C0923049F420E09A858A89981321E0B5
:1018D0002A87CE010996BBC0823049F420E09A8560
:1018E0008A89981321E02A8BCE014196B0C02D84BD
:1018F0003E844F8458886D887E888F88988CEE242B
:10190000FF248701AA24BB24650140E050E060E089
:1019100070E0E0E0F0E0C10181709070892BE9F0A7
:10192000E60CF71C081D191D9A01AB012A0D3B1D81
:101930004C1D5D1D80E090E0A0E0B0E0E614F704EF
:101940000805190520F481E090E0A0E0B0E0BA01BC
:10195000A901480F591F6A1F7B1FAA0CBB1CCC1C76
:10196000DD1C97FE08C081E090E0A0E0B0E0A82A6E
:10197000B92ACA2ADB2A3196E032F10549F0660C11
:10198000771C881C991C5694479437942794C3CF8E
:10199000FA85EA892B893C898B859C85280F391F1C
:1019A0002E5F3F4F17C0CA0181709070892B61F084
:1019B00016950795F794E79480E090E0A0E0B0E8F2
:1019C000E82AF92A0A2B1B2B769567955795479598
:1019D0002F5F3F4F77FDE7CF0CC0440F551F661FA9
:1019E000771F17FD4160EE0CFF1C001F111F2150D7
:1019F0003040403090E0590790E0690790E4790763
:101A000060F32B8F3C8FDB01CA018F779070A07041
:101A1000B07080349105A105B10561F447FD0AC09D
:101A2000E114F1040105110529F0405C5F4F6F4F8F
:101A30007F4F40781A8EFE1711F081E08A8F4D8F0C
:101A40005E8F6F8F78A383E0898FCE0149960E94C5
:101A5000810FA096E2E10C94AC11A8E1B0E0E3E3C1
:101A6000FDE00C94981169837A838B839C832D838A
:101A70003E834F835887B9E0EB2EF12CEC0EFD1E10
:101A8000B701CE0101960E9456108E010F5E1F4FC6
:101A9000B801CE0105960E9456102985223008F41F
:101AA0007CC03989323010F4B8017AC08A859A89AD
:101AB00089278A87243011F0223031F4231709F066
:101AC0006CC060E071E06CC0343039F41D861E8655
:101AD0001F86188A1C861B8604C0323021F484E0DD
:101AE0008987B7015DC02B853C858B899C89281B24
:101AF000390B3C872B87ED84FE840F851889AD88D0
:101B0000BE88CF88D88CEA14FB040C051D0540F470
:101B1000EE0CFF1C001F111F215030403C872B870B
:101B200020E030E040E050E080E090E0A0E0B0E471
:101B30006FE170E0EA14FB040C051D0540F0282B52
:101B4000392B4A2B5B2BEA18FB080C091D09B695AB
:101B5000A79597958795EE0CFF1C001F111F6150EC
:101B6000704041F7DA01C9018F779070A070B070B2
:101B700080349105A105B10561F427FD0AC0E11487
:101B8000F1040105110529F0205C3F4F4F4F5F4FD5
:101B900020782D873E874F87588BBE01675F7F4F28
:101BA000CB010E94810F6896EAE00C94B411A8E181
:101BB000B0E0EDEDFDE00C949C1169837A838B839A
:101BC0009C832D833E834F83588789E0E82EF12C38
:101BD000EC0EFD1EB701CE0101960E9456108E013B
:101BE0000F5E1F4FB801CE0105960E9456108985E1
:101BF000823040F08989823028F0B801C7010E9404
:101C0000C61001C08FEF6896E6E00C94B811A8E00A
:101C1000B0E0EDE0FEE00C9499119B01AC0183E093
:101C20008983DA01C9018827B7FD83959927AA27F7
:101C3000BB27B82E211531054105510519F482E065
:101C400089833AC08823A9F0203080E0380780E0FB
:101C5000480780E8580729F460E070E080E09FECD6
:101C600030C0EE24FF248701E21AF30A040B150B9F
:101C700002C079018A018EE1C82ED12CDC82CB8290
:101C8000ED82FE820F831887C801B7010E94320FD0
:101C900001971816190684F4082E04C0EE0CFF1CD8
:101CA000001F111F0A94D2F7ED82FE820F8318875E
:101CB000C81AD90ADC82CB82BA82CE0101960E9470
:101CC000810F2896E9E00C94B511ACE0B0E0EBE6AA
:101CD000FEE00C94A01169837A838B839C83BE0100
:101CE0006B5F7F4FCE0101960E9456108D8182302E
:101CF00061F1823050F1843021F48E81882351F1DA
:101D00002EC02F81388537FD20C06E812F313105DF
:101D10001CF06623F9F023C08EE190E0821B930B48
:101D200029853A854B855C8504C05695479537953E
:101D300027958A95D2F76623B1F050954095309556
:101D400021953F4F4F4F5F4F0EC020E030E040E005
:101D500050E009C02FEF3FEF4FEF5FE704C020E0F6
:101D600030E040E050E8B901CA012C96E2E00C9462
:101D7000BC11A8E0B0E0EFEBFEE00C949A117B01FF
:101D80008C01611571058105910519F482E0898343
:101D900060C083E089838EE1C82ED12CDC82CB82A7
:101DA000ED82FE820F831887C801B7010E94320FAF
:101DB000BC016150704077FF39C0EE27FF27E61B5A
:101DC000F70B20E030E040E050E081E090E0A0E060
:101DD000B0E00E2E04C0880F991FAA1FBB1F0A94E3
:101DE000D2F70197A109B1098E219F21A023B12328
:101DF0000097A105B10521F021E030E040E050E07E
:101E000004C016950795F794E794EA95D2F72E2922
:101E10003F29402B512B2D833E834F8358878EE1E2
:101E200090E0861B970B9C838B8313C06115710513
:101E300081F0062E04C0EE0CFF1C001F111F0A9437
:101E4000D2F7ED82FE820F831887C61AD70ADC828A
:101E5000CB821A82CE0101960E94810F2896E8E07B
:101E60000C94B611EF92FF920F931F937B018C019C
:101E700080E0E81680E0F80681E0080780E01807B7
:101E800088F48FEFE816F1040105110531F028F010
:101E900088E090E0A0E0B0E017C080E090E0A0E033
:101EA000B0E012C080E0E81680E0F80680E00807A5
:101EB00081E0180728F088E190E0A0E0B0E004C0DD
:101EC00080E190E0A0E0B0E020E230E040E050E0CF
:101ED000281B390B4A0B5B0B04C016950795F7942A
:101EE000E7948A95D2F7F701E85FFE4F8081281BBF
:101EF000310941095109C9011F910F91FF90EF90DC
:101F00000895DF92EF92FF920F931F93FC01E480FC
:101F1000F58006811781D1808081823048F480E08D
:101F200090E0A0E1B0E0E82AF92A0A2B1B2BA5C01B
:101F3000843009F49FC0823021F4EE24FF2487010D
:101F400005C0E114F1040105110519F4E0E0F0E029
:101F500096C0628173819FEF623879070CF05BC095
:101F600022E83FEF261B370B2A3131052CF020E009
:101F700030E040E050E02AC0B801A701022E04C0C2
:101F800076956795579547950A94D2F781E090E04A
:101F9000A0E0B0E004C0880F991FAA1FBB1F2A95BC
:101FA000D2F70197A109B1098E219F21A023B12366
:101FB0000097A105B10521F081E090E0A0E0B0E03C
:101FC0009A01AB01282B392B4A2B5B2BDA01C90173
:101FD0008F779070A070B07080349105A105B10525
:101FE00039F427FF09C0205C3F4F4F4F5F4F04C0BB
:101FF000215C3F4F4F4F5F4FE0E0F0E02030A0E02A
:102000003A07A0E04A07A0E45A0710F0E1E0F0E048
:1020100079018A0127C06038710564F5FB01E15838
:10202000FF4FD801C7018F779070A070B0708034D7
:102030009105A105B10539F4E7FE0DC080E490E0FB
:10204000A0E0B0E004C08FE390E0A0E0B0E0E80ED4
:10205000F91E0A1F1B1F17FF05C016950795F79459
:10206000E794319687E016950795F794E7948A955B
:10207000D1F705C0EE24FF248701EFEFF0E06E2FCB
:10208000679566276795902F9F77D794DD24D7941F
:102090008E2F8695492F462B582F5D29B701CA01EF
:1020A0001F910F91FF90EF90DF900895FC01DB01ED
:1020B000408151812281622F6F7770E0221F222799
:1020C000221F9381892F880F822B282F30E0991FA0
:1020D0009927991FFD0191832115310581F541153E
:1020E00051056105710511F482E032C082E89FEF6D
:1020F000FD01938382839A01AB0167E0220F331FB6
:10210000441F551F6A95D1F783E08C930AC0220FB4
:10211000331F441F551FFD018281938101979383D3
:1021200082832030F0E03F07F0E04F07F0E45F07E4
:1021300070F3FD01248335834683578308952F3F31
:10214000310581F4411551056105710519F484E0EB
:102150008C93089564FF03C081E08C9301C01C92AE
:10216000FD010FC02F573040FD013383228383E0F0
:102170008C9387E0440F551F661F771F8A95D1F710
:102180007064448355836683778308951F93CF9348
:10219000DF93DC01FB019C91923008F444C0808104
:1021A000823008F440C0943051F4ED01198184303C
:1021B00081F58181682F70E0611B71093CC084301A
:1021C00021F0923031F48230A1F18181882371F1C4
:1021D0002AC0ED0119818230E1F081811817C9F41C
:1021E000ED012A813B8182819381821793078CF0D4
:1021F00028173907B4F0ED018C819D81AE81BF8134
:102200002481358146815781281739074A075B07A2
:1022100018F4112341F00AC082179307A407B507E9
:1022200040F4112319F061E070E005C06FEF7FEF1B
:1022300002C060E070E0CB01DF91CF911F91089563
:10224000629FD001739FF001829FE00DF11D649F9A
:10225000E00DF11D929FF00D839FF00D749FF00D26
:10226000659FF00D9927729FB00DE11DF91F639FC7
:10227000B00DE11DF91FBD01CF0111240895AA1B66
:10228000BB1B51E107C0AA1FBB1FA617B70710F061
:10229000A61BB70B881F991F5A95A9F78095909593
:1022A000BC01CD010895A1E21A2EAA1BBB1BFD01A2
:1022B0000DC0AA1FBB1FEE1FFF1FA217B307E40725
:1022C000F50720F0A21BB30BE40BF50B661F771F7D
:1022D000881F991F1A9469F760957095809590955D
:1022E0009B01AC01BD01CF01089597FB092E052686
:1022F0000ED057FD04D0D7DF0AD0001C38F450951B
:102300004095309521953F4F4F4F5F4F0895F6F719
:1023100090958095709561957F4F8F4F9F4F089551
:102320002F923F924F925F926F927F928F929F92E5
:10233000AF92BF92CF92DF92EF92FF920F931F93D3
:10234000CF93DF93CDB7DEB7CA1BDB0B0FB6F89484
:10235000DEBF0FBECDBF09942A88398848885F84C4
:102360006E847D848C849B84AA84B984C884DF8035
:10237000EE80FD800C811B81AA81B981CE0FD11D19
:102380000FB6F894DEBF0FBECDBFED01089533D177
:1023900058F080E891E009F49EEF34D128F040E84D
:1023A00051E059F45EEF09C0FEC07DC1E92FE0782D
:1023B00041D168F3092E052AC1F3261737074807CC
:1023C000590738F00E2E07F8E02569F0E025E064A3
:1023D0000AC0EF6307F8009407FADB01B9019D0119
:1023E000DC01CA01AD01EF9341D013D10AD05F9156
:1023F000552331F02BED3FE049E450FD49EC06CA8E
:102400000895DF93DD27B92FBF7740E85FE3161605
:10241000170648075B0710F4D92F4CD19F938F9371
:102420007F936F93FDD1ECE8F0E0C0D0F2D02F9114
:102430003F914F915F914FD1DD2349F09058A2EA2F
:102440002AED3FE049EC5FE3D0785D27F9D1DF91D9
:10245000E0C0D8D040F0CFD030F021F45F3F19F089
:1024600071C0511121C19FC0E5D098F39923C9F3E0
:102470005523B1F3951B550BBB27AA27621773078A
:10248000840738F09F5F5F4F220F331F441FAA1F3E
:10249000A9F333D00E2E3AF0E0E830D091505040FE
:1024A000E695001CCAF729D0FE2F27D0660F771FAC
:1024B000881FBB1F261737074807AB07B0E809F08E
:1024C000BB0B802DBF01FF2793585F4F2AF09E3F23
:1024D000510568F037C0E8C05F3FECF3983EDCF38D
:1024E000869577956795B795F7959F5FC9F7880F9C
:1024F000911D9695879597F90895E1E0660F771FEE
:10250000881FBB1F621773078407BA0720F0621B7E
:10251000730B840BBA0BEE1F88F7E0950895ACD0CF
:1025200080F09F3740F491110EF0BEC060E070E083
:1025300080E89FEB089526F41B16611D711D811D17
:1025400007C021C097F99F6780E870E060E00895B8
:10255000882371F4772321F09850872B762F07C0BA
:10256000662311F499270DC09051862B70E060E02E
:102570002AF09A95660F771F881FDAF7880F9695CD
:10258000879597F908959F3F49F0915028F48695D3
:1025900077956795B7959F5F80389F4F880F969581
:1025A000879597F908959FEF80EC0895DF93CF9377
:1025B0001F930F93FF92EF92DF927B018C0168943F
:1025C00005C0DA2EEF0187D0FE01E894A591259190
:1025D000359145915591AEF3EF0132D1FE0197014E
:1025E000A801DA9479F7DF90EF90FF900F911F9197
:1025F000CF91DF91089500240A9416161706180645
:102600000906089500240A941216130614060506F6
:102610000895092E0394000C11F4882352F0BB0F87
:1026200040F4BF2B11F460FF04C06F5F7F4F8F4FEA
:102630009F4F089557FD9058440F551F59F05F3F25
:1026400071F04795880F97FB991F61F09F3F79F0D4
:1026500087950895121613061406551FF2CF469556
:10266000F1DF08C0161617061806991FF1CF8695D8
:102670007105610508940895E5DFA0F0BEE7B9177C
:1026800088F4BB279F3860F41616B11D672F782F8A
:102690008827985FF7CF869577956795B11D9395B5
:1026A0009639C8F30895E894BB2766277727CB01AE
:1026B00097F908959B01AC0160E070E080E89FE32A
:1026C000CCC999DF28F09EDF18F0952309F03ACFA6
:1026D0006ACF1124E9CFAEDFA0F3959FD1F3950F18
:1026E00050E0551F629FF001729FBB27F00DB11D96
:1026F000639FAA27F00DB11DAA1F649F6627B00D26
:10270000A11D661F829F2227B00DA11D621F739F0E
:10271000B00DA11D621F839FA00D611D221F749F1C
:102720003327A00D611D231F849F600D211D822F63
:10273000762F6A2F11249F5750408AF0E1F08823AA
:102740004AF0EE0FFF1FBB1F661F771F881F9150B7
:102750005040A9F79E3F510570F0F4CEA5CF5F3FE2
:10276000ECF3983EDCF3869577956795B795F795EA
:10277000E7959F5FC1F7FE2B880F911D9695879572
:1027800097F9089511F40EF40ECFFDCE5BDFD0F370
:102790009923D9F3CEF39F57550B87FFA4D05695B5
:1027A0009795B0E020F4660F771F881FBB1F1F931B
:1027B0000F9300249001A0018001F001A0E80E0F0A
:1027C0001F1F0A1E511D601B710B8009B50B48F4B9
:1027D000600F711F801DB51F0E1B1F0B0A0A5109C8
:1027E00007C02E0F3F1F4A1F0E0F1F1F0A1E511D2D
:1027F000660F771F881FBB1FA695F795E795F8F61C
:102800000617170708065B07211D311D411D0F9193
:102810001F91B901842F9158880F96958795089537
:102820009B01AC0120C8E7DE30F0ECDE20F031F493
:102830009F3F11F41EF4B7CE0EF4E095E7FB82CE75
:10284000E92FF8DE80F3BA1762077307840795074C
:1028500018F071F49EF527CF0EF4E0950B2EBA2FE9
:10286000A02D0B01B90190010C01CA01A001112496
:10287000FF27591B99F0593F50F4503E68F11A1642
:10288000F040A22F232F342F4427585FF3CF4695D3
:1028900037952795A795F0405395C9F77EF41F16F5
:1028A000BA0B620B730B840BBAF09150A1F0FF0FBF
:1028B000BB1F661F771F881FC2F70EC0BA0F621FAB
:1028C000731F841F48F4879577956795B795F7959B
:1028D0009E3F08F0B3CF9395880F08F09927EE0F2D
:1028E00097958795089591505040660F771F881FE0
:0828F000D2F70895F894FFCF20
:1028F80000000000000000000001020203030303BF
:102908000404040404040404050505050505050577
:102918000505050505050505060606060606060657
:10292800060606060606060606060606060606063F
:102938000606060606060606070707070707070727
:10294800070707070707070707070707070707070F
:1029580007070707070707070707070707070707FF
:1029680007070707070707070707070707070707EF
:1029780007070707070707070808080808080808D7
:1029880008080808080808080808080808080808BF
:1029980008080808080808080808080808080808AF
:1029A800080808080808080808080808080808089F
:1029B800080808080808080808080808080808088F
:1029C800080808080808080808080808080808087F
:1029D800080808080808080808080808080808086F
:1029E800080808080808080808080808080808085F
:0829F800080808080808080897
:00000001FF
/programy/C/avr/akcelerometr/project.map
1,107 → 1,111
Archive member included because of file (symbol)
 
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_mulsi3.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mulsi3.o)
timer.o (__mulsi3)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_udivmodhi4.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodhi4.o)
buffer.o (__udivmodhi4)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_divmodhi4.o)
a2dtest.o (__divmodhi4)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_udivmodsi4.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodsi4.o)
rprintf.o (__udivmodsi4)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_divmodsi4.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o)
timer.o (__divmodsi4)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_exit.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o (exit)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_copy_data.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o (exit)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
a2dtest.o (__do_copy_data)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clear_bss.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
a2dtest.o (__do_clear_bss)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_fixunssfsi.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_fixunssfsi.o)
a2dtest.o (__fixunssfsi)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_addsub_sf.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_addsub_sf.o)
a2dtest.o (__subsf3)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_mul_sf.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mul_sf.o)
a2dtest.o (__mulsf3)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_div_sf.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_div_sf.o)
a2dtest.o (__divsf3)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_ge_sf.o)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_fixunssfsi.o) (__gesf2)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_si_to_sf.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_ge_sf.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_fixunssfsi.o) (__gesf2)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_si_to_sf.o)
a2dtest.o (__floatsisf)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_sf_to_si.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_sf_to_si.o)
a2dtest.o (__fixsfsi)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_thenan_sf.o)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_addsub_sf.o) (__thenan_sf)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_prologue.o)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_addsub_sf.o) (__prologue_saves__)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_epilogue.o)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_addsub_sf.o) (__epilogue_restores__)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clzsi2.o)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_si_to_sf.o) (__clzsi2)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_pack_sf.o)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_addsub_sf.o) (__pack_f)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_unpack_sf.o)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_addsub_sf.o) (__unpack_f)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_fpcmp_parts_sf.o)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_ge_sf.o) (__fpcmp_parts_f)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clz.o)
/usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clzsi2.o) (__clz_tab)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_thenan_sf.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_addsub_sf.o) (__thenan_sf)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_usi_to_sf.o)
a2dtest.o (__floatunsisf)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_prologue.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_addsub_sf.o) (__prologue_saves__)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_epilogue.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_addsub_sf.o) (__epilogue_restores__)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clzsi2.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_si_to_sf.o) (__clzsi2)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_pack_sf.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_addsub_sf.o) (__pack_f)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_unpack_sf.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_addsub_sf.o) (__unpack_f)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_fpcmp_parts_sf.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_ge_sf.o) (__fpcmp_parts_f)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clz.o)
/usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clzsi2.o) (__clz_tab)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o)
a2dtest.o (atan2)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o) (atan)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(divsf3x.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o) (__divsf3_pse)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(floor.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o) (atan)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(divsf3x.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o) (__divsf3_pse)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(floor.o)
a2dtest.o (floor)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_inf.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(divsf3x.o) (__fp_inf)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mintl.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(floor.o) (__fp_mintl)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mpack.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(floor.o) (__fp_mpack)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_nan.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o) (__fp_nan)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_powser.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o) (__fp_powser)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscA.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o) (__fp_pscA)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscB.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o) (__fp_pscB)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_round.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o) (__fp_round)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_split3.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o) (__fp_split3)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_trunc.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(floor.o) (__fp_trunc)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_zero.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o) (__fp_zero)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(inverse.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o) (inverse)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(mulsf3x.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o) (__mulsf3x)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(square.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o) (square)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(addsf3x.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o) (__addsf3x)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_inf.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(divsf3x.o) (__fp_inf)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mintl.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(floor.o) (__fp_mintl)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mpack.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(floor.o) (__fp_mpack)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_nan.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o) (__fp_nan)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_powser.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o) (__fp_powser)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscA.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o) (__fp_pscA)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscB.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o) (__fp_pscB)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_round.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o) (__fp_round)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_split3.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o) (__fp_split3)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_trunc.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(floor.o) (__fp_trunc)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_zero.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o) (__fp_zero)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(inverse.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o) (inverse)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(mulsf3x.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o) (__mulsf3x)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(sqrt.o)
a2dtest.o (sqrt)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(square.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o) (square)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(addsf3x.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o) (__addsf3x)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_norm2.o)
/usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(sqrt.o) (__fp_norm2)
 
Allocating common symbols
Common symbol size file
 
uartReadyTx 0x1 uart.o
uartReadyTx 0x2 uart2.o
Timer0Reg0 0x4 timer.o
uartRxBuffer 0x8 uart.o
uartRxBuffer 0x10 uart2.o
TimerPauseReg 0x4 timer.o
Timer2Reg0 0x4 timer.o
uartBufferedTx 0x1 uart.o
uartBufferedTx 0x2 uart2.o
a2dCompleteFlag 0x1 a2d.o
uartTxBuffer 0x8 uart.o
uartRxOverflow 0x2 uart.o
uartTxBuffer 0x10 uart2.o
uartRxOverflow 0x4 uart2.o
 
Memory Configuration
 
Name Origin Length Attributes
text 0x00000000 0x00002000 xr
text 0x00000000 0x00020000 xr
data 0x00800060 0x0000ffa0 rw !x
eeprom 0x00810000 0x00010000 rw !x
fuse 0x00820000 0x00000400 rw !x
111,16 → 115,17
 
Linker script and memory map
 
LOAD /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o
Address of section .data set to 0x800100
LOAD /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o
LOAD a2dtest.o
LOAD a2d.o
LOAD buffer.o
LOAD rprintf.o
LOAD timer.o
LOAD uart.o
LOAD /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a
LOAD /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a
LOAD /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a
LOAD uart2.o
LOAD /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a
LOAD /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a
LOAD /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a
 
.hash
*(.hash)
212,55 → 217,55
.rela.plt
*(.rela.plt)
 
.text 0x00000000 0x2186
.text 0x00000000 0x28f8
*(.vectors)
.vectors 0x00000000 0x26 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o
.vectors 0x00000000 0x8c /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o
0x00000000 __vectors
0x00000000 __vector_default
*(.vectors)
*(.progmem.gcc*)
.progmem.gcc_fplib
0x00000026 0x2d /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o)
0x0000008c 0x2d /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o)
*(.progmem*)
.progmem.data 0x00000053 0x16 a2dtest.o
.progmem.data 0x00000069 0x11 rprintf.o
.progmem.data 0x0000007a 0x1c timer.o
0x00000086 TimerRTCPrescaleFactor
0x0000007a TimerPrescaleFactor
0x00000096 . = ALIGN (0x2)
0x00000096 __trampolines_start = .
.progmem.data 0x000000b9 0x16 a2dtest.o
.progmem.data 0x000000cf 0x11 rprintf.o
.progmem.data 0x000000e0 0x1c timer.o
0x000000ec TimerRTCPrescaleFactor
0x000000e0 TimerPrescaleFactor
0x000000fc . = ALIGN (0x2)
0x000000fc __trampolines_start = .
*(.trampolines)
.trampolines 0x00000096 0x0 linker stubs
.trampolines 0x000000fc 0x0 linker stubs
*(.trampolines*)
0x00000096 __trampolines_end = .
0x000000fc __trampolines_end = .
*(.jumptables)
*(.jumptables*)
*(.lowtext)
*(.lowtext*)
0x00000096 __ctors_start = .
0x000000fc __ctors_start = .
*(.ctors)
0x00000096 __ctors_end = .
0x00000096 __dtors_start = .
0x000000fc __ctors_end = .
0x000000fc __dtors_start = .
*(.dtors)
0x00000096 __dtors_end = .
0x000000fc __dtors_end = .
SORT(*)(.ctors)
SORT(*)(.dtors)
*(.init0)
.init0 0x00000096 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o
0x00000096 __init
.init0 0x000000fc 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o
0x000000fc __init
*(.init0)
*(.init1)
*(.init1)
*(.init2)
.init2 0x00000096 0xc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o
.init2 0x000000fc 0xc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o
*(.init2)
*(.init3)
*(.init3)
*(.init4)
.init4 0x000000a2 0x16 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_copy_data.o)
0x000000a2 __do_copy_data
.init4 0x000000b8 0x10 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clear_bss.o)
0x000000b8 __do_clear_bss
.init4 0x00000108 0x16 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
0x00000108 __do_copy_data
.init4 0x0000011e 0x10 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
0x0000011e __do_clear_bss
*(.init4)
*(.init5)
*(.init5)
271,225 → 276,256
*(.init8)
*(.init8)
*(.init9)
.init9 0x000000c8 0x4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o
.init9 0x0000012e 0x8 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o
*(.init9)
*(.text)
.text 0x000000cc 0x2 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o
0x000000cc __vector_1
0x000000cc __vector_12
0x000000cc __bad_interrupt
0x000000cc __vector_17
0x000000cc __vector_2
0x000000cc __vector_15
0x000000cc __vector_10
0x000000cc __vector_16
0x000000cc __vector_18
.text 0x000000ce 0x116 a2dtest.o
0x000000ce main
.text 0x000001e4 0xac a2d.o
0x00000238 a2dIsComplete
0x00000266 a2dConvert8bit
0x00000204 a2dOff
0x0000020a a2dSetPrescaler
0x0000023e a2dConvert10bit
0x000001e4 a2dInit
0x00000214 a2dSetReference
0x00000272 __vector_14
0x00000226 a2dSetChannel
0x00000232 a2dStartConvert
.text 0x00000290 0x150 buffer.o
0x000003ba bufferIsNotFull
0x000002aa bufferGetFromFront
0x00000348 bufferGetAtIndex
0x00000304 bufferDumpFromFront
0x00000290 bufferInit
0x0000036e bufferAddToEnd
0x000003d2 bufferFlush
.text 0x000003e0 0x3b2 rprintf.o
0x00000678 rprintf1RamRom
0x000004bc rprintfu08
0x000004de rprintfu32
0x0000040e rprintfStr
0x0000042a rprintfStrLen
0x00000484 rprintfProgStr
0x000004ce rprintfu16
0x000003e0 rprintfInit
0x000003ea rprintfChar
0x000004a2 rprintfCRLF
0x000004a8 rprintfu04
0x00000500 rprintfNum
.text 0x00000792 0x594 timer.o
0x00000a38 timer2GetOverflowCount
0x000008de timerDetach
0x00000866 timer1SetPrescaler
0x00000af4 timer1PWMBOff
0x000008ae timer2GetPrescaler
0x00000c3e __vector_6
0x00000804 timer0Init
0x00000ae6 timer1PWMAOff
0x00000b08 timer1PWMBSet
0x00000cec __vector_3
0x00000a7e timer1PWMInitICR
0x0000087a timer0GetPrescaler
0x00000c78 __vector_7
0x00000a10 timer0GetOverflowCount
0x00000cb2 __vector_5
0x00000794 timerInit
0x00000870 timer2SetPrescaler
0x00000aca timer1PWMAOn
0x0000085c timer0SetPrescaler
0x00000792 delay_us
0x00000bd6 __vector_4
0x000009fe timer0ClearOverflowCount
0x00000b0e __vector_9
0x00000826 timer1Init
0x00000a4e timer1PWMInit
0x00000ad8 timer1PWMBOn
0x0000083a timer2Init
0x00000b9c __vector_8
0x00000b02 timer1PWMASet
0x000008c8 timerAttach
0x00000aa4 timer1PWMOff
0x00000894 timer1GetPrescaler
0x00000a26 timer2ClearOverflowCount
0x000008f4 timerPause
.text 0x00000d26 0x1ee uart.o
0x00000e4e uartSendTxBuffer
0x00000d70 uartSendByte
0x00000ec8 uartInitBuffers
0x00000e6c uartReceiveByte
0x00000e00 uartAddToTxBuffer
0x00000da0 __vector_11
0x00000d26 uartSetRxHandler
0x00000e0a __vector_13
0x00000d82 uartFlushReceiveBuffer
0x00000ee6 uartInit
0x00000d8c uartReceiveBufferIsEmpty
0x00000d30 uartSetBaudRate
0x00000d6a uartGetTxBuffer
0x00000e9e uartGetByte
0x00000d64 uartGetRxBuffer
.text 0x00000f14 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_mulsi3.o)
.text 0x00000f14 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_udivmodhi4.o)
.text 0x00000f14 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_divmodhi4.o)
.text 0x00000f14 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_udivmodsi4.o)
.text 0x00000f14 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_divmodsi4.o)
.text 0x00000f14 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_exit.o)
.text 0x00000f14 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_copy_data.o)
.text 0x00000f14 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clear_bss.o)
.text 0x00000f14 0x50 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_fixunssfsi.o)
0x00000f14 __fixunssfsi
.text 0x00000f64 0x332 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_addsub_sf.o)
0x000011f2 __subsf3
0x00001248 __addsf3
.text 0x00001296 0x1ea /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_mul_sf.o)
0x00001296 __mulsf3
.text 0x00001480 0x14a /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_div_sf.o)
0x00001480 __divsf3
.text 0x000015ca 0x56 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_ge_sf.o)
0x000015ca __gesf2
.text 0x00001620 0xb4 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_si_to_sf.o)
0x00001620 __floatsisf
.text 0x000016d4 0xa2 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_sf_to_si.o)
0x000016d4 __fixsfsi
.text 0x00001776 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_thenan_sf.o)
.text 0x00001776 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_prologue.o)
.text 0x00001776 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_epilogue.o)
.text 0x00001776 0x9e /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clzsi2.o)
0x00001776 __clzsi2
.text 0x00001814 0x1aa /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_pack_sf.o)
0x00001814 __pack_f
.text 0x000019be 0xe0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_unpack_sf.o)
0x000019be __unpack_f
.text 0x00001a9e 0xb4 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_fpcmp_parts_sf.o)
0x00001a9e __fpcmp_parts_f
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clz.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(divsf3x.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(floor.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_inf.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mintl.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mpack.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_nan.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_powser.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscA.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscB.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_round.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_split3.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_trunc.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_zero.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(inverse.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(mulsf3x.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(square.o)
.text 0x00001b52 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(addsf3x.o)
0x00001b52 . = ALIGN (0x2)
.text 0x00000136 0x4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o
0x00000136 __vector_22
0x00000136 __vector_28
0x00000136 __vector_1
0x00000136 __vector_34
0x00000136 __vector_24
0x00000136 __bad_interrupt
0x00000136 __vector_6
0x00000136 __vector_31
0x00000136 __vector_3
0x00000136 __vector_23
0x00000136 __vector_25
0x00000136 __vector_17
0x00000136 __vector_19
0x00000136 __vector_7
0x00000136 __vector_27
0x00000136 __vector_5
0x00000136 __vector_33
0x00000136 __vector_4
0x00000136 __vector_2
0x00000136 __vector_29
0x00000136 __vector_8
0x00000136 __vector_26
.text 0x0000013a 0x2b2 a2dtest.o
0x0000013a main
.text 0x000003ec 0xae a2d.o
0x00000440 a2dIsComplete
0x0000046e a2dConvert8bit
0x0000040c a2dOff
0x00000412 a2dSetPrescaler
0x00000446 a2dConvert10bit
0x000003ec a2dInit
0x0000041c a2dSetReference
0x0000047c __vector_21
0x0000042e a2dSetChannel
0x0000043a a2dStartConvert
.text 0x0000049a 0x154 buffer.o
0x000005c8 bufferIsNotFull
0x000004b4 bufferGetFromFront
0x00000552 bufferGetAtIndex
0x0000050e bufferDumpFromFront
0x0000049a bufferInit
0x0000057a bufferAddToEnd
0x000005e0 bufferFlush
.text 0x000005ee 0x3e0 rprintf.o
0x000008a6 rprintf1RamRom
0x000006d4 rprintfu08
0x000006fe rprintfu32
0x0000061c rprintfStr
0x0000063a rprintfStrLen
0x00000696 rprintfProgStr
0x000006ea rprintfu16
0x000005ee rprintfInit
0x000005f8 rprintfChar
0x000006b6 rprintfCRLF
0x000006be rprintfu04
0x00000724 rprintfNum
.text 0x000009ce 0x5d8 timer.o
0x00000c7e timer2GetOverflowCount
0x00000b1a timerDetach
0x00000aa2 timer1SetPrescaler
0x00000ebe __vector_12
0x00000d3a timer1PWMBOff
0x00000aea timer2GetPrescaler
0x00000a40 timer0Init
0x00000d2c timer1PWMAOff
0x00000d4e timer1PWMBSet
0x00000f32 __vector_11
0x00000cc4 timer1PWMInitICR
0x00000ef8 __vector_13
0x00000ab6 timer0GetPrescaler
0x00000c56 timer0GetOverflowCount
0x000009d0 timerInit
0x00000aac timer2SetPrescaler
0x00000d10 timer1PWMAOn
0x00000a98 timer0SetPrescaler
0x000009ce delay_us
0x00000c44 timer0ClearOverflowCount
0x00000f6c __vector_9
0x00000a62 timer1Init
0x00000e84 __vector_15
0x00000c94 timer1PWMInit
0x00000d1e timer1PWMBOn
0x00000a76 timer2Init
0x00000d48 timer1PWMASet
0x00000b04 timerAttach
0x00000cea timer1PWMOff
0x00000de2 __vector_14
0x00000e1c __vector_10
0x00000d54 __vector_16
0x00000ad0 timer1GetPrescaler
0x00000c6c timer2ClearOverflowCount
0x00000b30 timerPause
.text 0x00000fa6 0x51a uart2.o
0x000012e4 uartSendTxBuffer
0x000012a8 __vector_32
0x0000109e uartReceiveService
0x00001038 uartSendByte
0x00001460 uart0InitBuffers
0x00001392 uart1GetByte
0x00001336 uartReceiveByte
0x0000113c uartSendBuffer
0x00001100 __vector_30
0x000013c2 uart0GetByte
0x0000121e uartAddToTxBuffer
0x0000124c uartTransmitService
0x00000fa6 uartSetRxHandler
0x00001482 uart0Init
0x0000142a uart1Init
0x000013f2 uartFlushReceiveBuffer
0x000014b6 uartInit
0x0000105c uart0SendByte
0x0000107c uartReceiveBufferIsEmpty
0x00000fbc uartSetBaudRate
0x00001068 uart1SendByte
0x00001022 uartGetTxBuffer
0x0000100c uartGetRxBuffer
0x00001408 uart1InitBuffers
0x00001240 uart0AddToTxBuffer
0x0000111e __vector_18
0x00001234 uart1AddToTxBuffer
0x000012c6 __vector_20
.text 0x000014c0 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mulsi3.o)
.text 0x000014c0 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodhi4.o)
.text 0x000014c0 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodsi4.o)
.text 0x000014c0 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o)
.text 0x000014c0 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
.text 0x000014c0 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
.text 0x000014c0 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
.text 0x000014c0 0x58 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_fixunssfsi.o)
0x000014c0 __fixunssfsi
.text 0x00001518 0x34e /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_addsub_sf.o)
0x000017aa __subsf3
0x0000180c __addsf3
.text 0x00001866 0x1f4 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mul_sf.o)
0x00001866 __mulsf3
.text 0x00001a5a 0x154 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_div_sf.o)
0x00001a5a __divsf3
.text 0x00001bae 0x60 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_ge_sf.o)
0x00001bae __gesf2
.text 0x00001c0e 0xbc /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_si_to_sf.o)
0x00001c0e __floatsisf
.text 0x00001cca 0xa8 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_sf_to_si.o)
0x00001cca __fixsfsi
.text 0x00001d72 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_thenan_sf.o)
.text 0x00001d72 0xf2 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_usi_to_sf.o)
0x00001d72 __floatunsisf
.text 0x00001e64 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_prologue.o)
.text 0x00001e64 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_epilogue.o)
.text 0x00001e64 0x9e /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clzsi2.o)
0x00001e64 __clzsi2
.text 0x00001f02 0x1aa /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_pack_sf.o)
0x00001f02 __pack_f
.text 0x000020ac 0xe0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_unpack_sf.o)
0x000020ac __unpack_f
.text 0x0000218c 0xb4 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_fpcmp_parts_sf.o)
0x0000218c __fpcmp_parts_f
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clz.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(divsf3x.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(floor.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_inf.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mintl.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mpack.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_nan.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_powser.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscA.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscB.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_round.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_split3.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_trunc.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_zero.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(inverse.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(mulsf3x.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(sqrt.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(square.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(addsf3x.o)
.text 0x00002240 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_norm2.o)
0x00002240 . = ALIGN (0x2)
*(.text.*)
.text.libgcc 0x00001b52 0x3e /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_mulsi3.o)
0x00001b52 __mulsi3
.text.libgcc 0x00001b90 0x28 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_udivmodhi4.o)
0x00001b90 __udivmodhi4
.text.libgcc 0x00001bb8 0x26 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_divmodhi4.o)
0x00001bb8 __divmodhi4
0x00001bb8 _div
.text.libgcc 0x00001bde 0x44 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_udivmodsi4.o)
0x00001bde __udivmodsi4
.text.libgcc 0x00001c22 0x36 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_divmodsi4.o)
0x00001c22 __divmodsi4
.text.libgcc 0x00001c58 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_exit.o)
.text.libgcc 0x00001c58 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_copy_data.o)
.text.libgcc 0x00001c58 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clear_bss.o)
.text.libgcc 0x00001c58 0x38 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_prologue.o)
0x00001c58 __prologue_saves__
.text.libgcc 0x00001c90 0x36 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_epilogue.o)
0x00001c90 __epilogue_restores__
.text.fplib 0x00001cc6 0x74 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o)
0x00001ce4 atan2
.text.fplib 0x00001d3a 0x50 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o)
0x00001d3a atan
.text.fplib 0x00001d8a 0xcc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(divsf3x.o)
0x00001da0 __divsf3x
0x00001da4 __divsf3_pse
.text.fplib 0x00001e56 0x26 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(floor.o)
0x00001e56 floor
.text.fplib 0x00001e7c 0xc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_inf.o)
0x00001e7c __fp_inf
.text.fplib 0x00001e88 0x36 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mintl.o)
0x00001e88 __fp_mintl
.text.fplib 0x00001ebe 0x20 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mpack.o)
0x00001ebe __fp_mpack
.text.fplib 0x00001ede 0x6 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_nan.o)
0x00001ede __fp_nan
.text.fplib 0x00001ee4 0x4a /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_powser.o)
0x00001ee4 __fp_powser
.text.fplib 0x00001f2e 0xe /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscA.o)
0x00001f2e __fp_pscA
.text.fplib 0x00001f3c 0xe /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscB.o)
0x00001f3c __fp_pscB
.text.fplib 0x00001f4a 0x22 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_round.o)
0x00001f4a __fp_round
.text.fplib 0x00001f6c 0x44 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_split3.o)
0x00001f6c __fp_split3
0x00001f7c __fp_splitA
.text.fplib 0x00001fb0 0x2e /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_trunc.o)
0x00001fb0 __fp_trunc
.text.fplib 0x00001fde 0xe /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_zero.o)
0x00001fde __fp_zero
0x00001fe0 __fp_szero
.text.fplib 0x00001fec 0xe /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(inverse.o)
0x00001fec inverse
.text.fplib 0x00001ffa 0xc2 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(mulsf3x.o)
0x00002012 __mulsf3_pse
0x0000200e __mulsf3x
.text.fplib 0x000020bc 0x6 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(square.o)
0x000020bc square
.text.fplib 0x000020c2 0xc0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(addsf3x.o)
0x000020dc __addsf3x
0x00002182 . = ALIGN (0x2)
.text.libgcc 0x00002240 0x3e /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mulsi3.o)
0x00002240 __mulsi3
.text.libgcc 0x0000227e 0x28 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodhi4.o)
0x0000227e __udivmodhi4
.text.libgcc 0x000022a6 0x44 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodsi4.o)
0x000022a6 __udivmodsi4
.text.libgcc 0x000022ea 0x36 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o)
0x000022ea __divmodsi4
.text.libgcc 0x00002320 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
.text.libgcc 0x00002320 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
.text.libgcc 0x00002320 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
.text.libgcc 0x00002320 0x38 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_prologue.o)
0x00002320 __prologue_saves__
.text.libgcc 0x00002358 0x36 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_epilogue.o)
0x00002358 __epilogue_restores__
.text.fplib 0x0000238e 0x74 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o)
0x000023ac atan2
.text.fplib 0x00002402 0x50 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o)
0x00002402 atan
.text.fplib 0x00002452 0xcc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(divsf3x.o)
0x00002468 __divsf3x
0x0000246c __divsf3_pse
.text.fplib 0x0000251e 0x26 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(floor.o)
0x0000251e floor
.text.fplib 0x00002544 0xc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_inf.o)
0x00002544 __fp_inf
.text.fplib 0x00002550 0x36 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mintl.o)
0x00002550 __fp_mintl
.text.fplib 0x00002586 0x20 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mpack.o)
0x00002586 __fp_mpack
.text.fplib 0x000025a6 0x6 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_nan.o)
0x000025a6 __fp_nan
.text.fplib 0x000025ac 0x4a /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_powser.o)
0x000025ac __fp_powser
.text.fplib 0x000025f6 0xe /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscA.o)
0x000025f6 __fp_pscA
.text.fplib 0x00002604 0xe /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscB.o)
0x00002604 __fp_pscB
.text.fplib 0x00002612 0x22 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_round.o)
0x00002612 __fp_round
.text.fplib 0x00002634 0x44 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_split3.o)
0x00002634 __fp_split3
0x00002644 __fp_splitA
.text.fplib 0x00002678 0x2e /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_trunc.o)
0x00002678 __fp_trunc
.text.fplib 0x000026a6 0xe /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_zero.o)
0x000026a6 __fp_zero
0x000026a8 __fp_szero
.text.fplib 0x000026b4 0xe /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(inverse.o)
0x000026b4 inverse
.text.fplib 0x000026c2 0xc2 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(mulsf3x.o)
0x000026da __mulsf3_pse
0x000026d6 __mulsf3x
.text.fplib 0x00002784 0x9c /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(sqrt.o)
0x0000278c sqrt
.text.fplib 0x00002820 0x6 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(square.o)
0x00002820 square
.text.fplib 0x00002826 0xc0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(addsf3x.o)
0x00002840 __addsf3x
.text.fplib 0x000028e6 0xe /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_norm2.o)
0x000028e6 __fp_norm2
0x000028f4 . = ALIGN (0x2)
*(.fini9)
.fini9 0x00002182 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_exit.o)
0x00002182 exit
0x00002182 _exit
.fini9 0x000028f4 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
0x000028f4 exit
0x000028f4 _exit
*(.fini9)
*(.fini8)
*(.fini8)
508,148 → 544,152
*(.fini1)
*(.fini1)
*(.fini0)
.fini0 0x00002182 0x4 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_exit.o)
.fini0 0x000028f4 0x4 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
*(.fini0)
0x00002186 _etext = .
0x000028f8 _etext = .
 
.data 0x00800060 0x108 load address 0x00002186
0x00800060 PROVIDE (__data_start, .)
.data 0x00800100 0x108 load address 0x000028f8
0x00800100 PROVIDE (__data_start, .)
*(.data)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o
.data 0x00800060 0x0 a2dtest.o
.data 0x00800060 0x0 a2d.o
.data 0x00800060 0x0 buffer.o
.data 0x00800060 0x0 rprintf.o
.data 0x00800060 0x0 timer.o
.data 0x00800060 0x0 uart.o
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_mulsi3.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_udivmodhi4.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_divmodhi4.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_udivmodsi4.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_divmodsi4.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_exit.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_copy_data.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clear_bss.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_fixunssfsi.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_addsub_sf.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_mul_sf.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_div_sf.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_ge_sf.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_si_to_sf.o)
.data 0x00800060 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_sf_to_si.o)
.data 0x00800060 0x8 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_thenan_sf.o)
0x00800060 __thenan_sf
.data 0x00800068 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_prologue.o)
.data 0x00800068 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_epilogue.o)
.data 0x00800068 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clzsi2.o)
.data 0x00800068 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_pack_sf.o)
.data 0x00800068 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_unpack_sf.o)
.data 0x00800068 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_fpcmp_parts_sf.o)
.data 0x00800068 0x100 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clz.o)
0x00800068 __clz_tab
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(divsf3x.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(floor.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_inf.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mintl.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mpack.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_nan.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_powser.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscA.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscB.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_round.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_split3.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_trunc.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_zero.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(inverse.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(mulsf3x.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(square.o)
.data 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(addsf3x.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o
.data 0x00800100 0x0 a2dtest.o
.data 0x00800100 0x0 a2d.o
.data 0x00800100 0x0 buffer.o
.data 0x00800100 0x0 rprintf.o
.data 0x00800100 0x0 timer.o
.data 0x00800100 0x0 uart2.o
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mulsi3.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodhi4.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodsi4.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_fixunssfsi.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_addsub_sf.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mul_sf.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_div_sf.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_ge_sf.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_si_to_sf.o)
.data 0x00800100 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_sf_to_si.o)
.data 0x00800100 0x8 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_thenan_sf.o)
0x00800100 __thenan_sf
.data 0x00800108 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_usi_to_sf.o)
.data 0x00800108 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_prologue.o)
.data 0x00800108 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_epilogue.o)
.data 0x00800108 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clzsi2.o)
.data 0x00800108 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_pack_sf.o)
.data 0x00800108 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_unpack_sf.o)
.data 0x00800108 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_fpcmp_parts_sf.o)
.data 0x00800108 0x100 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clz.o)
0x00800108 __clz_tab
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(divsf3x.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(floor.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_inf.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mintl.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mpack.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_nan.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_powser.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscA.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscB.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_round.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_split3.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_trunc.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_zero.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(inverse.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(mulsf3x.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(sqrt.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(square.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(addsf3x.o)
.data 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_norm2.o)
*(.data*)
*(.rodata)
*(.rodata*)
*(.gnu.linkonce.d*)
0x00800168 . = ALIGN (0x2)
0x00800168 _edata = .
0x00800168 PROVIDE (__data_end, .)
0x00800208 . = ALIGN (0x2)
0x00800208 _edata = .
0x00800208 PROVIDE (__data_end, .)
 
.bss 0x00800168 0x172 load address 0x0000228e
0x00800168 PROVIDE (__bss_start, .)
.bss 0x00800208 0x16b load address 0x00002a00
0x00800208 PROVIDE (__bss_start, .)
*(.bss)
.bss 0x00800168 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o
.bss 0x00800168 0x0 a2dtest.o
.bss 0x00800168 0x0 a2d.o
.bss 0x00800168 0x0 buffer.o
.bss 0x00800168 0x2 rprintf.o
.bss 0x0080016a 0xe timer.o
.bss 0x00800178 0x141 uart.o
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_mulsi3.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_udivmodhi4.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_divmodhi4.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_udivmodsi4.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_divmodsi4.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_exit.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_copy_data.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clear_bss.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_fixunssfsi.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_addsub_sf.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_mul_sf.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_div_sf.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_ge_sf.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_si_to_sf.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_sf_to_si.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_thenan_sf.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_prologue.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_epilogue.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clzsi2.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_pack_sf.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_unpack_sf.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_fpcmp_parts_sf.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/avr4/libgcc.a(_clz.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(divsf3x.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(floor.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_inf.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mintl.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mpack.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_nan.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_powser.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscA.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscB.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_round.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_split3.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_trunc.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_zero.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(inverse.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(mulsf3x.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(square.o)
.bss 0x008002b9 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(addsf3x.o)
.bss 0x00800208 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o
.bss 0x00800208 0x0 a2dtest.o
.bss 0x00800208 0x0 a2d.o
.bss 0x00800208 0x0 buffer.o
.bss 0x00800208 0x2 rprintf.o
.bss 0x0080020a 0x10 timer.o
.bss 0x0080021a 0x124 uart2.o
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mulsi3.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodhi4.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_udivmodsi4.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_divmodsi4.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_exit.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_copy_data.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clear_bss.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_fixunssfsi.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_addsub_sf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_mul_sf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_div_sf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_ge_sf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_si_to_sf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_sf_to_si.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_thenan_sf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_usi_to_sf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_prologue.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_epilogue.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clzsi2.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_pack_sf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_unpack_sf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_fpcmp_parts_sf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/avr5/libgcc.a(_clz.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(divsf3x.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(floor.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_inf.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mintl.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mpack.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_nan.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_powser.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscA.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscB.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_round.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_split3.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_trunc.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_zero.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(inverse.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(mulsf3x.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(sqrt.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(square.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(addsf3x.o)
.bss 0x0080033e 0x0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_norm2.o)
*(.bss*)
*(COMMON)
COMMON 0x008002b9 0x1 a2d.o
0x008002b9 a2dCompleteFlag
COMMON 0x008002ba 0xc timer.o
0x008002ba Timer0Reg0
0x008002be TimerPauseReg
0x008002c2 Timer2Reg0
COMMON 0x008002c6 0x14 uart.o
0x008002c6 uartReadyTx
0x008002c7 uartRxBuffer
0x008002cf uartBufferedTx
0x008002d0 uartTxBuffer
0x008002d8 uartRxOverflow
0x008002da PROVIDE (__bss_end, .)
0x00002186 __data_load_start = LOADADDR (.data)
0x0000228e __data_load_end = (__data_load_start + SIZEOF (.data))
COMMON 0x0080033e 0x1 a2d.o
0x0080033e a2dCompleteFlag
COMMON 0x0080033f 0xc timer.o
0x0080033f Timer0Reg0
0x00800343 TimerPauseReg
0x00800347 Timer2Reg0
COMMON 0x0080034b 0x28 uart2.o
0x0080034b uartReadyTx
0x0080034d uartRxBuffer
0x0080035d uartBufferedTx
0x0080035f uartTxBuffer
0x0080036f uartRxOverflow
0x00800373 PROVIDE (__bss_end, .)
0x000028f8 __data_load_start = LOADADDR (.data)
0x00002a00 __data_load_end = (__data_load_start + SIZEOF (.data))
 
.noinit 0x008002da 0x0
0x008002da PROVIDE (__noinit_start, .)
.noinit 0x00800373 0x0
0x00800373 PROVIDE (__noinit_start, .)
*(.noinit*)
0x008002da PROVIDE (__noinit_end, .)
0x008002da _end = .
0x008002da PROVIDE (__heap_start, .)
0x00800373 PROVIDE (__noinit_end, .)
0x00800373 _end = .
0x00800373 PROVIDE (__heap_start, .)
 
.eeprom 0x00810000 0x0
*(.eeprom*)
667,51 → 707,55
.signature
*(.signature*)
 
.stab 0x00000000 0x270c
.stab 0x00000000 0x2b74
*(.stab)
.stab 0x00000000 0x6b4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o
.stab 0x000006b4 0x2f4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan2.o)
.stab 0x00000000 0x6b4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o
.stab 0x000006b4 0x2f4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan2.o)
0x300 (size before relaxing)
.stab 0x000009a8 0x210 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(atan.o)
.stab 0x000009a8 0x210 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(atan.o)
0x21c (size before relaxing)
.stab 0x00000bb8 0x510 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(divsf3x.o)
.stab 0x00000bb8 0x510 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(divsf3x.o)
0x51c (size before relaxing)
.stab 0x000010c8 0x114 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(floor.o)
.stab 0x000010c8 0x114 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(floor.o)
0x120 (size before relaxing)
.stab 0x000011dc 0x78 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_inf.o)
.stab 0x000011dc 0x78 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_inf.o)
0x84 (size before relaxing)
.stab 0x00001254 0x174 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mintl.o)
.stab 0x00001254 0x174 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mintl.o)
0x180 (size before relaxing)
.stab 0x000013c8 0xf0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_mpack.o)
.stab 0x000013c8 0xf0 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_mpack.o)
0xfc (size before relaxing)
.stab 0x000014b8 0x54 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_nan.o)
.stab 0x000014b8 0x54 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_nan.o)
0x60 (size before relaxing)
.stab 0x0000150c 0x1ec /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_powser.o)
.stab 0x0000150c 0x1ec /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_powser.o)
0x1f8 (size before relaxing)
.stab 0x000016f8 0x84 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscA.o)
.stab 0x000016f8 0x84 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscA.o)
0x90 (size before relaxing)
.stab 0x0000177c 0x84 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_pscB.o)
.stab 0x0000177c 0x84 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_pscB.o)
0x90 (size before relaxing)
.stab 0x00001800 0xfc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_round.o)
.stab 0x00001800 0xfc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_round.o)
0x108 (size before relaxing)
.stab 0x000018fc 0x1d4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_split3.o)
.stab 0x000018fc 0x1d4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_split3.o)
0x1e0 (size before relaxing)
.stab 0x00001ad0 0x144 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_trunc.o)
.stab 0x00001ad0 0x144 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_trunc.o)
0x150 (size before relaxing)
.stab 0x00001c14 0x90 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(fp_zero.o)
.stab 0x00001c14 0x90 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_zero.o)
0x9c (size before relaxing)
.stab 0x00001ca4 0x84 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(inverse.o)
.stab 0x00001ca4 0x84 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(inverse.o)
0x90 (size before relaxing)
.stab 0x00001d28 0x4d4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(mulsf3x.o)
.stab 0x00001d28 0x4d4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(mulsf3x.o)
0x4e0 (size before relaxing)
.stab 0x000021fc 0x54 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(square.o)
.stab 0x000021fc 0x3e4 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(sqrt.o)
0x3f0 (size before relaxing)
.stab 0x000025e0 0x54 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(square.o)
0x60 (size before relaxing)
.stab 0x00002250 0x4bc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/libc.a(addsf3x.o)
.stab 0x00002634 0x4bc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(addsf3x.o)
0x4c8 (size before relaxing)
.stab 0x00002af0 0x84 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/libc.a(fp_norm2.o)
0x90 (size before relaxing)
 
.stabstr 0x00000000 0x3bc
.stabstr 0x00000000 0x416
*(.stabstr)
.stabstr 0x00000000 0x3bc /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o
.stabstr 0x00000000 0x416 /usr/lib/gcc/avr/4.3.0/../../../../avr/lib/avr5/crtm64.o
 
.stab.excl
*(.stab.excl)