Home
AVR-libc Introduction - Iowa State University
Contents
1. 22 45 lt avr interrupt h gt Interrupts 238 Vector name Old vector Description Applicable for device name TIMER4 SIG_ Timer Counter4 ATmega640 ATmegal280 ATmegal281 COMPC_vect OUTPUT_ Compare Match ATmega2560 ATmega2561 COMPARE4C C TIMERA SIG Timer Counter4 ATmega640 ATmegal280 ATmegal281 OVF vect OVERFLOWA Overflow ATmega2560 ATmega2561 TIMERS SIG INPUT Timer Counter5 ATmega640 ATmegal280 ATmegal28l vect CAPTURES Capture Event ATmega2560 ATmega2561 TIMERS SIG Timer Counter5 ATmega640 ATmegal280 ATmegal281 COMPA vect OUTPUT Compare Match ATmega2560 ATmega2561 COMPARESA A TIMERS SIG Timer Counter5 ATmega640 ATmegal280 ATmegal281 COMPB vect OUTPUT Compare Match ATmega2560 ATmega2561 COMPARESB B TIMERS SIG Timer Counter5 ATmega640 ATmegal280 ATmegal281 vect OUTPUT Compare Match ATmega2560 ATmega2561 COMPARESC C TIMERS SIG Timer Counter5 ATmega640 ATmegal280 ATmegal281 OVF vect OVERFLOWS Overflow ATmega2560 ATmega2561 TWI vect SIG 2WIRE 2 wire Serial In AT90CANI28 AT90CAN32 AT90CAN64 SERIAL terface ATmegal28 ATmegal284P ATmegal6 ATmegal63 ATmegal68P ATmega32 AT mega323 ATmega328P ATmega32HVB ATmega406 ATmega48P ATmega64 ATmega8 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 AT mega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATtiny48 AT90USB1
2. TW SLA 0x40 SLA R transmitted ACK received 22 31 2 6 define TW MR SLA 0x48 SLA R transmitted NACK received 22 31 27 define TW MT LOST 0x38 arbitration lost in SLA W or data 22 31 2 8 define TW MT DATA 0x28 data transmitted ACK received 22 31 2 9 define TW MT DATA NACK 0x30 data transmitted NACK received 22 31 2 10 define TW MT SLA 0x18 SLA W transmitted ACK received 22 31 2 11 define TW MT SLA 0x20 SLA W transmitted NACK received Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 34 lt util twi h gt TWI bit mask definitions 291 22 31 2 12 define TW NO INFO 0 8 no state information available 22 31 2 13 define TW READ 1 SLA R address 22 31 2 14 define TW START 0x10 repeated start condition transmitted 22 31 2 15 define TW SR LOST GCALL 0x78 arbitration lost in SLA RW general call received ACK returned 22 31 2 16 define TW SR ARB LOST SLA 0x68 arbitration lost in SLA RW SLA W received ACK returned 22 31 2 17 TW SR 0x80 data received ACK returned 22 31 2 18 define TW SR NACK 0x88 data received NACK returned 22 31 2 19 define TW SR GCALL 0x70 general call received ACK returned 22 31 2 20 define TW SR GCALL DATA 0x90 general call data received ACK returned 22 31 2 21 define TW SR GCALL DATA N
3. X Sts 1 2 XOnNCU N out SREG tmp reg no outputs d tmp M SFR MEM ADDR CLKPR Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 36 setbaud h File Reference 367 d x N 0 X 24 36 setbaud h File Reference 24 36 1 Detailed Description Defines define BAUD TOL 2 define UBRR VALUE define UBRRL VALUE define UBRRH VALUE define USE 2X 0 24 37 setjmp h File Reference 24 37 1 Detailed Description Defines define_ SETJMP H 1 define ATTR NORETURN attribute noreturn Functions intsetjmp buf jmpb e void longjmp jmp buf jmpb int ret ATTR NORETURN 24 38 sleep h File Reference 24 38 1 Detailed Description Defines define AVR SLEEP 1 define SLEEP CONTROL REG MCUCR define SLEEP ENABLE MASK BV SE Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 39 stdint h File Reference 368 Functions 24 39 24 39 1 Defines void sleep enable void void sleep disable void void sleep cpu void void sleep mode void void sleep bod disable void stdint h File Reference Detailed Description define _ USING 8 0 define _ CONCATenate left right left right right _ CONCATenate left right Limits of specified width integer types C implementations should define these macros only when
4. mmcu architecture Compile code for architecture Currently known architectures are Architecture Macros avrl AVR ARCH 1 AVR ASM ONLY AVR 2 BYTE avr2 AVR ARCH 2 AVR 2 BYTE PC 2 avr25 1 AVR ARCH 25 AVR HAVE MOVW 1 AVR HAVE LPMX AVR 2 BYTE P avr3 AVR ARCH 3 AVR MEGA 5 AVR HAVE JMP CALL AVR 2 BYTE PC avr3l AVR ARCH 31 AVR AVR HAVE RAMPZ 4 AVR HAVE ELPM 4 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 1 Options for the C compiler avr gcc 105 Architecture Macros avr35 3 AVR ARCH 235 AVR MEGA 5 AVR HAVE JMP CALL AVR HAVE avr4 AVR ARCH 4 AVR ENHANCED 5 AVR HAVE MOVW AVR HAVE avr5 AVR ARCH 5 AVR MEGA 5 AVR ENHANCED 5 AVR HAVE JMP CALL avr51 AVR ARCH 51 AVR MEGA AVR ENHANCED AVR HAVE MOVW 1 AVI avr6 2 AVR ARCH AVR MEGA 5 AVR ENHANCED 5 AVR HAVE JMP CALL 1 New in GCC 42 2 Unofficial patch for GCC 4 1 3 New in GCC 4 2 3 4 New in GCC 4 3 5 Obsolete By default code is generated for the avr2 architecture Note that when only using mmcu architecture but no mmcu MCU type including the file lt avr io h gt cannot work since it cannot decide which device s definitions to select e mncu MCU type The following MCU types are currently und
5. 104 13 1 2 Selected general compiler options 110 13 2 Options for the assembler avr as 112 13 2 1 Machine specific assembler options 112 13 2 2 Examples for assembler options passed through the C compiler 113 13 3 Controlling the 113 13 3 1 Selected linker options 113 13 3 2 Passing linker options from the C compiler 115 14 Using the avrdude program 116 15 Release Numbering and Methodology 118 15 1 Release Version Numbering Scheme 118 LL Stable Versus 2 2222 2221 Ey ded S 118 15 1 2 Development Versions s sses ak ka bee RR 118 15 2 Releasing AVR Libe o e ces ee m we 8 m Rs 119 15 2 1 Creating a cys branchi uu zoo RR SD 119 15 2 2 Makinpareleas 2 2 120 16 Acknowledgments 121 17 Todo List 122 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS vi 18 Deprecated List 122 19 Module Index 123 MONES mm pre ne 123 20 Data Structure Index 125 LIJEK Mj DD m ene 125 21 File Index 125 ARM 1 Re pes 125 22 Module Documentation 129 22 1 alloca h Allocate space in the stack 129 22 11 Detaled Descriphon 2 amp 2 94 Se be ERR 129 22 1 2 Function Documentation p ee sa a parane iaa 129 22 2 Diagnostics 2 222 130 2221 Deusbdieserptian lt 6 2426250 i een ced 130
6. avr gcc g mmcu atmega8 Wl1 Map demo map o demo elf demo o Some points of interest in the demo map file are rela plt rela plt text 0x00000000 0 110 vectors vectors 0x00000000 0x26 c avrdev avr libc avr libc 1 6 6 avr lib avr4 atmega8 crtm8 o 0x00000000 vectors 0x00000000 vector default vectors x progmem gccx x progmem x 0x00000026 ALIGN 0x2 0x00000026 trampolines start trampolines trampolines 0x00000026 0 0 linker stubs x trampolinesx 0x00000026 trampolines end Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 Asimple project 312 jumptables jumptables x lowtext lowtextx 0x00000026 _ Ctors_start The text segment where program instructions are stored starts at location 0x0 finti2 x fini2 finil finil finiO0 fini 0x0000010c x fini0 0x00000110 data 0x00800060 0x00800060 data data 0x00800060 data 0x00800060 data 0x00800060 data 0x00800060 data 0x00800060 x datax rodata x rodatax x gnu linkonce dx 0x00800060 0x00800060 0x00800060 bss 0x00800060 0x00800060 x bss bss 0x00800060 bss 0x00800063 bss 0x00800063 bss 0x00800063 bss 0x00800063 x bssx COMMON 0x00800063 0x00000110 0x00000110 noinit 0x00800063 0x00800063 noinit x 0x00800063 0x00800063 0x00800063 eeprom 0x00810000 x 0x00810000 0 4 0 0 0 0 0 0
7. 9051200 419052313 9052323 9052333 419052343 AT90S4414 9054433 419054434 9058515 AT90S8535 AT90PWM216 AT90PWM2B AT90PWM316 AT90PWM3B AT90PWM3 AT90PWM2 AT90PWM1 AT90CANI28 AT90CAN32 AT90CAN64 ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal6l ATmegal62 ATmegal63 ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega32 ATmega323 ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega32HVB AT mega406 ATmega48P ATmega64 mega645 ATmega6450 ATmega649 ATmega6490 ATmega8 ATmega8515 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 AT megal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATmegal6HVA ATtinyll ATtiny12 ATtinyl3 ATtinyl5 ATtiny22 ATtiny2313 ATtiny26 ATtiny28 ATtiny43U ATtiny48 ATtiny45 ATtiny25 ATtiny85 ATtiny261 ATtiny46l AT tiny861 AT90USB162 9005 82 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 INTI vect SIG INTERRUPTI External Interrupt Request 1 AT90S2313 419052333 9054414 9054433 419054434 9058515 AT90S8535 AT90PWM216 AT90PWM2B AT90PWM316 AT90PWM3B AT90PWM3 AT90PWM2 AT90PWM1 AT90CANI28 AT90CAN32 AT90CAN64 ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal6l ATmegal62 ATmegal63 ATmegal68P ATmega32 ATmega323 ATmega328P ATmega32HVB ATmega406 AT mega48P ATmega
8. if Mn uart putchar Nr loop until bit is set USR UDRE UDR return 0 so it could be used for fdevopen too void debug_P const char xaddr char c while c read byte uart putchar oc int main void ioinit initialize UART debug P PSTR foo was here n return 0 Note By convention the suffix _P to the function name is used as an indication that this function is going to accept a program space string Note also the use of the PSTRQ macro Back to FAQ Index Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 21 Why does the compiler compile an 8 bit operation that uses bitwise operators into a 16 bit operation in assembly 78 11 21 Why does the compiler compile an 8 bit operation that uses bitwise operators into a 16 bit operation in assembly Bitwise operations in Standard C will automatically promote their operands to an int which is by default 16 bits in avr gcc To work around this use typecasts on the operands including literals to declare that the values are to be 8 bit operands This may be especially important when clearing a bit var amp mask wrong way x The bitwise not operator will also promote the value in mask to an int To keep it an 8 bit value typecast before the not operator var amp unsigned char mask Back to FAQ Index 11 22 How to detect
9. 22 21 2 3 define bit is set sfr bit SFR BYTE sfr amp BV bit include lt avr io h gt Test whether bit bit in IO register sfr is set This will return a 0 if the bit is clear and non zero if the bit is set 22 21 2 4 define loop_until_bit_is_clear sfr bit do while bit is set sfr bit include lt avr io h gt Wait until bit bit in IO register s fr is clear Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 22 lt avr sleep h gt Power Management and Sleep Modes 269 22 21 2 5 until bit is set sfr bit do while bit_is_clear sfr bit include lt avr io h gt Wait until bit bit in IO register s fr is set 22 22 lt avr sleep h gt Power Management and Sleep Modes 22 22 11 Detailed Description finclude lt avr sleep h gt Use of the SLEEP instruction can allow an application to reduce its power comsump tion considerably AVR devices can be put into different sleep modes Refer to the datasheet for the details relating to the device you are using There are several macros provided in this header file to actually put the device into sleep mode The simplest way is to optionally set the desired sleep mode using set Sleep it usually defaults to idle mode where the CPU is put on sleep but all peripheral clocks are still running and then call s1eep mode This macro automatically sets the sleep enable bit goes to sleep and
10. Returns The function returns strlen src If retval gt siz truncation occurred 22 18 4 16 size tstrlen P P src The function is similar to strlen except that src is a pointer to a string in program space Returns The strlen function returns the number of characters in src Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 260 22 18 4 17 int strncasecmp P const char 57 P 52 size Compare two strings ignoring case The strncasecmp_P function is similar to strcasecmp except it only compares the first n characters of 51 Parameters 81 A pointer to a string in the devices SRAM 52 A pointer to a string in the devices Flash n The maximum number of bytes to compare Returns The strncasecmp P function returns an integer less than equal to or greater than zero if s1 or the first n bytes thereof is found respectively to be less than to match or be greater than s2 A consequence of the ordering used by strncasecmp P is that if s1 is an initial substring of 52 then 51 is considered to be less than s2 22 18 4 18 char x strncat_P char x dest PGM P src size t len Concatenate two strings The strncat_P function is similar to strncat except that the src string must be located in program space flash Returns The strncat_P function returns a pointer
11. Variant of vsnprintf that uses a fmt string that resides in program memory 22 9 3 40 vsprintf char x s const char x va_list ap Like sprintf but takes a variable argument list for the arguments Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 186 22 9 3 41 int vsprintf_P char x s const char x fmt va_list ap Variant of vsprintf that uses a fmt string that resides in program memory 22 10 lt stdlib h gt General utilities 22 10 1 Detailed Description include lt stdlib h gt This file declares some basic C macros and functions as defined by the ISO standard plus some AVR specific extensions Data Structures struct div t struct ldiv t Non standard i e non ISO C functions char long int val char x__s int radix char utoa unsigned int __val char s int radix char ultoa unsigned long int val char __s int radix long random void void srandom unsigned long __ seed long random unsigned long ctx char itoa int __ val char __s int radix define RANDOM MAX Ox7FFFFFFF Conversion functions for double arguments Note that these functions are not located in the default library 1ibc a but in the mathematical library 1ibm a So when linking the application the 1m option needs to be specified e char dtostre double val char s unsigned char __ prec unsigned c
12. binary conversion and up to 36 If radix is greater than 10 the next digit after 9 will be the letter a The utoa function returns the pointer passed as s Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 197 22 10 5 Variable Documentation 22 10 51 char malloc heap end malloc tunable 22 10 5 2 charx malloc heap start malloc tunable 22 10 5 3 size t malloc margin malloc tunable 22 41 lt string h gt Strings 22 11 1 Detailed Description finclude string h The string functions perform string operations on NULL terminated strings Note If the strings you are working on resident in program space flash you will need to use the string functions described in lt avr pgmspace h gt Program Space Utilities Defines define FFS x Functions int ffs int int ffsl long val int ffsll long long val void memccpy void const void int size 1 void memchr const void int size t ATTR_ PURE int memcmp const void const void size t ATTR_PURE void memcpy void const void size t void memmem const void size t const void size t ATTR PURE void memmove void const void size t void memrchr const void int size_t PURE Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 198 voi
13. include lt avr io h gt fuse_t fuse attribute section fuse low LFUSE DEFAULT extended EFUSE DEFAULT int main void return 0 If you are compiling in C you cannot use the designated intializers so you must do include avr io h FUSES LFUSE DEFAULT low FUSE 00 570 amp FUSE BOOTSZ1 amp FUSE EESAVE amp FUSE SPIEN amp FUSE JTAGEN EFUSE DEFAULT extended int main void return 0 However there are a number of caveats that you need to be aware of to use this API properly Be sure to include avr io h to get all of the definitions for the API The FUSES macro defines a global variable to store the fuse data This variable is assigned to its own linker section Assign the desired fuse values immediately in the variable initial ization The fuse section in the ELF file will get its values from the initial variable assignment ONLY This means that you can NOT assign values to this variable in functions and the new values will not be put into the ELF fuse section The global variable is declared in the FUSES macro has two leading underscores which means that it is reserved for the implementation meaning the library so it will not conflict with a user named variable Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen high FUSE_BOOTSZO FUSE_BOOTSZ1 amp FUSE_EESAVE amp FUSE SPIEN amp FUSE JTAGEN high 22 45 lt
14. include lt avr io h gt volatile uint16 t ctr ISR TIMERI1 OVF CUT int main void ctr 0x200 start_timer while ctr 0 wait There is a chance where the main context will exit its wait loop when the variable ct x just reached the value OxFF This happens because the compiler cannot natively access a 16 bit variable atomically in an 8 bit CPU So the variable is for example at 0 100 the compiler then tests the low byte for 0 which succeeds It then proceeds to test the high byte but that moment the ISR triggers and the main context is interrupted The ISR will decrement the variable from 0x100 to OxFF and the main context proceeds It now tests the high byte of the variable which is now also 0 so it concludes the variable has reached 0 and terminates the loop Using the macros from this header file the above code can be rewritten like include lt inttypes h gt include lt avr interrupt h gt finclude lt avr io h gt include lt util atomic h gt volatile uintl16 t ctr ISR TIMERI1 OVF CUCI Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 25 lt util atomic h gt Atomically and Non Atomically Executed Code BlocB98 int main void ctr 0x200 start timer sei uintl6 t ctr copy do ATOMIC BLOCK ATOMIC_FORCEON ctr copy ctr while ctr_copy 0 This will install the appropria
15. 11 13 How do I pass an IO port as a parameter to a function 69 finclude inttypes h include avr io h void set bits func wrong volatile uint8 t port uint8 t mask port mask void set bits func correct volatile uint8_t xport uint8 t mask xport mask define set_bits_macro port mask port mask int main void set bits func wrong PORTB set bits func correct amp PORTB 0x55 set bits macro PORTB 0 0 return 0 The first function will generate object code which is not even close to what is intended The major problem arises when the function is called When the compiler sees this call it will actually pass the value of the PORTB register using an IN instruction instead of passing the address of PORTB e g memory mapped io addr of 0x38 io port 0x18 for the mega128 This is seen clearly when looking at the disassembly of the call set bits func wrong PORTB 10a 6a ea ldi r22 OxAA 170 106 88 r24 0 18 24 10e 0e 94 65 00 call So the function once called only sees the value of the port register and knows nothing about which port it came from At this point whatever object code is generated for the function by the compiler is irrelevant The interested reader can examine the full disassembly to see that the function s body is completely fubar The second function shows how to pass by reference the memory ma
16. 22 6 3 30 int signbit double x The signbit function returns a nonzero value if the value of __x has its sign bit set This is not the same as __x lt 0 0 because IEEE 754 floating point allows zero to be signed The comparison 0 0 lt 0 0 is false but signbit 0 0 will return a nonzero value 22 6 3 31 double sin double x The sin function returns the sine of x measured in radians 22 6 3 32 double sinh double x The sinh function returns the hyperbolic sine of __x 22 6 3 33 double sqrt double x The sqrt function returns the non negative square root of x 22 6 3 34 double square double x The function square returns x x Note This function does not belong to the C standard definition Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 227 lt setjmp h gt Non local goto 153 22 6 3 35 double tan double x The tan function returns the tangent of __x measured in radians 22 6 3 36 double tanh double x The tanh function returns the hyperbolic tangent of x 22 6 3 37 double trunc double x The trunc function rounds the nearest integer not larger in absolute value 227 lt setjmp h gt Non local goto 22 7 1 Detailed Description While the C language has the dreaded goto statement it can only be used to jump to a label in the same local function In order to jump directly to another non local function the C librar
17. 51 52 54 55 55 55 56 56 57 58 58 59 59 61 61 61 62 63 63 64 65 66 66 67 68 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS iv 11 14What registers are used by the C compiler 71 11 15How do I put an array of strings completely in ROM 72 ILISHGw ta nse extemal RAM lt 4 solo mew RS 74 flag touse eee 75 11 18How do I relocate code to a fixed 75 11 19My UART is generating nonsense My ATmega128 keeps crashing Port F is completely broken lt lt 20 ls oko dnne 76 11 20Why do all my foo bar strings eat up the SRAM 76 11 21 Why does the compiler compile an 8 bit operation that uses bitwise operators into a 16 bit operation in assembly 78 11 22How to detect RAM memory and variable overlap problems 78 11 23Is it really impossible to program the ATtinyXX inC 79 11 24 What is this clock skew detected 79 11 25Why are many interrupt flags cleared by writing a logical 1 79 11 26 Why have programmed fuses the bit value 0 80 11 27 Which AVR specific assembler operators are available 80 11 28Why are interrupts re enabled in the middle of writing the stack pointer 81 11 29Why are there five different linker scripts 81 11 30How to add a raw binary image to linker output 82 11 31How do I p
18. AVR GCC has sei for enable interrupts and cli fo _ disable interrupts Both of these macros are located in lt avr interrupts h gt AVR GCC has the macro wdt reset in place of __watchdog_reset However there is a whole Watchdog Timer API available in AVR GCC that can be found in lt avr wdt h gt 10 5 Flash Variables The C language was not designed for Harvard architecture processors with separate memory spaces This means that there are various non standard ways to define a vari able whose data resides in the Program Memory Flash IAR uses a non standard keyword to declare a variable in Program Memory flash int mydata AVR GCC uses Variable Attributes to achieve the same effect int mydata _ attribute progmem Note See the GCC User Manual for more information about Variable Attributes avr libc provides a convenience macro for the Variable Attribute finclude avr pgmspace h int mydata PROGMEM Note The PROGMEM macro expands to the Variable Attribute of progmem This macro requires that you include lt avr pgmspace h gt This is the canonical method for defining a variable in Program Space To read back flash data use the read macros defined avr pgmspace h Program Memory handling macros are defined there Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 10 6 Non Returning main 58 There is also a way to create a
19. Returns The memrchr function returns a pointer to the matching byte or NULL if the character does not occur in the given memory area 22 11 3 11 void x memset void dest int val size t len Fill memory with a constant byte The memset function fills the first len bytes of the memory area pointed to by dest with the constant byte val Returns The memset function returns a pointer to the memory area dest 22 11 3 12 int strcasecmp const char 81 const char 52 Compare two strings ignoring case The strcasecmp function compares the two strings s1 and s2 ignoring the case of the characters Returns The strcasecmp function returns an integer less than equal to or greater than Zero if s1 is found respectively to be less than to match or be greater than 52 consequence of the ordering used by strcasecmp is that if 51 is an initial substring of s2 then s1 is considered to be less than s2 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 202 22 11 3 13 char x strcasestr const char s7 const char 52 The strcasestr function finds the first occurrence of the substring s2 in the string s1 This is like strstr except that it ignores case of alphabetic symbols in searching for the substring Glibc GNU extension Returns The strcasestr function returns a pointer to the beginning of the substring or NULL if the substring is not
20. Vb back space or 177 delete deletes the previous character u control U ASCII NAK deletes the entire input buffer w control W ASCII ETB deletes the previous input word delimited by white space r control R ASCII DC2 sends a Vr then reprints the buffer refresh t tabulator will be replaced by a single space The function uart_init takes care of all hardware initialization that is required to put the UART into a mode with 8 data bits no parity one stop bit commonly referred to as 8N1 at the baud rate configured in defines h At low CPU clock frequencies the U2X bit in the UART is set reducing the oversampling from 16x to 8x which allows for a 9600 Bd rate to be achieved with tolerable error using the default 1 MHz RC oscillator The public function uart_putchar again has suitable arguments for direct use by the stdio stream interface It performs the n into r n translation by recursively Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 39 Example using the two wire interface TWI 332 calling itself when it sees a n character Just for demonstration purposes the audible bell ASCII BEL character is implemented by sending a string to stderr so it will be displayed on the LCD The public function uart_getchar implements the line editor If there are char acters available in the line buffer variable rxp is not NULL the next character will be returned from the
21. autoconf 2 59 2 60 is needed to build avr libc in MinGW http downloads sourceforge net mingw msys autoconf 2 59 tar bz2 use mirror internap gt Extract to c msys 1 0 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 12 Tools Required for Building the Toolchain for Windows 97 automake 1 8 2 automake 1 8 1 9 is needed to build avr libc in MinGW http downloads sourceforge net mingw msys automake 1 8 2 tar bz2 use mirror internap gt Extract to c msys 1 0 Install Cygwin Install everything all users UNIX line endings This will take a long time A fat internet pipe is highly recommended It is also recommended that you download all to a directory first and then install from that directory to your machine Note GMP is a prequisite for building MPFR Build GMP first Build GMP for MinGW Version 4 2 3 http gmplib org Build script configure 2 gt amp 1 make 2 gt amp 1 make check 2 gt amp 1 make install 2 gt amp 1 tee gmp configure log tee gmp make log tee gmp make check log tee gmp make install log GMP headers will be installed under usr local include and library installed under usr local lib Build MPFR for MinGW Version 2 3 2 lt http www mpfr org gt Build script configure with gmp usr local 2 gt amp 1 tee mpfr configure log make 2 gt amp 1 tee mpfr make log make check 2 gt amp 1 tee mpfr make ch
22. lt avr ioml63 h gt define SPMCR _SFR_I08 0x37 lt avr iom128 h gt define SPMCR _SFR_MEM8 0x68 dif SFR IO REG P SPMCR out SFR IO ADDR SPMCR r24 else sts _SFR_MEM_ADDR SPMCR r24 endif You can use the in out cbi sbi sbic sbis instructions without the SFR IO REG P test if you know that the register is in the I O space as with SREG for example If it isn t the assembler will complain I O address out of range 0 0x3f so this should be fairly safe If you do not define SFR OFFSET so it will be 0x20 by default all special register addresses are defined as memory addresses so SREG is Ox5f and if code size and speed are not important and you don t like the ugly if above you can always use lds sts to access them But this will not work if SFR OFFSET 0x20 so use a different macro defined only if SFR OFFSET 0x20 for safety sts _SFR_ADDR SPMCR r24 In programs all combinations of SFR 5 COMPAT and SFR OFFSET supported the SFR ADDR SPMCR macro can be used to get the address of the SPMCR register 0x57 or 0x68 depending on device Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 21 lt avr sfr_defs h gt Special function registers 267 22 21 lt avr sfr_defs h gt Special function registers 22 211 Detailed Description When working with microcontrollers many tasks usually consist of controlling internal peripherals
23. movw r0 4 n t movw r30 A3 n t sts 1 C3 n t sts 0 2 n t spm n t oly ori n t su i SFR ADDR SPM REG SFR MEM ADDR RAMPZ2 uint8 t BOOT PAGE FILL uint32 t address uint16_t data y r30 r31 1 yn 24 5 2 8 boot page fill normal address data Value QL extension 4 asm volatile vu um ur T AE A BELE v Im DOVE EVA Ld LIF LAM E Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 5 boot h File Reference 344 movw r0 3 n t sts 0 1 n t spm n t ele su i SFR ADDR SPM REG uint8 t BOOT PAGE FILL uint16_t address uint16_t data y zn yn ro POLE EVE Vu uL 24 5 2 0 boot page write alternate address Value QL extension 4 asm volatile sts 0 1 n t spm n t word Oxffff n t nop n t i SFR MEM ADDR SPM REG r uint8 t BOOT PAGE WRITE 2 uintl16 t address PEELE NU DE i 24 5 2 10 define boot page write extended address Value extension asm volatile movw r30 A3 n t sts SD sts 0 2 n t spm n t i SFR MEM ADDR SPM REG i SFR MEM ADDR RAMPZ r uint8 t BOOT PAGE WRITE uint32 t address br PATI y r30 PO uH LH OU
24. 22 37 A more sophisticated project 322 22 37 3 1 Part 1 Macro definitions A number of preprocessor macros are defined to improve readability and or portability of the application The first macros describe the IO pins our LEDs and pushbuttons are connected to This provides some kind of mini HAL hardware abstraction layer so should some of the connections be changed they don t need to be changed inside the code but only on top Note that the location of the PWM output itself is mandated by the hardware so it cannot be easily changed As the ATmega48 88 168 controllers belong to a more recent generation of AVRs a number of register and bit names have been changed there so they are mapped back to their ATmega8 16 equivalents to keep the actual program code portable The name CPU is the conventional name to describe the CPU clock frequency of the controller This demo project just uses the internal calibrated 1 MHz RC oscillator that is enabled by default Note that when using the lt util delay h gt functions F CPU needs to be defined before including that file The remaining macros have their own comments in the source code The macro TMR1 SCALE shows how to use the preprocessor and the compiler s constant expres sion computation to calculate the value of timer 1 post scaler a way so it only depends on CPU and the desired software clock frequency While the formula looks a bit complicated using a macro offers the advant
25. 24 18 1 Detailed Description 24 19 lock h File Reference 24 19 1 Detailed Description Defines define AVR LOCK 1 define LOCKMEM attribute section lock define LOCKBITS unsigned char _ lock LOCKMEM define LOCKBITS DEFAULT OxFF 24 20 math h File Reference 24 20 1 Detailed Description Defines define PI 3 141592653589793238462643 define SORT2 1 4142135623730950488016887 define builtin nan define INFINITY builtin inf Functions double cos double __ x double fabs double __ x double fmod double __x double y double modf double x double iptr double sin double x double sqrt double x double tan double __ x double floor double x double ceil double x double frexp double __x int __pexp double Idexp double __x int exp double exp double __x double cosh double __x double sinh double x double tanh double x Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 20 math h File Reference 353 double acos double x double asin double __x double atan double x double atan2 double y double x double log double x double log10 double x double pow double __x double y int isnan double __ x int double __x double square double x static double copysign double x double y e double fdim double
26. The memccpy function copies no more than len bytes from memory area src to mem ory area dest stopping when the character val is found Returns The memccpy function returns a pointer to the next character in dest after val or NULL if val was not found in the first len characters of src 22 11 3 5 void x memchr const void src int val size t len Scan memory for a character The memchr function scans the first len bytes of the memory area pointed to by src for the character val The first byte to match val interpreted as an unsigned character stops the operation Returns The memchr function returns a pointer to the matching byte or NULL if the character does not occur in the given memory area Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 200 22 11 3 6 int memcmp const void 57 const void 52 size t len Compare memory areas The memcmp function compares the first len bytes of the memory areas sl and 52 The comparision is performed using unsigned char operations Returns The memcmp function returns an integer less than equal to or greater than zero if the first len bytes of s1 is found respectively to be less than to match or be greater than the first len bytes of s2 Note Be sure to store the result in a 16 bit variable since you may get incorrect results if you use an unsigned char or char due to truncation Warning This functio
27. define boot spm busy wait do while boot_spm_busy Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 5 boot h File Reference 340 define _ BOOT PAGE SPM ENABLE BV PGERS define PAGE WRITE SPM ENABLE BV PGWRT define PAGE SPM ENABLE define RWW ENABLE SPM ENABLE _BV _ COMMON ASRE define BOOT_LOCK_BITS_SET 5 BV BLBSET define boot page fill normal address data define __ boot page fill alternate address data define __ boot page fill extended address data fdefine boot page erase normal address fdefine boot page erase alternate address fdefine boot page erase extended address define boot page write normal address define boot page write alternate address define __ boot page write extended address define __ boot enable define __ boot rww enable alternate define boot lock bits set lock bits define boot lock bits set alternate lock bits define GET LOW FUSE BITS 0 0000 define GET LOCK BITS 0x0001 define GET EXTENDED FUSE BITS 0x0002 define GET HIGH FUSE BITS 0x0003 define boot lock fuse bits get address SIGROW READ SPM ENABLE BV SIGRD fidefine boot signature byte get addr define boot page fill address data boot page
28. function be something that is required for the user to call in order to use the ISR like perhaps an initialization function for the subsystem or perhaps a function that enables the ISR in the first place 8 4 Creating a Library The librarian program is called for archiver and is found in the GNU Binutils project This program will have been built for the AVR target and will therefore be named avr ar The job of the librarian program is simple aggregate a list of object modules into a single library archive and create an index for the linker to use The name that you create for the library filename must follow a specific pattern libname a The name part is the unique part of the filename that you create It makes it easier if the name part relates to what the library is about This name part must be prefixed by lib and it must have a file extension of a for archive The reason for the special form of the filename is for how the library gets used by the toolchain as we will see later on Note The filename is case sensitive Use a lowercase lib prefix and a lowercase a as the file extension The command line is fairly simple avr ar rcs library name list of object modules The command switch tells the program to insert the object modules into the archive with replacement The c command line switch tells the program to create the archive And the s command line switch tells the program to write an obj
29. megal65P ATmegal69 ATmegal69P AT mega32 ATmega323 ATmega325 AT mega3250 ATmega3250P ATmega329 AT mega3290 ATmega3290P ATmega64 AT mega645 ATmega6450 ATmega649 AT mega6490 ATmega8 ATmega8535 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt avr interrupt h gt Interrupts 237 Vector name Old vector Description Applicable for device name TIMER2_ SIG_ Timer Counter2 AT90S4434 9058535 AT90CANI28 OVF_vect OVERFLOW2 Overflow AT90CAN32 AT90CAN64 ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal61 ATmegal62 ATmegal63 ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega32 AT mega323 ATmega325 ATmega3250 ATmega3250P ATmega328P AT mega329 ATmega3290 ATmega3290P ATmega48P ATmega64 ATmega645 ATmega6450 ATmega649 ATmega6490 ATmega8 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 AT mega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 AT mega324P ATmegal64P ATmega644P AT mega644 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 TIMER3_ SIG_INPUT_ Timer Counter3 AT90CAN128 AT90CAN32 AT90CANGA CAPT_vect CAPTURE3 Capture Event ATmegal28 ATmegal284P ATmegal62 ATmega64 ATmega640 ATmegal280 ATmegal281 ATmega2560 AT mega2561 AT90USB 1287 AT90USB1286 AT90USB647 AT90USB646 TIMER3 SIG Timer Counter3 AT90CAN128 AT90CAN32 AT90CANGA COMPA_vect OUTPUT_ Compare Match
30. static Deprecated This function modifies the t imsk register The value you pass via ints is device specific 22 33 lt compat ina90 h gt Compatibility with EWB 3 x include compat ina90 h This is an attempt to provide some compatibility with header files that come with IAR C to make porting applications between different compilers easier No 10096 compat ibility though Note For actual documentation please see the IAR manual 22 34 Demo projects 22 34 1 Detailed Description Various small demo projects are provided to illustrate several aspects of using the open source utilities for the AVR controller series It should be kept in mind that these de mos serve mainly educational purposes and are normally not directly suitable for use in any production environment Usually they have been kept as simple as sufficient to demonstrate one particular feature The simple project is somewhat like the Hello world application for a microcon troller about the most simple project that can be done It is explained in good detail Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 34 Demo projects 297 to allow the reader to understand the basic concepts behind using the tools on an AVR microcontroller The more sophisticated demo project builds on top of that simple project and adds some controls to it It touches a number of avr libc s basic concepts on its way A comprehensive example
31. 0 2 n t out 2 tmp reg N fo Ter 2 result N 2 I SFR IO ADDR RAMPZ N 3c N result N 24 34 2 4 define ELPM enhanced addr Value Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 34 pgmspace h File Reference 360 extension N uint32 t __addr32 uint32 t addr uint8 t _ result N asm N N out 2 SCIT n t N movw r30 1 n t N elpm 0 Z n t N r result N re addr32 N I SFR IO ADDR RAMPZ N30 N result N 24 34 2 5 define ELPM_float_enhanced__ addr Value __extension__ M uint32 t addr32 uint32 t addr float result N asm N N out 2 SCIT M ove 30 1 N elpm 0 Z AnNt N elpm 0 Z4 n t N elpm CO Z AnNt N elpm D0 7 n t r result N r addr32 N I SFR IO ADDR RAMPZ N Tp30T ES N result N 24 34 2 6 define ELPM float xmega addr Value QL extension N uint32 t __addr32 uint32 t addr float result i asm N N in tmp reg 2 n t N out 2 C1 n t movw r30 1 elpm 0 Z AnNt N Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 34 pgmspace h File Reference 361 elpm BO Z AnNt elpmu 00 Z4 elpm
32. 1 avr25 architecture is new in GCC 4 2 2 avr35 architecture is new in GCC 4 2 3 morder1 e morder2 Change the order of register assignment The default is 124 r25 r18 r19 120 r21 r22 r23 r30 r31 r26 127 128 129 r17 r16 r15 r14 r13 r12 r11 r10 r9 r8 r7 r6 r5 r4 r3 12 10 r1 Order 1 uses r18 r19 120 r21 122 r23 r24 r25 r30 r31 126 r27 128 129 r17 r16 r15 r14 r13 r12 r11 r10 r9 r8 r7 r6 r5 r4 r3 12 r0 r1 Order 2 uses 125 r24 123 122 121 r20 r19 r18 r30 r31 r26 r27 r28 r29 r17 r16 r15 r14 r13 r12 r11 r10 r9 r8 r7 r6 r5 r4 r3 12 r1 rO Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 1 Options for the C compiler avr gcc 109 e mint8 Assume int to be an 8 bit integer Note that this is not really supported by avr libc so it should normally not be used The default is to use 16 bit integers mno interrupts Generates code that changes the stack pointer without disabling interrupts Normally the state of the status register SREG is saved in a temporary register interrupts are disabled while changing the stack pointer and SREG is restored Specifying this option will define the preprocessor macro INTERRUPTS to the value 1 e mcall prologues Use subroutines for function prologue epilogue For complex functions that use many registers that needs to be saved restored on functi
33. 161 intptr t avr stdint 164 inttypes h 348 io h 351 isalnum ctype 130 isalpha ctype 130 isascii ctype 131 isblank ctype 131 iscntrl ctype 131 isdigit ctype 131 isfinite avr_math 149 isgraph ctype 131 isinf avr_math 149 islower ctype 131 isnan avr_math 149 isprint ctype 131 ispunct ctype 131 ISR avr_interrupts 242 ISR_ALIAS avr_interrupts 242 ISR_ALIASOF avr_interrupts 243 ISR_BLOCK avr_interrupts 243 ISR_NAKED avr_interrupts 243 ISR_NOBLOCK avr_interrupts 243 isspace ctype 131 isupper ctype 131 isxdigit ctype 132 itoa avr_stdlib 190 labs avr_stdlib 190 ldexp avr math 149 Idiv avr_stdlib 190 ldiv t 337 quot 337 rem 337 lock h 351 log avr math 150 log10 avr math 150 longjmp setjmp 153 loop until bit is clear avr sfr 267 loop until bit is set avr sfr 267 lrint avr_math 150 lround avr_math 150 Itoa avr_stdlib 191 M_PI avr_math 146 M_SQRT2 avr_math 146 malloc avr_stdlib 191 math h 351 memccpy Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX avr string 198 memccpy S 354 memchr avr string 198 memchr S 354 memchr P avr pgmspace 255 memchr PS 354 memcmp avr string 198 mememp S 354 memcemp P avr pgmspace 255 memcmp PS 354 memcpy avr string 199 memcpy S 354 memcpy P avr pgmspace 255 memcpy_P S 354 memmem avr string 199 memmem S 354 memmem_P avr_pg
34. 222 2 Denne Documentation cs o o eisd bok we Rie 130 22 3 ctype h Character Operations 2 131 22 5 Description 22 RR bk 131 22 3 3 Function Documentation lt ses se Sb ee RES 131 224 ennobo sSystemBrtror 2 2 22 2 2 22 2 133 224 1 Detailed Description 133 224 2 Define Documentation 2 134 22 5 lt inttypes h gt Integer Type conversions 134 22 5 1 Detailed Description 222 2 2 134 22 5 3 Define Documentation 22222 222 2 2 RE Rs 137 22 5 9 Typedef Documentation lt 2 ses comm 146 22 6 lt lt saa o o x ER 146 22 6 1 Detailed Description lt s e s s esr reste dettes 146 226 2 Deine Documentation e sa oe 24 04 Fed dae ew 147 22 6 3 Function Documentation 148 22 7 lt setjmp h gt Non local goto 2 2 153 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS vii 22 1 1 Detailed Description 153 22 1 3 Punchon Docnmentation e e ss 66 RR RR 154 22 8 lt stdint h gt Standard Integer 2 155 22 8 1 Description 22 22 2 2 5 gt 155 22 5 2 Define Documentation 2222 2 22222 2 2 159 22 8 9 Typedef Documentation lt ux RR e E 164 229 lt stdio h gt Standard IO facilities ro o RR o 167 2291 Detaled Description
35. Characters are read from stream and processed in a way described by fmt Conversion results will be assigned to the parameters passed via ap The format string fmt is scanned for conversion specifications Anything that doesn t comprise a conversion specification is taken as text that is matched literally against the input White space in the format string will match any white space in the data including none all other characters match only itself Processing is aborted as soon as the data and format string no longer match or there is an error or end of file condition on stream Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 183 Most conversions skip leading white space before starting the actual conversion Conversions are introduced with the character 96 Possible options can follow the 96 e x indicating that the conversion should be performed but the conversion result is to be discarded no parameters will be processed from ap e the character h indicating that the argument is a pointer to short int rather than int the2 characters hh indicating that the argument is a pointer to char rather than int e the character 1 indicating that the argument is a pointer to long int rather than int for integer type conversions or a pointer to double for floating point conversions In addition a maximal field width may be specified as a nonzero positive deci
36. FDEV ERR 171 _ SETUP READ 171 JFDEV SETUP RW 171 FDEV SETUP WRITE 171 clearerr 174 EOF 171 fclose 174 fdev close 171 fdev get udata 172 set udata 172 FDEV SETUP STREAM 172 fdev setup stream 172 fdevopen 174 feof 175 ferror 175 fflush 175 fgetc 175 fgets 175 FILE 172 fprintf 175 fprintf P 175 fputc 176 fputs 176 fputs P 176 fread 176 fscanf 176 fscanf P 176 fwrite 176 getc 173 getchar 173 gets 176 printf 177 ecagd amp cgc g printf_P 177 pute 173 putchar 173 puts 177 puts_P 177 scanf 177 scanf_P 177 snprintf 177 snprintf_P 177 sprintf 177 sprintf_P 178 sscanf 178 sscanf_P 178 stderr 173 stdin 173 stdout 173 ungetc 178 vfprintf 178 vfprintf P 181 vfscanf 181 vfscanf P 184 vprintf 184 vscanf 184 vsnprintf 184 vsnprintf P 184 vsprintf 184 vsprintf P 184 avr stdlib compar fn t 187 malloc heap end 196 malloc heap start 196 malloc margin 196 abort 187 abs 187 atof 187 atoi 188 atol 188 bsearch 188 calloc 188 div 189 DTOSTR ALWAYS SIGN 187 DTOSTR PLUS SIGN 187 DTOSTR_UPPERCASE 187 dtostre 189 dtostrf 189 exit 189 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen memcopy 198 memchr 198 mememp 198 memcpy 199 memmem 199 memmove 199 memrchr 200 memset 200 strcasecmp 200 strcasestr 200 INDEX 390 free 190 strlwr 203
37. Figure 9 Wiring of the STK500 The LCD controller is used in 4 bit mode including polling the busy flag so the R W line from the LCD controller needs to be connected Note that the LCD con troller has yet another supply pin that is used to adjust the LCD s contrast V5 ically that pin connects to a potentiometer between Vcc and GND Often it might work to just connect that pin to GND while leaving it unconnected usually yields an unreadable display Port A has been chosen as 7 pins on a single port are needed to connect the LCD yet all other ports are already partially in use port B has the pins for in system programming ISP port C has the ports for JTAG can be used for debugging and port D is used for the UART connection 22 38 2 Functional overview The project consists of the following files stdiodemo c This is the main example file defines h Contains some global defines like the LCD wiring hd44780 c Implementation of an HD44780 LCD display driver e hd44780 h Interface declarations for the HD44780 driver 1cd c Implementation of LCD character IO on top of the HD44780 driver 1cd h Interface declarations for the LCD driver Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 38 Using the standard IO facilities 327 uart c Implementation of a character IO driver for the internal UART uart h Interface declarations for the UART driver 22 38 3 A code walkthrough 22
38. Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 13 Building the Toolchain for Windows 99 Binutils Open source code pacakge and patch as necessary Configure and build in a directory outside of the source code tree Set PATH in order MikTex executables gt usr local bin usr bin bin mingw bin c cygwin bin install directory gt bin Configure CFLAGS D USE MINGW ACCESS Sarchivedir configure prefix installdir target avr disable nls enable doc datadir installdir doc binutils with gmp usr local with mpfr usr local 2 amp 1 tee binutils configure log Make make all html install install html 2 gt amp 1 tee binutils make log Manually change documentation location GCC Open source code pacakge and patch as necessary Configure and build in a directory outside of the source code tree Set PATH in order MikTex executables gt usr local bin usr bin bin mingw bin c cygwin bin install directory gt bin Configure Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 13 Building the Toolchain for Windows 100 CFLAGS D USE MINGW ACCESS gcc version configure prefix installdir target target enable languages c ct with dwarf2 enable win32 registry WinAVR release disable nls with gmp
39. INT32 C avr stdint 158 INT32 MAX avr stdint 158 INT32 MIN avr stdint 158 int32 t avr stdint 163 INT64 C avr stdint 158 INT64 MAX avr stdint 158 64 MIN avr stdint 158 int64 t avr stdint 163 INT8 C avr stdint 158 INT8 MAX avr stdint 159 8 MIN avr stdint 159 int8 t avr stdint 163 int farptr t avr inttypes 145 INT FASTI6 MAX avr stdint 159 INT FAST16 MIN avr stdint 159 int fastl6 t avr stdint 163 INT FAST32 MAX avr stdint 159 INT FAST32 MIN avr stdint 159 int fast32 t avr stdint 163 INT FAST64 MAX avr stdint 159 INT FAST64 MIN avr stdint 159 int fast64 t avr stdint 163 INT FAST8 MAX avr stdint 159 INT FAST8 MIN avr stdint 159 int fast8 t avr stdint 164 INT LEASTI6 MAX avr stdint 159 INT LEAST1I6 MIN avr stdint 160 int least16 t avr stdint 164 INT LEAST32 MAX avr stdint 160 INT LEAST32 MIN avr stdint 160 int least32 t avr stdint 164 INT LEAST64 MAX avr stdint 160 INT LEAST64 MIN avr stdint 160 int least64 t avr stdint 164 INT LEAST8 MAX avr stdint 160 INT LEAST8 MIN avr stdint 160 int least8 t avr stdint 164 INTERRUPT deprecated items 294 interrupt h 347 INTMAX C avr stdint 160 INTMAX MAX avr stdint 160 MIN avr stdint 160 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX intmax t avr stdint 164 MAX avr stdint 160 INTPTR MIN avr stdint
40. It is usually the best to use the latest released version of each of the tools 12 2 Required Tools GNU Binutils http sources redhat com binutils Installation Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 3 Optional Tools 90 12 3 GCC httpi goc gnu org Installation AVR Libc http savannah gnu org projects avr libc Installation Optional Tools You can develop programs for AVR devices without the following tools They may or may not be of use for you AVRDUDE http savannah nongnu org projects avrdude Installation Usage Notes GDB http sources redhat com gdb Installation SimulAVR http savannah gnu org projects simulavr Installation AVaRICE http avarice sourceforge net Installation 124 GNU Binutils for the AVR target The binutils package provides all the low level utilities needed in building and ma nipulating object files Once installed your environment will have an AVR assembler avr as linker avr 13G and librarian avr ar and avr ranlib In addi tion you get tools which extract data from object files avr ob dissassem ble object file information avr ob jdump and strip information from object files avr strip Before we can build the C compiler these tools need to be in place Download and unpack the source files Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 4 GNU Binutils for the AVR target 9
41. Standard IO facilities 182 using conversion flags these flags are parsed correctly from the format specification but then simply ignored This version can be requested using the following compiler options Wl u vfprintf lprintf min If the full functionality including the floating point conversions is required the follow ing options should be used Wl u vfprintf lprintf flt lm Limitations The specified width and precision can be at most 255 Notes For floating point conversions if you link default or minimized version of vfprintf the symbol will be output and double argument will be skiped So you output below will not be crashed For default version the width field and the pad to left symbol minus option will work in this case The hh length modifier is ignored char argument is promouted to int More exactly this realization does not check the number of h symbols But the 11 length modifier will to abort the output as this realization does not operate long long arguments The variable width or precision field an asterisk symbol is not realized and will to abort the output 22 9 3 33 vfprintf P FILE x stream const char _ fmt va list Variant of v printf that uses a fmt string that resides in program memory 22 9 3 34 vfscanf FILE x stream const char fmt va list ap Formatted input This function is the heart of the scanf family of functions
42. The PWM is being used in 10 bit mode so we need a 16 bit variable to remember the current value Note 4 This section determines the new value of the PWM Note 5 Here s where the newly computed value is loaded into the PWM register Since we are in an interrupt routine it is safe to use a 16 bit assignment to the register Outside of an interrupt the assignment should only be performed with interrupts disabled if there s a chance that an interrupt routine could also access this register or another register that uses TEMP see the appropriate FAQ entry Note 6 This routine gets called after a reset It initializes the PWM and enables interrupts Note 7 The main loop of the program does nothing all the work is done by the interrupt routine The sleep mode puts the processor on sleep until the next interrupt to conserve power Of course that probably won t be noticable as we are still driving a LED it is merely mentioned here to demonstrate the basic principle Note 8 Early AVR devices saturate their outputs at rather low currents when sourcing cur rent so the LED can be connected directly the resulting current through the LED will be about 15 mA For modern parts at least for the ATmega 128 however Atmel has drastically increased the IO source capability so when operating at 5 V Vcc R2 is needed Its value should be about 150 Ohms When operating the circuit at 3 V it can still be omitted tho
43. The strsep function locates in the string referenced by sp the first occurrence of any character in the string delim or the terminating 0 character and replaces it with a 707 The location of the next character after the delimiter character or NULL if the end of the string was reached is stored in sp An empty field i e one caused by two adjacent delimiter characters can be detected by comparing the location referenced by the pointer returned sp to 707 Returns The strsep function returns a pointer to the original value of sp If is initially NULL strsep returns NULL 22 11 3 34 size_t strspn const char s const char accept The strspn function calculates the length of the initial segment of s which consists entirely of characters in accept Returns The strspn function returns the number of characters in the initial segment of s which consist only of characters from accept The terminating zero is not considered as a part of string Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 208 22 11 3 35 char x strstr const char s7 const char 52 Locate a substring The strstr function finds the first occurrence of the substring s2 in the string s1 The terminating 0 characters are not compared Returns The strstr function returns a pointer to the beginning of the substring or NULL if the substring is not foun
44. This also explains why the variable mcucsr that mirrors the register s value needs to be placed into the noinit section because other wise the default initialization which happens after init3 would blank the value again As the initialization code is not called using CALL RET instructions but rather con catenated together the compiler needs to be instructed to omit the entire function pro logue and epilogue This is performed by the naked attribute So while syntactically handle mcucsr is a function to the compiler the compiler will just emit the in structions for it without setting up any stack frame and not even a RET instruction at the end Function ioinit centralizes all hardware setup The very last part of that function demonstrates the use of the EEPROM variable ee pwm to obtain an EEPROM address that can in turn be applied as an argument to eeprom read word The following functions handle UART character and string output UART input is handled by an ISR There are two string output functions printstr and printstr p The latter function fetches the string from program memory Both functions translate a newline character into a carriage return newline sequence so a simple n can be used in the source code The function set pwm propagates the new PWM value to the PWM performing range checking When the value has been changed the new percentage will be an nounced on the serial link The current value is mirror
45. USARTO SIG USARTO Rx AT90CANI28 AT90CAN32 AT90CANGA vect UARTO Complete ATmegal28 ATmegal284P ATmegal65 RECV ATmegal65P ATmegal69 ATmegal69P ATmega325 ATmega329 ATmega64 AT mega645 ATmega649 ATmega640 AT mega1280 ATmegal281 ATmega2560 AT mega2561 ATmega324P ATmegal64P AT mega644P ATmega644 USARTO SIG USARTO Tx ATmegal62 TXC vect USARTO Complete TRANS USARTO SIG USARTO Tx AT90CANI28 AT90CAN32 AT90CAN64 TX vect UARTO Complete ATmegal28 ATmegal284P ATmegal65 TRANS ATmegal65P ATmegal69 ATmegal69P ATmega325 ATmega3250 ATmega3250P ATmega329 ATmega3290 ATmega3290P ATmega64 ATmega645 ATmega6450 AT mega649 ATmega6490 ATmega640 AT megal280 ATmegal281 ATmega2560 AT mega2561 ATmega324P ATmegal64P AT mega644P ATmega644 USARTO SIG USARTO Data AT90CANI28 AT90CAN32 AT90CANGA UDRE vect UARTO Register Empty ATmegal28 ATmegal284P ATmegal62 DATA ATmegal65 ATmegal65P ATmegal69 ATmegal69P ATmega325 ATmega329 ATmega64 ATmega645 ATmega649 ATmega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 USARTI SIG USARTI Rx ATmegal62 vect USARTI Complete RECV USARTI SIG USARTI Rx AT90CANI28 AT90CAN32 AT90CANGA vect UARTI Complete ATmegal28 ATmegal284P ATmega64 RECV ATmega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 AT mega324P ATmegal64P ATmega644P ATmega644 AT90
46. alloca returns a pointer to the beginning of the allocated space If the allocation causes stack overflow program behaviour is undefined Warning Avoid use alloca inside the list of arguments of a function call 22 2 lt assert h gt Diagnostics 22 2 1 Detailed Description finclude lt assert h gt This header file defines a debugging aid As there is no standard error output stream available for many applications using this library the generation of a printable error message is not enabled by default These messages will only be generated if the application defines the macro ASSERT USE STDERR before including the assert h gt header file By default only abort will be called to halt the application Defines define assert expression 22 2 3 Define Documentation 22 2 2 1 ftdefine assert expression Parameters expression Expression to test for The assert macro tests the given expression and if it is false the calling process is terminated A diagnostic message is written to stderr and the function abort is called effectively terminating the program If expression is true the assert macro does nothing The assert macro may be removed at compile time by defining NDEBUG as a macro e g by using the compiler option DNDEBUG Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 3 lt ctype h gt Character Operations 131 22 3 lt ctype h gt Character Operations
47. ficient storage in s Note The minimal size of the buffer s depends on the choice of radix For example if the radix is 2 binary you need to supply a buffer with a minimal length of 8 sizeof unsigned long int 1 characters i e one character for each bit plus one for the string terminator Using a larger radix will require a smaller minimal buffer size Warning If the buffer is too small you risk a buffer overflow Conversion is done using the radix as base which may be a number between 2 binary conversion and up to 36 If radix is greater than 10 the next digit after 9 will be the letter a The ultoa function returns the pointer passed as s 22 10 4 30 char utoa unsigned int val char s int radix Convert an unsigned integer to a string The function utoa converts the unsigned integer value from val into an ASCII repre sentation that will be stored under s The caller is responsible for providing sufficient storage in s Note The minimal size of the buffer s depends on the choice of radix For example if the radix is 2 binary you need to supply a buffer with a minimal length of 8 sizeof unsigned int 1 characters i e one character for each bit plus one for the string terminator Using a larger radix will require a smaller minimal buffer size Warning If the buffer is too small you risk a buffer overflow Conversion is done using the radix as base which may be a number between 2
48. http savannah nongnu org projects avr libc 71 asm Statement Let s start with a simple example of reading a value from port D asm in 0 1 r value I SFR IO ADDR PORTD Each asm statement is devided by colons into up to four parts 1 The assembler instructions defined as a single string constant in 0 1 2 A list of output operands separated by commas Our example uses just one value 3 A comma separated list of input operands Again our example uses one operand only I SFR IO ADDR PORTD 4 Clobbered registers left empty in our example You can write assembler instructions in much the same way as you would write assem bler programs However registers and constants are used in a different way if they refer to expressions of your C program The connection between registers and C operands is specified in the second and third part of the asm instruction the list of input and output operands respectively The general form is Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7 1 GCC asm Statement 38 asm code output operand list input operand list clobber list In the code section operands are referenced by a percent sign followed by a single digit 0 refers to the first 1 to the second operand and so forth From the above example Orefers to r value and 1 refers to I SFR IO ADDR PORTD This may still look a little odd now but th
49. i define 16 i define PRId32 1 define PRIGLEAST32 Id define PRIdFAST32 Id define PRIi32 li define PRULEAST32 li define PRIiFAST32 li define PRIdPTR PRId16 define PRUPTR PRII16 define PRIo8 o define PRIOLEASTS o define PRIoFASTS o define PRIu8 define PRIULEASTS define PRIUFASTS define PRIx8 x define PRIXLEASTS x define PRIXFASTS8 x define PRIX8 X define PRIXLEASTS X define PRIXFASTS X define PRIo16 o define PRIOLEAST16 define PRIOFAST16 o Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt inttypes h gt Integer Type conversions 136 define PRIu16 define PRIULEAST16 u define PRIUFAST16 u define PRIx16 x define PRIxLEAST16 x define PRIxFAST16 x define PRIX16 X define PRIXLEASTI6 X define PRIXFASTI6 X define PRIo32 lo define PRIOLEAST32 lo define PRIOFAST32 lo define PRIu32 lu define PRIULEAST32 define PRIUFAST32 lu define PRIx32 Ix define PRIxLEAST32 Ix define PRIxFAST32 Ix define PRIX32 IX define PRIXLEAST32 IX define PRIXFAST32 IX define PRIoPTR PRIo16 define PRIUPTR PRIul6 define PRIxPTR PRIx16 define PRIXPTR PRIX16 define SCNd16 d define SCNdLEAST16 d define SCNdFAST16 d define SCNi16 1 define SCNiLEAST16 i define SCNIFASTI6 i define SCNd32 Id define SCNdLEAST32 Id define SCNdFAST3
50. itoa 190 strncasecmp 204 labs 190 strncat 204 Idiv 190 strncmp 204 Itoa 191 strncpy 204 malloc 191 strnlen 205 qsort 191 strpbrk 205 rand 192 strrchr 205 RAND MAX 187 strrev 206 rand r 192 strsep 206 random 192 strspn 206 RANDOM MAX 187 strstr 206 random r 192 strtok 207 realloc 192 strtok 207 srand 193 strupr 207 srandom 193 avr version strtod 193 AVR DATE 271 strtol 193 AVR LIBC DATE STRING strtoul 194 271 ultoa 194 AVR LIBC MAJOR 271 utoa 195 AVR MINOR 271 avr string AVR REVISION 271 _ 197 AVR LIBC VERSION ffs 198 STRING 271 ffsl 198 AVR LIBC VERSION 271 ffsll 198 avr watchdog wdt disable 273 wdt enable 273 wdt reset 273 WDTO 120MS 273 WDTO 15MS 274 WDTO 15 274 WDTO 250MS 274 WDTO 2S 274 WDTO 30MS 274 WDTO 45 274 strcat 201 WDTO 500MS 275 strchr 201 WDTO 60MS 275 strchrnul 201 WDTO 85 275 strcmp 201 avrdude usage 115 strcpy 202 avrprog usage 115 strcspn 202 strdup 202 BADISR vect strlcat 203 avr interrupts 241 strlcpy 203 BAUD TOL strlen 203 util setbaud 287 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 391 bit is clear avr sfr 267 bit is set avr sfr 267 boot h 338 boot lock bits set 340 boot lock bits set alternate 340 boot page erase alternate 340 boot page erase extended 341 boot page erase normal 341 boot page fill alternate 341
51. make it possible to use a single branch instruction for conditional operations Branch instructions can only cover a short range for the target PC 63 through 64 words from the current PC If a branch instruction cannot be used directly the compiler needs to work around it by combining a skip instruction together with a relative jump r jmp instruction which will need one additional word of ROM Another side effect of optimization is that variable usage is restricted to the area of code where it is actually used So if a variable was placed in a register at the beginning of some function this same register can be re used later on if the compiler notices that the first variable is no longer used inside that function even though the variable is still in lexical scope When trying to examine the variable in avr gdb the displayed result will then look garbled So in order to avoid these side effects optimization can be turned off while debugging However some of these optimizations might also have the side effect of uncovering bugs that would otherwise not be obvious so it must be noted that turning off opti mization can easily change the bug pattern In most cases you are better off leaving optimizations enabled while debugging Back to FAQ Index 11 12 How do I trace an assembler file in avr gdb When using the g compiler option avr gcc only generates line number and other debug information for C and files that pass the comp
52. or external peripherals that are connected to the device The entire IO address space is made available as memory mapped IO i e it can be accessed using all the MCU instructions that are applicable to normal data memory For most AVR devices the IO register space is mapped into the data memory address space with an offset of 0 20 since the bottom of this space is reserved for direct access to the MCU registers Actual SRAM is available only behind the IO register area starting at some specific address depending on the device For example the user can access memory mapped IO registers as if they were globally defined variables like this PORTA 0x33 unsigned char foo PINA The compiler will choose the correct instruction sequence to generate based on the address of the register being accessed The advantage of using the memory mapped registers in C programs is that it makes the programs more portable to other C compilers for the AVR platform Note that special care must be taken when accessing some of the 16 bit timer IO reg isters where access from both the main program and within an interrupt context can happen See Why do some 16 bit timer registers sometimes get trashed Porting programs that use the deprecated sbi cbi macros Access to the AVR single bit set and clear instructions are provided via the standard C bit manipulation commands The sbi and cbi macros are no longer directly supported sbi sfr bit can be replaced
53. pwm incoming Both variables are marked volatile to ensure their readers will always pick up an up dated value as both variables will be set by interrupt service routines The function ioinit initializes the microcontroller peripheral devices In partic it starts timer 0 to generate the outgoing PWM signal on OCOB Setting OCROA to 255 which is the TOP value of timer 0 is used to generate a timer overflow interrupt on the ATtiny13 This interrupt is used to inform the incoming PWM decoder that the counting direction of channel 0 is just changing from up to down Likewise an overflow interrupt will be generated whenever the countdown reached BOTTOM value 0 where the counter will again alter its counting direction to upwards This informa tion is needed in order to know whether the current counter value of TCNTO is to be evaluated from bottom or top Further ioinit activates the pin change interrupt PCINTO on any edge of PB4 Finally PB1 OCOB will be activated as an output pin and global interrupts are being enabled In the ATtiny45 setup the C code contains an ISR for PCINTO At each pin change interrupt it will first be analyzed whether the interrupt was caused by a rising or a falling edge In case of the rising edge timer 1 will be started with a prescaler of 16 after clearing the current timer value Then at the falling edge the current timer value will be recorded and timer 1 stopped the pin change in
54. streams inside avr libc Character Vn is sent literally down to the device s put function If the device requires a carriage return r character to be sent before the linefeed its put routine must implement this see note 2 As an alternative method to fdevopen the macro setup stream might be used to setup a user supplied FILE structure It should be noted that the automatic conversion of a newline character into a carriage return newline sequence breaks binary transfers If binary transfers are desired no automatic conversion should be performed but instead any string that aims to issue a CR LF sequence must use Vr An explicitly For convenience the first call to fdevopen that opens a stream for reading will cause the resulting stream to be aliased to stdin Likewise the first call to fdevopen that opens a stream for writing will cause the resulting stream to be aliased to both stdout and stderr Thus if the open was done with both read and write intent all three standard streams will be identical Note that these aliases are indistinguishable from each other thus calling fclose on such a stream will also effectively close all of its aliases note 3 It is possible to tie additional user data to a stream using fdev udata back end put and get functions can then extract this user data using fdev get udata and act appropriately For example a single put function could be used to talk t
55. typedef uint64 t fast64 t Greatest width integer types Types designating integer data capable of representing any value of any integer type in the corresponding signed or unsigned category e typedef int64 t intmax t e typedef uint64 t uintmax t 24 40 stdio h File Reference 24 40 1 Detailed Description Defines define STDIO H 1 define need NULL define need size t define FILE struct file define stdin __iob 0 define stdout __iob 1 define stderr __iob 2 define EOF 1 define fdev_set_udata stream u do stream udata u while 0 define fdev_get_udata stream stream udata define fdev_setup_stream stream put get rwflag define FDEV SETUP READ SRD define FDEV SETUP WRITE SWR define FDEV SETUP RW SRD SWR define FDEV ERR 1 define _FDEV_EOF 2 define FDEV SETUP STREAM put get rwflag define fdev_close define putc c stream fputc c ___ define putchar __c fputc c stdout define getc __stream fgetc __stream define getchar fgetc stdin define SEEK_SET 0 define SEEK CUR 1 define SEEK END 2 stream Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 40 stdio h File Reference 372 Functions int fclose FILE stream int vfprintf FILE stream const char fmt va_list int vfprintf P FILE stream const char fmt va list ap intfputc int __c FILE stream int printf co
56. uint8 t value static Write a byte __ value to EEPROM address p 22 13 3 7 static inline void eeprom write dword uint32 t x p uint32 t yalue static Write 32 bit double word value to EEPROM address p Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 14 lt avr fuse h gt Fuse Support 219 22 13 3 8 static inline void eeprom write word uintl6 t x uintl6 t yalue static Write a word value to EEPROM address p 22 44 lt avr fuse h gt Fuse Support Introduction The Fuse API allows a user to specify the fuse settings for the specific AVR device they are compiling for These fuse settings will be placed in a special section in the ELF output file after linking Programming tools can take advantage of the fuse information embedded in the ELF file by extracting this information and determining if the fuses need to be programmed before programming the Flash and EEPROM memories This also allows a single ELF file to contain all the information needed to program an AVR To use the Fuse API include the lt avr io h gt header file which in turn automatically includes the individual I O header file and the avr fuse h file These other two files provides everything necessary to set the AVR fuses Fuse API Each I O header file must define the FUSE MEMORY SIZE macro which is defined to the number of fuse bytes that exist in the AVR device A new type fuse t is defined as
57. 0 0 0 0 0 0 0 3 0 3 0 0 0 0 0 0 0 0 0 0 0 0 c winavr bin lib gcc avr 4 3 2 avr4 libgcc a _exit o etext load address 0x00000110 PROVIDE data start demo o c avrdev avr libc avr libc 1 6 6 avr lib avr4 atmega8 crtm8 o c avrdev avr libc avr libc 1 6 6 avr lib avr4 exit o c winavr bin lib gcc avr 4 3 2 avr4Mlibgcc a exit o c winavr bin lib gcc avr 4 3 2 avr4Mlibgcc a clear ALIGN 0x2 edata PROVIDE PROVIDE ss start demo o c avrdev avr libc avr libc 1 6 6 avr lib avr4 atmega8 crtm8 o c avrdev avr libc avr libc 1 6 6 avr lib avr4 exit o c winavr bin lib gcc avr 4 3 2 avr4 libgcc a _exit o c winavr bin lib gcc avr 4 3 2 avr4 libgcc a _clear_bss o PROVIDE bss data load start LOADADDR data data load end data load start SIZEOF data PROVIDE noinit start PROVIDE noinit end _end PROVIDE heap start eeprom end Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 A simple project 313 The last address in the text segment is location 0x114 denoted by etext so the instructions use up 276 bytes of FLASH The data segment where initialized static variables are stored starts at location 0x 60 which is the first address after the register bank on ATmega8 processor The next available address in the data segment is also location 0x60 s
58. 16 47 36 2009 for avr libc by Doxygen 7 Inline Assembler Cookbook 36 hi8 Takes the most significant 8 bits of a 16 bit integer pm Takes a program memory ROM address and converts it into a RAM ad dress This implies a division by 2 as the AVR handles ROM addresses as 16 bit words e g in an IJMP or ICALL instruction and can also handle relocatable symbols on the right hand side Example 141 r24 lo8 pm somefunc ldi r25 hi8 pm somefunc call something This passes the address of function somefunc as the first parameter to function something 7 Inline Assembler Cookbook AVR GCC Inline Assembler Cookbook About this Document The GNU C compiler for Atmel AVR RISC processors offers to embed assembly language code into C programs This cool feature may be used for manually optimizing time critical parts of the software or to use specific processor instruction which are not available in the C language Because of a lack of documentation especially for the AVR version of the compiler it may take some time to figure out the implementation details by studying the compiler and assembler source code There are also a few sample programs available in the net Hopefully this document will help to increase their number It s assumed that you are familiar with writing AVR assembler programs because this is not an AVR assembler programming tutorial It s not a C language tutorial either Note that this document does no
59. 22 5 2 74 define SCNiPTR SCNi16 generic integer scanf format for intptr_t 22 5 2 75 define SCNo16 o octal scanf format for uint16 t 22 5 2 76 define SCNo32 lo octal scanf format for uint32_t 22 5 2 77 define SCNoFASTI6 o octal scanf format for uint fast16 t 22 5 2 78 define SCNoFAST32 lo octal scanf format for uint fast32 t 22 5 2 79 define SCNoLEAST16 octal scanf format for uint leastl6 t 22 5 2 80 define SCNoLEAST32 lo octal scanf format for uint least32 t 22 5 2 81 define SCNoPTR SCNo16 octal scanf format for uintptr t 22 5 2 82 define SCNu16 decimal scanf format for uint16_t 22 5 2 83 define SCNu32 lu decimal scanf format for uint32_t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt gt Integer Type conversions 145 22 5 2 84 define SCNuFASTI6 u decimal scanf format for uint fastl6 t 22 5 2 85 define SCNuFAST32 decimal scanf format for uint fast32 t 22 5 2 86 define SCNULEAST16 decimal scanf format for leastl16 t 22 5 2 87 define SCNuLEAST32 lu decimal scanf format for uint least32 t 22 5 2 88 define SCNuPTR SCNu16 decimal scanf format for uintptr t 22 5 2 89 define SCNx16 x hexadecimal scanf format for uint16 t 22 5 2 90 define SCNx32 Ix hexadecimal scanf format for uint32_t 22 5 2 91 SCNxFAST16 x hexadecimal scanf format for uint_fast16_t 2
60. 22 8 3 11 typedef int64 t int least64 t signed int with at least 64 bits Note This type is not available when the compiler option mint8 is in effect 22 8 3 12 typedef int8 t int least8 t signed int with at least 8 bits 22 8 3 13 typedef int64 t intmax t largest signed int available 22 8 3 14 typedef int16_t intptr_t Signed pointer compatible type 22 8 3 15 typedef unsigned int uint16_t 16 bit unsigned type Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h gt Standard Integer Types 166 22 8 3 16 typedef unsigned long int uint32 t 32 bit unsigned type 22 8 3 17 typedef unsigned long long int uint64 t 64 bit unsigned type Note This type is not available when the compiler option mint8 is in effect 22 8 3 18 typedef unsigned char uint8 t 8 bit unsigned type 22 8 3 19 typedef uintl6 tuint fastl6 t fastest unsigned int with at least 16 bits 22 8 3 20 typedef uint32 t uint fast32 t fastest unsigned int with at least 32 bits 22 8 3 21 typedef uint64 t uint fast64 t fastest unsigned int with at least 64 bits Note This type is not available when the compiler option mint8 is in effect 22 8 3 22 typedef uint8 t uint fast8 t fastest unsigned int with at least 8 bits 22 8 3 23 typedef uintl6 tuint least16 t unsigned int with at least 16 bits 22 8 3 24 typedef uint32 t uint least32 t unsigned int with at least 32 bits Generated o
61. 38 3 1 stdiodemo c As usual include files go first While conventionally sys tem header files those in angular brackets lt gt go before application specific header files in double quotes de ines h comes as the first header file here The main reason is that this file defines the value of F CPU which needs to be known before including lt utils delay h gt The function ioinit summarizes all hardware initialization tasks As this function is declared to be module internal only st at ic the compiler will notice its simplic ity and with a reasonable optimization level in effect it will inline that function That needs to be kept in mind when debugging because the inlining might cause the debug ger to jump around wildly at a first glance when single stepping The definitions of str and lcd str set up two stdio streams The initial ization is done using the FDEV SETUP STREAM initializer template macro so static object can be constructed that can be used for IO purposes This initializer macro takes three arguments two function macros to connect the corresponding output and input functions respectively the third one describes the intent of the stream read write or both Those functions that are not required by the specified intent like the input function for 1 str which is specified to only perform output operations can be given as NULL The stream uart str corresponds to input an
62. 4 Clobbers 45 uint8 t s asm volatile in 0 __SREG__ An Nen cli An NET ld tmp reg 1 MATINET inc tmp reg MANEN st Sal _ tmp reg out SREG 0 n t amp r s e ptr Now every thing seems correct but it isn t really The assembler code modifies the variable that pt x points to The compiler will not recognize this and may keep its value in any of the other registers Not only does the compiler work with the wrong value but the assembler code does too The C program may have modified the value too but the compiler didn t update the memory location for optimization reasons The worst thing you can do in this case is uint8 t s asm volatile in 0 SREG TANNET WoT i ld tmp reg al TAXE inc tmp reg MANET st al tmp reg out SREG 0 sash aa eat amp 5 e ptr memory The special clobber memory informs the compiler that the assembler code may mod ify any memory location It forces the compiler to update all variables for which the contents are currently held in a register before executing the assembler code And of course everything has to be reloaded again after this code In most situations a much better solution would be to declare the pointer destination itself volatile volatile uint8 t ptr This way the compiler expects the value pointed to by ptr to be changed and will load it whenever used an
63. 5 KB to the code Optimization Size of text Time for test 1 Time for test 2 flags 03 6898 903 us 19 7 ms O2 6666 972 us 20 1 ms Os 6618 955 us 20 1 ms Os 6474 972 us 20 1 ms mcall prologues The difference between 955 us and 972 us was just a single timer tick so take this with a grain of salt So generally it seems Os mcall prologues is the most universal best opti mization level Only applications that need to get the last few percent of speed benefit from using 03 Back to FAQ Index 11 18 How do I relocate code to a fixed address First the code should be put into a new named section This is done with a section attribute attribute section bootloader In this example bootloader is the name of the new section This attribute needs to be placed after the prototype of any function to force the function into the new section Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 19 My UART is generating nonsense My ATmegal28 keeps crashing Port F is completely broken 76 void boot void attribute section bootloader To relocate the section to a fixed address the linker flag section start is used This option can be passed to the linker using the W1 compiler option Wl section start bootloader 0x1E000 The name after section start is the name of the section to be relocated The number after the section name is th
64. 6 pins so the 1 second flash LED had to be moved from PD6 to PD4 PD4 is used as the ADC control button on the other MCU types but that is not needed here is located at PB3 on this device The TARGET macro in the Makefile needs to be adjusted appropriately for the alternative controller types Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 37 A more sophisticated project 321 The flash ROM and RAM consumption of this demo are way below the resources of even an ATmega48 and still well within the capabilities of an ATtiny2313 The major advantage of experimenting with the ATmega16 in addition that it ships together with an STK500 anyway is that it can be debugged online via JTAG Likewise the ATmega48 88 168 and ATtiny2313 devices can be debugged through debugWire using the Atmel JTAG ICE mkII or the low cost AVR Dragon Note that in the explanation below all port pin names are applicable to the ATmegal6 setup 22 37 2 Functional overview PD6 will be toggled with each internal clock tick approx 10 ms PD7 will flash once per second PDO and are configured as UART IO and can be used to connect the demo kit to a PC 9600 Bd 8N1 frame format The demo application talks to the serial port and it can be controlled from the serial port PD2 through PD4 are configured as inputs and control the application unless control has been taken over by the serial port Shorting PD2 to G
65. 80 08 rcall 16 jr 0x92 This code reads the pointer to the desired string from the ROM table array into a register pair The value of i in r22 r23 is doubled to accommodate for the word offset required to access array then the address of array 0x26 is added by subtracting the negated address Oxffda The address of variable p is computed by adding its offset within the stack frame 33 to the Y pointer register and P is called strcpy P buf p 82 69 al 1 22 33 0x21 84 7a al ldd r23 Y 34 0x22 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 16 How to use external RAM 74 86 ce 01 movw r24 r28 88 01 96 adiw r24 0x01 nib 8a Oc 11 24 Oxa4 This will finally copy the ROM string into the local buffer buf Variable p located at Y 33 is read and passed together with the address of buf Y 1 to strepy_P This will copy the string from ROM to buf Note that when using a compile time constant index omitting the first step reading the pointer from ROM via P usually remains unnoticed since the compiler would then optimize the code for accessing array at compile time Back to FAQ Index 11 16 How to use external RAM Well there is no universal answer to this question it depends on what the external RAM is going to be used for Basically the bit SRE SRAM enable in the MCUCR register needs to be set in order to enable the e
66. 88 b3 in r24 0x18 24 11e 80 6f ori r24 OxFO 240 120 88 bb out 0x18 r24 24 Of course in a real application you might be doing a lot more in your function which uses a passed by reference io port address and thus the use of a function over a macro could save you some code space but still at a cost of execution speed Care should be taken when such an indirect port access is going to one of the 16 bit IO registers where the order of write access is critical like some timer registers versions of avr gcc up to 3 3 will generate instructions that use the wrong access order in this situation since with normal memory operands where the order doesn t matter this sometimes yields shorter code Seehttp mail nongnu org archive html avr libc dev 2003 01 msg00044 html for a possible workaround avr gcc versions after 3 3 have been fixed in a way where this optimization will be disabled if the respective pointer variable is declared to be volatile so the correct behaviour for 16 bit IO ports can be forced that way Back to FAQ Index Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 14 What registers are used by the C compiler 71 11 14 What registers are used by the C compiler Data types char is 8 bits int is 16 bits Long is 32 bits Long long is 64 bits float and double are 32 bits this is the only supported floating point format pointers 16 bits function pointers are word addresse
67. 9 3 30 int sscanf_P const char buf const char fmt Variant of sscanf using a fmt string in program memory 22 9 3 31 intungetc int FILE stream The ungetc function pushes the character c converted to an unsigned char back onto the input stream pointed to by stream The pushed back character will be returned by a subsequent read on the stream Currently only a single character can be pushed back onto the stream The ungetc function returns the character pushed back after the conversion or EOF if the operation fails If the value of the argument c character equals EOF the operation will fail and the stream will remain unchanged 22 9 3 32 vfprintf FILE stream const char x _ fmt va list vfprintf is the central facility of print f family of functions It outputs values to stream under control of a format string passed in mt The actual values to print are passed as a variable argument list ap vfprintf returns the number of characters written to stream or EOF in case of an error Currently this will only happen if st ream has not been opened with write intent The format string is composed of zero or more directives ordinary characters not which are copied unchanged to the output stream and conversion specifications each of which results in fetching zero or more subsequent arguments Each conversion specification is introduced by the character The arguments mu
68. AT90PWM1 AT90CANI28 AT90CAN32 AT90CAN64 ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal6l ATmegal62 ATmegal63 ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega32 ATmega323 ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega32HVB AT mega48P ATmega64 ATmega645 AT mega6450 ATmega649 ATmega6490 ATmega8 ATmega8515 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATmegal6HVA ATtiny2313 48 ATtiny261 ATtiny461 AT tiny861 AT9OUSB162 9005 82 9005 1287 AT90USB 1286 9005 647 9005 646 Generated Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 45 lt avr interrupt h gt Interrupts 235 Vector name Old vector Description Applicable for device name TIMER 1_ SIG_ Timer Counter1 AT90S4414 419054434 41719058515 COMPB vect OUTPUT Compare MatchB AT90S8535 AT90PWM216 COMPAREIB AT90PWM2B AT90PWM316 AT90PWM3B AT90PWM3 AT90PWM2 AT90PWM1 AT90CANI28 AT90CAN32 AT90CAN64 ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal6l ATmegal62 ATmegal63 ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega32 ATmega323 ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega32HVB AT mega48P ATmega64 ATmega645 mega
69. ATmegal28 ATmegal284P ATmegal62 COMPARE3A A ATmega64 ATmega640 ATmegal280 ATmegal281 ATmega2560 AT mega2561 AT90USB 1287 AT90USB1286 AT90USB647 AT90USB646 TIMER3 SIG Timer Counter3 AT90CAN128 AT90CAN32 AT90CANGA COMPB_vect OUTPUT_ Compare Match ATmegal28 ATmegal284P ATmegal62 COMPARE3B B ATmega64 ATmega640 ATmegal280 ATmegal281 ATmega2560 AT mega2561 AT90USB 1287 AT90USB1286 AT90USB647 AT90USB646 TIMER3 SIG Timer Counter3 AT90CAN128 AT90CAN32 AT90CANGA COMPC_vect OUTPUT_ Compare Match ATmegal28 ATmega64 ATmega640 AT COMPARE3C C mega1280 ATmegal281 ATmega2560 AT mega2561 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 TIMER3_ SIG_ Timer Counter3 AT90CAN128 AT90CAN32 AT90CANGA OVF_vect OVERFLOW3 Overflow ATmegal28 ATmegal284P ATmegal62 ATmega64 ATmega640 ATmegal280 ATmegal281 ATmega2560 AT mega2561 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 TIMERA SIG INPUT Timer Counter4 ATmega640 ATmegal280 ATmegal281 CAPT vect CAPTURE4 Capture Event ATmega2560 ATmega2561 TIMER4 SIG_ Timer Counter4 ATmega640 ATmegal280 ATmegal281 COMPA vect OUTPUT_ Compare Match ATmega2560 ATmega2561 COMPARE4A A TIMERA SIG Timer Counter4 ATmega640 ATmegal280 ATmegal28l COMPB vect OUTPUT Compare Match ATmega2560 ATmega2561 COMPAREAB B Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen
70. ATtiny45 ATtiny85 ATtiny261 461 ATtiny861 ATmega48 ATmega88 ATmegal68 ATmega48P ATmega88P AT megal68P ATmega328P ATmegal64P ATmega324P ATmega644P ATmega644 AT mega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega8HVA ATmegal6HVA ATmega32HVB ATmega406 ATmegal284P AT90PWMI AT90PWM2 AT90PWM2B AT90PWM3 9 216 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 25 lt util atomic h gt Atomically and Non Atomically Executed Code 76 AT90PWM316 AT9OPWM81 AT90USB82 AT9OUSB162 9005 646 AT90USB647 AT90USB1286 AT90USB1287 ATtiny48 ATtiny88 22 24 2 11 define WDTO_500MS 5 See WDTO 15MS 22 24 2 12 define WDTO 60MS 2 WDTO 15MS 22 24 2 13 define WDTO 85 9 See WDTO 15MS Note This is only available on the ATtiny2313 ATtiny24 ATtiny44 ATtiny84 ATtiny25 ATtiny45 ATtiny85 ATtiny261 461 ATtiny861 ATmega48 ATmega88 ATmegal68 ATmega48P ATmega88P AT megal68P ATmega328P ATmegal64P ATmega324P ATmega644P ATmega644 AT mega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega8HVA ATmegal6HVA ATmega32HVB ATmega406 ATmegal284P 9 AT90PWM2 AT9OPWM2B AT9O0PWM3 9 216 AT90PWM316 AT9OPWM81 9005 82 9005 162 9005 646 AT90USB647 9005 1286 AT90USB1287 48 ATtiny88 22 205 lt util atomic h gt Atomically an
71. Carlos Lamas Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 14 avr ibc License 9 Cliff Lawson Artur Lipowski Marek Michalkiewicz Todd C Miller Rich Neswold Colin O Flynn Bob Paddock Andrey Pashchenko Reiner Patommel Florin Viorel Petrov Alexander Popov Michael Rickman Theodore A Roth Juergen Schilling Philip Soeberg Anatoly Sokolov Nils Kristian Strom Michael Stumpf Stefan Swanepoel Helmut Wallner Eric B Weddington Joerg Wunsch Dmitry Xmelkov Atmel Corporation egnite Software GmbH The Regents of the University of California All rights reserved Redistribution and use in source and binary forms with or without modification are permitted provided that the following conditions are met Redistributions of source code must retain the above copyright notice this list of conditions and the following disclaimer Redistributions in binary form must reproduce the above copyright notice this list of conditions and the following disclaimer in the documentation and or other materials provided with the distribution Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission HIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS ND ANY EXPRESS OR IMPLIED WARRANTIES INCLUDING BUT NOT LIMITED TO THE MPLIED WARRANTI
72. Demo projects 296 Combining C and assembly source files 298 A simple project 301 A more sophisticated project 317 Using the standard IO facilities 325 Example using the two wire interface TWI 332 20 Data Structure Index 20 1 Data Structures Here are the data structures with brief descriptions div_t 337 Idiv_t 338 21 File Index 21 1 File List Here is a list of all documented files with brief descriptions assert h 338 atoi S 339 atol S 339 atomic h 339 boot h 339 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 211 File List 126 crc16 h 346 ctype h 346 delay h 347 delay basic h 347 errno h 347 fdevopen c 348 ffs S 348 ffsl S 348 ffsll S 348 fuse h 348 interrupt h 348 inttypes h 349 io h 352 lock h 352 math h 352 memccpy S 355 memchr S 355 memchr P S 355 memcmp S 355 memcmp P S 355 memcpy S 355 memcpy P S 355 memmem S 355 memmove S 355 memrchr S 355 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 211 File List 127 memrchr P S 355 memset S 355 parity h 355 pgmspace h 356 power h 366 setbaud h 367 setjmp h 367 sleep h 367 stdint h 368 stdio h 371 stdlib h 373 strcasecmp S 376 strcasecmp P S 376 strcasestr S 376 strcat S 376 strcat P S 376 strchr S 376 strchr P S 376 strchrnul S 376 strchrnul P S 376 strcmp S 376 stremp_P S 376 strcpy S 376 strepy_P S 376 strcspn S 376 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 211 File
73. Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS xii 2420matb h File 2521 1 Detailed Description us mee P xxx eR ec 24 2 1memecepyo Pile RetereioB coo ea ole Bde BAR eS 2221 1 Detailed Description 222 2222 2 24 22memehtS File Reference 2 2222 eA m m Rx 24 22 1 Detailed Description 24 23memchr P S File 22 2 2 24 23 1 Detailed Description 24 24memenip 5 Pile Reference coc srca RR o RR 24 24 1 Detailed Description 2o RR GR 24 25memcmp_PS File Reference 24 25 1 Detailed Description sos ek Roo Ae eS 24 70 memepys File Referente o uomo Ee ee 24 26 1 Detailed Description x 24 4 48855 Gedy a eee gt gt 24 2 memcpy PS File Reference co socor o to RAS 2127 1 Detailed Description sous scum m RR 24226 5 File Reference zs momo n 24 28 1 Detailed Description lt lt sso RR Bem 24 20memmove 5 File 24 29 Detailed Description amp e e RR menm 28 30 mennchr s File Reference 2222 2222 2 2 22 940 24 30 1 Detailed Description 24 3 memrchr PS File Reference 2431 1 Detailed Description susc m om ook XE x RR 24 32memset s File Reference 2 2 2 2 2 2 2132 1 Detailed Description 222 2222 2 2 24 33panty bl Fi
74. Inter rupt Request 2 ATmega3250 ATmega3250P ATmega328P ATmega3290 ATmega3290P ATmega48P ATmega6450 ATmega6490 ATmega88P ATmegal68 ATmega48 ATmega88 AT mega640 ATmegal280 ATmegal281 AT mega2560 ATmega2561 ATmega324P AT megal64P ATmega644P ATmega644 AT tiny48 vect SIG PIN CHANGE3 Pin Change Inter rupt Request 3 ATmega3250 ATmega3250P ATmega3290 ATmega3290P ATmega6450 ATmega6490 ATmega324P ATmegal64P ATmega644P ATmega644 ATtiny48 PCINT vect SIG PIN CHANGE SIG PCINT ATtiny2313 ATtiny261 ATtiny461 AT tiny861 PSCO vect SIG PSCO CAPTURE PSCO Event Capture AT90PWMG AT90PWM2 AT90PWM1 PSCO EC vect SIG PSCO END CYCLE PSCO End Cycle AT90PWM3 AT90PWM2 AT90PWM1 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt avr interrupt h gt Interrupts 231 Vector name Old name vector Description Applicable for device PSCI vect SIG PSCI CAPTURE PSCI Event Capture AT90PWM3 AT90PWM2 AT90PWM1 PSCI EC vect SIG PSCI END CYCLE End Cycle AT90PWM3 AT90PWM2 AT90PWMI PSC2_ CAPT_vect SIG_PSC2_ CAPTURE PSC2 Event Capture AT90PWM3 AT90PWM2 AT90PWM1 PSC2_EC_ vect SIG_PSC2_ END_CYCLE PSC2 End Cycle AT90PWM3 AT90PWM2 AT90PWM1 SPI_STC_vect SIG_SPI Serial
75. Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 173 22 9 2 7 define close This macro frees up any library resources that might be associated with stream It should be called if st ream is no longer needed right before the application is going to destroy the st ream object itself Currently this macro evaluates to nothing but this might change in future versions of the library 22 9 2 8 define get udata stream stream udata This macro retrieves a pointer to user defined data from a FILE stream object 22 0 2 0 define set udata stream u do stream udata u while 0 This macro inserts a pointer to user defined data into a FILE stream object The user data can be useful for tracking state in the put and get functions supplied to the fdevopen function 22 9 2 10 define FDEV SETUP STREAM put get rwflag Initializer for a user supplied stdio stream This macro acts similar to fdev setup stream but it is to be used as the initializer of a variable of type FILE The remaining arguments are to be used as explained in fdev setup stream 22 9 2 11 define fdev setup stream stream put get rwflag Setup a user supplied buffer as an stdio stream This macro takes a user supplied buffer st ream and sets it up as a stream that is valid for stdio operations similar to one that has been obtained dynamically from fdevopen The buffer to set
76. N N result N 24 34 2 17 define LPM word classic Value extension uintl6 t X addrl6 uintl6 t addr N uintl6 t result N asm N N lpm n t mov A0 ro adiw r30 1 n t lpm TANNET X mov B0 ro Anje r result z __addrl16 1 addr16 N Br N N result N 24 34 2 18 define word enhanced __ addr Value extension N Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 35 power h File Reference 366 uintl6 t _ addrl6 uintl16 t addr N uintl6 t _ result N asm N N lpm SAO Z lpm B0 2 n t r result z addrl16 1 addr16 N result N 24 35 File Reference 24 35 1 Detailed Description Defines define AVR POWER H 1 define clock prescale set x define clock prescale get clock div t CLKPR amp uint8 t 1 lt lt CLKPS0 1 lt lt CLKPS1 1 lt lt CLKPS2 1 lt lt CLKPS3 Enumerations enum clock div t clock div 1 0 clock div 2 1 clock div 4 2 clock div 8 3 clock div 16 4 clock div 32 5 clock div 64 6 clock div 128 7 clock div 256 8 24 35 2 Define Documentation 24 35 21 define clock prescale set x Value uint8_t tmp _BV CLKPCE __asm__ _ volatile__ N in tmp_reg__ __SREG__ n t Gli ner sts 1 30
77. Note The ax progbits tells the assembler that the section is allocatable a executable x and contains data progbits For more detailed information on the section directive see the gas user manual 4 9 Using Sections in C Code Example Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 5 Data in Program Space 25 include lt avr io h gt void my_init_portb void __attribute__ naked __attribute__ section init3 void my_init_portb void PORTB Oxff DDRB Oxff Note Section init3 is used in this example as this ensures theinernal zero reg has already been set up The code generated by the compiler might blindly rely on zero reg beingreally 0 5 Data in Program Space 5 1 Introduction So you have some constant data and you re running out of room to store it Many AVRs have limited amount of RAM in which to store data but may have more Flash space available The AVR is a Harvard architecture processor where Flash is used for the program RAM is used for data and they each have separate address spaces It is a challenge to get constant data to be stored in the Program Space and to retrieve that data to use it in the AVR application The problem is exacerbated by the fact that the C Language was not designed for Harvard architectures it was designed for Von Neumann architectures where code and data exist in the same address space This means that any
78. RAM memory and variable overlap prob lems You can simply run avr nm on your output ELF file Run it with the n option and it will sort the symbols numerically by default they are sorted alphabetically Look for the symbol end that s the first address in RAM that is not allocated by a variable avr gcc internally adds 0x800000 to all data bss variable addresses so please ignore this offset Then the run time initialization code initializes the stack pointer by default to point to the last available address in internal SRAM Thus the region between end and the end of SRAM is what is available for stack If your application uses malloc which e g also can happen inside printf the heap for dynamic memory is also located there See Memory Areas and Using malloc The amount of stack required for your application cannot be determined that easily For example if you recursively call a function and forget to break that recursion the amount of stack required is infinite You can look at the generated assembler code avr gcc S there s a comment in each generated assembler file that tells you the frame size for each generated function That s the amount of stack required for this function you have to add up that for all functions where you know that the calls could be nested Back to FAQ Index Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 23 Isit really impossible to program the ATtiny
79. These things could easily add up into a considerable amount of time and program memory wasted Thus casual inspection of the generated assembler code using the 5 compiler option seems to be warranted Back to FAQ Index 11 8 Shouldn t I initialize all my variables Global and static variables are guaranteed to be initialized to 0 by the C standard avr gcc does this by placing the appropriate code into section init4 see The initN Sections With respect to the standard this sentence is somewhat simplified because the standard allows for machines where the actual bit pattern used differs from all bits being 0 but for the AVR target in general all integer type variables are set to 0 all pointers to a NULL pointer and all floating point variables to 0 0 As long as these variables are not initialized 1i e they don t have an equal sign and an initialization expression to the right within the definition of the variable they go into the bss section of the file This section simply records the size of the variable but otherwise doesn t consume space neither within the object file nor within flash memory Of course being a variable it will consume space in the target s SRAM In contrast global and static variables that have an initializer go into the data section of the file This will cause them to consume space in the object file in order to record the initializing value and in the flash ROM of the target device The latt
80. Transfer Complete 9052333 479054434 9054414 9058515 9054433 9058535 AT90PWM216 AT90PWM2B AT90PWM316 AT90PWM3B AT90PWM3 AT90PWM2 AT90PWMI AT90CAN128 AT90CAN32 AT90CANGA ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal6l ATmegal62 ATmegal63 ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega32 ATmega323 ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega32HVB ATmega48P ATmega64 ATmega645 ATmega6450 ATmega649 ATmega6490 ATmega8 ATmega8515 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 AT megal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATmegal6HVA ATtiny48 90 5 162 9005 82 9005 1287 AT90USB1286 AT90USB647 AT90USB646 SPM RDY vect SIG SPM READY Store Program Memory Ready ATmegal6 ATmegal62 ATmega32 AT mega323 ATmega8 ATmega8515 AT mega8535 SPM READY vect SIG SPM READY Store Program Memory Read AT90PWM3 AT90PWM2 AT90PWMI AT90CAN128 AT90CAN32 AT90CANGA ATmegal28 ATmegal284P ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega406 ATmega48P ATmega64 ATmega645 ATmega6450 ATmega649 ATmega6490 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 ATmegal280 ATmegal281 ATmega2560 ATme
81. __x double y e double fma double x double __y double 7 e double fmax double _ x double y e double fmin double __x double y int signbit double __x double trunc double __x static int isfinite double __x double hypot double __x double y double round double __x long lround double __ x long lrint double __x Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 20 math h File Reference 354 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 21 memccpy S File Reference 355 24 21 memccpy S File Reference 24 211 Detailed Description 24 22 memchrS File Reference 24 22 1 Detailed Description 24 23 memchr PS File Reference 24 23 1 Detailed Description 2424 memcmp S File Reference 24 24 1 Detailed Description 2425 memcmp 5 File Reference 24 25 1 Detailed Description 24 26 memcpy S File Reference 24 26 1 Detailed Description 24 77 memcpy PS File Reference 24 27 1 Detailed Description 2428 memmem S File Reference 24 28 1 Detailed Description 24 29 memmove S File Reference 24 29 1 Detailed Description 24 30 memrchr S File Reference 24 30 1 Detailed Description 24 31 memrchr P S File Reference 24 31 1 Detailed Description 24 32 memset S File Reference Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 32 1 Detailed Description 24 33 parity h File Reference 24 33 1 Detailed Description Defines 24 34 pgmspace h File Refer
82. all install 2 gt amp 1 tee avarice make log SimulAVR Open source code package Configure and build in a directory outside of the source code tree Set PATH in order MikTex executables gt usr local bin usr bin Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 Using the GNU tools 104 bin install directory gt bin Configure export LDFLAGS static Sarchivedir configure prefix installdir datadir installdir disable tests disable versioned doc 2 gt amp 1 tee simulavr configure log Make make k all install 2 gt amp 1 tee simulavr make log make pdf install pdf 2 gt amp 1 tee simulavr pdf make log 13 Using the GNU tools This is a short summary of the AVR specific aspects of using the GNU tools Normally the generic documentation of these tools is fairly large and maintained in texinfo files Command line options are explained in detail in the manual page 13 1 Options for the C compiler avr gcc 13 1 1 Machine specific options for the AVR The following machine specific options are recognized by the C compiler frontend In addition to the preprocessor macros indicated in the tables below the preprocessor will define the macros __ AVR __ AVR to the value 1 when compiling for an AVR target The macro AVR will be defined as well when using the standard levels gnu89 default and gnu99 but not with c89 and c99
83. any use of the mul s u instructions which return their result in rl r0 Interrupt handlers save and clear r1 on entry and restore r1 on exit in case it was non zero Function call conventions Arguments allocated left to right r25 to r8 All arguments are aligned to start in even numbered registers odd sized arguments including char have one free register above them This allows making better use of the movw instruction on the enhanced core Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 15 How do I put an array of strings completely in ROM 72 If too many those that don t fit are passed on the stack Return values 8 bit in r24 not r25 16 bit in r25 124 up to 32 bits in 122 125 up to 64 bits in r18 r25 8 bit return values are zero sign extended to 16 bits by the called function unsigned char is more efficient than signed char justclr r25 Arguments to functions with variable argument lists printf etc are all passed on stack and char is extended to int Warning There was no such alignment before 2000 07 01 including the old patches for gcc 2 95 2 Check your old assembler subroutines and adjust them accordingly Back to FAQ Index 11 15 How do I put an array of strings completely in ROM There are times when you may need an array of strings which will never be modified In this case you don t want to waste ram storing the constant strings The most obvious and incorrect
84. are the smallest unit that the linker works with Typically on the linker command line you will specify a set of object modules that has been previously compiled and then a list of libraries including the Standard C Library The linker takes the set of object modules that you specify on the command line and links them together Afterwards there will probably be a set of undefined references A reference is essentially a function call An undefined reference is a function call with no defined function to match the call The linker will then go through the libraries in order to match the undefined references with function definitions that are found in the libraries If it finds the function that matches the call the linker will then link in the object module in which the function is located This part is important the linker links in THE ENTIRE OBJECT MODULE in which the function is located Remember the linker knows nothing about the functions internal to an object module other than symbol names such as function names The smallest unit the linker works with is object modules When there are no more undefined references the linker has linked everything and is done and outputs the final application 8 3 How to Design a Library How the linker behaves is very important in designing a library Ideally you want to design a library where only the functions that are called are the only functions to be linked into the final application
85. area For technical reasons erased E E PROM cells have all bits set to the value 1 so unprogrammed fuses also have a logical 1 Conversely programmed fuse cells read out as bit value 0 Back to FAQ Index 11 27 Which AVR specific assembler operators are available See Pseudo ops and operators Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 28 Why are interrupts re enabled in the middle of writing the stack Back to FAQ Index 11 28 Why are interrupts re enabled in the middle of writing the stack pointer When setting up space for local variables on the stack the compiler generates code like this prologue frame size 20 x push r28 push r29 r28 SP_L__ in sbiw r28 20 in tmp reg SREG Gba out SPH r29 out SREG tmp reg out SPL r28 prologue end size 10 x It reads the current stack pointer value decrements it by the required amount of bytes then disables interrupts writes back the high part of the stack pointer writes back the saved SREG which will eventually re enable interrupts if they have been enabled before and finally writes the low part of the stack pointer At the first glance there s a race between restoring SREG and writing SPL However after enabling interrupts either explicitly by setting the flag or by restoring it as part of the entire SREG the AVR hardware executes at least the next instruction still
86. atmega640 AVR ATmega640 avr5 atmega644 AVR ATmega644 avr5 atmega644p AVR ATmega644P avr5 atmega645 AVR ATmega645 avr5 atmega6450 AVR ATmega6450 avr5 atmega649 AVR ATmega649 avr5 atmega6490 AVR ATmega6490 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 1 Options for the C compiler avr gcc 108 Architecture MCU name Macro avr5 atmega64c __AVR_ATmega64C1__ avr5 atmega64m 1 __AVR_ATmega64M1__ avr5 at94k AVR ATO94K avr5 at90scr100 AVR ATOO0SCRIOO avr5 avr51 3 atmegal28 AVR ATmegal28 avr5 avr51 3 atmegal280 _ ATmegal280 avr5 avr51 3 atmegal281 ATmegal281 avr5 avr51 3 atmegal284p _ ATmegal284P 5 51 3 at90can128 AVR_AT90CAN128__ avr5 avr51 3 at90usb1286 AVR ATO0USB1286 avr5 avr51 3 at90usb1287 AVR ATO0USB1287 avr6 atmega2560 __AVR_ATmega2560__ avr6 atmega2561 __AVR_ATmega2561__ avrxmega2 atxmega16a4 __AVR_ATxmegal6A4__ avrxmega2 atxmega16d4 __AVR_ATxmegal6D4__ avrxmega2 atxmega32d4 __AVR_ATxmega32D4__ avrxmega3 atxmega32a4 __AVR_ATxmega32A4__ avrxmega4 atxmega64a3 __AVR_ATxmega64A3__ avrxmega5 atxmega64a1 __AVR_ATxmega64A1__ avrxmega6 atxmega128a3 AVR AIxmegal28A3 avrxmega6 atxmega256a3 AVR ATIxmega256A3 avrxmega6 atxmega256a3b AVR ATxmega256A3B avrxmega7 atxmegal28al ATxmegal28Al
87. avr libc by Doxygen 22 49 lt avr power h gt Power Reduction Management 263 Many AVRs contain a Power Reduction Register PRR or Registers PRRx that allow you to reduce power consumption by disabling or enabling various on board peripher als as needed There are many macros in this header file that provide an easy interface to enable or disable on board peripherals to reduce power See the table below Note Not all AVR devices have a Power Reduction Register for example the AT megal28 On those devices without a Power Reduction Register these macros are not available Not all AVR devices contain the same peripherals for example the LCD inter face or they will be named differently for example USART and USARTO Please consult your device s datasheet or the header file to find out which macros are applicable to your device Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 49 lt avr power h gt Power Reduction Management 264 Power Macro Description Applicable for device power adc enable Enable the Analog to Digital Converter module ATmega640 ATmegal280 ATmegal281 ATmegal28RFA1 ATmega2560 ATmega2561 AT90USB646 AT90USB647 AT90USB1286 AT90USB1287 AT90PWM 1 AT90PWM2 AT90PWM2B AT90PWM3 AT90PWM3B AT90PWM216 AT90PWM316 ATmega165 ATmega165P ATmega325 ATmega3250 ATmega645 ATmega6450 ATmega169 ATmegal69P ATmega329 ATmega3290 ATmega649 ATmeg
88. avr lock h gt also defines a macro that provides a default lockbit value LOCKBITS DEFAULT which is defined to be OxFF See the AVR device specific datasheet for more details about these lock bits and the available mode settings convenience macro LOCKMEM is defined as a GCC attribute for a custom named section of lock A convenience macro LOCKBITS is defined that declares a variable lock of type unsigned char with the attribute defined by LOCKMEM This variable allows the end user to easily set the lockbit data Note If a device specific I O header file has previously defined LOCKMEM then LOCKMEM is not redefined If a device specific I O header file has previously defined LOCKBITS then LOCKBITS is not redefined LOCKBITS is currently known to be defined in the I O header files for the XMEGA devices API Usage Example Putting all of this together is easy include avr io h LOCKBITS LB MODE 1 BLBO MODE 3 amp 1 MODE 4 int main void return 0 Or include avr io h unsigned char __lock __attribute__ section lock LB MODE 1 BLBO MODE 3 amp BLB1_MODE_4 int main void return 0 However there are a number of caveats that you need to be aware of to use this API properly Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 249 Be sure to include lt avr io h gt to get all of
89. becomes re entrant 22 10 4 23 void realloc void __ptr size t size The realloc function tries to change the size of the region allocated at pt r to the new size value It returns a pointer to the new region The returned pointer might be the Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 194 same as the old pointer or a pointer to a completely different region The contents of the returned region up to either the old or the new size value whatever is less will be identical to the contents of the old region even in case a new region had to be allocated It is acceptable to pass ptr as NULL in which case realloc will behave identical to malloc If the new memory cannot be allocated realloc returns NULL and the region at pt r will not be changed 22 10 4 24 void unsigned int __seed Pseudo random number generator seeding see rand 22 10 4 25 void srandom unsigned long __ seed Pseudo random number generator seeding see random 22 10 4 26 double strtod const char nptr char endptr The strtod function converts the initial portion of the string pointed to by nptr to double representation The expected form of the string is an optional plus or minus sign followed by a sequence of digits optionally containing a decimal point character op tionally followed by an exponent An exponent consists of an
90. bit value read from two successive port addresses uintl6 t inw uint8 t port uintl6 t result asm volatile in 0 1 n t in BO 1 1 r result I SFR IO ADDR port return result Note inw is supplied by avr libc 77 C Names Used in Assembler Code By default AVR GCC uses the same symbolic names of functions or variables in C and assembler code You can specify a different name for the assembler code by using a special form of the asm statement unsigned long value asm clock 3686400 This statement instructs the compiler to use the symbol name clock rather than value This makes sense only for external or static variables because local variables do not have symbolic names in the assembler code However local variables may be held in registers Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7 8 Links 48 With AVR GCC you can specify the use of a specific register void Count void register unsigned char counter asm r3 some code asm volatile clr r3 more code The assembler instruction clr r3 will clear the variable counter AVR GCC will not completely reserve the specified register If the optimizer recognizes that the vari able will not be referenced any longer the register may be re used But the compiler is not able to check wether this register usage conflicts with any predefined register If you reserve too many registers in this w
91. boot page fill extended 342 boot page fill normal 342 boot page write alternate 343 boot page write extended 343 boot page write normal 343 boot rww enable 344 boot rww enable alternate 344 boot is spm interrupt avr boot 210 boot lock bits set avr boot 210 boot lock bits set safe avr boot 210 boot lock fuse bits get avr boot 211 boot page erase avr boot 211 boot page erase safe avr boot 211 boot page fill avr boot 212 boot page fill safe avr boot 212 boot page write avr boot 212 boot page write safe avr boot 212 boot rww busy avr boot 213 boot rww enable avr boot 213 boot rww enable safe avr boot 213 boot signature byte get avr boot 213 boot spm busy avr boot 214 boot spm busy wait avr boot 214 boot spm interrupt disable avr boot 214 boot spm interrupt enable avr boot 214 BOOTLOADER SECTION avr boot 214 bsearch avr stdlib 188 calloc avr stdlib 188 cbi deprecated items 293 ceil avr math 147 clearerr avr stdio 174 cli avr interrupts 241 clock prescale set power h 365 Combining C and assembly source files 207 copysign avr math 147 cos avr_math 147 cosh avr_math 148 crc16 h 345 ctype isalnum 130 isalpha 130 isascii 131 isblank 131 iscntrl 131 isdigit 131 isgraph 131 islower 131 isprint 131 ispunct 131 isspace 131 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxyg
92. buffer without any UART interaction If there are no characters inside the line buffer the input loop will be entered Charac ters will be read from the UART and processed accordingly If the UART signalled a framing error FE bit set typically caused by the terminal sending a line break con dition start condition held much longer than one character period the function will return an end of file condition using FDEV If there was a data overrun condi tion on input DOR bit set an error condition will be returned as FDEV ERR Line editing characters are handled inside the loop potentially modifying the buffer status If characters are attempted to be entered beyond the size of the line buffer their reception is refused and a Va character is sent to the terminal If a Vr or n character is seen the variable rxp receive pointer is set to the beginning of the buffer the loop is left and the first character of the buffer will be returned to the application If no other characters have been entered this will just be the newline character and the buffer is marked as being exhausted immediately again 22 38 4 The source code The source code is installed under Sprefix share doc avr libc examples stdiodemo where prefix is a configuration option For Unix systems it is usually set to either usr usr local 22 39 Example using the two wire interface TWI Some newer devices of the A
93. by sfr _BV bit i e sbi PORTB PB1 is now PORTB 1 This actually is more flexible than having sbi directly as the optimizer will use a hard ware sbi if appropriate or a read or write operation if not appropriate You do not need to keep track of which registers sbi cbi will operate on Likewise cbi sfr bit is now sfr amp _BV bit Modules e Additional notes from lt avr sfr_defs h gt Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 21 lt avr sfr_defs h gt Special function registers 268 Bit manipulation e define BV bit 1 lt lt bit IO register bit manipulation define bit is set sfr bit SFR BYTE sfr amp _BV bit define bit is clear sfr bit SFR BYTE sfr amp BV bit define loop until bit is set sfr bit do while bit is clear sfr bit define loop until bit is clear sfr bit do while bit is set sfr bit 22 21 2 Define Documentation 22 21 2 1 define BV bit 1 lt lt bit include lt avr io h gt Converts a bit number into a byte value Note The bit shift is performed by the compiler which then inserts the result into the code Thus there is no run time overhead when using BV 22 21 2 2 define bit is clear sfr bit SFR BYTE sfr amp BV bit include lt avr io h gt Test whether bit bit in IO register sfr is clear This will return non zero if the bit is clear and a O if the bit is set
94. by the macro F CPU Note In order for these functions to work as intended compiler optimizations must be enabled and the delay time must be an expression that is a known constant at compile time If these requirements are not met the resulting delay will be much longer and basically unpredictable and applications that otherwise do not use floating point calculations will experience severe code bloat by the floating point library routines linked into the application The functions available allow the specification of microsecond and millisecond delays Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 28 util delay basic h gt Basic busy wait delay loops 284 directly using the application supplied macro CPU as the CPU clock frequency in Hertz Functions e void delay ms double ms e void delay us double us 22 27 2 Function Documentation 22 27 21 void delay ms double ms Perform a delay of __ms milliseconds using delay loop 20 The macro CPU is supposed to be defined to a constant defining the CPU clock frequency in Hertz The maximal possible delay is 262 14 ms F CPU in MHz When the user request delay which exceed the maximum possible one delay ms provides a decreased resolution functionality In this mode delay ms will work with a resolution of 1 10 ms providing delays up to 6 5535 seconds independent from CPU frequency The user will not be informed about de
95. byte An additional macro USE 2X will be defined Its value is set to 1 if the desired BAUD Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 30 lt util setbaud h gt Helper macros for baud rate calculations 287 rate within the given tolerance could only be achieved by setting the U2X bit in the UART configuration It will be defined to 0 if U2X is not needed Example usage include avr io h define F CPU 4000000 static void uart 9600 void define BAUD 9600 include lt util setbaud h gt UBRRH UBRRH_VALUE UBRRL UBRRL_VALUE if USE 2X UCSRA 1 lt lt U2X else UCSRA amp 1 lt lt U2X endif static void uart_38400 void undef BAUD avoid compiler warning define BAUD 38400 include lt util setbaud h gt UBRRH UBRRH_VALUE UBRRL UBRRL_VALUE dif USE 2X UCSRA 1 lt lt U2X else UCSRA amp 1 lt lt U2X endif In this example two functions are defined to setup the UART to run at 9600 Bd and 38400 Bd respectively Using a CPU clock of 4 MHz 9600 Bd can be achieved with an acceptable tolerance without setting U2X prescaler 25 while 38400 Bd require U2X to be set prescaler 12 Defines define BAUD TOL 2 define UBRR VALUE define UBRRL VALUE define UBRRH VALUE define USE 2X 0 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 31 lt util twi h gt TWI bit mas
96. c 375 string h 376 strlcat avr_string 203 strlcat S 379 strlcat P avr pgmspace 258 strlcat P S 379 avr string 203 strlcpy S 379 strlcpy P avr pgmspace 258 strlcpy P S 379 strlen avr string 203 strlen S 379 strlen P avr pgmspace 258 strlen P S 379 strlwr avr_string 203 strlwr S 379 strncasecmp avr_string 204 strncasecmp S 379 strncasecmp_P avr_pgmspace 258 strncasecmp_P S 379 strncat avr_string 204 strncat S 379 strncat P avr pgmspace 259 strncat_P S 379 strncmp avr string 204 strncmp S 379 strncmp P avr pgmspace 259 strncmp 5 379 strncpy avr string 204 strncpy S 379 strncpy P avr pgmspace 259 strncpy_P S 379 strnlen avr string 205 strnlen S 379 strnlen P avr pgmspace 260 strnlen P S 379 strpbrk avr string 205 strpbrk S 379 strpbrk P avr pgmspace 260 strpbrk_P S 379 strrchr avr string 205 strrchr S 379 strrchr P avr pgmspace 260 strrchr_P S 379 strrev avr string 206 strrev S 379 strsep avr string 206 strsep S 379 strsep P Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 402 avr pgmspace 260 strsep P S 379 strspn avr string 206 strspn S 379 strspn P avr pgmspace 261 strspn_P S 379 strstr avr string 206 strstr S 379 strstr P avr pgmspace 261 strstr P S 379 strtod avr stdlib 193 strtok avr string 207 strtok c 379 strtok avr string 207 strt
97. character It is equivalent to isupper c islower c 22 3 2 3 int isascii int Checks whether c is a 7 bit unsigned char value that fits into the ASCII character set 22 3 2 int isblank int Checks for a blank character that is a space or a tab 22 3 2 5 int iscntrl int Checks for a control character 22 3 2 6 int isdigit int Checks for a digit 0 through 9 22 3 2 7 int isgraph int Checks for any printable character except space 22 3 2 8 int islower int Checks for a lower case character 22 3 2 9 int isprint int Checks for any printable character including space 22 3 2 10 int ispunct int Checks for any printable character which is not a space or an alphanumeric character 22 3 2 11 int isspace int c Checks for white space characters For the avr libc library these are space form feed newline n carriage return r horizontal tab t and vertical tab Cw Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 4 lt errno h gt System Errors 133 22 3 2 12 int isupper int Checks for an uppercase letter 22 3 2 13 int isxdigit int Checks for a hexadecimal digits i e one of 0123456789abcdefABCDEF 22 3 2 14 int toascii int Converts c to a 7 bit unsigned char value that fits into the ASCII character set by clearing the high order bits Warning Many people will be unhappy
98. configure ac and commit configure ac to cvs branch Change the patch number to 90 to denote that this now a branch leading up to a release Be sure to leave the lt date gt part of the version 9 Bring the build system up to date by running bootstrap and configure 10 Perform a make distcheck and make sure it succeeds This will create the snapshot source tarball This should be considered the first release candidate Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 15 2 Releasing AVR Libc 120 11 12 Note Upload the snapshot tarball to savannah Announce the branch and the branch tag to the avr libc dev list so other devel opers can checkout the branch CVS tags do not allow the use of periods 7 15 2 2 Making a release A stable release will only be done on a branch not from the cvs HEAD The following steps should be taken when making a release 10 11 12 Make sure the source tree you are working from is on the correct branch cvs update r avr libe major minor branch Update the package version in configure ac and commit it to cvs Update the gnu tool chain version requirements in the README and commit to CVS Update the ChangeLog file to note the release and commit to cvs on the branch Add Released avr libc lt this_release gt Update the NEWS file with pending release number and commit to cvs Change Changes since avr libc lt last_releas
99. double __x double Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 6 lt math h gt Mathematics 147 double sin double x double sqrt double x double tan double __ x double floor double __ x double ceil double x double frexp double x int __pexp double Idexp double __x int exp double exp double x double cosh double x double sinh double __ double tanh double __x double acos double x double asin double x double atan double x double atan2 double y double x double log double x double log10 double x double pow double __x double y int isnan double __ x int isinf double x double square double x static double copysign double __x double y e double fdim double __x double y e double fma double x double __y double 7 e double fmax double __x double y e double fmin double __x double y int signbit double x double double x static int isfinite double __x double hypot double x double y double round double x long lround double x long lrint double x 22 6 2 Define Documentation 22 6 2 1 define INFINITY __ builtin_inf INFINITY constant 22 6 2 2 define 3 141592653589793238462643 The constant pi Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 6 lt math h gt Mat
100. dword address short pgm read dword near address short Read a double word from the program space with a 16 bit near address Note The address is a byte address The address is in the program space 22 18 2 6 define read dword far address long ELPM dword uint32 t address long Read a double word from the program space with a 32 bit far address Note The address is a byte address The address is in the program space Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 lt avr pgmspace h gt Program Space Utilities 253 22 18 27 define read dword near address short LPM dword uint16 t address short Read a double word from the program space with a 16 bit near address Note The address is a byte address The address is in the program space 22 18 2 8 define read float address short pgm read float near address short Read a float from the program space with a 16 bit near address Note The address is a byte address The address is in the program space 22 18 2 9 read float far address long ELPM float uint32 t address long Read a float from the program space with a 32 bit far address Note The address is a byte address The address is in the program space 22 18 2 10 define read float near address short LPM float uintl6 t address short Read a float from the program space with a 16 b
101. field width If the con verted value has fewer characters than the field width it will be padded with spaces on the left or right if the left adjustment flag has been given to fill out the field width optional precision in the form of a period followed by an optional digit string If the digit string is omitted the precision is taken as zero This gives the minimum number of digits to appear for d i o u x and X conversions or the maximum number of characters to be printed from a string for s conversions An optional 1 or h length modifier that specifies that the argument for the d i u or X conversion isa long int rather than int The h is ignored as short int isequivalent to int A character that specifies the type of conversion to be applied The conversion specifiers and their meanings are diouxX The int or appropriate variant argument is converted to signed decimal d and 1 unsigned octal unsigned decimal or unsigned hexadecimal x and X notation The letters abcdef are used for x conversions the letters ABCDEF are used for X conversions The precision if any gives the minimum number of digits that must appear if the converted value requires fewer digits it is padded on the left with zeros Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 181 p The void argument is taken as an unsigned integer an
102. flags in the link stage Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 185 Wl u vfscanf lscanf flt im A third version is available for environments that are tight on space In addition to the restrictions of the standard one this version implements no specification This version is provided in the library 1ibscanf min a can be requested using the following options in the link stage Wl u vfscanf l1scanf min lm 22 9 3 35 int vfscanf P FILE stream const char x _ fmt va list Variant of vfscanf using a mt string in program memory 22 9 3 36 vprintf const char x fmt va list The function vprintf performs formatted output to stream stdout taking a vari able argument list as in vfprintf See vfprintf for details 22 9 3 37 vscanf const char fmt va list The function vscanf performs formatted input from stream st din taking a variable argument list as in vfscanf See vfscanf for details 22 9 3 38 vsnprintf char 65 size t const char x fmt va list ap Like vsprintf but instead of assuming s to be of infinite size no more than n characters including the trailing NUL character will be converted to s Returns the number of characters that would have been written to s if there were enough space 22 9 3 39 int vsnprintf P char s size t const char fmt va list ap
103. float classic 363 LPM float enhanced 364 LPM word classic 364 LPM word enhanced 364 pow avr math 151 power h 365 clock prescale set 365 PRId16 avr inttypes 136 PRId32 avr inttypes 136 PRId8 avr inttypes 136 PRIdFAST 16 avr_inttypes 136 PRIdFAST32 avr_inttypes 136 PRIdFASTS avr inttypes 136 PRIdLEASTI6 avr inttypes 136 PRIdLEAST32 avr inttypes 137 PRIdLEASTS8 avr inttypes 137 PRIdPTR avr inttypes 137 PRIi16 avr_inttypes 137 PRIi32 avr_inttypes 137 PRIi8 avr_inttypes 137 PRIiFAST16 avr_inttypes 137 PRIiFAST32 avr_inttypes 137 PRIiFAST8 avr_inttypes 137 PRILEAST16 avr_inttypes 137 PRIiLEAST32 avr_inttypes 137 PRIiLEAST8 avr_inttypes 138 PRIiPTR avr_inttypes 138 printf avr_stdio 177 printf_P avr_stdio 177 PRIo16 avr_inttypes 138 PRIo32 avr inttypes 138 PRIo8 avr_inttypes 138 PRIoFASTI6 avr inttypes 138 PRIoFAST32 avr inttypes 138 PRIoFAST8 avr_inttypes 138 PRIoLEAST16 avr_inttypes 138 PRIoLEAST32 avr_inttypes 138 PRIoLEAST8 avr_inttypes 138 PRIoPTR avr_inttypes 139 PRIu16 avr_inttypes 139 PRIu32 avr inttypes 139 PRIu8 avr inttypes 139 PRIuFASTI6 avr inttypes 139 PRIuFAST32 avr inttypes 139 PRIuFAST8 avr_inttypes 139 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 398 PRIuLEASTI6 PRIxPTR avr inttypes 139 avr inttypes 141 PRIuLEAST32 prog char avr i
104. format d ddde dd where there is one digit before the decimal point character and the number of digits after it is equal to the precision prec if the precision is zero no decimal point character appears If 1ags has the DTOSTRE UPPERCASE bit set the letter rather than e will be used to introduce the exponent The exponent always contains two digits if the value is zero the exponent is 00 If 1ags has the DTOSTRE ALWAYS SIGN bit set a space character will be placed into the leading position for positive numbers If flags has the DTOSTRE PLUS SIGN bit set a plus sign will be used instead of a space character in this case The dtostre function returns the pointer to the converted string s 22 10 4 10 char dtostrf double val signed char width unsigned char prec char x s The dtostrf function converts the double value passed in 1 into an ASCII repre sentationthat will be stored under s The caller is responsible for providing sufficient storage in s Conversion is done in the format d ddd The minimum field width of the output string including the and the possible sign for negative values is given in width and prec determines the number of digits after the decimal sign width is signed value negative for left adjustment The dtostrf function returns the pointer to the converted string s 22 10 4 11 void exit int status Generated on Fri Mar 13 16 47 36 2009
105. found If s2 points to a string of zero length the function returns s1 22 11 3 14 char x strcat char dest const char x src Concatenate two strings The strcat function appends the src string to the dest string overwriting the 0 char acter at the end of dest and then adds a terminating 70 character The strings may not overlap and the dest string must have enough space for the result Returns The strcat function returns a pointer to the resulting string dest 22 11 3 15 char x strchr const char src int val Locate character in string The strchr function returns a pointer to the first occurrence of the character val in the string src Here character means byte these functions do not work with wide or multi byte characters Returns The strchr function returns a pointer to the matched character or NULL if the character is not found 22 11 3 16 char x strchrnul const char x s int c The strchrnul function is like strchr except that if c is not found in s then it returns a pointer to the null byte at the end of s rather than NULL Glibc GNU extension Returns The strchrnul function returns a pointer to the matched character or a pointer to the null byte at the end of s i e s str len s if the character is not found Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 203 22 11 3 17 int stremp const char 57 cons
106. idle mode could be used as well but probably would not conserve much energy anyway since the interrupt service is executed quite frequently Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 6 3 Example program 34 Note 7 Interrupt functions can get the usual names that are also available to C programs The linker will then put them into the appropriate interrupt vector slots Note that they must be declared global in order to be acceptable for this purpose This will only work if lt avr io h gt has been included Note that the assembler or linker no chance to check the correct spelling of an interrupt function so it should be double checked When analyzing the resulting object file using avr objdump or avr nm a name like vector N should appear with N being a small integer number Note 8 As explained in the section about special function registers the actual IO port address should be obtained using the macro SFR IO ADDR The 905 1200 does not have RAM thus the memory mapped approach to access the IO registers is not available It would be slower than using in out instructions anyway Since the operation to reload TCCNTO is time critical it is even performed before saving SREG Obviously this requires that the instructions involved would not change any of the flag bits in SREG Note 9 Interrupt routines must not clobber the global CPU state Thus it is usually necessary to
107. individually update EEPROM cells fuse bits and or lock bits if their access is supported by the Atmel serial programming protocol The main flash instruction memory of the AVR can also be programmed in interactive mode however this is not very useful because one can only turn bits off The only way to turn flash bits on is to erase the entire memory using avrdude s e option avrdude is part of the FreeBSD ports system To install it simply do the following cd usr ports devel avrdude make install Once installed avrdude can program processors using the contents of the hex file specified on the command line In this example the file main hex is burned into the flash memory avrdude 2313 e m flash i main hex avrdude AVR device initialized and ready to accept instructions avrdude Device signature 0x1e9101 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 14 Using the avrdude program 117 avrdude erasing chip avrdude done avrdude reading input file main hex avrdude input file main hex auto detected as Intel Hex avrdude writing flash 1749 0x00 avrdude 1750 bytes of flash written avrdude verifying flash memory against main hex avrdude reading on chip flash data 1749 0x00 avrdude verifying avrdude 1750 bytes of flash verified avrdude done Thank you The 2313 option lets avrdude know that we are operating on an 419052313 chip This option specifies
108. linker changed the preference and picks the wrong option in this situation Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 3 3 Tunables for malloc 18 external RAM on board RAM 0x0100 Ox10FF 0x1100 OxFFFF 4 bL malloc heap heap end RAMEND __brkval 1 malloc heap start start L bss end data bss start data start Figure 2 Internal RAM stack only external RAM variables and heap If dynamic memory should be placed in external RAM while keeping the variables in internal RAM something like the following could be used Note that for demonstration purposes the assignment of the various regions has not been made adjacent in this example so there are holes below and above the heap in external RAM that remain completely unaccessible by regular variables or dynamic memory allocations shown in light bisque color in the picture below avr gcc Wl defsym heap start 0x802000 defsym heap end 0x803fff external RAM RAM SP _ t __malloc_heap_end heap end RAMEND __brkval bss end malloc heap start heap start data bss start 0x0100 Ox10FF 0x1100 0x200 Ox3FFF OxFFFF data start Figure 3 Internal RAM variables and stack external RAM heap If malloc_heap_end is 0 the allocator attempts to detect the bottom of stack in order
109. no more tokens are found Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 12 avr boot h Bootloader Support Utilities 209 22 11 3 38 char x strupr char x s Convert a string to upper case The strupr function will convert a string to upper case Only the lower case alphabetic characters a 7 are converted Non alphabetic characters will not be changed Returns The strupr function returns a pointer to the converted string The pointer is the same as that passed in since the operation is perform in place 22 2 lt avr boot h gt Bootloader Support Utilities 22 12 1 Detailed Description include avr io h include lt avr boot h gt The macros in this module provide a C language interface to the bootloader support functionality of certain AVR processors These macros are designed to work with all sizes of flash memory Global interrupts are not automatically disabled for these macros It is left up to the programmer to do this See the code example below Also see the processor datasheet for caveats on having global interrupts enabled during writing of the Flash Note Not all AVR processors provide bootloader support See your processor datasheet to see if it provides bootloader support Todo From email with Marek On smaller devices all except ATmega64 128 SPM REG is in the I O space accessible with the shorter in and out instructions since the boot loader has a limited
110. of copying the contents of data from the flash to SRAM For all other devices this code as well as the code to zero out the bss section is loaded from libgcc a init5 Unused User definable init6 Unused for C programs but used for constructors in C programs init7 Unused User definable 1018 Unused User definable init9 Jumps into main 4 7 The finiN Sections These sections are used to define the exit code executed after return from main or a call to exit These all are subparts of the text section The finiN sections are executed in descending order from 9 to 0 finit9 Unused User definable This is effectively where _exit starts fini8 Unused User definable fini7 Unused User definable Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 4 8 Using Sections in Assembler Code 24 fini6 Unused for C programs but used for destructors in C programs fini5 Unused User definable fini4 Unused User definable fini3 Unused User definable fini2 Unused User definable finil Unused User definable fini0 Goes into an infinite loop after program termination and completion of any _exit code execution of code in the fini9 gt finil sections 4 8 Using Sections in Assembler Code Example include lt avr io h gt section 1 ax progbits ldi r0 Oxff out _ IO ADDR PORTB out SFR IO ADDR DDRB
111. on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 172 int vfscanf P FILE stream const char fmt va list int fscanf FILE stream const char fmt int fscanf P FILE stream const char fmt int scanf const char fmt intscanf P const char fmt int vscanf const char fmt va list int sscanf const char buf const char fmt int sscanf_P const char buf const char fmt int fflush FILE xstream FILE fdevopen int put char FILE x int get FILE 22 9 2 Define Documentation 22 0 2 fidefine FDEV EOF 2 Return code for an end of file condition during device read To be used in the get function of fdevopen 22 9 2 2 define FDEV ERR 1 Return code for an error condition during device read To be used in the get function of fdevopen 22 0 2 3 define FDEV SETUP READ SRD fdev setup stream with read intent 22 9 24 define FDEV SETUP RW SRD SWR fdev setup stream with read write intent 22 0 2 5 define FDEV SETUP WRITE SWR setup stream with write intent 22 9 2 6 define EOF 1 EOF declares the value that is returned by various standard IO functions in case of an error Since the AVR platform currently doesn t contain an abstraction for actual files its origin as end of file is somewhat meaningless here Generated on Fri
112. on using the standard IO facilities intends to explain that complex topic using a practical microcontroller peripheral setup with one RS 232 con nection and an HD44780 compatible industry standard LCD display The Example using the two wire interface TWI project explains the use of the two wire hardware interface also known as I2C that is present on many AVR controllers Finally the Combining C and assembly source files demo shows how C and assem bly language source files can collaborate within one project While the overall project is managed by a C program part for easy maintenance time critical parts are written directly in manually optimized assembly language for shortest execution times possi ble Naturally this kind of project is very closely tied to the hardware design thus it is custom tailored to a particular controller type and peripheral setup As an alternative to the assembly language solution this project also offers a C only implementation de ploying the exact same peripheral setup based on a more sophisticated and thus more expensive but pin compatible controller While the simple demo is meant to run on about any AVR setup possible where a LED could be connected to OCR1 A output the large and stdio demos are mainly targeted to the Atmel STK500 starter kit and the TWI example requires a controller where some 24Cxx two wire EEPPROM can be connected to For the STK500 demos the default CPU either an AT90S8
113. operand and the respective input operand list remains empty asm volatile X tmp reg 0 mov 0 mov DO mov BO mov CO 6 0 tmp reg mov tmp reg BO co tmp reg r value n t AnNE NEN NND TANNET MATINET If operands do not fit into a single register the compiler will automatically assign enough registers to hold the entire operand In the assembler code you use A0 to refer to the lowest byte of the first operand A1 to the lowest byte of the second operand and so on The next byte of the first operand will be B0 the next byte CO and so on This also implies that it is often neccessary to cast the type of an input operand to the desired size A final problem may arise while using pointer register pairs If you define an input operand e ptr and the compiler selects register Z 130 131 then AO refers to x30 and BO refers to r31 But both versions will fail during the assembly stage of the compiler if you explicitely need 7 like in ld 24 7 If you write r24 0 with a lower case a following the percent sign then the compiler will create the proper assembler line Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7 4 Clobbers 44 7 4 Clobbers As stated previously the last part of the asm statement the list of clobbers may be omitted including the colon seperator However if you are using registe
114. passage of time due EEPROM s inability to hold a charge from the excessive write wear Back to FAQ Index 11 35 Why is my baud rate wrong Some AVR datasheets give the following formula for calculating baud rates F CPU UART BAUD RATE 16L 1 Unfortunately that formula does not work with all combinations of clock speeds and baud rates due to integer truncation during the division operator When doing integer division it is usually better to round to the nearest integer rather than to the lowest To do this add 0 5 1 e half the value of the denominator to the numerator before the division resulting in the formula F_CPU UART BAUD RATE 8L UART BAUD RATE 161 1 This is also the way it is implemented in lt util setbaud h gt Helper macros for baud rate calculations Back to FAQ Index 12 Building and Installing the GNU Tool Chain This chapter shows how to build and install from source code a complete develop ment environment for the AVR processors using the GNU toolset There are two main sections one for Linux FreeBSD and other Unix like operating systems and another section for Windows Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 1 Building and Installing under Linux FreeBSD and Others 89 12 4 Building and Installing under Linux FreeBSD and Others The default behaviour for most of these tools is to install every thing under the usr ilocal directory In or
115. pulse width of 920 microseconds denotes one end of the scale represented as 0 pulse width on output and 2120 microseconds mark the other end 100 output PWM Normally multiple channels would be encoded that way in subsequent pulses followed by a larger gap so the en tire frame will repeat each 14 through 20 ms but this is ignored for the purpose of the demo so only a single input PWM channel is assumed The basic challenge is to use the cheapest controller available for the task an ATtiny13 that has only a single timer channel As this timer channel is required to run the out going PWM signal generation the incoming PWM decoding had to be adjusted to the constraints set by the outgoing PWM As PWM generation toggles the counting direction of timer 0 between up and down after each 256 timer cycles the current time cannot be deduced by reading TCNTO only but the current counting direction of the timer needs to be considered as well This requires servicing interrupts whenever the timer hits 255 and BOTTOM to learn about each change of the counting direction For PWM generation itis usually desired to run it at the highest possible speed so filtering the PWM frequency from the modulated output signal is made easy Thus the PWM timer runs at full CPU speed This causes the overflow and compare match interrupts to be triggered each 256 CPU clocks so they must run with the minimal number of processor cycles possible in orde
116. radix is greater than 10 the next digit after 9 will be the letter a If radix is 10 and val is negative a minus sign will be prepended The ltoa function returns the pointer passed as s 22 10 4 17 malloc size t size The malloc function allocates size bytes of memory If malloc fails a NULL pointer is returned Note that malloc does not initialize the returned memory to zero bytes See the chapter about malloc usage for implementation details 22 10 4 18 void qsort void x base size t nmemb size t size compar fn t compar The qsort function is a modified partition exchange sort or quicksort The qsort function sorts an array of nmemb objects the initial member of which is pointed to by base The size of each object is specified by size The contents of the Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 193 array base are sorted in ascending order according to a comparison function pointed to by compar which requires two arguments pointing to the objects being compared The comparison function must return an integer less than equal to or greater than zero if the first argument is considered to be respectively less than equal to or greater than the second 22 10 4 19 int rand void The rand function computes a sequence of pseudo random integers in the range of 0 to RAND MAX as defined by the head
117. returned If longjmp is invoked with a second argument of 0 1 will be returned instead Parameters jmpb Information saved by a previous call to setjmp ret Value to return to the caller of setjmp Returns This function never returns Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h gt Standard Integer Types 155 22 7 2 2 int setjmp jmp buf jmpb Save stack context for non local goto include lt setjmp h gt setjmp saves the stack context environment in __jmpb for later use by longjmp The stack context will be invalidated if the function which called setjmp returns Parameters jmpb Variable of type jmp_buf which holds the stack information such that the environment can be restored Returns setjmp returns O if returning directly and non zero when returning from longjmp using the saved context 22 8 lt stdint h gt Standard Integer Types 22 81 Detailed Description include stdint h Use u intN t if you need exactly N bits Since these typedefs are mandated by the C99 standard they are preferred over rolling your own typedefs Exact width integer types Integer types having exactly the specified width typedef signed char int8 t typedef unsigned char uint8 t typedef signed int int16 t typedef unsigned int uint16 t typedef signed long int int32 t typedef unsigned long int uint32 t typedef signed long long int int64 t typede
118. save at least the state of the flag bits in SREG Note that this serves as an example here only since actually all the following instructions would not modify SREG either but that s not commonly the case Also it must be made sure that registers used inside the interrupt routine do not conflict with those used outside In the case of a RAM less device like the 419051200 this can only be done by agreeing on a set of registers to be used exclusively inside the interrupt routine there would not be any other chance to save a register anywhere If the interrupt routine is to be linked together with C modules care must be taken to follow the register usage guidelines imposed by the C compiler Also any register modified inside the interrupt sevice needs to be saved usually on the stack Note 10 As explained in Interrupts a global catch all interrupt handler that gets all unassigned interrupt vectors can be installed using the _ vector default This must Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 6 4 Pseudo ops and operators 35 be global and obviously should end in a reti instruction By default a jump to location 0 would be implied instead 6 4 Pseudo ops and operators The available pseudo ops in the assembler are described in the GNU assembler gas manual The manual can be found online as part of the current binutils release under http sources redhat com binutils As gas come
119. size this could be an important optimization API Usage Example The following code shows typical usage of the boot API include lt inttypes h gt include lt avr interrupt h gt include lt avr pgmspace h gt void boot program page uint32 t page uint8 t buf uintl6 t i Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 12 avr boot h Bootloader Support Utilities 210 uint8 t sreg Disable interrupts sreg SREG cli eeprom busy wait boot page erase page boot spm busy wait Wait until the memory is erased for i20 i SPM PAGESIZE i 2 Set up little endian word uintl16 t w buf w xbuf lt lt 8 boot page fill page i boot page write page Store buffer in flash page boot spm busy wait Wait until the memory is written Reenable RWW section again We need this if we want to jump back to the application after bootloading boot rww enable Re enable interrupts if they were ever enabled SREG sreg Defines define BOOTLOADER SECTION attribute section bootloader define boot spm interrupt SPM REG uint8 t BV SPMIE define boot spm interrupt disable 5 REG amp uint8 t BV SPMIE define boot is spm interrupt SPM REG amp uint8 t BV SPMIEB define boot rww busy SPM REG amp uint8 t COMMON ASB define boot spm bu
120. so make sure the changes will be done early enough in the startup sequence The variables malloc heap start and malloc heap end be used to restrict the malloc function to a certain memory region These variables are stati cally initialized to point to__ heap start and heap end respectively where heap start is filled in by the linker to point just beyond bss and heap end is set to 0 which makes malloc assume the heap is below the stack If the heap is going to be moved to external RAM _ malloc heap must be adjusted accordingly This can either be done at run time by writing directly to this variable or it can be done automatically at link time by adjusting the value of the symbol heap end The following example shows a linker command to relocate the entire data and bss segments and the heap to location 0x1100 in external RAM The heap will extend up to address Oxffff avr gcc Wl section start data 0x801100 defsym heap end 0x80ffff Note See explanation for offset 0x800000 See the chapter about using gcc for the w1 options The ld linker user manual states that using Tdata lt x gt is equivalent to using section start data lt x gt However you have to use section start as above be cause the GCC frontend also sets the Tdata option for all MCU types where the SRAM doesn t start at 0x800060 Thus the linker is being faced with two Tdata options Sarting with binutils 2 16 the
121. space Returns The strcpy P function returns a pointer to the destination string dest Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 259 22 18 4 13 size t strcspn P const char x s P reject The strcspn_P function calculates the length of the initial segment of s which consists entirely of characters not in reject This function is similar to strcspn except that reject is a pointer to a string in program space Returns The strcspn function returns the number of characters in the initial segment of s which are not in the string re ject The terminating zero is not considered as part of string 22 18 4 14 size_t strlcat P char dst P size t siz Concatenate two strings The strlcat_P function is similar to strlcat except that the src string must be located in program space flash Appends src to string dst of size siz unlike strncat siz is the full size of dst not space left At most siz 1 characters will be copied Always NULL terminates unless 517 lt strlen dst Returns The strlcat_P function returns strlen src MIN siz strlen initial dst If retval gt siz truncation occurred 22 18 4 15 size tstrlcpy P char x dst PGM P size_t siz Copy a string from progmem to RAM Copy src to string dst of size siz At most siz 1 characters will be copied Always NULL terminates unless 517 0
122. src instead of forwards from the front Glibc GNU extension Returns The memrchr_P function returns a pointer to the matching byte or NULL if the character does not occur in the given memory area 22 18 4 6 int strcasecmp P const char s1 PGM P s2 Compare two strings ignoring case The strcasecmp_P function compares the two strings 51 and s2 ignoring the case of the characters Parameters 81 A pointer to a string in the devices SRAM 82 A pointer to a string in the devices Flash Returns The strcasecmp_P function returns an integer less than equal to or greater than Zero if s1 is found respectively to be less than to match or be greater than s2 A consequence of the ordering used by strcasecmp is that if s1 is an initial substring of s2 then s1 is considered to be less than s2 22 18 47 char x strcasestr P const char x s PGM P s2 This funtion is similar to strcasestr except that s2 is pointer to a string in program space 22 18 4 8 char x strcat P char x dest PGM P src The strcat_P function is similar to strcat except that the src string must be located in program space flash Returns The strcat function returns a pointer to the resulting string dest Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 258 22 18 4 9 PGM Pstrchr P P s int val Locate character in program space string The st
123. stderr __iob 2 Stream destined for error output Unless specifically assigned identical to stdout If stderr should point to another stream the result of another fdevopen must be explicitly assigned to it without closing the previous st derr since this would also close stdout 22 9 2 18 define stdin __iob 0 Stream that will be used as an input stream by the simplified functions that don t take a stream argument The first stream opened with read intent using fdevopen will be assigned to stdin 22 9 2 19 define stdout __iob 1 Stream that will be used as an output stream by the simplified functions that don t take a stream argument Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 175 The first stream opened with write intent using fdevopen will be assigned to both stdin and stderr 22 9 3 Function Documentation 22 9 3 1 void clearerr FILE stream Clear the error and end of file flags of st ream 22 9 3 2 int fclose FILE x stream This function closes st ream and disallows and further IO to and from it When using fdevopen to setup the stream a call to fclose is needed in order to free the internal resources allocated If the stream has been set up using fdev setup stream or FDEV SETUP STREAM use fdev_close instead It currently always returns for success 22 9 3 3 FILE fdevopen int char F
124. stdlib 187 random r avr stdlib 192 realloc avr stdlib 192 rem div t 336 t 337 reti avr interrupts 244 round avr math 151 sbi deprecated items 294 scanf avr stdio 177 scanf P avr stdio 177 SCNd16 avr_inttypes 141 SCNd32 avr_inttypes 141 SCNdFAST16 avr_inttypes 142 SCNdFAST32 avr_inttypes 142 SCNdLEAST16 avr_inttypes 142 SCNdLEAST32 avr_inttypes 142 SCNdPTR avr_inttypes 142 SCNi16 avr_inttypes 142 SCNi32 avr_inttypes 142 SCNiFAST16 avr_inttypes 142 SCNiFAST32 avr_inttypes 142 SCNiLEAST16 avr_inttypes 142 SCNiLEAST32 avr_inttypes 142 SCNiPTR avr_inttypes 143 SCNo16 avr inttypes 143 SCNo32 avr inttypes 143 SCNoFAST16 avr_inttypes 143 SCNoFAST32 avr_inttypes 143 SCNoLEAST16 avr_inttypes 143 SCNoLEAST32 avr_inttypes 143 SCNoPTR avr_inttypes 143 SCNul6 avr inttypes 143 SCNu32 avr inttypes 143 SCNuFAST16 avr_inttypes 143 SCNuFAST32 avr_inttypes 144 SCNuLEASTI6 avr inttypes 144 SCNuLEAST32 avr inttypes 144 SCNuPTR avr inttypes 144 SCNx16 avr_inttypes 144 SCNx32 avr_inttypes 144 SCNxFAST16 avr_inttypes 144 SCNxFAST32 avr_inttypes 144 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 400 SCNxLEAST16 srand avr_inttypes 144 avr_stdlib 193 SCNxLEAST32 srandom avr_inttypes 144 avr_stdlib 193 SCNxPTR sscanf avr_inttypes 144 sel avr_interrupts 244 setbaud h 366 setjmp longjmp 153 setj
125. that the compiler will not check if the operands are of reasonable type for the kind of operation used in the assembler instructions Input operands are you guessed it read only But what if you need the same operand for input and output As stated above read write operands are not supported in inline assembler code But there is another solution For input operators it is possible to use a single digit in the constraint string Using digit n tells the compiler to use the same register as for the n th operand starting with zero Here is an example asm volatile swap 0 r value 0 value This statement will swap the nibbles of an 8 bit variable named value Constraint 0 tells the compiler to use the same input register as for the first operand Note however that this doesn t automatically imply the reverse case The compiler may choose the same registers for input and output even if not told to do so This is not a problem in most cases but may be fatal if the output operator is modified by the assembler code before the input operator is used In the situation where your code depends on different registers used for input and output operands you must add the amp constraint modifier to your output operand The following example demonstrates this problem asm volatile in 0 1 n t out 1 2 n t amp r input I SFR IO ADDR port output In this example an input value is read from a port and th
126. the function like fdev setup stream so all data initialization happens during C start up If streams initialized that way are no longer needed they can be destroyed by first calling the macro fdev close and then destroying the object itself No call to fclose should be issued for these streams While calling fclose itself is harmless it will cause an undefined reference to free and thus cause the linker to link the malloc module into the application Notes Note 1 It might have been possible to implement a device abstraction that is compatible with fopen but since this would have required to parse a string and to take all Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 170 the information needed either out of this string or out of an additional table that would need to be provided by the application this approach was not taken Note 2 This basically follows the Unix approach if a device such as a terminal needs special handling it is in the domain of the terminal device driver to provide this functionality Thus a simple function suitable as put for fdevopen that talks to a UART interface might look like this int uart putchar char c FILE xstream if An uart_putchar r loop_until_bit_is_set UCSRA UDRE UDR c return 0 Note 3 This implementation has been chosen because the cost of maintaining an al
127. the C compiler could be explicitly called by the name avr c However there s currently no support for libstdc the standard support library needed for a complete C implementation This imposes a number of restrictions on the C programs that can be compiled Among them are Obviously none of the C related standard functions classes and template classes are available Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 8 Shouldn t I initialize all my variables 64 The operators new and delete are not implemented attempting to use them will cause the linker to complain about undefined external references This could perhaps be fixed Some of the supplied include files are not safe i e they need to be wrapped into extern C This could certainly be fixed too Exceptions are not supported Since exceptions are enabled by default in the frontend they explicitly need to be turned off using no exceptions in the compiler options Failing this the linker will complain about an undefined external reference to__ gxx personality 510 Constructors and destructors are supported though including global ones When programming in space and runtime sensitive environments like microcon trollers extra care should be taken to avoid unwanted side effects of the C calling conventions like implied copy constructors that could be called upon function invo cation etc
128. the appropriate name your routine will be called when the corresponding interrupt occurs The device library provides a set of default interrupt routines which will get used if you don t define your own Patching into the vector table is only one part of the problem The compiler uses by convention a set of registers when it s normally executing compiler generated code It s important that these registers as well as the status register get saved and restored The extra code needed to do this is enabled by tagging the interrupt function with attribute signal These details seem to make interrupt routines a little messy but all these details are handled by the Interrupt API An interrupt routine is defined with ISR This macro register and mark the routine as an interrupt handler for the specified peripheral The following is an example definition of a handler for the ADC interrupt Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 45 lt avr interrupt h gt Interrupts 223 include avr interrupt h ISR ADC_vect user code here Refer to the chapter explaining assembler programming for an explanation about inter rupt routines written solely in assembler language Catch all interrupt vector If an unexpected interrupt occurs interrupt is enabled and no handler is installed which usually indicates a bug then the default action is to reset the device by jumping to the reset vect
129. the device id and is matched up with the device of the same id in avrdude s configuration file usr local etc avrdude conf To list valid parts specify the v option The e option instructs avrdude to perform a chip erase before programming this is almost always necessary before programming the flash The m flash option indicates that we want to upload data into the flash memory while i main hex specifies the name of the input file The EEPROM is uploaded in the same way the only difference is that you would use m eeprom instead of m flash To use interactive mode use the t option avrdude p 2313 t avrdude AVR device initialized and ready to accept instructions avrdude Device signature 0x1e9101 avrdude The command displays a list of valid commands avrdude gt gt gt 7 Valid commands dump dump memory dump memtype addr lt N Bytes gt read alias for dump write write memory write lt memtype gt addr bl lt b2 gt lt bN gt erase perform a chip erase sig display device signature bytes part display the current part information send send a raw command send bl lt b2 gt lt b3 gt lt b4 gt help help 2 help quit quit Use the part command to display valid memory types for use with the dump and write commands Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 15 Release Numbering and Methodology 118
130. the related contraints Because of the improper constraint definitions in version 3 3 they aren t strict enough There is for example no constraint which restricts integer constants to the range 0 to 7 for bit set and bit clear operations Mnemonic Constraints Mnemonic Constraints adc rr add rr adiw rr andi asr r bclr I bid rl brbc Llabel brbs Llabel bset I bst rl cbi LI cbr d l com r cp Lr cpc LI cpi LI dec r elpm tz eor rr in rl inc r ld re Idd rb ldi d M 146 r label lpm 52 Isl r Isr r mov rr movw rr mul rr neg r Lr ori out Lr pop r push r rol r sbc rr sbci sbi LI sbic LI sbiw sbr sbrc rl sbrs rl ser d st e r std b r sts label r sub rr subi swap r Constraint characters may be prepended by a single constraint modifier Contraints without a modifier specify read only operands Modifiers are Modifier Specifies Write only operand usually used for all output operands Read write operand amp Register should be used for output only Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7 3 Input and Output Operands 42 Output operands must be write only and the C expression result must be an lvalue which means that the operands must be valid on the left side of assignments Note
131. to prevent a stack heap collision when extending the actual size of the heap to gain more space for dynamic memory It will not try to go beyond the current stack limit decreased by __malloc_margin bytes Thus all possible stack frames Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 3 4 Implementation details 19 of interrupt routines that could interrupt the current function plus all further nested function calls must not require more stack space or they will risk colliding with the data segment The default value of 11 marginis set to 32 3 4 Implementation details Dynamic memory allocation requests will be returned with a two byte header prepended that records the size of the allocation This is later used by free The returned address points just beyond that header Thus if the application accidentally writes before the returned memory region the internal consistency of the memory al locator is compromised The implementation maintains a simple freelist that accounts for memory blocks that have been returned in previous calls to free Note that all of this memory is considered to be successfully added to the heap already so no further checks against stack heap collisions are done when recycling memory from the freelist The freelist itself is not maintained as a separate data structure but rather by modifying the contents of the freed memory to contain pointers chaining the pieces together Th
132. to process the current value 22 35 3 Thesource code The source code is installed under Sprefix share doc avr libc examples asmdemo where prefix is a configuration option For Unix systems it is usually set to either usror usr local 22 36 simple project At this point you should have the GNU tools configured built and installed on your system In this chapter we present a simple example of using the GNU tools in an AVR project After reading this chapter you should have a better feel as to how the tools are used and how a Makefile can be configured 22 36 1 Project This project will use the pulse width modulator PWM to ramp an LED on and off every two seconds An AT90S2313 processor will be used as the controller The circuit for this demonstration is shown in the schematic diagram If you have a development kit you should be able to use it rather than build the circuit for this project Note Meanwhile the AT90S2313 became obsolete Either use its successor the pin compatible ATtiny2313 for the project or perhaps the ATmega8 or one of its successors ATmega48 88 168 which have become quite popular since the origi nal demo project had been established For all these more modern devices it is no longer necessary to use an external crystal for clocking as they ship with the inter nal 1 MHz oscillator enabled so C2 and Q1 can be omitted Normally for this experiment the external circuitr
133. to the user to build the tool application from its source code This can be a very daunting task to any potential user of these tools Luckily there are people who help out in this area Volunteers take the time to build the application from source code on particular host platforms and sometimes packaging the tools for convenient installation by the end user These packages contain the binary executables of the tools pre made and ready to use These packages are known as distributions of the AVR toolchain or by a more shortened name distros AVR toolchain distros are available on FreeBSD Windows Mac OS X and certain flavors of Linux Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 2 13 Open Source 15 2 13 Open Source of these tools from the original source code in the multitude of projects to the various distros are put together by many many volunteers All of these projects could always use more help from other people who are willing to volunteer some of their time There are many different ways to help for people with varying skill levels abilities and available time You can help to answer questions in mailing lists such as the avr gcc list or on forums at the AVR Freaks website This helps many people new to the open source AVR tools If you think you found a bug in any of the tools it is always a big help to submit a good bug report to the proper project good bug report always helps othe
134. uint8 t BOOT SIGROW READ N z addr16 N result N Read the Signature Row byte at address For some MCU types this function can also retrieve the factory stored oscillator calibration bytes Parameter address be 0 Ox1f as documented by the datasheet Note The values are MCU type dependent 22 12 2 15 define boot busy SPM REG amp uint8 t BV SPM ENABLE Check if the SPM instruction is busy 22 12 2 16 define boot busy wait do while boot_spm_busy Wait while the SPM instruction is busy 22 12 2 17 define boot spm interrupt disable SPM REG amp uint8_ t _BV SPMIE Disable the SPM interrupt 22 12 2 18 define boot_spm_interrupt_enable _SPM_REG uint8 t BV SPMIE Enable the SPM interrupt 22 12 2 19 define BOOTLOADER SECTION __attribute__ section boot loader Used to declare a function or variable to be placed into a new section called boot loader This section and its contents can then be relocated to any address such as the bootloader NRWW area at link time 22 12 2 20 define GET EXTENDED FUSE BITS 0x0002 address to read the extended fuse bits using boot lock fuse bits get Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 13 lt avr eeprom h gt EEPROM handling 216 22 12 2 21 define GET HIGH FUSE BITS 0 0003 address to read the high fuse bits using boot lock fuse bits get 22 12 2 2
135. value _ CONCAT value LL define UINT64_C value _ CONCAT value ULL define INTMAX C value _ CONCAT value LL define UINTMAX_C value ULL Typedefs Exact width integer types Integer types having exactly the specified width typedef signed char int8_t typedef unsigned char uint8_t typedef signed int int16_t typedef unsigned int uint16_t typedef signed long int int32_t typedef unsigned long int uint32_t typedef signed long long int int64_t typedef unsigned long long int uint64_t Integer types capable of holding object pointers These allow you to declare variables of the same size as a pointer typedef int16 t intptr t e typedef uintl6 t uintptr t Minimum width integer types Integer types having at least the specified width typedef int8 t int least8 t typedef uint8 t uint least8 t typedef int16 t int least16 t typedef uint16 tuint leastl6 t typedef int32 tint least32 t typedef uint32 t uint least32 t typedef int64 t int least 4 t typedef uint64 t uint least64 t Fastest minimum width integer types Integer types being usually fastest having at least the specified width typedef int8 t int fast8 t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 40 stdio h File Reference 371 typedef uint8 t uint fast8 t typedef int16 t int fastl t typedef uint16 tuint fastl t typedef int32 tint fast32 t typedef uint32 t uint fast32 t typedef int64 t int fast64 t
136. when writing reentrant code 85 Below is a table of library calls with known issues Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 33 What pitfalls exist when writing reentrant code 86 Library call Reentrant Issue Workaround Alternative rand random Uses global variables to keep state information Use special reentrant versions rand r random 1 strtod strtol strtoul Uses the global variable errno toreturn success failure Ignore errno or protect calls with cli sei or ATOMIC BLOCK if the application can tolerate it Or use sccanf or sccanf P if possible malloc realloc Uses the stack pointer Protect calls with calloc free and global variables to cli sei or allocate and free memory ATOMIC BLOCKY if the application can tolerate it If using an OS use the OS provided memory allocator since the OS is likely modifying the stack pointer anyway fdevopen fclose Uses calloc and free Protect calls with cli sei or ATOMIC BLOCK if the application can tolerate it Or use setup stream or FDEV SETUP STREAM Note fclose will only call free if the stream has been opened with fdevopen eeprom boot_ Accesses I O registers Protect calls with cliQ sei Q ATOMIC or use OS locking far Accesses I O register RAMPZ S
137. with interrupts disabled so the write to SPL is guaranteed to be executed with interrupts disabled still Thus the emitted sequence ensures interrupts will be disabled only for the minimum time required to guarantee the integrity of this operation Back to FAQ Index 11 29 Why are there five different linker scripts From a comment in the source code Which one of the five linker script files is actually used depends on command line options given to ld A x script file is the default script A xr script is for linking without relocation r flag xu script is like xr but xdox create constructors Ur flag A xn script is for linking with n flag mix text and data on same page xbn script is for linking with N flag mix text and data on same page Back to FAQ Index Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 30 How to add a raw binary image to linker output 82 11 30 How to add a raw binary image to linker output The GNU linker avr 1d cannot handle binary data directly However there s a com panion tool called avr objcopy This is already known from the output side it s used to extract the contents of the linked ELF file into an Intel Hex load file avr objcopy can create a relocatable object file from arbitrary binary input like avr objcopy I binary O elf32 avr foo bin foo o This will create a file named foo o with the contents of foo bin The contents will default to sec
138. 0 63 88 Of 90 pop roO 8a 1f 90 pop rl 8c 18 95 reti ISR TIMER1 OVF vect x Note 2 static uintl16 t pwm Note 3 static uint8 t direction switch direction x Note 4 8e 81 30 cpi r24 0x01 1 90 29 0 breq 10 Ox9c vector 8 0 56 gt 92 20 91 61 00 1ds r18 0x0061 96 30 91 62 00 145 r19 0x0062 9a ef cf rjmp 34 Ox7a lt vector 8 0 34 gt Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 Asimple project 309 if pwm TOP direction DOWN break case DOWN if pwm 0 9c 20 91 61 00 145 r18 0x0061 a0 30 91 62 00 145 r19 0 0062 a4 21 50 subi r18 0x01 1 a6 30 40 sbci r19 0x00 O a8 30 93 62 00 sts 0x0062 r19 ac 20 93 61 00 sts 0x0061 r18 21 15 rl9 rl b2 31 05 rli9 xt b4 11 7 brne 60 Ox7a lt __vector_8 0x34 gt direction UP b6 10 92 60 00 sts 0x0060 r1 ba df cf rjmp 66 Ox7a vector 8 0 34 gt switch direction x Note 4 case UP if pwm TIMER TOP direction DOWN bc 81 eO ldi r24 0x01 1 be 80 93 60 00 sts 0x0060 r24 c2 Gf rjmp 74 Ox7a vector 8 0 34 gt 000000c4 lt ioinit gt void ioinit void x Note 6 Timer 1 is 10 bit PWM 8 bit PWM on some ATtinys TCCRIA TIMER INIT c4 83 e8 ldi r24 0x83 131 c6 8f bd out 0x2f r24 47 Start timer 1 x NB TCCRIA and TCCRIB could actually
139. 0 7 out 2 tmp reg r result r addr32 I SFR IO ADDR RAMPZ 2301 result 24 34 27 define ELPM word classic Value LL extension uint32 t addr32 uint32 t addr uintl6 t _ result asm out 2 C1 NX XU nov r31 SBI manit mov r30 elpm mov 0 ro TANNET in r0 2 TANNET adiw r30 1 adc r0 zero n t out 2 ro n t elpm Ane mov B0 ro Pea r __result r addr32 I SFR IO ADDR RAMPZ 0 130 r31 result 24 34 2 define ELPM word enhanced addr Value QL extension 4 uint32 t addr32 uint32 t addr uintl6 t _ result asm out 2 5 1 movw r30 1 elpm A0 Z Po d tttm Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 34 pgmspace h File Reference 362 elpm BO 7 NA r result Addre32 I SFR IO ADDR RAMPZ p3QM ys result a a an an an a 24 34 2 9 define ELPM xmega addr Value extension N uint32 t __addr32 uint32 t addr uintl16 t _ result N asm N N in tmp reg 2 n t N out 2 C1 N movw r30 1 n t N elpm AO Z n t N elpm BO Z TANNET out 2 tmp re
140. 02F3F38070 F910F900FBEO 091610030916 200215030403 10511F710926 BCF83E88FBD8 2E087BB84E08 EB581608EBD1 0008 F4F3 9F13 F901 200E 0936 000D EB58 9BF7 823C1F4209168 0936200209318 BBD2ABD8F9116 F9018958130C8 FCF2091610042 2002093610013 FCF81E08093A8 1608EBD1BBC29 894089583E8E6 BBC1ABC82E087BB04 000F00084E089BF789485B7806885BF889585B787 100100008F7785BFF8CF7CCFF89400COF894FFCFED 00000001FF Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 A simple project 314 The j option indicates that we want the information from the text and data segment extracted If we specify the EEPROM segment we can generate a hex file that can be used to program the EEPROM 5 avr objcopy j eeprom change section Ima eeprom 0 O ihex demo elf demo eeprom hex There is no demo eeprom hex file written as that file would be empty Starting with version 2 17 of the GNU binutils the avr ob jcopy command that used to generate the empty EEPROM files now aborts because of the empty input section eeprom so these empty files are not generated It also signals an error to the Makefile which will be caught there and makes it print a message about the empty file not being generated 22 36 7 Letting Make Build the Project Rather than type these commands over and over they can all be placed in a make file To build the demo project using make save the following in a file called Makefile Note Th
141. 084 2974 3040 2930 1 2345 Stack bytes 66 66 MCU clocks 2513 2297 sscanf min Flash bytes 1540 1428 1354 1244 1354 1244 12345 Stack bytes 55 55 amp i MCU clocks 1339 1240 sscanf 12345 Flash bytes 1950 1838 1704 1594 1704 1594 amp i Stack bytes 53 53 MCU clocks 1334 1235 sscanf Flash bytes 1950 1838 1704 1594 1704 1594 point color Stack bytes 87 87 a z s MCU clocks 2878 2718 sscanf flt Flash bytes 3298 3186 2934 2824 2918 2808 1 2345 Stack bytes 63 63 amp x MCU clocks 2187 1833 strtod 1 2345 Flash bytes 1570 1458 1472 1362 1456 1346 amp p Stack bytes 22 22 MCU clocks 1237 971 strtol 12345 Flash bytes 942 830 874 764 808 698 amp p 0 Stack bytes 29 21 MCU clocks 1074 722 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 9 2 Math functions 54 9 2 Math functions The table contains the number of MCU clocks to calculate a function with a given argument s The main reason of a big difference between Avr2 and Avr4 is a hardware multiplication Function Avr2 Avr4 __addsf3 1 234 5 678 113 108 mulsf3 1 234 5 678 375 138 __divsf3 1 234 5 678 466 465 acos 0 54321 4411 2455 asin 0 54321 4517 2556 atan 0 54321 4710 2271 atan2 1 234 5 678 5270 2857 ceil 1 2345 177 177 cos 1 2345 3387
142. 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B 0x6C 0x6D and later in your code you access this data in a function and store a single byte into variable like so byte mydata i j Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 5 3 Storing and Retrieving Data in the Program Space 27 Now you want to store your data in Program Memory Use the PROGMEM macro found in lt avr pgmspace h gt and put it after the declaration of the variable but before the initializer like so finclude avr pgmspace h unsigned char mydata 11 10 PROGMEM 0 00 0 01 0 02 0 03 0 04 0 05 0 06 0 07 0 08 0 09 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 11 0 12 0 13 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D Ox1E 0x1F 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 0x54 0x55 0x56 0x57 0x58 0x59 Ox5A 0x5B 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B 0x6C 0x6D That s it Now your data is in the Program Space You can compile link and check the map file to verify that mydata is placed in the correct section Now that your data resides in the Program Space your code
143. 1 bunzip2 c binutils lt version gt tar bz2 tar xf cd binutils version Note Replace lt version gt with the version of the package you downloaded If you obtained gzip compressed file gz use gunzip instead of bunzip2 It is usually a good idea to configure and build binutils in a subdirectory so as not to pollute the source with the compiled files This is recommended by the binutils developers mkdir obj avr cd obj avr The next step is to configure and build the tools This is done by supplying arguments to the configure script that enable the AVR specific options configure prefix PREFIX target avr disable nls If you don t specify the prefix option the tools will get installed in the usr ilocal hierarchy i e the binaries will get installed in usr local bin the info pages get installed in usr local info etc Since these tools are chang ing frequently It is preferrable to put them in a location that is easily removed When configure is run it generates a lot of messages while it determines what is available on your operating system When it finishes it will have created several Makefiles that are custom tailored to your platform At this point you can build the project make Note BSD users should note that the project s Makefile uses GNU make syntax This means FreeBSD users may need to build the tools by using gmake If the tools compiled cleanly you re ready to i
144. 1 define FFS x This macro finds the first least significant bit set in the input value This macro is very similar to the function ffs except that it evaluates its argument at compile time so it should only be applied to compile time constant expressions where it will reduce to a constant itself Application of this macro to expressions that are not constant at compile time is not recommended and might result in a huge amount of code generated Returns The FFS macro returns the position of the first least significant bit set in the word val or 0 if no bits are set The least significant bit is position 1 Only 16 bits of argument are evaluted Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 199 22 11 3 Function Documentation 22 11 3 1 int ffs int val This function finds the first least significant bit set in the input value Returns The ffs function returns the position of the first least significant bit set in the word val or 0 if no bits set The least significant bit is position 1 Note For expressions that are constant at compile time consider using the FFS macro instead 22 11 3 2 intffsl long Same as ffs for an argument of type long 22 11 3 3 intffsll long long Same as ffs for an argument of type long long 22 11 3 4 void memccpy void dest const void src int val size_t len Copy memory area
145. 13 16 47 36 2009 for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 189 22 10 4 3 double atof const char nptr The atof function converts the initial portion of the string pointed to by nptr to double representation It is equivalent to calling strtod nptr char xx 0 22 10 4 4 int atoi const char x s Convert a string to an integer The atoi function converts the initial portion of the string pointed to by s to integer representation In contrast to int strtol s char NULL 10 this function does not detect overflow errno is not changed and the result value is not predictable uses smaller memory flash and stack and works more quickly 22 10 4 5 long atol const char x s Convert a string to a long integer The atol function converts the initial portion of the string pointed to by s to long integer representation In contrast to strtol s char NULL 10 this function does not detect overflow errno is not changed and the result value is not predictable uses smaller memory flash and stack and works more quickly 22 10 4 6 void bsearch const void key const void base size_t nmemb size t size int const void const void compar The bsearch function searches an array of nmemb objects the initial member of which is pointed to by base for a member that matches the object pointed to by key The size of each member of the array is specified by si
146. 16 MIN 159 int fast16 t 163 INT FAST32 MAX 159 INT FAST32 MIN 159 int fast32 t 163 INT FAST64 MAX 159 INT FAST64 MIN 159 int fast64 t 163 INT FAST8 MAX 159 INT FAST8 MIN 159 int fast8 t 164 INT LEAST16 MAX 159 INT LEASTI16 MIN 160 int least16 t 164 INT LEAST32 MAX 160 INT LEAST32 MIN 160 int least32 t 164 INT LEAST64 MAX 160 INT LEAST64 MIN 160 int least64 t 164 INT LEAST8 MAX 160 INT LEASTS8 MIN 160 int least8 t 164 INTMAX C 160 INTMAX MAX 160 MIN 160 intmax t 164 INTPTR MAX 160 MIN 161 intptr t 164 PTRDIFF MAX 161 PTRDIFF MIN 161 SIG ATOMIC MAX 161 SIG ATOMIC MIN 161 SIZE MAX 161 JINT16 C 161 JINT16 MAX 161 int16 t 164 JINT32 C 161 JINT32 MAX 161 int32 t 164 JINT64 C 161 JINT64 MAX 162 int64 t 165 JINT8_C 162 INT8 MAX 162 int8 t 165 JINT FAST16 162 int fastl6 t 165 JINT FAST32 MAX 162 int fast32 t 165 JINT FAST64 MAX 162 int fast64 t 165 JINT FAST8 MAX 162 int fast8 t 165 JINT LEASTI6 MAX 162 E C Ce CEs E Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 389 uint least16 t 165 JINT LEAST32 MAX 162 int least32 t 165 JINT LEAST64 MAX 162 int least64 t 165 INT LEAST8 MAX 162 int least8 t 166 C 163 MAX 163 intmax t 166 JINTPTR MAX 163 uintptr t 166 avr stdio _FDEV_EOF 171
147. 1671 cosh 1 2345 4922 2979 exp 1 2345 4708 2765 fdim 5 678 1 234 111 111 floor 1 2345 180 180 fmax 1 234 5 678 39 37 fmin 1 234 5 678 35 35 fmod 5 678 1 234 131 131 frexp 1 2345 0 42 41 hypot 1 234 5 678 1341 866 Idexp 1 2345 6 42 42 log 1 2345 4142 2134 log10 1 2345 4498 2260 modf 1 2345 0 433 429 pow 1 234 5 678 9293 5047 round 1 2345 150 150 sin 1 2345 3353 1653 sinh 1 2345 4946 3003 sqrt 1 2345 494 492 tan 1 2345 4381 2426 tanh 1 2345 5126 3173 trunc 1 2345 178 178 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 10 Porting From IAR to AVR GCC 55 10 Porting From IAR to AVR GCC 10 1 Introduction C language was designed to be a portable language There two main types of port ing activities porting an application to a different platform OS and or processor and porting to a different compiler Porting to a different compiler can be exacerbated when the application is an embedded system For example the C language Standard strangely does not specify a standard for declaring and defining Interrupt Service Rou tines ISRs Different compilers have different ways of defining registers some of which use non standard language constructs This chapter describes some methods and pointers on porting an AVR application built with the IAR compiler to the GNU toolchain AVR GCC Note that this may not be an exhaustive list 10 2 Registers I
148. 2 Id define SCNi32 li define SCNiLEAST32 li define SCNiFAST32 li define SCNdPTR SCNd16 define SCNIPTR SCNi16 define SCNo16 define SCNoLEAST16 o define SCNoFAST16 o define SCNul6 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt gt Integer Type conversions 137 define SCNuLEASTI6 define SCNuFAST16 define SCNx16 x define SCNxLEAST16 x define SCNxFAST16 x define SCNo32 lo define SCNoLEAST32 lo define SCNoFAST32 lo define SCNu32 lu define SCNuLEAST32 lu define SCNuFAST32 lu define SCNx32 Ix define SCNXLEAST32 Ix define SCNxFAST32 Ix define SCNoPTR SCNo16 define SCNuPTR SCNul6 define SCNxPTR SCNx16 22 5 2 Define Documentation 22 5 2 1 ffdefine PRId16 d decimal printf format for int16 t 22 5 2 2 define PRId32 Id decimal printf format for int32 t 22 5 2 3 define PRId8 decimal printf format for int8 t 22 5 2 4 define PRIGFAST16 decimal printf format for int fast16 t 22 5 2 5 define PRIdFAST32 Id decimal printf format for int fast32 t 22 5 2 6 define PRIdFASTS decimal printf format for int fast8 t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt gt Integer Type conversions 138 22 5 27 define PRIGLEAST16 d decimal printf format for int_least16_t 22 5 2 8 define PRIGLEAST32 Id decim
149. 2 ttdefine GET LOCK BITS 0x0001 address to read the lock bits using boot lock fuse bits get 22 12 2 23 define GET LOW FUSE BITS 0x0000 address to read the low fuse bits using boot lock fuse bits get 22 13 lt avr eeprom h gt EEPROM handling 22 13 1 Detailed Description include lt avr eeprom h gt This header file declares the interface to some simple library routines suitable for han dling the data EEPROM contained in the AVR microcontrollers The implementation uses a simple polled mode interface Applications that require interrupt controlled EEPROM access to ensure that no time will be wasted in spinloops will have to deploy their own implementation Note All of the read write functions first make sure the EEPROM is ready to be ac cessed Since this may cause long delays if a write operation is still pending time critical applications should first poll the EEPROM e g using eeprom_ is_ready before attempting any actual I O But this functions are not wait until SELFPRGEN in SPMCSR becomes zero Do this manually if your softwate con tains the Flash burning As these functions modify IO registers they are known to be non reentrant If any of these functions are used from both standard and interrupt context the applica tions must ensure proper protection e g by disabling interrupts before accessing them All write functions force erase_and_write programming mode IAR C compatibility defines e defin
150. 2 22 2222 RES 167 22 9 2 Define Documentation uolo m m Rs RR 172 229 3 Punction Documentation 9 175 2210 lt stdlib h gt General utilities 186 22 10 1 Detailed Description sos ek oom ee 186 22 10 2 Defne Documentation vsu o ute RR a A Ro 188 22 10 3 Typedet Documentation 222m omm cc 188 22 10 4 Function 188 22 10 5 Variable Documentation 197 22 Sine SENS 222226550552 EY 197 22 11 1 Detailed Description sss RR RR 197 22 11 2 Define Documentation lt e s e ooo Rx yx s 198 22 11 3 Function Documentation 2 m a a 199 22 12 avr boot h Bootloader Support Utilities 209 22 12 1 Detailed Description gt o lt a s esa ee mus 209 2212 2 Define Documentation ls om Re mom ew 211 22 13 lt ho EEPROM handling 216 22 131 Detailed Description 2m S 216 22 13 2 Define s soo 217 22 133 Function Documentation RE 218 22 14 cayrfuse h Fuse Support oo cx o 52222 219 22 15 caventertupt gt Datertupts corr 222 22 15 1 Detailed Description gt oe ee mm gms 222 22 15 2 Define Documentation sso o Es 242 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS viii 22 16 avr io h AVR device specific IO definitions 245 22 1 ev eck os LackbitSuppel
151. 2 5 2 92 define SCNxFAST32 Ix hexadecimal scanf format for uint_fast32_t 22 5 2 93 define SCNxLEAST16 x hexadecimal scanf format for uint_least16_t 22 5 2 94 define SCNxLEAST32 Ix hexadecimal scanf format for uint_least32_t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 6 lt math h gt Mathematics 146 22 5 2 95 define SCNxPTR SCNx16 hexadecimal scanf format for uintptr t 22 5 3 Typedef Documentation 22 5 3 1 typedef int32 t int farptr t signed integer type that can hold a pointer gt 64 KB 22 5 3 2 typedef uint32 t uint farptr t unsigned integer type that can hold a pointer gt 64 KB 22 6 math h Mathematics 22 6 1 Detailed Description include lt math h gt This header file declares basic mathematics constants and functions Notes In order to access the functions delcared herein it is usually also required to additionally link against the library 1ibm a See also the related FAQ entry Math functions do not raise exceptions and do not change the errno vari able Therefore the majority of them are declared with const attribute for better optimization by GCC Defines define PI 3 141592653589793238462643 define SORT2 1 4142135623730950488016887 define builtin nan define INFINITY builtin inf Functions e double cos double x e double fabs double x e double fmod double __ x double y e double modf
152. 2 8 lt stdint h gt Standard Integer Types 164 22 8 2 54 define UINT LEAST8 MAX UINT8 MAX largest value an uint least8 t can hold 22 8 2 55 define UINTMAX C value ULL define a constant of type uintmax t 22 8 2 56 define UINTMAX MAX UINT64 MAX largest value an uintmax t can hold 22 8 2 57 define UINTPTR MAX UINTI16 largest value an uintptr t can hold 22 8 3 Typedef Documentation 22 8 3 1 typedef signed int int16 t 16 bit signed type 22 8 3 2 typedef signed long int int32 t 32 bit signed type 22 8 3 3 typedef signed long long int int64 t 64 bit signed type Note This type is not available when the compiler option mint8 is in effect 22 8 3 4 typedef signed char int8 t 8 bit signed type 22 8 3 5 typedef int16_t int_fast16_t fastest signed int with at least 16 bits 22 8 3 6 typedef int32_t int_fast32_t fastest signed int with at least 32 bits Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h gt Standard Integer Types 165 22 8 3 7 typedef int64 t int fast64 t fastest signed int with at least 64 bits Note This type is not available when the compiler option mint8 is in effect 22 8 3 8 typedef int8 t int fast8 t fastest signed int with at least 8 bits 22 8 3 9 typedef int16 t int 16 t signed int with at least 16 bits 22 8 3 10 typedef int32 t int least32 t signed int with at least 32 bits
153. 2 Define Documentation 22 23 21 define AVR LIBC DATE 20090309UL Numerical representation of the release date 22 23 2 2 define AVR LIBC DATE STRING 20090309 String literal representation of the release date 22 23 2 3 define LIBC MAJOR 1 Library major version number 22 23 2 4 define LIBC MINOR 6 Library minor version number 22 23 2 5 define LIBC REVISION 6 Library revision number 22 23 2 6 define AVR LIBC VERSION J 10606UL Numerical representation of the current library version In the numerical representation the major number is multiplied by 10000 the minor number by 100 and all three parts are then added It is intented to provide a monoton ically increasing numerical value that can easily be used in numerical checks 22 23 27 define AVR LIBC VERSION STRING 1 6 6 String literal representation of the current library version 2224 lt avr wdt h gt Watchdog timer handling 22 24 1 Detailed Description include avr wdt h This header file declares the interface to some inline macros handling the watchdog timer present in many AVR devices In order to prevent the watchdog timer configura tion from being accidentally altered by a crashing application a special timed sequence is required in order to change it The macros within this header file handle the required Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 24 lt avr wdt h gt Watchdog tim
154. 2009 for avr libc by Doxygen 1 3 Supported Devices Devices atxmegal6a4 atxmegal6d4 atxmega32a4 atxmega32d4 atxmega64al atxmega64a3 atxmegal28al atxmegal28a3 atxmega256a3 atxmega256a3b Miscellaneous Devices at94K 2 at76c711 3 at43usb320 at43usb355 at86rf401 at90scr100 ata6289 Classic AVR Devices at90s1200 1 at90s2313 at90s2323 at90s2333 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 1 4 avr libc License 8 at90s2343 at90s4414 e 219054433 at90s4434 at90s8515 at90c8534 at90s8535 Note 1 Assembly only There is no direct support for these devices to be programmed in C since they do not have a RAM based stack Still it could be possible to program them in C see the FAQ for an option Note 2 The at94K devices are a combination of FPGA and AVR microcontroller TRoth 2002 11 12 Not sure of the level of support for these More information would be welcomed Note 3 The at76c711 is a USB to fast serial interface bridge chip using an AVR core 1 4 avr libc License avr libc can be freely used and redistributed provided the following license conditions are met Portions of avr libc are Copyright c 1999 2008 Werner Boellmann Dean Camera Pieter Conradie Brian Dean Keith Gudger Wouter van Gulik Bjoern Haase Steinar Haugen Peter Jansen Reinhard Jessich Magnus Johansson Harald Kipp
155. 22 26 1 Detailed Description gt s re o RR RR RRA 280 2225 2 Function Documentation Rs 281 22 27 lt util delay h gt Convenience functions for busy wait delay loops 283 22 21 1 Detaled Description s lt o o ceser etp tretes 283 22 27 2 Function Documentation 284 22 28 lt util delay_basic h gt Basic busy wait delay loops 284 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS ix 22 28 1 Detailed Description 284 22 28 2 Punchon Documentation gt lt sss lt s eR eos 285 22 29 parity h gt Panty bit generation lt a 3 sd t Rs 285 2249 1 Detaled Descrpti n lt se sse eroas rip eee a 285 22 29 2 Define Documentation scc 9 m Rs 286 22 30 lt util setbaud h gt Helper macros for baud rate calculations 286 2230 1 Detailed Description se cco moemoe ie p 599 5 286 22 302 Define Documentation 288 2231 lt util twi h gt TWI bit mask definitions 288 22 31 1 Detailed Description lt o lt oo oe ia Saks 288 22 31 2 Define Documentation 2 290 22 32 lt compat deprecated h gt Deprecated items 293 2532 1 Detailed Description lt lt ec ose 52585 i i 293 22 32 2 Define Documentation lt 2 24 4 428546 Geese eS 294 22 323 Function D c mentation gt ee RA 296 22 33 lt compat ina90 h gt Compatibility with I
156. 22 3 4 Detailed Description These functions perform various operations on characters include lt ctype h gt Character classification routines These functions perform character classification They return true or false status de pending whether the character passed to the function falls into the function s classifi cation i e isdigit returns true if its argument is any value 0 though 9 inclusive If the input is not an unsigned char value all of this function return false int isalnum int c e int isalpha int c int isascii int e int isblank int int iscntrl int e int isdigit int c e intisgraph int c int islower int c e intisprint int c int ispunct int c e int isspace int e int isupper int c e int isxdigit int c Character convertion routines This realization permits all possible values of integer argument The toascii function clears all highest bits The tolower and toupper functions return an input argument as is if it is not an unsigned char value inttoascii int c int tolower int __c int toupper int c 22 3 2 Function Documentation 22 3 2 1 int isalnum int c Checks for an alphanumeric character It is equivalent to isalpha c isdigit c Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 3 lt ctype h gt Character Operations 132 22 3 2 intisalpha int Checks for an alphabetic
157. 224 4 688 5 mex 376 24 57sdupcEbieReleren ee oo o a ca nro eA ee GG 376 24 57 1 Detailed Description gt lt ec ee ee as 376 24 58smg h Fil Reference 6 ca sco ee o9 222 377 24 58 1 Detailed Description 377 24 59stricat S File Referenc 2 380 24 59 7 Detailed Description o ue za do o Sede BA eS 380 2A bUstricat BS File Referenc us esos ow oto o o ER a e 380 24 60 1 Detailed Description 380 24 61 strlepy S File Refem nce ss ca soo A jaa ooo 380 2401 1 DetuledDsscrpHaen s oo e 6G o eR og a i RO 380 24 62stricpy_P5 File Reterenc 22 22 2222 m RR 380 24021 Detailed Des ripiion 22 2222 2 380 24 s File lt lt sao eR RR E 380 24 63 1 Detailed Description 2 22 22222 380 24 64 strlen PS File Reference o o occ 4 o o or o m m Ro 380 24 64 1 Detailed Description 380 240550 File Referente lt ramia ee ae ode EE ek ee eS 380 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS xv 24 65 1 Detailed Description 380 24 6605tmcasecmp o File Reference cs o cocs ees Be OS 380 24 66 Detmled Description sss eack e dn BA Re 380 24 07 stmicaseemp P5 File Reference op o c mu 99r RR RS 380 24 67 1 Detailed Description 380 24 68strncat 5 File Reference iu uoce 222 22 222 380 2466 1 Detailed D
158. 250p atmega328p atmega48 atmega48p atmega64 atmega640 atmega644 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 1 3 Supported Devices atmega644p atmega645 atmega6450 atmega8 atmega88 atmega88p atmega8515 atmega8535 tinyAVR Devices 11 1 attiny12 1 attiny 13 attiny 13a attiny15 1 attiny22 attiny24 attiny25 attiny26 attiny261 attiny28 1 attiny2313 attiny43u attiny44 attiny45 attiny461 attiny48 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 1 3 Supported Devices attiny84 attiny85 attiny861 attiny87 attiny88 Automotive AVR Devices e atmegal ml atmega32c1 atmega32m1 atmega64c1 atmega64m1 attiny 167 CAN AVR Devices at90can32 at90can64 at90can128 LCD AVR Devices atmega169 atmega169p atmega329 atmega329p atmega3290 atmega3290p atmega649 atmega6490 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 1 3 Supported Devices Lighting AVR Devices at90pwml at90pwm2 at90pwm2b at90pwm216 at90pwm3 at90pwm3b at90pwm316 at90pwmB81 Smart Battery AVR Devices atmega8hva atmegal6hva atmega32hvb atmega406 USB AVR Devices at90usb82 at90usb162 at90usb646 at90usb647 at90usb1286 at90usb1287 atmegal6u4 atmega32u4 atmega32u6 Generated on Fri Mar 13 16 47 36
159. 25420 34 0 Sor B0 38 01 0000003a sar Ta 0000003c 20 82 51 40 1 42 4d 44 61 00000046 include enum UP ISR cO rjmp cO rjmp cO rjmp cO rjmp cO rjmp cO rjmp cO rjmp cO rjmp cO rjmp 60 rjmp cO rjmp cO rjmp cO rjmp cO rjmp 0 rjmp cO rjmp cO rjmp cO rjmp cO rjmp ctors end 24 eor be out 5 ldi e0 141 bf out bf out lt clear bs e0 ldi e6 141 0 141 0 rjmp 2xx0 pt gt pt gt pt gt pt gt pt gt pt gt pt gt pt gt pt gt pt gt pt gt pt gt pt gt pt gt pt gt pt gt pt gt NTS READONLY DEBUGGING 051 00000000 00000000 0000053 NTS READONLY DEBUGGING text 36 0x26 lt __ctors_end gt 258 0x106 interru 256 0x106 lt __bad_interru 254 0x106 interru 252 0x106 interru 250 0x106 interru 248 0x106 lt __bad_interru 246 0x106 lt __bad_interru 52 0 46 vector 8 242 0x106 interru 240 Ox106 lt __bad_interru 238 0x106 lt __bad_interru 236 0x106 lt __bad_interru 234 0x106 lt __bad_interru 232 0x106 interru 230 0x106 interru 228 0x106 interru 226 0x106 interru 224 0x106 interru Id bi ri ap 63 r28 Ox5F 95 r29 0x04 4 0x3e r29 62 Ox3d r28 61 S CLT 0x000 r26 0x60 96 r27 0x00 0 2 0 3 do clear bss
160. 255 N Integer constant 1 O Integer constant 8 16 24 P Integer constant 1 Q GCC gt 4 2 x A memory address based on Y or Z pointer with displacement R gt 4 3 x Integer 6 to 5 constant The selection of the proper contraint depends on the range of the constants or registers which must be acceptable to the AVR instruction they are used with The C compiler doesn t check any line of your assembler code But it is able to check the constraint against your C expression However if you specify the wrong constraints then the compiler may silently pass wrong code to the assembler And of course the assembler will fail with some cryptic output or internal errors For example if you specify the constraint r and you are using this register with an ori instruction in your as sembler code then the compiler may select any register This will fail if the compiler chooses r2 to r15 It will never choose r0 or r1 because these are uses for special purposes That s why the correct constraint in that case is d On the other hand if you use the constraint M the compiler will make sure that you don t pass anything else but an 8 bit value Later on we will see how to pass multibyte expression results Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7 3 Input and Output Operands 41 to the assembler code The following table shows all AVR assembler mnemonics which require operands and
161. 261__ avr2 avr25 1 attiny43u __AVR_ATtiny43U__ avr2 avr25 1 attiny44 44 avr2 avr25 1 attiny45 __AVR_ATtiny45__ avr2 avr25 1 attiny461 __AVR_ATtiny461__ avr2 avr25 1 attiny48 48 avr2 avr25 1 attiny84 ATtiny84 avr2 avr25 1 attiny85 ATtiny85 avr2 avr25 1 attiny861 __AVR_ATtiny861__ avr2 avr25 1 attiny87 __AVR_ATtiny87__ avr2 avr25 1 attiny88 __AVR_ATtiny88__ avr3 atmega603 __AVR_ATmega603__ avr3 at43usb355 AVR ATA3USB355 avr3 avr31 3 atmegal03 ATmegal03 avr3 avr31 3 at43usb320 AVR ATA3USB320 avr3 avr35 2 at90usb82 __AVR_AT9OUSB82__ avr3 avr35 2 at90usb162 _ AVR_AT90USB162__ avr3 avr35 2 attiny167 __AVR_ATtiny167__ avr3 at76c711 AVR AT76C711 avr4 atmega48 __AVR_ATmega48__ avr4 atmega48p __AVR_ATmega48P__ avr4 atmega8 ATmega8 avr4 atmega8515 __AVR_ATmega8515__ avr4 atmega8535 __AVR_ATmega8535__ avr4 atmega88 AVR ATmega88 avr4 atmega88p __AVR_ATmega88P__ avr4 atmega8hva __AVR_ATmega8HVA__ avr4 at90pwml _ AVR AT90PWMI avr4 at90pwm2 AVR_AT90PWM2__ avr4 at90pwm2b AVR avr4 at90pwm3 AVR AT90PWM3 avr4 at90pwm3b AVR AT90PWMS3B avr4 at90pwm81 AVR ATO0PWMSI avr5 at90pwm216 AVR ATOOPWM216 avr5 at90pwm316 AVR ATOOPWM316 avr5 at90can32 AVR ATOOCAN22 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 1 Options
162. 287 AT90USB1286 AT90USB647 AT90USB646 TXDONE_ SIG_ Transmission AT86RF401 vect TXDONE Done Bit Timer Flag 2 Interrupt TXEMPTY_ SIG_TXBE Transmit Buffer AT86RF401 vect Empty Bit Itmer Flag 0 Interrupt UARTO RX SIG UARTO Rx ATmegal61 vect UARTO Complete RECV UARTO TX SIG UARTO Tx ATmegal6l vect UARTO Complete TRANS UARTO SIG UARTO Data ATmegal61 UDRE vect UARTO Register Empty DATA UART1_RX_ SIG_ UARTI Rx ATmegal61 vect UARTI Complete RECV UARTI TX SIG UARTI Tx ATmegal61 vect UARTI Complete TRANS UARTI SIG UARTI Data ATmegal61 UDRE vect UARTI Register Empty DATA Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 45 lt avr interrupt h gt Interrupts 239 Vector name Old vector Description Applicable for device name UART_RX_ SIG_UART_ UART Rx Com AT90S2313 419052333 AT90S4414 vect RECV plete 9054433 AT90S4434 9058515 AT90S8535 ATmegal03 ATmegal63 ATmega8515 UART_TX_ SIG_UART_ UART Tx Com AT90S2313 9052333 9054414 vect TRANS plete 9054433 AT90S4434 9058515 AT90S8535 ATmegal03 ATmegal63 ATmega8515 UART_ SIG_UART_ Data Reg AT90S2313 419052333 AT90S4414 UDRE_vect DATA ister Empty AT90S4433 9054434 9058515 AT90S8535 ATmegal03 ATmegal63 ATmega8515 USARTO SIG USARTO Rx ATmegal62 RXC vect USARTO Complete RECV
163. 28P ATmega3290 ATmega3290P ATmega48P ATmega6450 ATmega6490 ATmega8 ATmega8535 ATmega88P AT megal68 ATmega48 ATmega88 AT tiny2313 USL SIG USI USI Overflow ATmegal65 ATmegal65P ATmegal69 OVERFLOW_ OVERFLOW ATmegal69P ATmega325 ATmega3250 vect ATmega3250P ATmega329 ATmega3290 ATmega3290P ATmega645 ATmega6450 ATmega649 ATmega6490 ATtiny2313 USI OVF SIG USI USI Overflow ATtiny26 ATtiny43U ATtiny24 ATtiny44 vect OVERFLOW ATtiny84 ATtiny45 ATtiny25 ATtiny85 ATtiny261 ATtiny461 ATtiny861 USI START SIG USI USI Start Condi ATmegal65 ATmegal65P ATmegal69 vect START tion ATmegal69P ATmega325 ATmega3250 ATmega3250P ATmega329 ATmega3290 ATmega3290P ATmega645 ATmega6450 ATmega649 ATmega6490 ATtiny2313 ATtiny43U ATtiny45 ATtiny25 ATtiny85 ATtiny261 ATtiny461 ATtiny861 USI STRT SIG USI USI Start ATtiny26 vect START USI STR SIG USI USI START ATtiny24 ATtiny44 ATtiny84 vect START WATCHDOG SIG Watchdog Time ATtiny24 ATtiny44 ATtiny84 vect WATCHDOG out TIMEOUT WDT SIG Watchdog Timer ATtiny2313 OVERFLOW WATCHDOG_ Overflow vect TIMEOUT SIG WDT OVERFLOW WDT vect SIG WDT Watchdog Time AT90PWMG3 AT90PWM2 AT90PWMI SIG out Interrupt ATmegal284P ATmegal68P ATmega328P WATCHDOG ATmega32HVB ATmega406 ATmega48P TIMEOUT ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P A
164. 4 9058515 9054433 9058535 AT90PWM216 AT90PWM2B AT90PWM316 AT90PWM3B AT90PWM3 AT90PWM2 AT90PWMI AT90CAN128 AT90CAN32 AT90CANGA ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal6l ATmegal62 ATmegal63 ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega32 ATmega323 ATmega325 ATmega3250 ATmega3250P AT mega328P ATmega329 ATmega3290 ATmega3290P ATmega48P ATmega64 ATmega645 ATmega6450 ATmega649 ATmega6490 ATmega8 ATmega8515 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 AT megal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATtiny2313 ATtiny48 9008 162 AT90USB82 AT90USB 1287 AT90USB 1286 AT90USB647 9005 646 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 45 lt avr interrupt h gt Interrupts 234 Vector name Old vector Description Applicable for device name TIMERI SIG Timer Counter1 ATtiny26 CMPA_vect OUTPUT_ Compare Match COMPAREIA 1 TIMERI SIG Timer Counter1 ATtiny26 CMPB_vect OUTPUT_ Compare Match COMPAREIB 1B SIG Timer Counter1 AT90S2313 vect OUTPUT Compare Match COMPAREIA SIG Timer Counter1 AT90S4414 AT90S4434 419058515 COMPA vect OUTPUT Compare Match AT90S8535 AT90PWM216 COMPAREIA A AT90PWM2B AT90PWM316 AT90PWM3B AT90PWM3 AT90PWM2
165. 4 23 Enable timer 1 overflow interrupt TIMSK BV TOIE1 f0 84 eO ldi r24 0x04 4 f2 89 bf out 0x39 r24 57 sei f4 78 94 sei ioinit 0 loop forever the interrupts are doing the rest for Note 7 x Sleep mode f6 85 b7 In R245 0x35 53 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 Asimple project 311 8 80 68 ori r24 0x80 128 85 bf out 0x35 24 53 fc 88 95 sleep fe 85 b7 in 24 0x35 53 00 8f 77 andi r24 Ox7F 127 102 85 Df out 0x35 r24 53 104 f8 cf Pimp L6 Oxf6 lt main 0x18 gt 00000106 interrupt 06 7c cf rjmp 264 0x0 vectors 00000108 exit 08 f8 94 cli Oa 00 cO rjmp 0 0 0 lt exit 0000010c exit Oc 8 94 cli 0000010 stop program 10e ff cf rjmp 2 0 10 stop program 22 36 5 Linker Map Files avr objdump is very useful but sometimes it s necessary to see information about the link that can only be generated by the linker A map file contains this information A map file is useful for monitoring the sizes of your code and data It also shows where modules are loaded and which modules were loaded from libraries It is yet another view of your application To get a map file I usually add Wl Map demo map to my link command Relink the application using the following command to generate demo a portion of which is shown below
166. 4 MIN smallest negative value an int 64 t can hold 22 8 2 27 define INT LEAST8 MAX INT8 MAX largest positive value an int least8 t can hold 22 8 2 28 define INT LEAST8 MIN INT8 MIN smallest negative value an int least8 t can hold 22 8 2 29 define INTMAX _ CONCAT value LL define a constant of type intmax t 22 8 2 30 define INTMAX INT64 MAX largest positive value an intmax t can hold 22 8 2 31 define INTMAX MIN INT64 MIN smallest negative value an intmax_t can hold Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h gt Standard Integer Types 162 22 8 2 32 itdefine INTPTR MAX INT16 MAX largest positive value an intptr t can hold 22 8 2 33 define INTPTR MIN 6 MIN smallest negative value an intptr t can hold 22 8 2 34 define PTRDIFF MAX INT16 largest positive value a ptrdiff t can hold 22 8 2 35 define PTRDIFF MIN INT16 MIN smallest negative value a ptrdiff t can hold 22 8 2 36 define SIG ATOMIC MAX INT8 MAX largest positive value a sig atomic t can hold 22 8 2 37 define SIG ATOMIC MIN INT8 MIN smallest negative value a sig atomic t can hold 22 8 2 38 define SIZE CONCAT INTI16 MAX U largest value a size t can hold 22 8 2 39 define UINT16_C value CONCAT value U define a constant of type uint16 t 22 8 2 40 define UINTI6 MAX CONCAT INTI6 MAX U 2U 1U largest value
167. 515 or ATmega8515 should be removed from its socket and the ATmegal6 that ships with the kit should be inserted into socket SCKT3100A3 The ATmegal6 offers an on board ADC that is used in the large demo and all AVRs with an ADC feature a different pinout than the industry standard com patible devices In order to fully utilize the large demo a female 10 pin header with cable connecting to a 10 kOhm potentiometer will be useful For the stdio demo an industry standard HD44780 compatible LCD display of at least 16x1 characters will be needed Among other things the LCD4Linux project page describes many things around these displays including common pinouts Modules Combining C and assembly source files e A simple project A more sophisticated project Using the standard IO facilities Example using the two wire interface TWI Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 35 Combining C and assembly source files 298 22 35 Combining and assembly source files For time or space critical applications it can often be desirable to combine C code for easy maintenance and assembly code for maximal speed or minimal code size together This demo provides an example of how to do that The objective of the demo is to decode radio controlled model PWM signals and con trol an output PWM based on the current input signal s value The incoming PWM pulses follow a standard encoding scheme where a
168. 6 fdefine TCNT3 SFR MEMI16 0x94 define CANIDT SFR 2 0xF0 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 20 Additional notes from lt avr sfr_defs h gt 266 If SFR ASM COMPAT is not defined C programs can use names like PORTA directly in C expressions also on the left side of assignment operators and GCC will do the right thing use short I O instructions if possible The SFR OFFSET definition is not used in any way in this case Define SFR 5 COMPAT as 1 to make these names work as simple constants ad dresses of the I O registers This is necessary when included in preprocessed assem bler S source files so it is done automatically if ASSEMBLER is defined By default all addresses are defined as if they were memory addresses used in 1ds st s instructions To use these addresses in in out instructions you must subtract 0x20 from them For more backwards compatibility insert the following at the start of your old assem bler source file define _ SFR OFFSET 0 This automatically subtracts 0x20 from I O space addresses but it s a hack so it is recommended to change your source wrap such addresses in macros defined here as shown below After this is done the __SFR_OFF SET definition is no longer necessary and can be removed Real example this code could be used in a boot loader that is portable between devices with SPMCR at different addresses
169. 6 3 20 intisinf double x The function isinf returns 1 if the argument xis positive infinity 1 if __x is negative infinity and 0 otherwise Note The GCC 4 3 can replace this function with inline code that returns the 1 value for both infinities gcc bug 35509 22 6 3 21 int isnan double x The function isnan returns 1 if the argument __x represents a not a number NaN object otherwise 0 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 6 lt math h gt Mathematics 151 22 6 3 22 doubleldexp double x int exp The Idexp function multiplies a floating point number by an integral power of 2 The Idexp function returns the value of x times 2 raised to the power __ exp 22 6 3 23 double log double x The log function returns the natural logarithm of argument x 22 6 3 24 double log10 double x The log10 function returns the logarithm of argument __x to base 10 22 6 3 25 long Irint double x The lrint function rounds __x to the nearest integer rounding the halfway cases to the even integer direction That is both 1 5 and 2 5 values are rounded to 2 This function is similar to rint function but it differs in type of return value and in that an overflow is possible Returns The rounded long integer value If __x is not a finite number or an overflow was this realization returns the LONG_MIN value 0x80000000 22 6 3 26 long round double x The lr
170. 64 ATmega8 AT mega8515 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 AT mega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATmegal6HVA ATtiny2313 ATtiny28 48 ATtiny261 ATtiny461 AT tiny861 AT9OUSB162 9005 82 9005 1287 AT90USB1286 AT90USB647 AT90USB646 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt avr interrupt h gt Interrupts 229 Vector name Old vector name Description Applicable for device INT2_vect SIG_ INTERRUPT2 External Interrupt Request 2 AT90PWM3 AT90PWM2 AT90PWMI AT90CAN128 AT90CAN32 AT90CANGA ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal6l ATmegal62 ATmega32 ATmega323 ATmega32HVB ATmega406 ATmega64 ATmega8515 AT mega8535 ATmega640 ATmegal280 ATmegal 281 ATmega2560 AT mega2561 ATmega324P ATmegal64P ATmega644P ATmega644 AT megal6HVA AT90USB162 9005 82 9005 1287 AT90USB1286 AT90USB647 AT90USB646 INT3 vect SIG INTERRUPT3 External Interrupt Request 3 AT90PWM3 AT90PWM2 AT90PWMI AT90CAN128 AT90CAN32 AT90CANGA ATmegal03 ATmegal28 ATmega32HVB ATmega406 ATmega64 ATmega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 AT90USB162 9005 82 9005 1287 AT90USB 1286 AT90USB647 AT90USB646 4 vect SIG INTERRUPT4 External Interrupt Request 4 AT90CAN128
171. 64 INTERRUPTI Complete or Error EEPROM SIG ATtiny2313 READY vect EEPROM READY SIG EE READY EE RDY vect SIG EEPROM Ready 9052333 AT90S4433 AT90S4434 EEPROM AT9088535 ATmegal6 161 READY ATmegal62 ATmegal63 ATmega32 ATmega323 ATmega8 ATmega8515 ATmega8535 12 ATtinyl3 0 15 26 ATtiny43U ATtiny48 ATtiny24 ATtiny44 ATtiny84 ATtiny45 ATtiny25 ATtiny85 ATtiny261 ATtiny461 ATtiny861 EE READY SIG EEPROM Ready AT90PWMS3 AT90PWM2 AT90PWMI vect EEPROM AT90CAN128 AT90CAN32 AT90CANGA READY ATmegal03 ATmegal28 ATmegal284P ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega32HVB ATmega406 ATmega48P ATmega64 ATmega645 ATmega6450 ATmega649 ATmega6490 ATmega88P ATmegal68 ATmega48 ATmega88 AT mega640 ATmegal280 ATmegal281 AT mega2560 ATmega2561 ATmega324P AT megal64P ATmega644P ATmega644 AT megal6HVA AT90USB162 9005 82 9005 1287 AT90USB1286 AT90USB647 AT90USB646 EXT INTO SIG External Interrupt ATtiny24 ATtiny44 ATtiny84 vect INTERRUPTO Request 0 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt avr interrupt h gt Interrupts 228 Vector name Old vector name Description Applicable for device INTO_vect SIG_ INTERRUPTO External Interrupt 0
172. 6450 ATmega649 ATmega6490 ATmega8 ATmega8515 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATmegal6HVA ATtiny2313 48 ATtiny261 ATtiny46l AT tiny861 AT90USB162 9005 82 9005 1287 AT90USB 1286 AT90USB647 AT90USB646 SIG Timer Counter1 AT90CAN128 AT90CAN32 AT90CANGA COMPC_vect OUTPUT_ Compare Match ATmegal28 ATmega64 ATmega640 COMPAREIC C ATmegal280 ATmegal281 ATmega2560 ATmega2561 AT90USB162 9005 82 9005 1287 AT90USB1286 AT90USB647 9005 646 TIMERI SIG Timer Counter1 ATtiny261 ATtiny461 ATtiny861 COMPD_vect OUTPUT_ Compare Match COMPAREOD D TIMER 1 _ SIG_ Timer Counter1 AT90S2333 AT90S4433 ATtiny15 COMP_vect OUTPUT_ Compare Match COMPAREIA TIMERI SIG Timer Counter1 AT908S2313 ATtiny26 OVFI vect OVERFLOWI Overflow Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt avr interrupt h gt Interrupts 236 Vector name Old vector name Description Applicable for device TIMER 1_ OVF_vect SIG_ OVERFLOW 1 Timer Counter1 Overflow 9052333 9054434 AT90PWM216 AT90PWM2B AT90PWM316 AT90PWM3B AT90PWM3 AT90PWM2 AT90PWMI AT90CAN128 AT90CAN32 AT90CANGA ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal6l ATmegal62 ATmegal63 ATmegal65
173. A NACK 0x88 fdefine TW SR GCALL DATA 0x90 define TW SR GCALL DATA 0x98 define TW SR STOP OxAO define TW NO INFO OxF8 define TW BUS ERROR 0x00 define TW STATUS 5 define TW STATUS TWSR amp TW STATUS 5 R W bit in SLA R W address field define TW READ 1 define TW WRITE 0 24 91 wdt h File Reference 24 91 1 Detailed Description Defines define wdt reset volatile wdr define _WD_PS3_MASK 0x00 define WD_CONTROL_REG WDTCR define WD CHANGE BIT WDCE define wdt_enable value define wdt_disable define WDTO 15MS 0 define WDTO_30MS 1 define WDTO_60MS 2 define WDTO_120MS 3 define WDTO_250MS 4 define WDTO 500MS 5 define WDTO 1S 6 define WDTO_2S 7 define WDTO 4S 8 define WDTO 8S 9 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen Index lt alloca h gt Allocate space in the stack 128 lt assert h gt Diagnostics 129 lt avr boot h gt Bootloader Support Utili ties 208 lt avr eeprom h gt lt avr fuse h gt Fuse Support 218 avr interrupt h gt Interrupts 221 lt avr io h gt AVR device specific IO defi nitions 244 lt avr lock h gt Lockbit Support 245 lt avr pgmspace h gt Program Space Util ities 248 avr power h Power Reduction Man agement 261 lt avr sfr_defs h gt Special function regis ters 266 avr sleep h Power Management and Sleep Modes 268 lt a
174. ACK 0x98 general call data received NACK returned 22 31 2 22 define TW SR SLA 0x60 SLA W received ACK returned Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 34 lt util twi h gt TWI bit mask definitions 292 22 31 2 23 define TW SR STOP 0xA0 stop or repeated start condition received while selected 22 31 2 24 define TW ST LOST SLA 0xB0 arbitration lost in SLA RW SLA R received ACK returned 22 31 2 25 define TW_ST_DATA_ACK 0xB8 data transmitted ACK received 22 31 2 26 define TW_ST_DATA_NACK 0 0 data transmitted NACK received 22 31 2 27 define TW ST LAST DATA 0xC8 last data byte transmitted ACK received 22 31 2 28 define TW ST 51 ACK 0xA8 SLA R received ACK returned 22 31 2 29 define TW START 0x08 start condition transmitted 22 31 2 30 fidefine TW STATUS TWSR amp TW STATUS MASK TWSR masked by TW STATUS MASK 22 31 2 31 define TW STATUS MASK Value BV TWS7 _BV TWS6 _BV TWS5 _BV TWS4 BV TWS3 The lower 3 bits of TWSR are reserved on the ATmegal63 The 2 LSB carry the prescaler bits on the newer ATmegas 22 31 2 32 define TW WRITE 0 SLA W address Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 32 lt compat deprecated h gt Deprecated items 293 22 32 lt compat deprecated h gt Deprecated items 22 32 1 Detailed Description This header file contains several items that used to be avai
175. AR EWB 3 x 296 22 54 Demo Precis lt dos SS T bey Ro bor c3 S eee ee ted 296 22 34 1 Detailed Description sss RR RR 296 22 35Combining and assembly source files 298 22 55 Hattbware 5 ed ues 298 2225 7 A code walkthrough sp c ee RR ARR 5 299 22 353 Thesoume code 22222929 eR meo m RR Rs 301 22 507 simple projecE s s ook e ERROR 301 22 5B Phe Projeti ovo xo Ro 3o m m oy Xo RAO 301 22 365 The soiree Code a s cs oemat RR RR YS 304 22 36 3 Compiling and LINKIN oss RR RR RS 305 22 36 4 Examining the Object File llle 306 22 362 Lmker Map FIIS uso ERP Sos 311 22 36 6 Generating Intel Hex Files 313 22 36 7 Letting Make Build the Project c n 314 22 36 8 Reference to the source code 2 222 22 2 317 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS X 22 37A more sophisticated project 317 27 341 ee es 317 22 27 2 Functional GVEFVIEM 254222555500 e vus 321 22313 A code walk oUPl sous RR RR OAS Re Ge 8 321 22 374 Ihesoumecode 22252 9 bed woe Sas 324 22 38Using the standard IO 325 22 56 1 Hardware 222222252 55 559555 325 22 38 2 Functional OVervieW 2 22 2 22 326 22 38 3 A code walkthrough lt s o soc lk RR RR 327 22384 The sourcecode acs a Rr RE U
176. AT90CAN32 AT90CANGA ATmegal03 ATmegal28 AT mega64 ATmega640 ATmega1280 ATmegal281 ATmega2560 AT mega2561 AT90USBI62 9005 82 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 INTS vect SIG INTERRUPT5 External Interrupt Request 5 AT90CANI28 AT90CAN32 AT90CANGA ATmegal03 ATmegal28 AT mega64 ATmega640 ATmega1280 ATmegal281 ATmega2560 AT mega2561 AT90USB162 9005 82 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 INT6 vect SIG INTERRUPT6 External Interrupt Request 6 AT90CAN128 AT90CAN32 AT90CANGA ATmegal03 ATmegal28 AT mega64 ATmega640 ATmega1280 ATmegal281 ATmega2560 AT mega2561 AT90USBI62 9005 82 9005 1287 AT90USB1286 AT90USB647 AT90USB646 INT7 vect SIG INTERRUPT7 External Interrupt Request 7 AT90CAN128 AT90CAN32 ATIOCAN64 ATmegal03 ATmegal28 AT mega64 ATmega640 ATmega1280 ATmegal281 ATmega2560 AT mega2561 AT90USBI62 9005 82 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 IO PINS vect SIG PIN SIG PIN CHANGE External Interrupt Request 0 ATtinyll ATtiny12 ATtiny15 ATtiny26 LCD vect SIG LCD LCD Stat of Frame ATmegal69 ATmegal69P ATmega329 ATmega3290 ATmega3290P ATmega649 ATmega6490 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt avr interrupt h gt Interrupts 230 Vector name Old name vector Desc
177. ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega32 ATmega323 ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega32HVB ATmega48P AT mega64 ATmega645 ATmega6450 ATmega649 ATmega6490 8 ATmega8515 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 AT mega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATmegal6HVA ATtinyl5 ATtiny2313 48 ATtiny261 ATtiny46l AT tiny861 AT9OUSB162 9005 82 9005 1287 AT90USB1286 AT90USB647 AT90USB646 9054414 9058515 9054433 AT90S8535 TIMER2_ COMPA vect SIG OUTPUT COMPARE2A Timer Counter2 Compare Match A ATmegal68 ATmega48 ATmega88 AT mega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 AT mega324P ATmegal64P ATmega644P AT mega644 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 TIMER2_ COMPB_vect SIG_ OUTPUT_ COMPARE2B Timer Counter2 Compare Match A ATmegal68 ATmega48 ATmega88 AT mega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 AT mega324P ATmegal64P ATmega644P AT mega644 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 TIMER2_ COMP_vect SIG_ OUTPUT_ COMPARE2 Timer Counter2 Compare Match AT90S4434 AT90S8535 90 128 AT90CAN32 AT90CAN64 ATmegal03 ATmegal28 ATmegal6 ATmegal61 AT megal62 ATmegal63 ATmegal65 AT
178. CPU register see How to permanently bind a variable to a register Even in case the C code never has a need to access these variables declaring the register binding that way causes the compiler to not use these registers in C code at all The 1ags variable needs to be in the range of r16 through r31 as it is the target of a load immediate or SER instruction that is not applicable to the entire register file 22 35 2 3 isrs S This file is a preprocessed assembly source file The C preproces sor will be run by the compiler front end first resolving all include define etc directives The resulting program text will then be passed on to the assembler As the C preprocessor strips all C style comments preprocessed assembly source files can have both C style as well as assembly style comments At the top the IO register definition file avr io h and the project declaration file project hare included The remainder of the file is conditionally assembled only if the target MCU type is ATtiny13 so it will be completely ignored for the ATtiny45 option Next are the two interrupt service routines for timer 0 compare A match timer 0 hits as OCROA is set to 255 and timer 0 overflow timer 0 hits BOTTOM dis cussed above these are kept as short as possible They only save SREG as the flags will be modified by the INC instruction increment the counter hi variable which forms the high p
179. CU_TARGET attiny85 MCU_TARGET attiny86 OPTIMIZE 02 DEFS LIBS You should not have to change anything below here CE avr gcc Override is only needed by avr lib build system override CFLAGS g Wall OPTIMIZE mmcu TARGET DEFS override LDFLAGS 11 PRG map OBJCOPY avr objcopy OBJDUMP avr objdump all PRG elf lst text eeprom S PRG elf 5 OBJ 5 CFLAGS LDFLAGS o 8 LIBS dependency demo o demo c iocompat h clean rm rf x o PRG elf eps png x bak rm rf x lst map CLEAN FILES lst PRG 1st 156 elf Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 A simple project 316 S OBJDUMP h S lt gt Q Rules for building the text rom images text hex bin srec hex PRG hex bin PRG bin srec PRG srec hex elf j text j data O ihex lt srec elf j text j data O srec lt 6 oe bin elf j text j data O binary lt 50 Rules for building the eeprom rom images eeprom ehex ebin esrec ehex PRG eeprom hex PRG _eeprom bin esrec PRG _eeprom srec oe eeprom hex elf 5 j eeprom change section Ima eeprom 0 O ihex lt SR echo empty 8 not generated exit 0 eeprom srec elf OBJCOPY j eeprom change
180. DEM calculation Polynomial x 16 x 12 x 5 1 0x1021 Initial value 0 0 This is the CRC used by the Xmodem CRC protocol The following is the equivalent functionality written in C Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 207 lt util delay h gt Convenience functions for busy wait delay loops 283 uintl16 t crc xmodem update uintl6 t crc uint8 t data int i cre uintl16 lt lt 8 for i20 i 8 i XR ere cro else ere return crc amp 0x8000 crc lt lt 1 0x1021 lt lt 1 22 27 lt util delay h gt Convenience functions for busy wait delay loops 22 271 Detailed Description define F CPU 1000000UL 1 MHz define F CPU 14 7456E6 include lt util delay h gt Note As an alternative method it is possible to pass the F_CPU macro down to the com piler from the Makefile Obviously in that case no define statement should be used The functions in this header file are wrappers around the basic busy wait functions from util delay basic h They are meant as convenience functions where actual time values can be specified rather than a number of cycles to wait for The idea behind is that compile time constant expressions will be eliminated by compiler optimization so floating point expressions can be used to calculate the number of delay cycles needed based on the CPU frequency passed
181. DTO 156 define WDTO 257 define WDTO 4S 8 define WDTO_8S 9 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 24 lt avr wdt h gt Watchdog timer handling 274 22 24 2 Define Documentation 22 24 2 1 define wdt disable Value asm__ _ volatile Nam tmp reg SREG__ n t N oli AVE out 0 manjem N out 0 zero reg n t out SREG tmp reg n t no outputs I _SFR_IO_ADDR _WD_CONTROL_REG uint8 t _BV _WD_CHANGE_BIT _BV WDE yon X Disable the watchdog timer if possible This attempts to turn off the Enable bit in the watchdog control register See the datasheet for details 22 24 2 2 define wdt enable value Value asm volatile in tmp reg SREG n t N elg TANNET X n t N ob WO TANNET X out SREG tmp reg n t N out 0 2 no outputs x I SFR IO ADDR WD CONTROL REG r BV WD CHANGE BIT BV WDE r uint8 t value amp 0x08 WD PS3 MASK 0x00 _BV WDE value amp 0x07 EOT vx Enable the watchdog timer configuring it for expiry after timeout which is a com bination of the WDPO through WDP2 bits to write into the WDTCR register For those devices that have a WDTCSR register it uses the combination of the WDPO through WDP3 bits See also the symbolic constants WDTO 15MS et al 22 24 2 3 define w
182. E or e followed by an optional plus or minus sign followed by a sequence of digits Leading white space characters in the string are skipped The strtod function returns the converted value if any If endptr is not NULL a pointer to the character after the last character used in the conversion is stored in the location referenced by endptr If no conversion is performed zero is returned and the value of nptr is stored in the location referenced by endptr If the correct value would cause overflow plus or minus INFINITY is returned ac cording to the sign of the value and ERANGE is stored in errno If the correct value would cause underflow zero is returned and ERANGE 16 stored in errno 22 10 4 27 long strtol const char np r char endptr int base The strtol function converts the string in nptr to a long value The conversion is done according to the given base which must be between 2 and 36 inclusive or be the special value 0 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 195 The string may begin with an arbitrary amount of white space as determined by iss pace followed by a single optional or sign If base is zero or 16 the string may then include a prefix and the number will be read in base 16 otherwise zero base is taken as 10 decimal unless the next character is 0 in which cas
183. E E FE 332 22 39Example using the two wire interface TWI 332 22 30 1 Introduction Into TWI ls eS SSA g RS 332 22 397 The TWI example project 2 204 5 8 ps RR 333 24 303 The Sour e Code uos c ek wae 8 333 23 Data Structure Documentation 337 23 1 diy Reference 2 337 23 1 1 Detailed Description 337 23 1 3 Field Documentation lt e se sd ee ew 337 23 2 hv t Struct Reference o 29x RR x US ev RR 338 23 2 1 Detailed Description 222 22 222552205656 338 2322 Field Documentation Ry 338 24 File Documentation 338 24 1 assert h File Reference oou vs xu m wee e 338 24 1 1 Detaled Description 2022 22 2 2 338 24 2 ts File RefereBEe oon 5594554 339 24 21 Detailed Description lt s cos sacs ck 9 m x omo 339 24 3 awLS File Reference pao Rt ER S 339 24 3 1 Detailed Description 22 22 eeste teste 339 244 atomic Pile Reference cc e ooo so RR Res 339 244 1 Detailed Description lt RR B Re ER UE ts 339 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS xi 24 5 booth File Reference 2 5 330 245 1 Detailed Descripfion se cce aa a wg oe wa Sa eee eS 339 245 2 Define Documentation lt lt lt lt cs sa RE ws 341 24 6 File Reference 2222229 RR EGER GS 346 24 6 1 Detailed Description 346 24 7 File R
184. ES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE RE DISCLAIMED IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE IABLE FOR ANY DIRECT INDIRECT INCIDENTAL SPECIAL EXEMPLARY OR ONSEQUENTIAL DAMAGES INCLUDING BUT NOT LIMITED TO PROCUREMENT OF UBSTITUTE GOODS OR SERVICES LOSS OF USE DATA OR PROFITS OR BUSINESS NTERRUPTION HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY WHETHER IN ONTRACT STRICT LIABILITY OR TORT INCLUDING NEGLIGENCE OR OTHERWISE RISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE PQOHNARPH PH Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 2 Toolchain Overview 10 2 Toolchain Overview 2 1 Introduction Welcome to the open source software development toolset for the Atmel AVR There is not a single tool that provides everything needed to develop software for the AVR It takes many tools working together Collectively the group of tools are called a toolset or commonly a toolchain as the tools are chained together to produce the final executable application for the AVR microcontroller The following sections provide an overview of all of these tools You may be used to cross compilers that provide everything with a GUI front end and not know what goes on underneath the hood You may be coming from a desktop or server computer background and not used to embedded systems Or you may be just learning about
185. F file 22 48 lt gt Program Space Utilities 22 18 1 Detailed Description include lt avr io h gt include avr pgmspace h The functions in this module provide interfaces for a program to access data stored in program space flash memory of the device In order to use these functions the target device must support either the LPM or ELPM instructions Note These functions are an attempt to provide some compatibility with header files that come with IAR C to make porting applications between different compilers easier This is not 100 compatibility though GCC does not have full support for multiple address spaces yet If you are working with strings which are completely based in ram use the stan dard string functions described in lt string h gt Strings Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 250 If possible put your constant tables in the lower 64 KB and use pgm read byte near or pgm read word near instead of pgm read byte far or pgm read word far since it is more efficient that way and you can still use the upper 64K for executable code functions that are suffixed with a _P require their ar guments to be in the lower 64 KB of the flash ROM as they do not use ELPM instructions This is normally not a big concern as the linker setup arranges any program space constants declared using the
186. FIX make make install Note AVaRICE uses the BFD library for accessing various binary file formats You may need to tell the configure script where to find the lib and headers for the link to work This is usually done by invoking the configure script like this Replace hdr path with the path to the bfd h file on your system Replace 1ib path with the path to 1ibbfd a on your system 5 CPPFLAGS I hdr path LDFLAGS L lib path configure prefix PREFIX 12 11 Building and Installing under Windows Building and installing the toolchain under Windows requires more effort because all of the tools required for building and the programs themselves are mainly designed Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 12 Tools Required for Building the Toolchain for Windows 95 for running under a POSIX environment such as Unix and Linux Windows does not natively provide such an environment There are two projects available that provide such an environment Cygwin and MinGW MSYS There are advantages and disadvantages to both Cygwin provides a very complete POSIX environment that allows one to build many Linux based tools from source with very little or no source modifications However POSIX functionality is provided in the form of a DLL that is linked to the application This DLL has to be redistributed with your application and there are issues if the Cygwin DLL already exists on the installa
187. F_vect ISR_NAKED PORTB BV 0 results in SBI which does not affect SREG reti Choosing the vector Interrupt vector names The interrupt is chosen by supplying one of the symbols in following table There are currently two different styles present for naming the vectors One form uses names starting with SIG followed by a relatively verbose but arbitrarily chosen name describing the interrupt vector This has been the only available style in avr libc up to version 1 2 x Starting with avr libc version 1 4 0 a second style of interrupt vector names has been added where a short phrase for the vector description is followed by vect The short phrase matches the vector name as described in the datasheet of the respective device and in Atmel s XML files with spaces replaced by an underscore and other non alphanumeric characters dropped Using the suffix vect is intented to improve portability to other C compilers available for the AVR that use a similar naming con vention The historical naming style might become deprecated in a future release so it is not recommended for new projects Note The ISR macro cannot really spell check the argument passed to them Thus by misspelling one of the names below in a call to ISR a function will be created that while possibly being usable as an interrupt function is not actually wired into the interrupt vector table The compiler will generate a warning if it detects a su
188. Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 5 boot h File Reference 342 asm volatile sts 0 l n t spm n t word Oxffff n t nop n t i SFR MEM ADDR SPM REG E o Mint st BOOT PAGE ERASE z uint16 t address AO a ERE Vr ur 24 5 2 4 boot page erase extended address Value extension 4 asm _ volatile movw r30 A3 n t sts 1 C3 n t sts 0 2 n t spm n t su i SFR_MEM_ADDR __SPM_REG i SFR MEM ADDR RAMPZ lt 2 r uint8 t PAGE ERASE uint32 t address T5307 r31 24 5 2 5 define boot page erase normal address Value QL extension 4 asm volatile sts 0 1 n t spm n t i _SFR_MEM_ADDR __SPM_REG r uint8 t BOOT PAGE ERASE 2 uintl16 t address VE LE LA RR LM DEE EDE A A Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 5 boot h File Reference 343 24 5 2 6 boot page fill alternate address data Value extension asm 2 volatile movw r0 3 n t sts 0 1 n t spm n t word Oxffff n t nop n t ele i SFR MEM ADDR SPM REG r uint8 t BOOT PAGE FILL 2 uintl16 t address r uintl6 t data ro 24 5 2 7 define boot page fill extended address data Value QL extension 4 asm volatile
189. Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS iii 9 5 3 Howto DesipnalLibrary SA C uesmra LiB 22 222 259 A Re OSE EUR X E Ress MB DE Plor p m Benchmarks 91 of libe functions gt lt lt o se s eac eseas e ro O Math TuneHOBR 22202222222 ee x RUE 10 Porting From IAR to AVR GCC jal i e HET ac ez 10 3 Interrupt Service Routines 5 5 10 4 Intrinsic 5 222522222524 UU RO 8 Variables x29 99g Xm ee Rex UR EE 10 6 Non Returning main 10 7 Locking Registers slo m n Rm Rm mun ee Ros 11 Frequently Asked Questions FAQ oo DD nexo m ye wow 11 2 My program doesn t recognize a variable updated within an interrupt VOU an neee 11 3 I get undefined reference to for functions like sin 11 4 How to permanently bind a variable to a register 11 5 How to modify MCUCR or WDTCR early 11 6 What is all this__BV stuff about 11 7 C on the AVR 11 8 Shouldn t I initialize all my variables 11 9 Why do some 16 bit timer registers sometimes get trashed 11 11 Why does the PC randomly jump around when single stepping through myprograminavr gdb 49 50 51
190. ILE put int FILE x get This function is a replacement for fopen It opens a stream for a device where the actual device implementation needs to be provided by the application If successful a pointer to the structure for the opened stream is returned Reasons for a possible failure currently include that neither the put nor the get argument have been provided thus attempting to open a stream with no IO intent at all or that insufficient dynamic memory is available to establish a new stream If the put function pointer is provided the stream is opened with write intent The function passed as put shall take two arguments the first a character to write to the device and the second a pointer to FILE and shall return 0 if the output was successful and a nonzero value if the character could not be sent to the device If the get function pointer is provided the stream is opened with read intent The function passed as get shall take a pointer to FILE as its single argument and return one character from the device passed as an int type If an error occurs when trying to read from the device it shall return FDEV ERR If an end of file condition was reached while reading from the device FDEV EOF shall be returned If both functions are provided the stream is opened with read and write intent The first stream opened with read intent is assigned to st din and the first one opened with write intent is assigned to bo
191. Integer Types 158 define INT FAST32 MIN INT32 MIN define UINT FAST32 MAX UINT32 define INT FAST64 MAX INT64 MAX define INT FAST64 MIN INT64 MIN define UINT FAST64 MAX UINT64 MAX Limits of integer types capable of holding object pointers define INTPTR MAX INTIG6 MAX define INTPTR MIN INT16 MIN define UINTPTR MAX UINTI6 Limits of greatest width integer types define INTMAX MAX INT64 MAX define INTMAX MIN INT64 MIN define UINTMAX MAX UINT64 Limits of other integer types C implementations should define these macros only when STDC LIMIT MACROS is defined before lt stdint h gt is included define PTRDIFF MAX INTI6 MAX define PTRDIFF MIN INT16 MIN define SIG ATOMIC INT8 MAX define SIG ATOMIC MIN INT8 MIN define SIZE MAX CONCAT INT16 MAX U Macros for integer constants C implementations should define these macros only when STDC CONSTANT MACROS is defined before lt stdint h gt is included These definitions are valid for integer constants without suffix and for macros defined as integer constant without suffix define INT8_C value int8 t value define UINT8_C value uint8 t CONCAT value U e define INT16 C value value define UINT16_C value CONCAT value U define INT32_C value _ CONCAT value L Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h
192. Libc 1 24 815trsep 5 File Reference 380 2481 1 Detailed Description e ee 404 44 85 380 24 52s sep PS Pile Referente 22 oo mo omms 380 2782 1 Detailed D escrpti n 22 222 2 380 24 83 strspn S File Reference ooo cob mo ER Rs 380 24 83 1 Detailed Description 380 24 84stspn P5 File Reference o oro eR s 380 24 84 1 Detailed Description 380 2485555 File Referente uso ROR i o 8 380 2485 1 Detailed Description 2 2 2 2 22 RR EGG 380 24 86strstt PS File Referenc 2 22222 o xo o RR os 380 24 86 1 Detailed Description oss ez RRk 380 a or sition File Reference 2 u o o Re ee S 380 287 1 Detailed Description s zio mex 380 24 88strtok rS File Reference 381 24 88 1 Detailed Description 381 24 89struprs Pile Reference 2222 2 2 2 2 2 381 24 89 1 Detailed Description 381 24 90twi h Pile Reference oo o oee cessed men e 381 24 90 1 Detailed Description lt s e eR menm eS 381 24 91wdt h File Reference oo oco crac m m g a ok 0 382 24 91 1 Detailed Description oso m 9 te 382 1 AVR Libc 1 1 Introduction The latest version of this document is always available from http savannah nongnu org projects avr libc The AVR Libc package provides a subset of the standard C library for Atmel AVR 8 bit RI
193. List 128 strcspn P S 376 strdup c 376 string h 377 strlcat S 380 strlcat P S 380 strlcpy S 380 strlcpy P S 380 strlen S 380 strlen P S 380 strlwr S 380 strncasecmp S 380 strncasecmp P S 380 strncat S 380 strncat P S 380 strncmp S 380 strncmp 5 380 strncpy S 380 strncpy P S 380 strnlen S 380 strnlen P S 380 strpbrk S 380 strpbrk P S 380 strrchr S 380 strrchr P S 380 strrev S 380 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 Module Documentation 129 strsep S 380 strsep P S 380 strspn S 380 strspn P S 380 strstr S 380 strstr P S 380 strtok c 380 strtok r S 381 strupr S 381 util twi h 381 wdt h 382 22 Module Documentation 221 lt gt Allocate space in the stack 2211 Detailed Description Functions void alloca size t size 22 1 2 Function Documentation 22 1 2 1 void alloca size t size Allocate size bytes of space in the stack frame of the caller This temporary space is automatically freed when the function that called alloca re turns to its caller Avr libc defines the alloca as a macro which is translated into the inlined builtin alloca function The fact that the code is inlined means that it is impossible to take the address of this function or to change its behaviour by linking with a different library Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 2 lt assert h gt Diagnostics 130 Returns
194. M P 250 pgm read byte 250 pgm read byte far 251 pgm read byte near 251 read dword 251 read dword far 251 read dword near 251 pgm read float 252 pgm read float far 252 pgm read float near 252 read word 252 pgm read word far 252 pgm read word near 253 PGM VOID P 253 prog char 253 prog intl6 t 253 prog int32 t 253 prog int64 t 253 prog int8 t 254 prog uchar 254 prog uint16 t 254 prog uint32 t 254 prog uint64 t 254 prog uint8 t 254 prog void 254 PROGMEM 253 PSTR 253 strcasecmp P 256 strcasestr P 256 strcat P 256 strchr P 256 strchrnul P 257 strcmp P 257 strcpy P 257 strcspn P 257 strlcat P 258 P 258 strlen P 258 strncasecmp 258 strncat P 259 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 388 strncmp_P 259 strncpy P 259 strnlen P 260 strpbrk P 260 strrchr P 260 strsep P 260 strspn P 261 strstr P 261 avr sfr BV 267 bit is clear 267 bit is set 267 loop until bit is clear 267 loop until bit is set 267 avr sleep sleep cpu 269 sleep disable 270 sleep enable 270 avr stdint 6 C 158 INT16 MAX 158 6 MIN 158 int16 t 163 INT32 C 158 INT32 MAX 158 32 MIN 158 11432 t 163 INT64 C 158 INT64 MAX 158 INT64 MIN 158 int64 t 163 8 C 158 INT8 MAX 159 8 MIN 159 int8 t 163 INT FAST16 MAX 159 INT FAST
195. ND will decrease the current PWM value shorting PD3 to GND will increase it While PD4 is shorted to GND one ADC conversion for channel 0 ADC input is on PAO will be triggered each internal clock tick and the resulting value will be used as the PWM value So the brightness of the LED follows the analog input value on PCO VAREF on the STK500 should be set to the same value as VCC When running in serial control mode the function of the watchdog timer can be demon strated by typing an r This will make the demo application run in a tight loop without retriggering the watchdog so after some seconds the watchdog will reset the MCU This situation can be figured out on startup by reading the MCUCSR register The current value of the PWM is backed up in an EEPROM cell after about 3 seconds of idle time after the last change If that EEPROM cell contains a reasonable i e non erased value at startup it is taken as the initial value for the PWM This virtually preserves the last value across power cycles By not updating the EEPROM immme diately but only after a timeout EEPROM wear is reduced considerably compared to immediately writing the value at each change 22 37 3 A code walkthrough This section explains the ideas behind individual parts of the code The source code has been divided into numbered parts and the following subsections explain each of these parts Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen
196. O header files contain identifiers for all the register names and bit names for a par ticular processor IAR has individual header files for each processor and they must be included when registers are being used in the code For example include iom169 h Note IAR does not always use the same register names or bit names that are used in the AVR datasheet AVR GCC also has individual IO header files for each processor However the ac tual processor type is specified as a command line flag to the compiler Using the mmcu processor flag This is usually done in the Makefile This allows you to specify only a single header file for any processor type include lt avr io h gt Note The forward slash in the lt avr io h gt file name that is used to separate subdirecto ries can be used on Windows distributions of the toolchain and is the recommended method of including this file The compiler knows the processor type and through the single header file above it can pull in and include the correct individual IO header file This has the advantage that you only have to specify one generic header file and you can easily port your application Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 10 3 Interrupt Service Routines ISRs 56 to another processor type without having to change every file to include the new IO header file The AVR toolchain tries to adhere to the exact names of the registers and names
197. ONATOMIC RESTORESTATE 278 util crc crc16 update 280 ccitt update 280 crc ibutton update 281 crc xmodem update 281 util delay delay ms 283 delay us 283 util delay basic delay loop 1 284 delay loop 2 284 util parity parity even bit 285 util setbaud BAUD TOL 287 UBRR VALUE 287 UBRRH VALUE 287 UBRRL VALUE 287 USE 2X 287 util twi TW BUS ERROR 289 TW MR LOST 289 TW MR DATA ACK 289 DATA 289 TW SLA 289 MR SLA NACK 289 TW MT ARB LOST 289 TW MT DATA ACK 289 TW MT DATA NACK 289 TW MT 5 ACK 289 TW MT 5 NACK 289 TW NO INFO 289 TW READ 290 TW REP START 290 TW SR ARB LOST GCALL ACK 290 TW SR ARB LOST SLA ACK 290 TW SR DATA ACK 290 TW SR DATA NACK 290 TW SR GCALL 290 TW SR GCALL DATA ACK 290 TW SR GCALL DATA NACK 290 TW SR SLA ACK 290 TW SR STOP 290 TW ST LOST SLA ACK 291 TW ST DATA ACK 291 TW ST DATA NACK 291 TW ST LAST DATA 291 TW ST SLA 291 TW START 291 TW STATUS 291 TW STATUS MASK 291 TW WRITE 291 utoa avr stdlib 195 vfprintf avr stdio 178 vfprintf P avr stdio 181 vfscanf avr stdio 181 vfscanf P avr stdio 184 vprintf avr stdio 184 vscanf avr stdio 184 vsnprintf avr stdio 184 vsnprintf P Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 405 a
198. PD v E ELE s Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 5 boot h File Reference 345 24 5 2 11 define boot page write normal address Value extension N asm volatile N N sts 50 SINNET N spm n t i i SFR MEM ADDR SPM REG N r uint8 t BOOT PAGE WRITE N z uintl16 t address N 24 5 2 12 define boot rww enable Value extension N asm _ volatile N N sts 0 1 n t spm n t N i N i SFR MEM ADDR SPM REG N r uint8 t BOOT RWW ENABLE N 24 5 2 13 define boot rww enable alternate Value extension 4 asm volatile N N sts 0 1 n t spm n t word Oxffff n t nop n t N i SFR MEM ADDR SPM REG N r uint8 t BOOT RWW ENABLE N Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 6 16 File Reference 346 24 6 16 File Reference 24 6 1 Detailed Description Functions e static _ inline uintl6 t crc16 update uint16 t crc uint8 t data e static inline uintl6 t crc xmodem update uint16 t crc uint8 t data e static inline uintl6_t crc ccitt update uint16 t crc uint8 t data e static inline uint8 t crc ibutton update uint8 t crc uint8 t data 24 7 ctype h File Reference 24 7 1 Detailed Description Defines define 1 Functions Charact
199. PRIx8 140 PRIxFAST32 140 PRIXFASTS 140 PRIxFASTS 141 PRIXLEASTI6 141 PRIxLEASTI6 141 PRIXLEAST32 141 PRIxLEAST32 141 PRIXLEASTS 141 PRIxLEASTS 141 PRIXPTR 141 PRIxPTR 141 SCNd16 141 SCNd32 141 SCNdFASTI6 142 SCNdFAST32 142 SCNdLEASTI6 142 SCNdLEAST22 142 SCNdPTR 142 SCNi16 142 SCNi32 142 SCNiFAST16 142 SCNiFAST32 142 SCNiLEAST16 142 SCNiLEAST32 142 SCNiPTR 143 SCNo16 143 SCNo32 143 SCNoFAST 16 143 SCNoFAST32 143 SCNoLEAST16 143 SCNoLEAST32 143 SCNoPTR 143 SCNul6 143 SCNu32 143 SCNuFASTI6 143 SCNuFAST32 144 SCNuLEASTI6 144 SCNuLEAST32 144 SCNuPTR 144 SCNx16 144 SCNx32 144 SCNXxFAST 16 144 SCNxFAST32 144 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 387 SCNxLEASTI6 144 avr pgmspace SCNxLEAST32 144 SCNxPTR 144 uint_farptr_t 145 avr_math acos 147 asin 147 atan 147 atan2 147 ceil 147 copysign 147 cos 147 cosh 148 exp 148 fabs 148 fdim 148 floor 148 fma 148 fmax 148 fmin 148 fmod 148 frexp 148 hypot 149 INFINITY 146 isfinite 149 isinf 149 isnan 149 Idexp 149 log 150 log 10 150 150 lround 150 M_PI 146 M_SQRT2 146 modf 150 NAN 147 pow 151 round 151 signbit 151 sin 151 sinh 151 sqrt 151 square 151 tan 151 tanh 152 trunc 152 memchr_P 255 memcemp P 255 memopy P 255 memmem P 255 memrchr P 255 PG
200. R due to the size limitations of the devices The official version of GCC might lack support for recent AVR devices A patch that adds more AVR types can be found at http www freebsd org cgi cvsweb cgi ports devel avr gcc files patch newdevi 12 6 AVRLibc Warning You must install avr binutils avr gcc and make sure your path is set properly before installing avr libc Note If you have obtained the latest avr libc from cvs you will have to run the bootstrap script before using either of the build methods described below To build and install avr libc gunzip c avr libc version tar gz tar xf Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 127 AVRDUDE 93 cd avr libc version configure prefix PREFIX build config guess host avr make make install 12 7 AVRDUDE Note It has been ported to windows via MinGW or cygwin Linux and Solaris Other Unix systems should be trivial to port to avrdude is part of the FreeBSD ports system To install it simply do the following cd usr ports devel avrdude make install Note Installation into the default location usually requires root permissions However running the program only requires access permissions to the appropriate ppi 4 device Building and installing on other systems should use the configure system as such gunzip c avrdude lt version gt tar gz tar xf cd avrdude lt version gt mkdi
201. RAM even though the compiler might warn you when it detects write attempts to these RAM locations and occupy the same amount of flash ROM so they can be initialized to the actual string by startup code The compiler can optimize multiple identical strings into a single one but obviously only for one compilation unit i e a single C source file Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 20 Why do all my foo bar strings eat up the SRAM 77 That way any string literal will be a valid argument to any C function that expects const char argument Of course this is going to waste a lot of SRAM In Program Space String Utilities a method is described how such constant data can be moved out to flash ROM How ever a constant string located in flash ROM is no longer a valid argument to pass to a function that expects a const char x type string since the AVR processor needs the special instruction LPM to access these strings Thus separate functions are needed that take this into account Many of the standard C library functions have equivalents available where one of the string arguments can be located in flash ROM Private func tions in the applications need to handle this too For example the following can be used to implement simple debugging messages that will be sent through a UART include lt inttypes h gt include lt avr io h gt include lt avr pgmspace h gt int uart_putchar char
202. SC microcontrollers In addition the library provides the basic startup code needed by most applications There is a wealth of information in this document which goes beyond simply describ Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 1 2 General information about this library 2 ing the interfaces and routines provided by the library We hope that this document provides enough information to get a new AVR developer up to speed quickly using the freely available development tools binutils gcc avr libc and many others If you find yourself stuck on a problem which this document doesn t quite address you may wish to post a message to the avr gcc mailing list Most of the developers of the AVR binutils and gcc ports in addition to the devleopers of avr libc subscribe to the list so you will usually be able to get your problem resolved You can subscribe to the list at http lists nongnu org mailman listinfo avr gcc list Before posting to the list you might want to try reading the Frequently Asked Ques tions chapter of this document Note If you think you ve found a bug or have a suggestion for an improvement ei ther in this documentation or in the library itself please use the bug tracker at https savannah nongnu org bugs group avr libc to ensure the issue won t be forgotten 1 2 General information about this library In general it has been the goal to stick as best as possible to established standa
203. SECTION 214 GET_EXTENDED_FUSE_BITS 214 HIGH FUSE BITS 214 GET LOCK BITS 215 GET LOW FUSE BITS 215 avr eeprom _EEGET 216 EEPUT 216 216 eeprom busy wait 216 eeprom is ready 216 eeprom read block 217 eeprom read byte 217 eeprom read dword 217 eeprom read word 217 eeprom write block 217 eeprom write byte 217 eeprom write dword 217 eeprom write word 217 avr errno EDOM 133 ERANGE 133 avr interrupts BADISR vect 241 cli 241 EMPTY INTERRUPT 241 ISR 242 5 ALIAS 242 5 ALIASOF 243 5 BLOCK 243 5 NAKED 243 5 NOBLOCK 243 reti 244 sei 244 SIGNAL 244 avr inttypes int farptr t 145 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 386 PRId16 136 PRIXFAST 16 140 PRId32 136 PRIxFAST16 140 PRId8 136 PRIXFAST32 140 PRIdFAST 16 136 PRIdFAST32 136 PRIdFASTS 136 PRIdLEASTI6 136 PRIdLEAST32 137 PRIdLEASTS 137 PRIdPTR 137 PRIi16 137 PRIi32 137 PRH8 137 PRIFASTI6 137 PRIFAST32 137 PRIFASTS 137 PRILEASTI6 137 PRILEAST32 137 PRILEASTS 138 PRIIPTR 138 PRIo16 138 PRIo32 138 PRIoS 138 PRIoFAST16 138 PRIoFAST32 138 PRIoFASTS 138 PRIoLEAST16 138 PRIoLEAST32 138 PRIoLEASTS 138 PRIoPTR 139 PRIu16 139 PRIu32 139 PRIu8 139 PRIuFAST16 139 PRIuFAST32 139 PRIuFASTS 139 PRIuLEASTI6 139 PRIuLEAST32 139 PRIuLEASTS 139 PRIuPTR 139 PRIX16 140 PRIx16 140 PRIX32 140 PRIx32 140 PRIX8 140
204. SION__ avr_version 271 __AVR_LIBC_VERSION_STRING__ avr_version 271 INDEX 384 AVR VERSION avr version 271 ELPM classic pgmspace h 357 ELPM dword enhanced pgmspace h 357 ELPM_dword_xmega pgmspace h 358 ELPM enhanced pgmspace h 358 ELPM float enhanced pgmspace h 359 float xmega pgmspace h 359 ELPM word classic pgmspace h 360 ELPM word enhanced pgmspace h 360 ELPM word xmega pgmspace h 361 ELPM_xmega pgmspace h 361 LPM classic pgmspace h 361 LPM dword classic pgmspace h 362 LPM dword enhanced pgmspace h 362 LPM enhanced pgmspace h 363 LPM float classic pgmspace h 363 LPM float enhanced pgmspace h 364 LPM word classic pgmspace h 364 LPM word enhanced pgmspace h 364 boot lock bits set boot h 340 boot lock bits set alternate boot h 340 boot page erase alternate boot h 340 boot page erase extended boot h 341 boot page erase normal boot h 341 boot page fill alternate boot h 341 boot page fill extended boot h 342 boot page fill normal boot h 342 boot page write alternate boot h 343 boot page write extended boot h 343 boot page write normal boot h 343 boot rww enable boot h 344 boot rww enable alternate boot h 344 compar fn t avr stdlib 187 malloc heap end avr stdlib 196 malloc heap start
205. SLA ACK 0x18 define TW MT SLA NACK 0x20 fdefine TW MT DATA ACK 0x28 define TW MT DATA NACK 0x30 define TW MT ARB LOST 0x38 define TW LOST 0x38 fdefine TW SLA ACK 0x40 define TW MR SLA NACK 0x48 define TW DATA ACK 0x50 define TW MR DATA NACK 0x58 define TW ST 5 ACK 8 define TW ST ARB LOST SLA OxBO fdefine TW ST DATA ACK 0xB8 define TW ST DATA 0xCO define TW ST LAST DATA 0xC8 define TW SR SLA ACK 0x60 define TW SR ARB LOST SLA 0x68 define TW SR GCALL 0x70 define TW SR LOST GCALL 0x78 define TW SR DATA ACK 0x80 define TW SR 0x88 define TW SR DATA ACK 0x90 fdefine TW SR GCALL DATA NACK 0x98 define TW SR STOP OxAO define NO INFO OxF8 define TW BUS ERROR 0x00 define TW STATUS 5 define STATUS TWSR amp TW STATUS 5 R W bit in SLA R W address field define TW READ 1 define TW WRITEO Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 34 lt util twi h gt TWI bit mask definitions 290 22 31 2 Define Documentation 22 31 2 1 define TW BUS ERROR 0x00 illegal start or stop condition 22 31 2 2 define TW LOST 0x38 arbitration lost in SLA R or NACK 22 31 2 3 define TW MR DATA 0x50 data received ACK returned 22 31 2 4 define TW MR DATA NACK 0x58 data received NACK returned 22 31 2 5
206. TO is set section text Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 6 3 Example program 32 global main rcall rjmp global TIMERO OVF vect ldi out in sbic rjmp sbi rjmp 16 chi out reti ioinit sbi ldi out ldi out ldi out sei tet main ioinit 1b TIMERO OVF vect inttmp 256 SFR IO ADD intsav _SF SFR IO ADD SFR IO ADD SFR IO ADD SFR IO ADD SFR IO ADD work _ IO ADD work SFR IO ADD work 256 SFR IO ADD BV TOIEO BV CS00 tmconst fu R TCNTO inttm R IO ADDR SREG R PORTD SQUAR R PORTD SQUAR R PORTD SQUAR R SREG intsav R DDRD SQUARE R TIMSK work R TCCRO work tmconst R TCNTO work global _ vector default vector default reti end Note 1 22 9 tmr0 H ote 5 Note 6 ote 7 Note 8 Note 9 CK 1 Note 10 As in C programs this includes the central processor specific file containing the IO port definitions for the device Note that not all include files can be included into assembler Sources Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 6 3 Example program 33 Note 2 Assignment of registers to symbolic names used locally Another option would be to use a C preprocessor macro instead define work 16 Note 3 Our bit number for the square wave output Note
207. This helps keep the code size to a minimum In order to do this with the way the linker works is to only write one function per code module This will compile to one function per object module This is usually a very different way of doing things than writing an application There are always exceptions to the rule There are generally two cases where you would want to have more than one function per object module The first is when you have very complementary functions that it doesn t make much sense to split them up For example malloc and free If someone is going to use malloc they will very likely be using free or at least should be using free In this case it makes more sense to aggregate those two functions in the same object module The second case is when you want to have an Interrupt Service Routine ISR in your library that you want to link in The problem in this case is that the linker looks for unresolved references and tries to resolve them with code in libraries A reference is the same as a function call But with ISRs there is no function call to initiate the ISR The ISR is placed in the Interrupt Vector Table IVT hence no call no reference and no linking in of the ISR In order to do this you have to trick the linker in a way Aggregate the ISR with another function in the same object module but have the other Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 8 4 Creating a Library 50
208. Tmega series contain builtin support for interfacing the microcontroller to a two wire bus called TWI This is essentially the same called I2C by Philips but that term is avoided in Atmel s documentation due to patenting issues For the original Philips documentation see http www semiconductors philips com buses i2c index html 22 39 1 Introduction into TWI The two wire interface consists of two signal lines named SDA serial data and SCL serial clock plus a ground line of course All devices participating in the bus are connected together using open drain driver circuitry so the wires must be terminated Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 39 Example using the two wire interface TWI 333 using appropriate pullup resistors The pullups must be small enough to recharge the line capacity in short enough time compared to the desired maximal clock fre quency yet large enough so all drivers will not be overloaded There are formulas in the datasheet that help selecting the pullups Devices can either act as a master to the bus i e they initiate a transfer or as a slave they only act when being called by a master The bus is multi master capable and a particular device implementation can act as either master or slave at different times Devices are addressed using a 7 bit address coordinated by Philips transfered as the first byte after the so called start condition The LSB of that byt
209. Tmegal64P ATmega644P ATmega644 ATmegal6HVA ATtinyl3 ATtiny43U ATtiny48 ATtiny45 ATtiny25 ATtiny85 ATtiny261 ATtiny46l AT tiny861 AT90USB162 9005 82 9005 1287 9005 1286 9005 647 9005 646 Generated Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 45 lt avr interrupt h gt Interrupts 242 Global manipulation of the interrupt flag The global interrupt flag is maintained in the I bit of the status register SREG define sei define cli Macros for writing interrupt handler functions define ISR vector attributes define SIGNAL vector define EMPTY INTERRUPT vector define ISR_ALIAS vector target vector define reti define BADISR vect ISR attributes define 5 BLOCK define ISR NOBLOCK define 5 NAKED e define ISR ALIASOF target vector 22 15 2 Define Documentation 22 15 2 1 define BADISR vect include avr interrupt h This is a vector which is aliased to __ vector default the vector executed when an ISR fires with no accompanying ISR handler This may be used along with the ISR macro to create a catch all for undefined but used ISRs for debugging purposes 22 15 2 2 define cli include avr interrupt h Disables all interrupts by clearing the global interrupt mask This function actually compiles into a single line of assembly so there is no function call overhead Ge
210. USB162 9005 82 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt avr interrupt h gt Interrupts 240 Vector name Old vector Description Applicable for device name USARTI SIG USARTI Tx ATmegal62 TXC vect USARTI Complete TRANS USARTI SIG USARTI Tx AT90CANI28 AT90CAN32 AT90CAN64 TX vect UARTI Complete ATmegal28 ATmegal284P ATmega64 TRANS ATmega640 ATmegal280 ATmegal28l ATmega2560 ATmega2561 AT mega324P ATmegal64P ATmega644P ATmega644 AT90USB162 9005 82 9005 1287 AT90USB1286 AT90USB647 AT90USB646 USARTI SIG USARTI Data AT90CANI28 AT90CAN32 AT90CANGA UDRE vect UARTI Register Empty ATmegal28 ATmegal284P ATmegal62 DATA ATmega64 ATmega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 AT90USB162 9005 82 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 USART2_ SIG_ USART2 Rx ATmega640 ATmegal280 ATmegal28l RX_vect USART2 Complete ATmega2560 ATmega2561 RECV USART2 SIG USART2 Tx ATmega640 ATmegal280 ATmegal28l TX vect USART2 Complete ATmega2560 ATmega2561 TRANS USART2_ SIG_ USART2 Data ATmega640 ATmegal280 ATmegal28l UDRE vect USART2 register Empty ATmega2560 ATmega2561 DATA USART3 SIG USART3 Rx ATmega640 ATme
211. When reading data one request can read the entire device memory if desired the counter would wrap around and start back from 0 when reaching the end of the device Note 8 When reading the EEPROM a first device selection must be made with write intent R W bit set to 0 indicating a write operation in order to transfer the EEPROM ad dress to start reading from This is called master transmitter mode Each completion of a particular step in TWI communication is indicated by an asserted TWINT bit in TWCR An interrupt would be generated if allowed After performing any actions that are needed for the next communication step the interrupt condition must be man ually cleared by setting the TWINT bit Unlike with many other interrupt sources this would even be required when using a true interrupt routine since as soon as TWINT is re asserted the next bus transaction will start Note 9 Since the TWI bus is multi master capable there is potential for a bus contention when one master starts to access the bus Normally the TWI bus interface unit will detect this situation and will not initiate a start condition while the bus is busy However in case two masters were starting at exactly the same time the way bus arbitration works there is always a chance that one master could lose arbitration of the bus during any transmit operation A master that has lost arbitration is required by the protocol to immediately cease talking on the bus
212. When you do the same thing but replace the address of the port by its macro name like this asm volatile sbi PORTB 0x07 you get acompilation error Error constant value required PORTB is a precompiler definition included in the processor specific file included in avr io h As you may know the precompiler will not touch strings and PORTB instead of 0x18 gets passed to the assembler One way to avoid this problem is asm volatile sbi 0 0x07 I SFR IO ADDR PORTB Note For C programs rather use the standard C bit operators instead so the above would be expressed as PORTB 1 lt lt 7 The optimizer will take care to trans form this into a single SBI instruction assuming the operands allow for this Back to FAQ Index 11 11 Why does the PC randomly jump around when single stepping through my program in avr gdb When compiling a program with both optimization and debug information 9 which is fortunately possible in avr gcc the code watched in the debugger is opti mized code While it is not guaranteed very often this code runs with the exact same optimizations as it would run without the g switch This can have unwanted side effects Since the compiler is free to reorder code ex ecution as long as the semantics do not change code is often rearranged in order to Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 12 How do trace an assembler file in avr gdb 67
213. XX in C 79 11 23 Is it really impossible to program the ATtinyXX in While some small are not directly supported by the C compiler since they do not have a RAM based stack and some do not even have RAM at all itis possible anyway to use the general purpose registers as a RAM replacement since they are mapped into the data memory region Bruce D Lightner wrote an excellent description of how to do this and offers this together with a toolkit on his web page http lightner net avr ATtinyAvrGcc html Back to FAQ Index 11 24 What is this clock skew detected message It s a known problem of the MS DOS FAT file system Since the FAT file system has only a granularity of 2 seconds for maintaining a file s timestamp and it seems that some MS DOS derivative Win9x perhaps rounds up the current time to the next sec ond when calculating the timestamp of an updated file in case the current time cannot be represented in FAT s terms this causes a situation where make sees a file coming from the future Since all make decisions are based on file timestamps and their dependencies make warns about this situation Solution don t use inferior file systems operating systems Neither Unix file systems nor HPFS aka NTFS do experience that problem Workaround after saving the file wait a second before starting make Or simply ignore the warning If you are paranoid execute make clean all to make sure everything
214. _ normal address Write the bootloader temporary page buffer to flash page that contains address Note address is a byte address in flash not a word address Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 12 avr boot h Bootloader Support Utilities 214 22 12 2 10 define boot page write safe address Value do boot spm busy wait N eeprom busy wait boot page write address X while 0 Same as boot page write except it waits for eeprom and spm operations to complete before writing the page 22 12 2 11 define boot rww busy SPM REG amp uint8 t BV COMMON ASB Check if the RWW section is busy 22 12 2 12 define boot rww enable boot rww enable Enable the Read While Write memory section 22 12 2 13 define boot enable safe Value do boot spm busy wait N eeprom busy wait boot rww enable X while 0 Same as boot enable except waits for eeprom and spm operations to complete before enabling the RWW mameory 22 12 2 14 define boot signature byte get addr Value extension N uintl16 t addrl16 uintl6 t addr X uint8 t result N asm volatile N N sts 1 2 n t N lpm 0 Z n t N r result i _SFR_MEM_ADDR __SPM_REG X Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 12 avr boot h Bootloader Support Utilities 215 r
215. _NAKED define ISR ALIASOF target vector 24 17 inttypes h File Reference 24 17 1 Detailed Description Defines macros for printf and scanf format specifiers For C these are only included if STDC LIMIT MACROS is defined before including lt inttypes h gt define PRId8 d define PRIGLEAST8 d define PRIdFASTS d define PRIi8 i define PRILEASTS i define PRIIFAST8 i define PRId16 d define PRIGLEAST16 d define PRIGFAST 16 d define PRIi16 i define PRIILEAST16 i define PRIFASTI6 i define PRId32 Id Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 17 inttypes h File Reference 350 define PRIGLEAST32 define PRIGFAST32 Id define PRIi32 li define PRLILEAST32 li define PRIiFAST32 li define PRIdPTR PRId16 define PRIiPTR PRIi16 define PRIo8 o define PRIOLEASTS o define PRIoFASTS o define PRIu8 u define PRIULEASTS u define PRIUFASTS8 u define PRIx8 x define PRIXLEASTS x define PRIXFASTS x define PRIX8 X define PRIXLEASTS X define PRIXFASTS X define PRIo16 o define PRIOLEASTI6 o define PRIoFAST16 o define PRIu16 u define PRIULEASTI6 u define PRIUFASTI6 u define PRIx16 x define PRIXLEASTI6 x define PRIxFAST16 x define PRIX16 X define PRIXLEASTI6 X define PRIXFASTIO X define PRIo32 lo define PRIOLEAST32 lo define PRIOFAST32 lo define PRIu32 l
216. __STDC_LIMIT_ MACROS is defined before lt stdint h gt is included define INT8_MAX Ox7f define INT8_MIN INT8_MAX 1 define UINT8_MAX __CONCAT INT8_MAX U 2U 1U define INT16_MAX 0 7 define INT16_MIN INT16_MAX 1 define UINT16_MAX __CONCAT INT16_MAX U 2U 1U define INT32_ MAX Ox7fffffffL define INT32 MIN INT32_MAX IL define UINT322 MAX CONCAT INT32 U 2UL define INT64_MAX 7 define INT64 MIN INT64 ILL define UINT64_MAX CONCAT INT64 MAX U 2ULL IULL Limits of minimum width integer types define INT LEAST8 MAX INT8 MAX define INT LEAST8 MIN INT8 MIN define UINT LEAST8 MAX UINT8 MAX define INT LEASTI6 INTI6 MAX define INT LEAST16 MIN INT16 MIN define UINT LEASTI6 MAX UINTIG6 MAX fdefine INT LEAST32 MAX INT32 MAX define INT LEAST32 MIN INT32 MIN define UINT LEAST32 MAX UINT32 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 39 stdint h File Reference 369 define INT LEAST64 MAX INT64 MAX define INT LEAST64 MIN INT64 MIN define UINT LEAST64 MAX UINT64 Limits of fastest minimum width integer types define INT 8 MAX 8 MAX define INT FAST8 MIN INT8 MIN define UINT FASTS MAX UINT8 MAX define INT FASTI6 MAX INTI6 MAX define INT FASTI6 MIN INT16 MIN define UINT FASTI6 MAX UINTI6 MAX define INT FAST32 MAX INT32 MAX define INT FAST32 MIN INT32 MIN defin
217. a gstabs since the compiler will add the extra for you Example EXTRA OPTS Wall mmcu atmegal28 x assembler with cpp 5 avr gcc Wa gstabs EXTRA_OPTS c o foo o foo S Also note that the debugger might get confused when entering a piece of code that has a non local label before since it then takes this label as the name of a new function that appears to have been entered Thus the best practice to avoid this confusion is to only use non local labels when declaring a new function and restrict anything else to local labels Local labels consist just of a number only References to these labels consist of the number followed by the letter b for a backward reference or f for a forward reference These local labels may be re used within the source file references will pick the closest label with the same number and given direction Example myfunc push push push push push KKK A A eor ldi ldi rjmp 6 r16 start loop L lo8 sometable H hi8 sometable f jump to loop test at end 7 loop continues here HOM HO KA breq return from myfunc prematurely inc t16 2t cmp brlo 1b jump back to top of loop H K H 1 ret HOH OH KK Back to FAQ Index 11 13 How do I pass an IO port as a parameter to a function Consider this example code Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen
218. a pre release version number on a branch destined to become either 1 2 or 2 0 will look like this 1 1 90 20030828 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 15 2 Releasing AVR Libc 119 15 2 Releasing AVR Libc The information in this section is only relevant to AVR Libc developers and can be ignored by end users Note In what follows I assume you know how to use cvs and how to checkout multiple source trees in a single directory without having them clobber each other If you don t know how to do this you probably shouldn t be making releases or cutting branches 15 21 Creating a cvs branch The following steps should be taken to cut a branch in cvs 1 Check out a fresh source tree from cvs HEAD 2 Update the NEWS file with pending release number and commit to cvs HEAD Change Changes since avr libc lt last_release gt to Changes in avr libc this relelase 3 Set the branch point tag setting major and lt minor gt accordingly cvs tag avr libe major minor branchpoint 4 Create the branch cvs tag b avr libe major minor branch 5 Update the package version in configure ac and commit configure ac to cvs HEAD Change minor number to next odd value 6 Update the NEWS file and commit to cvs HEAD Add Changes since avr libc lt this_release gt 7 Check out a new tree for the branch cvs CO r avr libe major minor branch 8 Update the package version in
219. a structure The number of fields in this structure are determined by the number of fuse bytes in the FUSE MEMORY SIZE macro If FUSE MEMORY SIZE 1 there is only a single field byte of type unsigned char If FUSE MEMORY SIZE 2 there are two fields low and high of type unsigned char If FUSE MEMORY SIZE 3 there are three fields low high and extended of type unsigned char If FUSE MEMORY SIZE gt 3 there is a single field byte which is an array of unsigned char with the size of the array being FUSE MEMORY SIZE A convenience macro FUSEMEM is defined as a GCC attribute for a custom named section of fuse A convenience macro FUSES is defined that declares a variable fuse of type fuse t with the attribute defined by FUSEMEM This variable allows the end user to easily set the fuse data Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 14 lt avr fuse h gt Fuse Support 220 Note If a device specific I O header file has previously defined FUSEMEM then FUSE MEM is not redefined If a device specific I O header file has previously defined FUSES then FUSES is not redefined Each AVR device I O header file has a set of defined macros which specify the actual fuse bits available on that device The AVR fuses have inverted values logical 1 for an unprogrammed disabled bit and logical for a programmed enabled bit The defined macros for each individual fuse bit re
220. a6490 ATmega164P ATmega324P ATmega644 ATmega48 ATmega88 ATmegal68 ATtiny24 ATtiny44 ATtiny84 ATtiny25 ATtiny45 ATtiny85 ATtiny261 ATtiny461 ATtiny861 power_adc_disable Disable the Analog to Digital Converter module ATmega640 ATmega1280 ATmegal281 ATmegal28RFA1 ATmega2560 2561 AT90USB646 AT90USB647 AT90USB1286 AT90USB1287 AT90PWM 1 AT90PWM2 AT90PWM2B AT90PWM3 AT90PWM3B AT90PWM216 AT90PWM316 ATmega165 ATmega165P ATmega325 ATmega3250 ATmega645 ATmega6450 ATmegal69 ATmegal69P ATmega329 ATmega3290 ATmega649 ATmega6490 ATmega164P ATmega324P ATmega644 ATmega48 ATmega88 ATmegal68 ATtiny24 ATtiny44 ATtiny84 ATtiny25 ATtiny45 ATtiny85 ATtiny261 ATtiny461 ATtiny861 power lcd enable Enable the LCD module ATmegal69 ATmegal69P ATmega329 ATmega3290 ATmega649 ATmega6490 power lcd disable Disable the LCD module ATmegal69 ATmegal69P ATmega329 ATmega3290 ATmega649 ATmega6490 enable 16 47 36 2009 tenableithe Roperypeage Controller 0 module AT90PWMI AT90PWM2 AT90PWM2B AT90PWM3 AT90PWM3B power_psc0_disable Disable the Power Stage Controller 0 module AT90PWMI AT90PWM2 AT90PWM2B AT90PWM3 AT90PWM3B power_psc1_enable Enable the Power Stage Controller 1 module AT90PWMI AT90PWM2 AT90PWM2B AT90PWM3 22 20 Additional notes from lt avr sfr_de
221. age that the application will auto matically scale to new target softclock or master CPU frequencies without having to manually re calculate hardcoded constants 22 37 3 2 Part 2 Variable definitions intflags structure demonstrates way to allocate bit variables in memory Each of the interrupt service routines just sets one bit within that structure and the application s main loop then monitors the bits in order to act appropriately Like all variables that are used to communicate values between an interrupt service routine and the main application it is declared volatile The variable pwm is not a variable in the classical C sense that could be used as an lvalue or within an expression to obtain its value Instead the attribute section eeprom marks it as belonging to the EEPROM section This section is merely used as a place holder so the compiler can arrange for each individual variable s location in EEPROM The compiler will also keep track of initial values assigned and usually the Makefile is arranged to extract these initial values into a separate load file Largedemo eeprom x in this case that can be used to initialize the EEPROM The actual EEPROM IO must be performed manually Similarly the variable mcucsr is kept in the noinit section in order to prevent it from being cleared upon application startup Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 37 A more sophisti
222. ailable than in the default configuration 3 2 Internal vs external RAM Obviously the constraints are much harder to satisfy in the default configuration where only internal RAM is available Extreme care must be taken to avoid a stack heap collision both by making sure functions aren t nesting too deeply and don t require too much stack space for local variables as well as by being cautious with allocating too much dynamic memory If external RAM is available it is strongly recommended to move the heap into the ex ternal RAM regardless of whether or not the variables from the data and bss sections are also going to be located there The stack should always be kept in internal RAM Some devices even require this and in general internal RAM can be accessed faster since no extra wait states are required When using dynamic memory allocation and stack and heap are separated in distinct memory areas this is the safest way to avoid a stack heap collision Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 3 3 Tunables for malloc 17 3 3 Tunables for malloc There are a number of variables that can be tuned to adapt the behavior of malloc to the expected requirements and constraints of the application Any changes to these tunables should be made before the very first call to malloc Note that some library functions might also use dynamic memory notably those from the lt stdio h gt Stan dard IO facilities
223. al printf format for least8 t 22 5 2 59 define PRIXPTR PRIX16 uppercase hexadecimal printf format for uintptr t 22 5 2 60 define PRIxPTR PRIx16 hexadecimal printf format for uintptr t 22 5 2 01 define SCNd16 d decimal scanf format for int16 t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt gt Integer Type conversions 143 22 5 2 62 itdefine SCNd32 Id decimal scanf format for int32 t 22 5 2 63 define SCNdFASTI6 decimal scanf format for int fastl6 t 22 5 2 64 define SCNdFAST32 Id decimal scanf format for int fast32 t 22 5 2 65 define SCNdLEAST16 d decimal scanf format for int leastl6 t 22 5 2 66 define SCNdLEAST32 Id decimal scanf format for int least32 t 22 5 2 67 define SCNdPTR SCNd16 decimal scanf format for intptr t 22 5 2 68 define SCNi16 i generic integer scanf format for int16 t 22 5 2 69 define SCNi32 li generic integer scanf format for int32 t 22 5 2 70 define SCNiFASTI6 i generic integer scanf format for int fast16 t 22 5 2711 define SCNiIFAST32 li generic integer scanf format for int fast32 t 22 5 2 72 itdefine SCNILEASTI6 i generic integer scanf format for int leastl6 t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt gt Integer Type conversions 144 22 5 2 73 define SCNILEAST32 li generic integer scanf format for int least32 t
224. al printf format for int_least32_t 22 5 2 9 define PRIGLEASTS8 d decimal printf format for int_least8_t 22 5 2 10 define PRIdPTR PRId16 decimal printf format for intptr t 22 5 2 11 define PRIi16 i integer printf format for int16_t 22 5 2 12 define PRIi32 li integer printf format for int32_t 22 5 2 13 define PRIi8 i integer printf format for int8_t 22 5 2 14 define PRIiFASTI6 i integer printf format for int_fast16_t 22 5 2 15 define PRIiFAST32 li integer printf format for int fast32 t 22 5 2 16 define PRIiFASTS i integer printf format for int fast8 t 22 5 2 17 define PRIILEASTI6 i integer printf format for int leastl6 t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt gt Integer Type conversions 139 22 5 2 18 define PRIILEAST32 li integer printf format for int least32 t 22 5 2 19 define PRIiLEASTS i integer printf format for int least8 t 22 5 2 20 define PRIiPTR PRIi16 integer printf format for intptr t 22 5 2 21 define PRIo16 o octal printf format for uint16 t 22 5 2 22 define PRIo32 lo octal printf format for uint32 t 22 5 2 23 define PRIo8 octal printf format for uint8 t 22 5 0224 define PRIOFAST16 o octal printf format for uint fast16 t 22 5 2 25 itdefine PRIoFAST32 Io octal printf format for uint_fast32_t 22 5 2 26 define PRIoFASTS o octal printf format for u
225. all Select Current package Select type of install Full Install MSYS 1 0 10 exe package lt http prdownloads sf net mingw MSYS 1 0 10 exe download gt Default selections Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 12 Tools Required for Building the Toolchain for Windows 96 Batch file will ask Do you wish to continue with the post install Press y and press enter Do you have MinGW installed Press y and press enter Where is your MinGW installation Type in c mingw without quotes and press enter Do you wish for me to add mount bindings for c mingw to mingw Woo Press y and press enter It will display some messages on the screen then it will display Press any key to continue Press any key Edit c msys 1 0 msys bat Change line should be line 41 if EXIST rxvt exe goto startrxvt to rem if EXIST rxvt exe goto startrxvt to remark out this line Doing this will cause MSYS to always use the bash shell and not the rxvt shell Note The order of the next three is important Install MSYS Developer toolkit before the autotools MSYS Developer Toolkit version 1 0 1 This is needed to build avr libc in MinGW http downloads sourceforge net mingw msysDTK 1 0 1 exe use mirror internap gt Single file installer executable Install autoconf 2 59 from the MSYS Developer Toolkit release
226. all that large but dynamic memory allocations get fragmented over time such that new requests don t quite fit into the holes of previously freed regions Large stack space requirements can arise in a C function containing large and or numerous local variables or when recursively calling function Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 32 Internal vs external RAM 16 Note The pictures shown in this document represent typical situations where the RAM locations refer to an ATmegal28 The memory addresses used are not displayed in a linear scale LI gt SP t RAMEND __brkval lt SP __malloc_margin 2 on board RAM external RAM 0x10FF o o x amp __malloc_heap_start heap start _ bss end data bss start data start Figure 1 RAM map of a device with internal RAM On a simple device like a microcontroller it is a challenge to implement a dynamic memory allocator that is simple enough so the code size requirements will remain low yet powerful enough to avoid unnecessary memory fragmentation and to get it all done with reasonably few CPU cycles Microcontrollers are often low on space and also run at much lower speeds than the typical PC these days The memory allocator implemented in avr libc tries to cope with all of these con straints and offers some tuning options that can be used if there are more resources av
227. ame applies if only the heap is going to be located there since the application start up code does not affect the heap It is not recommended to locate the stack in external RAM In general accessing exter nal RAM is slower than internal RAM and errata of some AVR devices even prevent this configuration from working properly at all Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 17 Which O flag to use 75 Back to FAQ Index 11 17 Which O flag to use There s a common misconception that larger numbers behind the option might auto matically cause better optimization First there s no universal definition for better with optimization often being a speed vs code size trade off See the detailed discus sion for which option affects which part of the code generation A test case was run on an ATmegal28 to judge the effect of compiling the library itself using different optimization levels The following table lists the results The test case consisted of around 2 KB of strings to sort Test 1 used qsort using the standard library strcmp test 2 used a function that sorted the strings by their size thus had two calls to strlen per invocation When comparing the resulting code size it should be noted that a floating point version of fvprintf was linked into the binary in order to print out the time elapsed which is entirely not affected by the different optimization levels and added about 2
228. an uint16 t can hold 22 8 2 41 define UINT32_C value _ CONCAT value UL define a constant of type uint32_t 22 8 2 42 define UINT32 MAX _CONCAT INT32_MAX U 2UL 100 largest value an uint32_t can hold Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h gt Standard Integer Types 163 22 8 2 43 define UINT64_C value _ CONCAT value ULL define a constant of type uint64_t 22 8 2 44 define UINT6 4 MAX _CONCAT INT64_MAX U 2ULL 1ULL largest value an uint64_t can hold 22 8 2 45 define UINT8 C value uint8_t _ CONCAT value U define a constant of type uint8_t 22 8 2 46 define UINT8_MAX _CONCAT INT8_MAX U x 2U 1U largest value an uint8_t can hold 22 8 2 47 define UINT_FAST16_MAX UINT16_MAX largest value an uint fast16 t can hold 22 8 2 48 UINT FAST32 MAX UINT32 MAX largest value an uint_fast32_t can hold 22 8 2 49 define UINT FAST64 MAX UINT64 largest value an uint_fast64_t can hold 22 8 2 50 define UINT FAST8 MAX UINT8 largest value uint fast8 t can hold 22 8 2 51 define UINT LEASTI6 MAX UINTI6 largest value an leastl6 t can hold 22 8 2 52 itdefine UINT LEAST32 MAX UINT32 MAX largest value an uint least32 t can hold 22 8 2 53 define UINT LEAST64 MAX UINT64 largest value an uint least64 t can hold Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 2
229. ar s P accept The strpbrk_P function locates the first occurrence in the string s of any of the char acters in the flash string accept This function is similar to strpbrk except that accept is a pointer to a string in program space Returns The strpbrk_P function returns a pointer to the character s that matches one of the characters in accept or NULL if no such character is found The terminating Zero is not considered as a part of string if one or both args are empty the result will NULL 22 18 4 23 P strrchr P PGM P s int val Locate character in string The P function returns a pointer to the last occurrence of the character val in the flash string s Returns The strrchr function returns a pointer to the matched character or NULL if the character is not found Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 49 lt avr power h gt Power Reduction Management 262 22 18 4 24 char x strsep P char xx sp P delim Parse a string into tokens The strsep_P function locates in the string referenced by sp the first occurrence of any character in the string delim or the terminating 0 character and replaces it with a 707 The location of the next character after the delimiter character or NULL if the end of the string was reached is stored in sp An empty field i e one caused by two adjacent delimiter characters can be det
230. ar strpbrk P const s PGM P accept ATTR PGM_P strrchr P PGM_P int __ val char strsep P char sp PGM_P _ delim size tstrspn P const char s PGM P accept PURE char strstr P const char PGM P ATTR PURE void memmem P const void size t VOID P size_t _ ATTR PURE char strcasestr P const char x PGM P PURE 22 18 2 Define Documentation 22 18 2 1 define P const prog char Used to declare a variable that is a pointer to a string in program space Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 252 22 18 2 2 define read byte address short pgm read byte near address short Read a byte from the program space with a 16 bit near address Note The address is a byte address The address is in the program space 22 18 2 3 define pgm read byte far address long ELPM uint32 t address long Read a byte from the program space with a 32 bit far address Note The address is a byte address The address is in the program space 22 18 2 4 define read byte near address short LPM uintl6 t address short Read a byte from the program space with a 16 bit near address Note The address is a byte address The address is in the program space 22 18 2 5 define pgm read
231. ar 13 16 47 36 2009 for avr libc by Doxygen 11 2 My program doesn t recognize a variable updated within an interrupt routine 61 11 2 My program doesn t recognize a variable updated within an interrupt routine When using the optimizer in a loop like the following one uint8 t flag ISR SOME vect flag 1 while flag 0 the compiler will typically access 1ag only once and optimize further accesses com pletely away since its code path analysis shows that nothing inside the loop could change the value of 1ag anyway To tell the compiler that this variable could be changed outside the scope of its code path analysis e g from within an interrupt routine the variable needs to be declared like volatile uint8 t flag Back to FAQ Index 11 3 I get undefined reference to for functions like sin In order to access the mathematical functions that are declared in lt math h gt the linker needs to be told to also link the mathematical library 1ibm a Typically system libraries like 1ibm a are given to the final C compiler command line that performs the linking step by adding a flag 1m at the end That is the initial lib and the filename suffix from the library are written immediately after a flag So for a libfoo a library 1foo needs to be provided This will make the linker search the library in a path known to the system An alternative would be to specify the full path to the 1ibm a
232. art of the current time counter the low part is formed by querying TCNTO directly and clear or set the variable flags respectively in order to note the current counting direction The RETI instruction terminates these interrupt service routines Total cycle count is 8 CPU cycles so together with the 4 CPU cycles needed for interrupt setup and the 2 cycles for the RJMP from the interrupt vector to the han dler these routines will require 14 out of each 256 CPU cycles or about 5 96 of the overall CPU time The pin change interrupt PCINTO will be handled in the final part of this file The basic algorithm is to quickly evaluate the current system time by fetching the current timer value of TCNTO and combining it with the overflow part in counter hi If the counter is currently counting down rather than up the value fetched from TCNTO must be negated Finally if this pin change interrupt was triggered by a rising edge the time computed will be recorded as the start time only Then at the falling edge this start time will be subracted from the current time to compute the actual pulse width seen left in pwm incoming and the upper layers are informed of the new value by setting bit 0 in the intbits flags At the same time this pin change interrupt will be Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 A simple project 301 disabled so no new measurement can be performed until the upper layer had a chance
233. as The Assembler Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 2 4 GNU Binutils 12 avr ld The Linker avr ar Create modify and extract from libraries archives avr ranlib Generate index to library archive contents avr objcopy Copy and translate object files to different formats avr objdump Display information from object files including disassembly avr size List section sizes and total size avr nm List symbols from object files avr strings List printable strings from files avr strip Discard symbols from files avr readelf Display the contents of ELF format files avr addr2line Convert addresses to file and line avr c filt Filter to demangle encoded C symbols Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 2 5 avr libc 13 2 5 avr libc GCC and Binutils provides a lot of the tools to develop software but there is one critical component that they do not provide a Standard C Library There are different open source projects that provide a Standard C Library depending upon your system time whether for a native compiler GNU Libc for some other embedded system newlib or for some versions of Linux uCLibc The open source AVR toolchain has its own Standard C Library project avr libc AVR Libc provides many of the same functions found in a regular Standard C Library and many additional library functions that is specific to an AVR So
234. at way no additional memory is reqired to maintain this list except for a variable that keeps track of the lowest memory segment available for reallocation Since both a chain pointer and the size of the chunk need to be recorded in each chunk the minimum chunk size on the freelist is four bytes When allocating memory first the freelist is walked to see if it could satisfy the request If there s a chunk available on the freelist that will fit the request exactly it will be taken disconnected from the freelist and returned to the caller If no exact match could be found the closest match that would just satisfy the request will be used The chunk will normally be split up into one to be returned to the caller and another smaller one that will remain on the freelist In case this chunk was only up to two bytes larger than the request the request will simply be altered internally to also account for these additional bytes since no separate freelist entry could be split off in that case If nothing could be found on the freelist heap extension is attempted This is where malloc margin will be considered if the heap is operating below the stack or where malloc heap end will be verified otherwise If the remaining memory is insufficient to satisfy the request NULL will eventually be returned to the caller When calling free a new freelist entry will be prepared An attempt is then made to aggregate the new entry with possible adja
235. avr interrupt h gt Interrupts 233 Vector name Old vector name Description Applicable for device TIMERO_ OVFO_vect SIG_ OVERFLOWO Timer Counter0 Overflow AT90S2313 AT90S2323 AT90S2343 tiny22 ATtiny26 TIMERO OVF vect SIG OVERFLOWO Timer Counter0 Overflow AT90S1200 419052333 AT90S4433 9054434 AT90S8535 AT90PWM216 AT90PWM2B AT90PWM316 AT90PWM3B AT90PWM3 AT90PWM2 AT90PWM1 AT90CANI28 AT90CAN32 AT90CAN64 ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal6l ATmegal62 ATmegal63 ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega32 ATmega323 ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega32HVB AT mega48P ATmega64 ATmega645 mega6450 ATmega649 ATmega6490 ATmega8 ATmega8515 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATmegal6HVA ATtinyll ATtiny12 ATtiny15 ATtiny2313 ATtiny28 48 ATtiny261 ATtiny46l AT tiny861 AT9OUSB162 9005 82 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 AT9084414 AT90S8515 TIMER1_ CAPTI vect SIG INPUT CAPTURE Timer Counter1 Capture Event 9052313 vect SIG INPUT CAPTURE1 Timer Counter Capture Event 9052333 479054434 905441
236. avr interrupt h gt Interrupts 222 You must initialize ALL fields in the fuse t structure This is because the fuse bits in all bytes default to a logical 1 meaning unprogrammed Normal uninitialized data defaults to all locgial zeros So it is vital that all fuse bytes are initialized even with default data If they are not then the fuse bits may not programmed to the desired settings Be sure to have the mmcu device flag in your compile command line and your linker command line to have the correct device selected and to have the correct I O header file included when you include lt avr io h gt You can print out the contents of the fuse section in the ELF file by using this command line avr objdump s j fuse lt ELF file gt The section contents shows the address on the left then the data going from lower address to a higher address left to right 22 5 lt avr interrupt h gt Interrupts 22 15 1 Detailed Description Note This discussion of interrupts was originally taken from Rich Neswold s document See Acknowledgments Introduction to avr libc s interrupt handling It s nearly impossible to find compil ers that agree on how to handle interrupt code Since the C language tries to stay away from machine dependent details each compiler writer is forced to design their method of support In the AVR GCC environment the vector table is predefined to point to interrupt rou tines with predetermined names By using
237. avr libc 1 6 6 Generated by Doxygen 1 5 6 Fri Mar 13 16 47 36 2009 CONTENTS i Contents 1 AVRLibc 1 11 Introduction 2 225 roo n m m ER 1 1 2 General information about this library 2 13 Supported Devices vu se Ro sce eee ow eee 2 14 avrhbeLac ls 222522225252 o RR XX 8 2 Toolchain Overview 10 21 22 022 e 10 zx FPP ON e ee omm ERAN RUE Rs 10 10 24 GNU HA S 11 imi dm e ROS ere 13 20 Building SoftWare 222222222252 erpi db e ee as 13 27 AVRDUDE 4 422 923 909 cR RO RE RO ERG e mg 13 28 GDB Insight DDD 14 20 ARCE wong See Cue EURO E 14 2 10 22 20 09 eH a Xm 3 389 o3 e v ORG 14 MMC 14 2 12 Toolchain Distributions 14 213 OPER BOWE 222222222222 n EE d 15 3 Memory Areas and Using malloc 15 21 cl o wA 15 3 2 Internal vs external RAM 16 3 3 Tunables for malloc lt lt a 656680508 RR 17 34 Implementation details 19 4 Memory Sections 20 4A 0 5 55 4 RO ES 20 4 2 The data Secon 22222 5225 22 22 5 25 25 21 AS The DSS Lue e pa ew EERE 21 Generated on Fri Mar 13 16 47 36 2009 for avr li
238. avr stdlib 196 malloc margin avr stdlib 196 crc16 update util crc 280 _crc_ccitt_update util crc 280 crc ibutton update util crc 281 crc xmodem update util crc 281 delay loop 1 util delay basic 284 delay loop 2 util delay basic 284 delay ms util delay 283 delay us util delay 283 A more sophisticated project 316 A simple project 300 abort Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 385 avr stdlib 187 abs avr stdlib 187 acos avr math 147 Additional notes from lt avr sfr_defs h gt 264 alloca alloca 128 asin avr math 147 assert avr assert 129 assert h 337 atan avr math 147 atan2 avr math 147 atof avr stdlib 187 atoi avr_stdlib 188 atoi S 338 atol avr_stdlib 188 atol S 338 atomic h 338 ATOMIC_BLOCK util_atomic 277 ATOMIC_FORCEON util_atomic 277 ATOMIC_RESTORESTATE util_atomic 278 avr_assert assert 129 avr_boot boot_is_spm_interrupt 210 boot_lock_bits_set 210 boot_lock_bits_set_safe 210 boot_lock_fuse_bits_get 211 boot_page_erase 211 boot_page_erase_safe 211 boot_page_fill 212 boot_page_fill_safe 212 boot_page_write 212 boot_page_write_safe 212 boot_rww_busy 213 boot_rww_enable 213 boot_rww_enable_safe 213 boot_signature_byte_get 213 boot_spm_busy 214 boot_spm_busy_wait 214 boot_spm_interrupt_disable 214 boot_spm_interrupt_enable 214 BOOTLOADER_
239. avrdude 15 Release Numbering and Methodology 15 1 Release Version Numbering Scheme 15 1 1 Stable Versions A stable release will always have a minor number that is an even number This implies that you should be able to upgrade to a new version of the library with the same major and minor numbers without fear that any of the APIs have changed The only changes that should be made to a stable branch are bug fixes and under some circumstances additional functionality e g adding support for a new device If major version number has changed this implies that the required versions of gcc and binutils have changed Consult the README file in the toplevel directory of the AVR Libc source for which versions are required 15 1 2 Development Versions The major version number of a development series is always the same as the last stable release The minor version number of a development series is always an odd number and is 1 more than the last stable release The patch version number of a development series is always 0 until a new branch is cut at which point the patch number is changed to 90 to denote the branch is approaching a release and the date appended to the version to denote that it is still in development versions in development in cvs will also always have the date appended as a fourth version number The format of the date will be YYYYMMDD So the development version number will look like this 1 1 0 20030825 While
240. ay the compiler may even run out of registers during code generation In order to change the name of a function you need a prototype declaration because the compiler will not accept the asm keyword in the function definition extern long Calc void asm CALCULATE Calling the function Calc will create assembler instructions to call the function CALCULATE 7 8 Links For a more thorough discussion of inline assembly usage see the gcc user manual The latest version of the gcc manual is always available here http gcc gnu org onlinedocs 8 How to Build a Library 8 1 Introduction So you keep reusing the same functions that you created over and over Tired of cut and paste going from one project to the next Would you like to reduce your maintenance overhead Then you re ready to create your own library Code reuse is a very laudable goal With some upfront investment you can save time and energy on future projects by having ready to go libraries This chapter describes some background information design considerations and practical knowledge that you will need to create and use your own libraries Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 82 How the Linker Works 49 8 2 How the Linker Works The compiler compiles a single high level language file C language for example into a single object module file The linker Id can only work with object modules to link them together Object modules
241. bc by Doxygen CONTENTS ii 44 The 2 promi Section s ssop osos kRx R68 RR 08 0 21 45 The momit Section 24654 66440644545 OUR REOR Y eA e 21 dO TRE ami Seeing ee 22 The Dn M Seccions 2 23 4 8 Using Sections in Assembler 24 49 Usmg Sections nC Code ss s ea zx o ES 24 5 Data in Program Space 25 S l al a ee GUA 25 32 ANGE UN GONSE voc 42062 Rex Roe 26 5 3 Storing and Retrieving Data in the Program 26 5 4 Storing and Retrieving Strings in the Program Space 28 Mo E LT 30 6 avr libc and assembler programs 30 iti s c komo m Ro y tom Rom Y X 30 62 Inyolongihescompler 22x Romo e Rmo 8 31 n3 Example pioram y pom Rmo REDE Rs 31 6 4 Pseudo ops and operators 35 7 Inline Assembler Cookbook 36 71 GOC asm gt Roo Roy o 37 34 JXasemiblerCode 2 2 2525 5255 5 55555 39 13 Inputand Output Operands o ps o ose o o RR Ro 39 Tab SOBRE oe ke xe doo eee 44 32 Xeseniblef Maros ou loc ook OARS A ES ERO 46 16 5 222222 2222 2522 46 77 C Names Used in Assembler 47 fee 48 8 How to Build a Library 48 So Gil 22255 52 a 48 82 How the Linker Works lt aoc ee ewa ko eo 49
242. be the same register so take care to not clobber it x TCCRIB TIMER1_CLOCKSOURCE c8 8e b5 in r24 0 2 46 ca 81 60 ori r24 0x01 1 cc 8e bd out 0 2 r24 46 if defined TIMER1_SETUP_HOOk TIMER1_SETUP_HOOK endif x Set PWM value to 0 OCR 0 ce lb bc out 0x2b rl 43 d0 1 bc out 0 2 rl 42 Enable as output DDROC BV 0 1 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 Asimple project 310 d2 82 0 ldi r24 0x02 2 d4 87 bb out 0x17 r24 23 Enable timer 1 overflow interrupt TIMSK BV TOIE1 d6 84 eO ldi r24 0x04 4 d8 89 bf out 0x39 r24 57 sei da 78 94 sei des 08 95 ret 000000de main void ioinit void Note 6 Timer 1 is 10 bit 8 bit PWM on some ATtinys x TCCRIA TIMER INIT de 83 e8 ldi r24 0x83 131 e0 8f bd out 0x2f r24 47 Start timer 1 x NB TCCRIA and TCCRIB could actually be the same register so take care to not clobber it x TCCRIB TIMER1_CLOCKSOURCE e2 8e b5 in r24 0x2e 46 e4 81 60 ori r24 0x01 1 e6 8e bd out 0 2 r24 46 if defined TIMER1 SETUP HOOK TIMER1 SETUP HOOK endif x Set PWM value to 0 OCR 0 e8 1b bc out 0x2b rl 43 ea 1 bc out 0 2 r1 42 Enable as output DDROC BV 0 1 ec 82 ldi r24 0x02 2 ee 87 bb out 0x17 r2
243. bler and linker as required This approach has the following advantages e There is basically only one program to be called directly avr gcc regardless of the actual source language used The invokation of the C preprocessor will be automatic and will include the appropriate options to locate required include files in the filesystem The invokation of the linker will be automatic and will include the appropri ate options to locate additional libraries as well as the application start up code lt and linker script Note that the invokation of the C preprocessor will be automatic when the filename provided for the assembler file ends in S the capital letter s This would even apply to operating systems that use case insensitive filesystems since the actual decision is made based on the case of the filename suffix given on the command line not based on the actual filename from the file system Alternatively the language explicitly be specified using the x assembler with cpp option 6 3 Example program The following annotated example features a simple 100 kHz square wave generator using an AT90S1200 clocked with a 10 7 MHz crystal Pin PD6 will be used for the square wave output include lt avr io h gt Note 1 work 16 Note 2 tmp 17 inttmp 19 intsav 0 SQUARE PD6 Note 3 Note 4 tmconst 10700000 200000 100 kHz gt 200000 edges s fuzz 8 clocks in ISR until TCN
244. byte to match val interpreted as an unsigned character stops the operation Returns The memchr function returns a pointer to the matching byte or NULL if the character does not occur in the given memory area 22 18 4 2 int memcmp const void s1 VOID P s2 size t len Compare memory areas memcmp function compares the first 1en bytes of the memory areas s1 and flash s2 The comparision is performed using unsigned char operations Returns The memcmp_P function returns an integer less than equal to or greater than zero if the first Len bytes of s1 is found respectively to be less than to match or be greater than the first 1en bytes of s2 22 18 4 3 void x void dest PGM VOID P src size t n The memcpy_P function is similar to memcpy except the src string resides in pro gram space Returns The memopy function returns a pointer to dest 22 18 4 4 void memmem P const void s7 size t len VOID P s2 size t len2 The memmem function is similar to memmem except that 52 is pointer to a string in program space Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 257 22 18 4 5 VOID P memrchr P PGM VOID P src int val size t len The memrchr function is like the memchr function except that it searches backwards from the end of the 1en bytes pointed to by
245. called with the new request size the existing data will be copied over and free will be called on the old region 4 Memory Sections Remarks Need to list all the sections which are available to the avr Weak Bindings FIXME need to discuss the weak directive The following describes the various sections available 41 The text Section The text section contains the actual machine instructions which make up your program This section is further subdivided by the initN and finiN sections dicussed below Note The avr size program part of binutils coming from a Unix background doesn t account for the data initialization space added to the text section so in order to know how much flash the final program will consume one needs to add the values for both text and data but not bss while the amount of pre allocated SRAM is the sum of data and bss Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 4 2 The data Section 21 4 0 The data Section This section contains static data which was defined in your code Things like the fol lowing would end up in data char err str Your program has died a horrible death struct point pt 1 1 It is possible to tell the linker the SRAM address of the beginning of the data section This is accomplished by adding W1 Tdata addr to the avr gcc command used to the link your program Not that addr must be offset by adding 0x800000 the to r
246. cated project 323 22 37 3 3 Part 3 Interrupt service routines ISR to handle timer 178 overflow interrupt arranges for the software clock While timer 1 runs the PWM it calls its overflow handler rather frequently so the 1 SCALE value is used as a postscaler to reduce the internal software clock frequency further If the software clock triggers it sets the tmr int bitfield and defers all further tasks to the main loop The ADC ISR just fetches the value from the ADC conversion disables the ADC interrupt again and announces the presence of the new value in the adc int bitfield The interrupt is kept disabled while not needed because the ADC will also be triggered by executing the SLEEP instruction in idle mode which is the default sleep mode Another option would be to turn off the ADC completely here but that increases the ADC s startup time not that it would matter much for this application 22 37 3 4 Part 4 Auxiliary functions The function handle mcucsr uses two attribute declarators to achieve specific goals First it will instruct the compiler to place the generated code into the init3 section of the output Thus it will become part of the application initialization sequence This is done in order to fetch and clear the reason of the last hardware reset from MCUCSR as early as possible There is a short period of time where the next reset could already trigger before the current reason has been evaluated
247. cent entries yielding a single larger entry available for further allocations That way the potential for heap fragmentation is hopefully reduced A call to realloc first determines whether the operation is about to grow or shrink the current allocation When shrinking the case is easy the existing chunk is split and the Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 4 Memory Sections 20 tail of the region that is no longer to be used is passed to the standard free function for insertion into the freelist Checks are first made whether the tail chunk is large enough to hold a chunk of its own at all otherwise realloc will simply do nothing and return the original region When growing the region it is first checked whether the existing allocation can be ex tended in place If so this is done and the original pointer is returned without copying any data contents As a side effect this check will also record the size of the largest chunk on the freelist If the region cannot be extended in place but the old chunk is at the top of heap and the above freelist walk did not reveal a large enough chunk on the freelist to satisfy the new request an attempt is made to quickly extend this topmost chunk and thus the heap so no need arises to copy over the existing data If there s no more space available in the heap same check is done as in malloc the entire request will fail Otherwise malloc will be
248. char x malloc heap end Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 41 stdlib h File Reference 375 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 42 strcasecmp S File Reference 376 24 42 strcasecmp S File Reference 24 421 Detailed Description 24 43 strcasecmp 5 File Reference 24 43 1 Detailed Description 24 44 strcasestr S File Reference 24 44 1 Detailed Description 24 45 strcat S File Reference 24 45 1 Detailed Description 24 46 strcat P S File Reference 24 46 1 Detailed Description 24 47 strchr S File Reference 24 47 1 Detailed Description 24 48 strchr 5 File Reference 24 48 1 Detailed Description 24 49 strchrnul S File Reference 24 49 1 Detailed Description 24 50 strchrnul P S File Reference 24 50 1 Detailed Description 24 51 strcmp S File Reference 24 511 Detailed Description 24 52 stremp_P S File Reference 24 52 1 Detailed Description 24 53 sSstrcpy S File Reference Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 53 1 Detailed Description 24 54 strcpy_P S File Reference 24 54 1 Detailed Description 5 eftrecnn S File Reference 24 58 string h File Reference 377 24 58 string h File Reference 24 58 1 Detailed Description Defines define STRING H 1 define need NULL define need size t define PURE attribute pure define FFS x Functions int ffs int int 51 long
249. clears the sleep enable bit Example include avr sleep h set sleep mode mode Sleep mode Note that unless your purpose is to completely lock the CPU until a hardware reset interrupts need to be enabled before going to sleep As the sleep mode macro might cause race conditions in some situations the individual steps of manipulating the sleep enable SE bit and actually issuing the SLEEP instruction are provided in the macros sleep enable sleep disable sleep cpu This also allows for test and sleep scenarios that take care of not missing the interrupt that will awake the device from sleep I Example include avr interrupt h include avr sleep h set sleep mode mode Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 22 lt avr sleep h gt Power Management and Sleep Modes 270 if some condition sleep_enable sei sleep cpu sleep disable sei This sequence ensures an atomic test of some condition with interrupts being dis abled If the condition is met sleep mode will be prepared and the 51 I instruction will be scheduled immediately after an SEI instruction As the intruction right after the SEI is guaranteed to be executed before an interrupt could trigger it is sure the device will really be put to sleep Some devices have the ability to disable the Brown Out Det
250. compiler for a Harvard architecture processor like the AVR has to use other means to operate with separate address spaces Some compilers use non standard C language keywords or they extend the standard syntax in ways that are non standard The AVR toolset takes a different approach GCC has a special keyword attribute that is used to attach different at tributes to things such as function declarations variables and types This keyword is followed by an attribute specification in double parentheses In AVR there is a special attribute called progmem This attribute is use on data declarations and tells the compiler to place the data in the Program Memory Flash AVR Libc provides a simple macro PROGMEM that is defined as the attribute syn tax of GCC with the progmem attribute This macro was created as a convenience to the end user as we will see below The PROGMEM macro is defined in the avr pgmspace h system header file Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 5 2 A Note On const 26 It is difficult to modify GCC to create new extensions to the C language syntax so instead avr libc has created macros to retrieve the data from the Program Space These macros are also found in the lt avr pgmspace h gt system header file 5 2 A Note On const Many users bring up the idea of using C s keyword const as a means of declaring data to be in Program Space Doing this would be an abuse
251. configured by hardware strapping However since the next data packet following the device selection only allows for 8 bits that are used as an EEPROM address devices that require more than 8 address bits 24C04 and above steal subaddress bits and use them for the EEPROM cell address bits 9 to 11 as re quired This example simply assumes all subaddress bits 0 for the smaller devices so the EO E1 and E2 inputs of the 24Cxx must be grounded Note 4 For slow clocks enable the 2 x U S ART clock multiplier to improve the baud rate error This will allow a 9600 Bd communication using the standard 1 MHz calibrated RC oscillator See also the Baud rate tables in the datasheets Note 5 The datasheet explains why a minimum TWBR value of 10 should be maintained when running in master mode Thus for system clocks below 3 6 MHz we cannot run the bus at the intented clock rate of 100 kHz but have to slow down accordingly Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 39 Example using the two wire interface TWI 335 Note 6 This function is used by the standard output facilities that are utilized in this example for debugging and demonstration purposes Note 7 In order to shorten the data to be sent over the TWI bus the 24Cxx EEPROMs support multiple data bytes transfered within a single request maintaining an internal address counter that is updated after each data byte transfered successfully
252. creased resolution 22 27 2 2 void delay us double us Perform a delay of __us microseconds using delay loop 10 The macro CPU is supposed to be defined to a constant defining the CPU clock frequency in Hertz The maximal possible delay is 768 us F CPU in MHz If the user requests a delay greater than the maximal possible one delay us will automatically call delay ms instead The user will not be informed about this case 2228 lt util delay_basic h gt Basic busy wait delay loops 22 28 1 Detailed Description include lt util delay_basic h gt The functions in this header file implement simple delay loops that perform a busy waiting They are typically used to facilitate short delays in the program execution They are implemented as count down loops with a well known CPU cycle count per Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 29 lt util parity h gt Parity bit generation 285 loop iteration As such no other processing can occur simultaneously It should be kept in mind that the functions described here do not disable interrupts In general for long delays the use of hardware timers is much preferrable as they free the CPU and allow for concurrent processing of other events while the timer is running However in particular for very short delays the overhead of setting up a hardware timer is too much compared to the overall delay time Two inline functions are provided fo
253. d memset void int size t int strcasecmp const char const char x ATTR_PURE char strcasestr const char const char x ATTR PURE char strcat char const char char strchr const char int PURE char strchrnul const char int PURE int strcmp const char const char x ATTR PURE char strcpy char const char size tstrcspn const char 5 const char reject ATTR PURE char strdup const char s1 size_t strlcat char const char size_t size t strlcpy char const char size t size t strlen const char x ATTR PURE char strlwr char int strncasecmp const char const char size t ATTR_PURE char strncat char const char size_t int strnemp const char const char size_t _ ATTR PURE char strncpy char const char size_t size t strnlen const char size_t PURE char strpbrk const char 5 const char accept PURE char strrchr const char int PURE char strrev char char strsep char const char size tstrspn const char 65 const char __accept _ ATTR PURE char strstr const char const char x ATTR PURE char strtok char const char char strtok_r char const char char char strupr char 22 11 2 Define Documentation 22 11 2
254. d If s2 points to a string of zero length the function returns s1 22 11 3 36 char x strtok char s const char x delim Parses the string s into tokens strtok parses the string s into tokens The first call to strtok should have s as its first argument Subsequent calls should have the first argument set to NULL If a token ends with a delimiter this delimiting character is overwritten with a VO and a pointer to the next character is saved for the next call to strtok The delimiter string delim may be different for each call Returns The strtok function returns a pointer to the next token or NULL when no more tokens are found Note strtok is NOT reentrant For a reentrant version of this function see strtok Ew 22 11 3 37 char x strtok_r char x string const char delim char last Parses string into tokens strtok parses string into tokens The first call to strtok should have string as its first argument Subsequent calls should have the first argument set to NULL If a token ends with a delimiter this delimiting character is overwritten with a VO and a pointer to the next character is saved for the next call to strtok r The delimiter string delim may be different for each call last is a user allocated char pointer It must be the same while parsing the same string strtok r is a reentrant version of strtok Returns The strtok_r function returns a pointer to the next token or NULL when
255. d by the compiler as early as possible within the ISR to ensure minimal processing delay for nested interrupts Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 16 lt avr io h gt AVR device specific IO definitions 245 This may be used to create nested ISRs however care should be taken to avoid stack overflows or to avoid infinitely entering the ISR for those cases where the AVR hard ware does not clear the respective interrupt flag before entering the ISR Use this attribute in the attributes parameter of the ISR macro 22 15 2 10 define reti include avr interrupt h Returns from an interrupt routine enabling global interrupts This should be the last command executed before leaving an ISR defined with the ISR_NAKED attribute This macro actually compiles into a single line of assembly so there is no function call overhead 22 15 2 11 define sei include lt avr interrupt h gt Enables interrupts by setting the global interrupt mask This function actually compiles into a single line of assembly so there is no function call overhead 22 15 2 12 define SIGNAL vector include avr interrupt h Introduces an interrupt handler function that runs with global interrupts initially dis abled This is the same as the ISR macro without optional attributes Deprecated Do not use SIGNAL in new code Use ISR instead 22 16 lt avr io h gt AVR device specific IO definitions includ
256. d Non Atomically Executed Code Blocks 22 25 1 Detailed Description include lt util atomic h gt Note The macros in this header file require the ISO IEC 9899 1999 ISO C99 feature of for loop variables that are declared inside the for loop itself For that reason this header file can only be used if the standard level of the compiler option std is set to either c99 or gnu99 The macros in this header file deal with code blocks that are guaranteed to be excuted Atomically or Non Atmomically The term Atomic in this context refers to the un ability of the respective code to be interrupted These macros operate via automatic manipulation of the Global Interrupt Status I bit of the SREG register Exit paths from both block types are all managed automatically without the need for special considerations i e the interrupt status will be restored to the same value it has been when entering the respective block Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 25 lt util atomic h gt Atomically and Non Atomically Executed Code BlocR Y7 A typical example that requires atomic access is a 16 or more bit variable that is shared between the main execution path and an ISR While declaring such a variable as volatile ensures that the compiler will not optimize accesses to it away it does not guarantee atomic access to it Assuming the following example include inttypes h include avr interrupt h
257. d converted similarly as a 4 x command would do c The int argument is converted to an unsigned char and the resulting character is written s The char x argument is expected to be a pointer to an array of character type pointer to a string Characters from the array are written up to but not including a terminating NUL character if a precision is specified no more than the number specified are written If a precision is given no null character need be present if the precision is not specified or is greater than the size of the array the array must contain a terminating NUL character A is written No argument is converted The complete conversion specifica tion is 2696 eE The double argument is rounded and converted in the format d ddde dd where there is one digit before the decimal point charac ter and the number of digits after it is equal to the precision if the precision is missing it is taken as 6 if the precision is zero no decimal point character appears E conversion uses the letter E rather than to introduce the exponent The exponent always contains two digits if the value is zero the exponent is 00 F The double argument is rounded and converted to decimal notation in the format ddd ddd where the number of digits after the decimal point character is equal to the precision specification If the precision is missing it is taken as 6 if the precision is explicit
258. d output operations performed over the RS 232 connection to a terminal e g from to a PC running a terminal program while the 1 str stream provides a method to display character data on the LCD text display The function delay 1s suspends program execution for approximately one sec ond This is done using the delay ms function from lt util delay h gt which in turn needs the F CPU macro in order to adjust the cycle counts As the _ 1 ms function has a limited range of allowable argument values depending on F CPU a value of 10 ms has been chosen as the base delay which would be safe for CPU frequencies of up to about 26 MHz This function is then called 100 times to accomodate for the actual one second delay Ina practical application long delays like this one were better be handled by a hardware timer so the main CPU would be free for other tasks while waiting or could be put on sleep At the beginning of main after initializing the peripheral devices the default stdio streams stdin stdout and stderr are set up by using the existing static FILE stream objects While this is not mandatory the availability of stdin and stdout allows to use the shorthand functions e g printf instead of fprintf and stderr can mnemonically be referred to when sending out diagnostic messages Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 38 Using the standard IO facilities 328 Just for demons
259. d store it whenever modified Situations in which you need clobbers are very rare In most cases there will be better ways Clobbered registers will force the compiler to store their values before and reload them after your assembler code Avoiding clobbers gives the compiler more freedom while optimizing your code Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7 5 Assembler Macros 46 7 5 Assembler Macros In order to reuse your assembler language parts it is useful to define them as macros and put them into include files AVR Libc comes with a bunch of them which could be found in the directory avr include Using such include files may produce compiler warnings if they are used in modules which are compiled in strict ANSI mode To avoid that you can write asm instead of asm and volatile instead of volatile These are equivalent aliases Another problem with reused macros arises if you are using labels In such cases you may make use of the special pattern which is replaced by a unique number on each asm statement following code had been taken from avr include iomacros h define loop until bit is clear port bit asm volatile L 0 1 n t N rjmp L N no outputs x I SFR IO ADDR port I bit When used for the first time L_ may be translated to 1 1404 the next usage might create 1405 or whatever In any case the labels became unique t
260. dard error output i e to the LCD followed by three dots in one second spacing followed by a sequence that will clear the LCD Finally main will be terminated and the library will add an infinite loop so only a CPU reset will be able to restart the application There are three commands recognized each determined by the first letter of the line entered converted to lower case The q quit command has the same effect of leaving the main loop The LCD command takes its second argument and sends it to the LCD The u UART command takes its second argument and sends it back to the UART connection Command recognition is done using sscanf where the first format in the format string just skips over the command itself as the assignment suppression modifier is given 22 38 3 2 defines h This file just contains a few peripheral definitions CPU macro defines the CPU clock frequency to be used in delay loops as well as in the UART baud rate calculation The macro UART_BAUD defines the RS 232 baud rate Depending on the actual CPU frequency only a limited range of baud rates can be supported Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 38 Using the standard IO facilities 329 The remaining macros customize the IO port and pins used for the HD44780 LCD driver 22 38 3 3 hd44780 h This file describes the public interface of the low level LCD driver that interfaces
261. de selected with the set_sleep_mode function See the data sheet for your device for more details Set the SE sleep enable bit 22 23 lt avr version h gt avr libc version macros 22 23 1 Detailed Description include lt avr version h gt This header file defines macros that contain version numbers and strings describing the current version of avr libc The version number itself basically consists of three pieces that are separated by a dot the major number the minor number and the revision number For development versions which use an odd minor number the string representation additionally gets the date code YY YYMMDD appended This file will also be included by lt avr io h gt That way portable tests can be implemented using lt avr io h gt that can be used in code that wants to remain backwards compatible to library versions prior to the date when the library version API had been added as referenced but undefined C preprocessor macros automatically evaluate to 0 Defines define _ VERSION STRING 1 6 6 define _ LIBC VERSION 1060601 define _ DATE STRING A 20090309 define _ 20090309UL e define _ MAJOR 1 e define _ MINOR 6 e define _ AVR REVISION 6 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 24 lt avr wdt h gt Watchdog timer handling 272 22 23
262. define need NULL define need size t define need wchar t e define ptr t void define RAND MAX Ox7FFF Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 41 stdlib h File Reference 374 Typedefs e typedef int compar fn t const void const void Functions void abort void ATTR NORETURN int abs int 1 longlabs long i void bsearch const void key const void base size_t __nmemb size t size int __compar const void const void div_t div int num int denom asm divmodhi4 e div tldiv long num long denom asm divmodsi4 e void qsort void base size_t __nmemb size t size compar fn t compar long strtol const char nptr char endptr int base unsigned long strtoul const char nptr char __endptr int base long atol const char 5 PURE int atoi const char 5 PURE void exit int status NORETURN void malloc size t size MALLOC void free void ptr void calloc size nele size t size ATTR MALLOC void realloc void ptr size_t __size MALLOC double strtod const char nptr char endptr double const char nptr int rand void void srand unsigned int seed int unsigned long _ e size t malloc margin e char x malloc heap start e
263. defined 22 32 2 3 define inb port port Deprecated Read a value from an IO port port Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 32 lt compat deprecated h gt Deprecated items 295 22 32 2 4 define inp port port Deprecated Read a value from an IO port port 22 32 2 5 define INTERRUPT signame Value void signame void __attribute__ interrupt __INTR_ATTRS void signame void Deprecated Introduces an interrupt handler function that runs with global interrupts initially en abled This allows interrupt handlers to be interrupted As this macro has been used by too many unsuspecting people in the past it has been deprecated and will be removed in a future version of the library Users who want to legitimately re enable interrupts in their interrupt handlers as quickly as possible are encouraged to explicitly declare their handlers as described above 22 32 2 6 define outb port val port val Deprecated Write val to IO port port 22 32 27 define outp val port port val Deprecated Write val to IO port port Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 33 lt compat ina90 h gt Compatibility with EWB 3 x 296 22 32 2 8 define sbi port bit port 1 lt lt bit Deprecated Set bit in IO port port 22 32 3 Function Documentation 22 32 3 1 static _ inline void timer enable int unsigned char
264. der to keep the AVR tools separate from the base system it is usually better to install everything into usr local avr If the usr local avr directory does not exist you should create it before trying to install anything You will need root access to install there If you don t have root access to the system you can alternatively install in your home directory for exam ple in SHOME 10cal avr Where you install is a completely arbitrary decision but should be consistent for all the tools You specify the installation directory by using the prefix dir option with the configure script It is important to install all the AVR tools in the same directory or some of the tools will not work correctly To ensure consistency and simplify the discussion we will use PREF IX to refer to whatever directory you wish to install in You can set this as an environment variable if you wish as such using a Bourne like shell 8 PREFIX HOME local avr export PREFIX Note Be sure that you have your PATH environment variable set to search the direc tory you install everything in before you start installing anything For example if you use prefix PREFIX you must have PREFIX bin in your exported PATH As such PATH SPATH SPREFIX bin export PATH Warning If you have CC set to anything other than avr gcc in your environment this will cause the configure script to fail It is best to not have CC set at all Note
265. dt reset volatile wdr Resetthe watchdog timer When the watchdog timer is enabled a call to this instruction is required before the timer expires otherwise a watchdog initiated device reset will occur Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 24 lt avr wdt h gt Watchdog timer handling 275 22 24 2 4 define WDTO 120MS 3 See WDTO 15MS 22 24 2 5 itdefine WDTO 15MS 0 Symbolic constants for the watchdog timeout Since the watchdog timer is based on a free running RC oscillator the times are approximate only and apply to a supply voltage of 5 V At lower supply voltages the times will increase For older devices the times will be as large as three times when operating at Vcc 3 V while the newer devices e g ATmegal28 ATmega8 only experience a negligible change Possible timeout values are 15 ms 30 ms 60 ms 120 ms 250 ms 500 ms 1 s 2 s Some devices also allow for 4 s and 8 s Symbolic constants are formed by the prefix WDTO_ followed by the time Example that would select a watchdog timer expiry of approximately 500 ms enable WDTO 500 5 22 24 2 6 define WDTO 1S 6 See WDTO 15MS 22 24 27 define WDTO 250MS 4 See WDTO 15MS 22 24 2 8 define WDTO 2S 7 See WDTO 15MS 22 24 2 9 define WDTO 30MS 1 See WDTO 15MS 22 24 2 10 define WDTO 458 See WDTO 15MS Note This is only available on the ATtiny2313 ATtiny24 AT ny44 ATtiny84 ATtiny25
266. e lt avr io h gt This header file includes the apropriate IO definitions for the device that has been specified by the mmcu compiler command line switch This is done by divert ing to the appropriate file lt avr ioXXXX h gt which should never be included di rectly Some register names common to all AVR devices are defined directly within Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 47 lt avr lock h gt Lockbit Support 246 lt avr common h gt which is included in lt avr io h gt but most of the details come from the respective include file Note that this file always includes the following files include avr sfr defs h include lt avr portpins h gt include lt avr common h gt include lt avr version h gt See lt avr sfr_defs h gt Special function registers for more details about that header file Included are definitions of the IO register set and their respective bit values as specified in the Atmel documentation Note that inconsistencies in naming conventions so even identical functions sometimes get different names on different devices Also included are the specific names useable for interrupt function definitions as docu mented here Finally the following macros are defined RAMEND The last on chip RAM address XRAMEND The last possible RAM location that is addressable This is equal to RAMEND for devices that do not allow for external RAM For devices that allow ex
267. e UINT FAST32 MAX UINT32 define INT FAST64 MAX INT64 MAX define INT FAST64 MIN INT64 MIN define UINT FAST64 MAX UINT64 Limits of integer types capable of holding object pointers define INTPTR MAX INTI6 MAX define INTPTR MIN INT16 MIN define UINTPTR MAX UINTI6 MAX Limits of greatest width integer types define INTMAX MAX INT64 MAX define INTMAX MIN INT64 MIN define UINTMAX MAX UINT64 Limits of other integer types C implementations should define these macros only when __ STDC LIMIT MACROS is defined before lt stdint h gt is included define PTRDIFF MAX INTI6 MAX define PTRDIFF MIN INT16 MIN define SIG ATOMIC MAX INT8 MAX define SIG ATOMIC MIN 8 MIN define SIZE MAX 6 MAX U Macros for integer constants C implementations should define these macros only when STDC CONSTANT MACROS is defined before lt stdint h gt is included These definitions are valid for integer constants without suffix and for macros de fined as integer constant without suffix Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 39 stdint h File Reference 370 define INT8_C value int8 t value define UINT8_C value uint8 t CONCAT value U define INT16 C value value define UINT16_C value CONCAT value U define INT32_C value _ CONCAT value L define UINT32_C value CONCATC value UL define INT64_C
268. e _EEPUT addr val eeprom write byte uint8 t uint8_ t val define _EEGET var addr var eeprom read byte const uint8 t x addr Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 13 lt avr eeprom h gt EEPROM handling 217 Defines define EEMEM attribute section eeprom define eeprom is ready define eeprom busy wait do while eeprom_is_ready Functions static _ ATTR_ PURE inline__ uint8_t eeprom_read_byte const uint8_t p static ATTR PURE inline uintl6 t eeprom read word const uintl6 p static PURE inline uint32 t eeprom read dword const uint32 p static inline void eeprom read block void dst const void src size t n static inline void eeprom write byte uint8 t p uint8 t value static __inline__ void eeprom write word uint16 p uintl t value static __inline__ void write dword uint32 p uint32 t value static inline void eeprom write block const void src void dst size t n 22 13 2 Define Documentation 22 13 2 1 define EEGETv var addr var eeprom read byte const uint8 t x addr Read a byte from EEPROM Compatibility define for IAR C 22 13 2 2 EEPUT addr val eeprom write byte uint8 t addr uint8_t val Write a byte to EEPROM Compatibility define for IAR C 22 13 2 3 define EEMEM __attribu
269. e beginning address of the named section Back to FAQ Index 11 19 My UART is generating nonsense My ATmega128 keeps crashing Port F is completely broken Well certain odd problems arise out of the situation that the AVR devices as shipped by Atmel often come with a default fuse bit configuration that doesn t match the user s expectations Here is a list of things to care for devices that have an internal RC oscillator ship with the fuse enabled that causes the device to run off this oscillator instead of an external crystal This often remains unnoticed until the first attempt is made to use something critical in timing like UART communication The ATmegal28 ships with the fuse enabled that turns this device into AT megal03 compatibility mode This means that some ports are not fully usable and in particular that the internal SRAM is located at lower addresses Since by default the stack is located at the top of internal SRAM a program compiled for an ATmegal28 running on such a device will immediately crash upon the first function call or rather upon the first function return Devices with a JTAG interface have the JTAGEN fuse programmed by default This will make the respective port pins that are used for the JTAG interface un available for regular IO Back to FAQ Index 11 20 Why do all my foo bar strings eat up the SRAM By default all strings are handled as all other initialized variables they occupy
270. e busy wait time when writing Note that in case a device is broken and never responds to a selection e g since it is no longer present at all this will cause an infinite loop Thus the maximal number of iterations made until the device is declared to be not responding at all and an error is returned will be limited to ITER Note 12 This is called master receiver mode the bus master still supplies the SCL clock but the device slave drives the SDA line with the appropriate data After 8 data bits the master responds with an ACK bit SDA driven low in order to request another data transfer from the slave or it can leave the SDA line high NACK indicating to the slave that it is going to stop the transfer now Assertion of ACK is handled by setting the TWEA bit in TWCR when starting the current transfer Note 13 The control word sent out in order to initiate the transfer of the next data packet is initially set up to assert the TWEA bit During the last loop iteration TWEA is de asserted so the client will get informed that no further transfer is desired Note 14 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 23 Data Structure Documentation 337 Except in the case of lost arbitration all bus transactions must properly be terminated by the master initiating a stop condition Note 15 Writing to the EEPROM device is simpler than reading since only a master transmitter mode transfer is ne
271. e current timer counter value register TCNTn the input capture register ICRn and write access to the output compare registers OCRnM Refer to the actual datasheet for each device s set of registers that involves the TEMP register When accessing one of the registers that use TEMP from the main application and possibly any other one from within an interrupt routine care must be taken that no access from within an interrupt context could clobber the TEMP register data of an in progress transaction that has just started elsewhere To protect interrupt routines against other interrupt routines it s usually best to use the ISR macro when declaring the interrupt function and to ensure that interrupts are still disabled when accessing those 16 bit timer registers Within the main program access to those registers could be encapsulated in calls to the cli and sei macros If the status of the global interrupt flag before accessing one of those registers is uncertain something like the following example code can be used uint16_t read timerl void uint8 t sreg uintl6 t val sreg SREG cli Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 10 How do I use a define d constant in an asm statement 66 val TCNT1 SREG sreg return val Back to FAQ Index 11 10 How do I use a define d constant in an asm statement So you tried this asm volatile sbi 0x18 0x07 Which works
272. e data section so in this situation no stack heap collision can occur Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 14 Using the avrdude program 116 In order to relocate the stack from its default location at the top of interns RAM the value of the symbol stack can be changed on the linker command line As the linker is typically called from the compiler frontend this can be achieved using a com piler option like Wl defsym stack 0x8003ff The above will make the code use stack space from RAM address Ox3ff downwards The amount of stack space available then depends on the bottom address of internal RAM for a particular device It is the responsibility of the application to ensure the stack does not grow out of bounds as well as to arrange for the stack to not collide with variable allocations made by the compiler sections data and bss 14 Using the avrdude program Note This section was contributed by Brian Dean bsd bsdhome com The avrdude program was previously called avrprog The name was changed to avoid confusion with the avrprog program that Atmel ships with AvrStudio avrdude is a program that is used to update or read the flash and EEPROM memories of Atmel AVR microcontrollers on FreeBSD Unix It supports the Atmel serial pro gramming protocol using the PC s parallel port and can upload either a raw binary file or an Intel Hex format file It can also be used in an interactive mode to
273. e gt to Changes in avr libc this relelase Bring the build system up to date by running bootstrap and configure Perform a make distcheck and make sure it succeeds This will create the source tarball Tag the release cvs tag avr libe major minor patch release Upload the tarball to savannah Update the NEWS file and commit to cvs Add Changes since avr libc major minor patch Generate the latest documentation and upload to savannah Announce the release Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 16 Acknowledgments 121 The following hypothetical diagram should help clarify version and branch relation ships HEAD 1 0 Branch 1 2 Branch cvs tag avr libc 1 0 branchpoint set version to 1 1 0 lt date gt cvs tag b avr libc 1_0 branch set version to 0 90 90 lt date gt 1 set version to 1 0 cvs tag avr libc 1_0 release set version to 1 0 0 lt date gt set version to 1 0 1 cvs tag avr libc 1_0_1 releaseg 1 cvs tag avr libc 1_2 branchpoint i set version to 1 3 0 lt date gt cvs tag b avr libc 1 2 branch set version to 1 1 90 lt date gt set version to 1 2 cvs tag avr libc 1 2 release cvs tag avr libc 2 0 branchpoint set version to 2 1 0 lt date gt Figure 4 Release tree 16 Acknowledgments This document tries to tie together the labors of a large group of p
274. e is R W i e it determines whether the request to the slave is to read or write data during the next cycles There is also an option to have devices using 10 bit addresses but that is not covered by this example 22 39 2 The TWI example project The ATmega TWI hardware supports both master and slave operation This example will only demonstrate how to use an AVR microcontroller as TWI master The imple mentation is kept simple in order to concentrate on the steps that are required to talk to a TWI slave so all processing is done in polled mode waiting for the TWI interface to indicate that the next processing step is due by setting the TWINT interrupt bit If it is desired to have the entire TWI communication happen in background all this can be implemented in an interrupt controlled way where only the start condition needs to be triggered from outside the interrupt routine There is a variety of slave devices available that can be connected to a TWI bus For the purpose of this example an EEPROM device out of the industry standard 24Cxx series has been chosen where xx can be one of 01 02 04 08 or 16 which are available from various vendors The choice was almost arbitrary mainly triggered by the fact that an EEPROM device is being talked to in both directions reading and writing the slave device so the example will demonstrate the details of both Usually there is probably not much need to add more EEPROM to an ATmega syst
275. e it is taken as 8 octal The remainder of the string is converted to a long value in the obvious manner stopping at the first character which is not a valid digit in the given base In bases above 10 the letter A in either upper or lower case represents 10 represents 11 and so forth with Z representing 35 If endptr is not NULL strtol stores the address of the first invalid character in endptr If there were no digits at all however strtol stores the original value of nptr in endptr Thus if xnptr is not NO but xxendptr is 0 on return the entire string was valid The strtol function returns the result of the conversion unless the value would under flow or overflow If no conversion could be performed 0 is returned If an overflow or underflow occurs errno is set to ERANGE and the function return value is clamped to LONG MIN or MAX respectively 22 10 4 28 unsigned long strtoul const char _ nptr char xx endptr int base The strtoul function converts the string in npt r to an unsigned long value The con version is done according to the given base which must be between 2 and 36 inclusive or be the special value 0 The string may begin with an arbitrary amount of white space as determined by iss pace followed by a single optional or sign If base is zero or 16 the string may then include a 0x prefix and the number will be read in base 16 otherw
276. e not using any floating point math functions from the Standard C library but you are just doing floating point math operations When you link in the math library from AVR LibC those routines get replaced by hand optimized AVR assembly and it produces much smaller code See I get undefined reference to for functions like sin for more details on how to link in the math library Back to FAQ Index 11 33 What pitfalls exist when writing reentrant code Reentrant code means the ability for a piece of code to be called simultaneously from two or more threads Attention to re enterability is needed when using a multi tasking operating system or when using interrupts since an interrupt is really a temporary thread The code generated natively by gcc is reentrant But only some of the libraries in avr libc are explicitly reentrant and some are known not to be reentrant In general any library call that reads and writes global variables including I O registers is not reentrant This is because more than one thread could read or write the same storage at the same time unaware that other threads are doing the same and create inconsistent and or erroneous results A library call that is known not to be reentrant will work if it is used only within one thread and no other thread makes use of a library call that shares common storage with it Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 1133 What pitfalls exist
277. e syntax of an operand list will be explained soon Let us first examine the part of a compiler listing which may have been generated from our example lds r24 value x in r24 12 NOAPP sts value r24 The comments have been added by the compiler to inform the assembler that the in cluded code was not generated by the compilation of C statements but by inline as sembler statements The compiler selected register r24 for storage of the value read from PORTD The compiler could have selected any other register though It may not explicitely load or store the value and it may even decide not to include your assembler code at all All these decisions are part of the compiler s optimization strategy For example if you never use the variable value in the remaining part of the C program the compiler will most likely remove your code unless you switched off optimization To avoid this you can add the volatile attribute to the asm statement asm volatile in 0 1 r value I SFR IO ADDR PORTD Alternatively operands can be given names The name is prepended in brackets to the constraints in the operand list and references to the named operand use the bracketed name instead of a number after the sign Thus the above example could also be written as asm in retval port retval r value port I SFR IO ADDR PORTD The last part of the asm instruction the clobber list is mainly
278. eal SRAM address so that the linker knows that the address is in the SRAM memory space Thus if you want the data section to start at 0x1100 pass 0x801100 at the address to the linker offset explained Note When using malloc in the application which could even happen inside library calls additional adjustments are required 4 3 The bss Section Uninitialized global or static variables end up in the bss section 4 4 The eeprom Section This is where eeprom variables are stored 4 5 The noinit Section This sections is a part of the bss section What makes the noinit section special is that variables which are defined as such int foo attribute section noinit will not be initialized to zero during startup as would normal bss data Only uninitialized variables can be placed in the noinit section Thus the following code will cause avr gcc to issue an error int bar attribute section noinit Oxaa Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 4 6 The initN Sections 22 It is possible to tell the linker explicitly where to place the noinit section by adding Wl section start noinit 0x802000 to the avr gcc command line at the linking stage For example suppose you wish to place the noinit section at SRAM address 0x2000 5 avr gcc Wl section start noinit 0x802000 Note Because of the Harvard architecture of the AVR devices you must
279. eck log make install 2 gt amp 1 tee mpfr make install log MPFR headers will be installed under usr local include and library in stalled under usr local lib Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 13 Building the Toolchain for Windows 98 Install Doxygen Version 1 5 6 lt http www stack nl dimitri doxygen gt Download and install Install NetPBM Version 10 27 0 From the GNUWin32 project http gnuwin32 sourceforge net packages html Download and install nstall fig2dev Version 3 2 Patchlevel 5 From WinFig 2 2 http www schmidt web berlin de winfig Unzip the download file and install fig2dev exe in a location of your choice Install MiKTeX Version 2 7 lt http miktex org gt Download and install Install Ghostscript Version 8 63 lt http www cs wisc edu ghost gt Download and install In the subdirectory of the installaion copy gswin32c exe to gs exe Set the TEMP and TMP environment variables to c temp or to the short file name version This helps to avoid NTVDM errors during building 12 13 Building the Toolchain for Windows directories in the PATH enviornment variable should be specified using their short filename 8 3 version This will also help to avoid NTVDM errors during building These short filenames can be specific to each machine Build the tools below in MSYS
280. ect file index into the archive or update an existing one This last switch is very important as it helps the linker to find what it needs to do its job Note The command line switches are case sensitive There are uppercase switches that have completely different actions MFile and the WinAVR distribution contain a Makefile Template that includes the necessary command lines to build a library You will have to manually modify the template to switch it over to build a library instead of an application See the GNU Binutils manual for more information on the ar program Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 8 5 Usinga Library 51 8 5 Usinga Library To use a library use the 1 switch on your linker command line The string immedi ately following the 1 is the unique part of the library filename that the linker will link in For example if you use im this will expand to the library filename libm a which happens to be the math library included in avr libc If you use this on your linker command line lgrinut flt then the linker will look for a library called libprintf flt a This is why naming your library is so important when you create it The linker will search libraries in the order that they appear on the command line Whichever function is found first that matches the undefined reference it will be linked in There are also command line switches that tell GCC which dir
281. ected by comparing the location referenced by the pointer returned in to 7 07 This function is similar to strsep except that delim is a pointer to a string in program space Returns The strsep_P function returns a pointer to the original value of If is initially NULL strsep_P returns NULL 22 18 4 25 size_t strspn P const char s P accept The strspn_P function calculates the length of the initial segment of s which con sists entirely of characters in accept This function is similar to strspn except that accept is a pointer to a string in program space Returns The strspn_P function returns the number of characters in the initial segment of s which consist only of characters from accept The terminating zero is not considered as a part of string 22 18 4 26 char x strstr P const char s PGM P s2 Locate a substring strstr_P function finds the first occurrence of the substring 52 in the string 51 The terminating 0 characters are not compared The strstr_P function is similar to strstr except that s2 is pointer to a string in program space Returns The strstr function returns a pointer to the beginning of the substring or NULL if the substring is not found If 52 points to a string of zero length the function returns s1 22 19 lt avr power h gt Power Reduction Management finclude lt avr power h gt Generated on Fri Mar 13 16 47 36 2009 for
282. ector BOD before going to sleep This will also reduce power while sleeping If the specific AVR device has this ability then an additional macro is defined s1eep bod disable This macro generates inlined assembly code that will correctly implement the timed sequence for disabling the BOD before sleeping However there is a limited number of cycles af ter the BOD has been disabled that the device can be put into sleep mode otherwise the BOD will not truly be disabled Recommended practice is to disable the BOD sleep bod disable set the interrupts sei and then put the device to sleep 51 cpu like so include avr interrupt h include lt avr sleep h gt set_sleep_mode lt mode gt eli if some condition Sleep enable sleep bod disable sei sleep cpu sleep disable sei Functions void sleep enable void void sleep disable void void sleep cpu void 22 22 2 Function Documentation 22 22 2 1 void sleep cpu void Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 23 lt avr version h gt avr libc version macros 271 Put the device into sleep mode The SE bit must be set beforehand and it is recom mended to clear it afterwards 22 22 2 2 void sleep disable void Clear the SE sleep enable bit 22 22 2 3 void sleep_enable void Put the device in sleep mode How the device is brought out of sleep mode depends on the specific mo
283. ectory to look in 1 for the libraries that are specified to be linke in with 1 See the GNU Binutils manual for more information on the GNU linker ld program 9 Benchmarks The results below can only give a rough estimate of the resources necessary for using certain library functions There is a number of factors which can both increase or reduce the effort required Expenses for preparation of operands and their stack are not considered n the table the size includes all additional functions for example function to multiply two integers but they are only linked from the library Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 91 A few of libc functions 52 Expenses of time of performance of some functions essentially depend on param eters of a call for example qsort is recursive and sprintf receives parameters in a stack Different versions of the compiler can give a significant difference in code size and execution time For example the dtostre function compiled with avr gcc 3 4 6 requires 930 bytes After transition to avr gcc 4 2 3 the size become 1088 bytes 91 A few of libc functions Avr gcc version is 4 2 3 The size of function is given in view of all picked up functions By default Avr libc is compiled with mcall prologues option In brackets the size without taking into account modules of a prologue and an epilogue is resulted Both of the size can coincide if fu
284. ed Description 376 24 45 sireat S File Reference 376 24 45 1 Detailed Description 376 24 dostrcat_ P S File Referenc 376 24 46 1 Detailed Description 376 24 Af stvcbrs File Referenc scc ROR A OG 376 2441 1 Detailed Description 2 2 22222 2 2 5 4 gt 376 2448strchr PS File Reference 376 24 48 1 Detailed Description 376 2449strchmulS File Reference 2 376 24 491 Detailed Description 2 2 2 24 376 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS xiv 24 S0strchrngl PS File Reference 376 2550 1 Detailed Description s e ee 400444 8s xg a R es 376 24 Pile Reference 2 olm ed ee e e dies E RSS 376 2451 1 Detailed Description 22 222 2 5 376 24 52stromp_ PS File Reference o o o aoe ee 5942 RR 376 24 52 1 Detailed Description 376 24 5 3sttepyos Pile Referente 6 cu oko ono XR eR Rs 376 24 33 1 Detailed Description 376 24 PS He Reference RR REGE RR 376 2454 1 Detailed Description 2 376 24 55 strespn 5 Pile Reference 2 2 2 2 376 24 551 Detailed Description soc ek ob 376 24 56s cspn PS File Reference o o RR 376 24 56 Detailed Description 2
285. ed in the variable pwm so others can use it in calculations In order to allow for a simple calculation of a percentage value without requiring floating point mathematics the maximal value of the PWM is restricted to 1000 rather than 1023 so a simple division by 10 can be used Due to the nature of the human eye the difference in LED brightness between 1000 and 1023 is not noticable anyway Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 37 A more sophisticated project 324 22 37 3 5 Part 5 main At the start of main a variable mode is declared to keep the current mode of operation An enumeration is used to improve the readability By default the compiler would allocate a variable of type int for an enumeration The packed attribute declarator instructs the compiler to use the smallest possible integer type which would be an 8 bit type here After some initialization actions the application s main loop follows In an embedded application this is normally an infinite loop as there is nothing an application could exit into anyway At the beginning of the loop the watchdog timer will be retriggered If that timer is not triggered for about 2 seconds it will issue a hardware reset Care needs to be taken that no code path blocks longer than this or it needs to frequently perform watchdog resets of its own An example of such a code path would be the string IO functions for an overly large string to print abo
286. ed int seed int rand unsigned long ctx Variables size t malloc margin char __ heap start char malloc heap end Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 188 22 10 2 Define Documentation 22 10 2 1 define ALWAYS SIGN 0x01 Bit value that can be passed in 1ags to dtostre 22 10 2 2 define DTOSTR PLUS SIGN 0x02 Bit value that can be passed in 1ags to dtostre 22 10 2 3 define DTOSTR_UPPERCASE 0x04 Bit value that can be passed in 1ags to dtostre 22 10 2 4 define RAND MAX 0x7FFF Highest number that can be generated by rand 22 10 2 5 define RANDOM MAX 0x7FFFFFFF Highest number that can be generated by random 22 10 3 Typedef Documentation 22 10 3 1 typedef int compar fn t const void const void Comparision function type for qsort just for convenience 22 10 4 Function Documentation 22 10 4 1 void abort void The abort function causes abnormal program termination to occur This realization disables interrupts and jumps to exit function with argument equal to 1 In the limited AVR environment execution is effectively halted by entering an infinite loop 22 10 4 2 int abs int 1 The abs function computes the absolute value of the integer i Note The abs and labs functions are builtins of gcc Generated on Fri Mar
287. eded Note that the first packet after the SLA W selection is always considered to be the EEPROM address for the next operation This packet is exactly the same as the one above sent before starting to read the device In case a master transmitter mode transfer is going to send more than one data packet all following packets will be considered data bytes to write at the indicated address The internal address pointer will be incremented after each write operation Note 16 24Cxx devices can become write protected by strapping their WC pin to logic high Leaving it unconnected is explicitly allowed and constitutes logic low level i e no write protection In case of a write protected device all data transfer attempts will be NACKed by the device Note that some devices might not implement this 23 Data Structure Documentation 23 1 div t Struct Reference 23 1 1 Detailed Description Result type for function div Data Fields int quot int rem 23 1 2 Field Documentation 23 1 2 1 intdiv t quot The Quotient Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 23 2 ldiv t Struct Reference 338 23 1 2 2 int div t rem The Remainder The documentation for this struct was generated from the following file stdlib h 23 2 t Struct Reference 23 2 1 Detailed Description Result type for function Idiv Data Fields long quot long rem 23 2 2 Field Documentation 23 2 2 1
288. eference os cos ee eao 22 22 22 S 346 241 1 Detailed Description s e ecs pisoar eR Rs 346 24 8 delay File Reference 2 2 222 2 2 347 248 1 Detailed Descripnom 222 22 RR RR RR RR 347 24 9 delay basic h File Reference 347 249 1 Detailed Description lt lt lt a 22mm m 347 24 10ermo b File Reference 22 2 222 222 2 5 5 347 Detailed Description uou oou Rey Res 347 24 1 lidevapenie Pile Reference 2221243493939 348 24 111 Detaled Description lt lt soros esca reaper a 348 24 1215 5 File Reference oone erreren edre ru yns 348 24 12 1 Detailed Description 2 2 2 2 22 2 348 24 131815 File Reference o sss s no km m SE Rn 348 24 13 1 Detailed Description sso RR RS 348 Pile Referent o os zo mmm Re 9 Rt mm enm 348 2 14 1 Detailed Description lt lt o ss but RR 348 24 15fuse h File Reference ooo ooo m m Rs 348 24 15 1 Detailed Description lt a a ka 348 24 J Gintertupth Pile Reference lt oso m om or Rx XR REO 348 24 16 1 Detailed Description 348 24 17inttypes Pile Reference o coo spoe eea aoao 349 2417 1 Detailed Description 2 2225 9 3 nits 349 Pile Reference usn Ba os 9 RO Sees 352 24 18 1 Detailed Description 2 222 22 2 2 352 24 9lock h File Referenc m RR yes 352 24 193 Detailed Description 222222222 2 mx 5 352 Generated on
289. em that way the smallest possible AVR device that offers hardware TWI support is the ATmega8 which comes with 512 bytes of EEPROM which is equivalent to an 24C04 device The ATmegal28 already comes with twice as much EEPROM as the 24C16 would offer One exception might be to use an externally connected EEPROM device that is removable e g SDRAM PC memory comes with an integrated TWI EEPROM that carries the RAM configuration information 22 39 3 The Source Code The source code is installed under prefix share doc avr libc examples twitest twitest c where prefix isa configuration option For Unix systems it is usually set to either Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 39 Example using the two wire interface TWI 334 usror usr local Note 1 The header file lt util twi h gt contains some macro definitions for symbolic con stants used in the TWI status register These definitions match the names used in the Atmel datasheet except that all names have been prefixed with TW Note 2 The clock is used in timer calculations done by the compiler for the UART baud rate and the TWI clock rate Note 3 The address assigned for the 24 EEPROM consists of 1010 in the upper four bits The following three bits are normally available as slave sub addresses allowing to operate more than one device of the same type on a single bus where the actual sub address used for each device is
290. ematics 146 lt setjmp h gt Non local goto 153 lt stdint h gt Standard Integer Types 155 lt stdio h gt Standard IO facilities 167 lt stdlib h gt General utilities 186 lt string h gt Strings 197 lt avr boot h gt Bootloader Support Utilities 209 lt avr eeprom h gt EEPROM handling 216 lt avr fuse h gt Fuse Support 219 lt avr interrupt h gt Interrupts 222 lt avr io h gt AVR device specific IO definitions 245 lt avr lock h gt Lockbit Support 246 lt avr pgmspace h gt Program Space Utilities 249 lt avr power h gt Power Reduction Management 262 lt avr sfr_defs h gt Special function registers 267 Additional notes from lt avr sfr_defs h gt 265 lt avr sleep h gt Power Management and Sleep Modes 269 lt avr version h gt avr libc version macros 271 lt avr wdt h gt Watchdog timer handling 272 lt util atomic h gt Atomically and Non Atomically Executed Code Blocks 276 util crc16 h CRC Computations 280 lt util delay h gt Convenience functions for busy wait delay loops 283 lt util delay_basic h gt Basic busy wait delay loops 284 lt util parity h gt Parity bit generation 285 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 20 Data Structure Index 125 lt util setbaud h gt Helper macros for baud rate calculations 286 util twi h gt TWI bit mask definitions 288 lt compat deprecated h gt Deprecated items 293 lt compat ina90 h gt Compatibility with IAR EWB 3 x 296
291. en INDEX 392 isupper 131 isxdigit 132 toascii 132 tolower 132 toupper 132 ctype h 345 delay h 346 delay basic h 346 Demo projects 295 deprecated items cbi 293 enable external int 293 inb 293 inp 293 INTERRUPT 294 outb 294 outp 294 sbi 294 timer enable int 295 disassembling 305 div avr stdlib 189 div t 336 quot 336 rem 336 DTOSTR ALWAYS SIGN avr stdlib 187 DTOSTR PLUS SIGN avr stdlib 187 DTOSTR UPPERCASE avr stdlib 187 dtostre avr stdlib 189 dtostrf avr stdlib 189 EDOM avr errno 133 EEMEM avr eeprom 216 eeprom busy wait avr eeprom 216 eeprom is ready avr eeprom 216 eeprom read block avr eeprom 217 eeprom read byte avr eeprom 217 eeprom read dword avr eeprom 217 eeprom read word avr eeprom 217 eeprom write block avr eeprom 217 eeprom write byte avr eeprom 217 eeprom write dword avr eeprom 217 eeprom write word avr eeprom 217 EMPTY INTERRUPT avr interrupts 241 enable external int deprecated items 293 EOF avr stdio 171 ERANGE avr errno 133 errno h 346 Example using the two wire interface TWD 331 exit avr stdlib 189 exp avr math 148 fabs avr math 148 FAQ 58 fclose avr stdio 174 fdev close avr stdio 171 fdev get udata avr stdio 172 fdev set udata avr stdio 172 FDEV SETUP STREAM avr stdio 172 fdev setup stream avr stdio 172 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Do
292. en an output value is written to the same port If the compiler would have choosen the same register for input and out put then the output value would have been destroyed on the first assembler instruction Fortunately this example uses the amp constraint modifier to instruct the compiler not to select any register for the output value which is used for any of the input operands Back to swapping Here is the code to swap high and low byte of a 16 bit value asm volatile mov tmp reg A0 n t mov 0 0 Wine mov B0 __tmp_reg__ n t r value 0 value First you will notice the usage of register __tmp_reg__ which we listed among other special registers in the Assembler Code section You can use this register without saving its contents Completely new are those letters A and B in SAO and BO In fact they refer to two different 8 bit registers both containing a part of value Another example to swap bytes of a 32 bit value Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7 3 Input and Output Operands 43 asm volatile mov tmp_reg__ 0 mov 0 DO mov D0 _ tmp reg mov tmp reg BO mov BO CO mov CO _ tmp reg r value 0 value n t NnNET INNE TANNY MATINET Instead of listing the same operand as both input and output operand it can also be declared as a read write operand This must be applied to an output
293. en the side effects of enabling global interrupts at the block s completion are known and understood 22 25 2 3 define ATOMIC RESTORESTATE This is a possible parameter for ATOMIC BLOCK When used it will cause the ATOMIC BLOCK to restore the previous state of the SREG register saved before the Global Interrupt Status flag bit was disabled The net effect of this is to make the ATOMIC BLOCK s contents guaranteed atomic without changing the state of the Global Interrupt Status flag when execution of the block completes 22 25 2 4 define NONATOMIC BLOCK type Creates a block of code that is executed non atomically Upon entering the block the Global Interrupt Status flag in SREG is enabled and disabled upon exiting the block from any exit path This is useful when nested inside ATOMIC BLOCK sections al lowing for non atomic execution of small blocks of code while maintaining the atomic access of the other sections of the parent ATOMIC BLOCK Two possible macro parameters are permitted NONATOMIC RESTORESTATE and FORCEOFF 22 25 2 5 define NONATOMIC FORCEOFF This is a possible parameter for NONATOMIC BLOCK When used it will cause the NONATOMIC BLOCK to force the state of the SREG register on exit disabling the Global Interrupt Status flag bit This saves on flash space as the previous value of the SREG register does not need to be saved at the start of the block Care should be taken that NONATOMIC FORCEOFF is on
294. ence 356 24 34 pgmspace h File Reference 24 34 1 Detailed Description Defines define PGMSPACE H 1 define need size t Zdefine _ATTR_PROGMEM attribute progmem define _ ATTR_PURE attribute__ __pure__ define PROGMEM __ATTR_PROGMEM__ define PSTR s const PROGMEM char x s define _ LPM_classic__ addr define _ LPM_enhanced_ addr define _ LPM_word_classic__ addr define _ LPM word enhanced addr define LPM dword classic addr define _ dword enhanced define LPM float classic addr define LPM float enhanced addr define LPM addr LPM classic addr define _ LPM_word addr word classic addr define _ LPM_dword addr _ LPM dword classic define LPM float addr float classic addr define read byte near address short LPM uint16 t address short define read word near address short LPM word uint16 t address_short define pgm_read_dword_near address_short LPM dword uint16 t address_short define pgm_read_float_near address_short LPM float uintl6 t address short define ELPM classic addr define _ ELPM enhanced addr define _ ELPM xmega addr define _ ELPM word classic addr define _ ELPM word enhanced addr define word xmega addr define _ ELPM dword classic addr define ELPM dword enhanced define _ ELPM_dword_x
295. eople Without these individuals efforts we wouldn t have a terrific free set of tools to develop AVR projects We all owe thanks to The GCC Team which produced a very capable set of development tools for an amazing number of platforms and processors e Denis Chertykov denisc overta ru for making the AVR specific changes to the GNU tools Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 17 Todo List 122 17 Denis Chertykov and Marek Michalkiewicz marekm linux org pl for developing the standard libraries and startup code for AVR GCC Uros Platise for developing the AVR programmer tool uisp Joerg Wunsch joerg FreeBSD ORG for adding all the AVR development tools to the FreeBSD http www freebsd org ports tree and for pro viding the basics for the demo project Brian Dean bsd amp bsdhome com for developing avrdude an alternative to uisp and for contributing documentation which describes how to use it Avr dude was previously called avrprog Eric Weddington eweddington cso atmel com for maintaining the WinAVR package and thus making the continued improvements to the open source AVR toolchain available to many users Rich Neswold for writing the original avr tools document which he graciously allowed to be merged into this document and his improvements to the demo project Theodore A Roth for having been a long time maintainer of many of the tools AVR Libc the AVR po
296. er classification routines These functions perform character classification They return true or false status depending whether the character passed to the function falls into the function s classification i e isdigit returns true if its argument is any value 0 though 9 inclusive If the input is not an unsigned char value all of this function return false e intisalnum int c e intisalpha int c e intisascii int e intisblank int e intiscntrl int c e intisdigit int c e intisgraph int c e int islower int __c e int isprint int c e intispunct int c e intisspace int e intisupper int e intisxdigit int c Character convertion routines This realization permits all possible values of integer argument The toascii func tion clears all highest bits The tolower and toupper functions return an input argument as is if it is not an unsigned char value Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 8 delay h File Reference 347 e inttoascii int e inttolower int c e int toupper int c 24 8 delay h File Reference 24 8 1 Detailed Description Defines define UTIL DELAY 1 define F CPU 100000001 Functions e void delay ms double ms e void delay us double us 24 9 delay basic h File Reference 24 9 1 Detailed Description Defines define DELAY BASIC H 1 Functions e void delay loop 1 uint8 t count e void delay loo
297. er file lt stdlib h gt The srand function sets its argument seed as the seed for a new sequence of pseudo random numbers to be returned by rand These sequences are repeatable by calling srand with the same seed value If no seed value is provided the functions are automatically seeded with a value of 1 In compliance with the C standard these functions operate on int arguments Since the underlying algorithm already uses 32 bit calculations this causes a loss of preci sion See random for an alternate set of functions that retains full 32 bit precision 22 10 4 20 int rand unsigned long Variant of rand that stores the context in the user supplied variable located at ct x instead of a static library variable so the function becomes re entrant 22 10 4 21 long random void The random function computes a sequence of pseudo random integers in the range of Oto RANDOM MAX as defined by the header file lt stdlib h gt The srandom function sets its argument seed as the seed for a new sequence of pseudo random numbers to be returned by rand These sequences are repeatable by calling srandom with the same seed value If no seed value is provided the functions are automatically seeded with a value of 1 22 10 4 22 long random unsigned long _ Variant of random that stores the context in the user supplied variable located at ct x instead of a static library variable so the function
298. er handling 273 sequence automatically before changing any value Interrupts will be disabled during the manipulation Note Depending on the fuse configuration of the particular device further restrictions might apply in particular it might be disallowed to turn off the watchdog timer Note that for newer devices ATmega88 and newer effectively any AVR that has the op tion to also generate interrupts the watchdog timer remains active even after a system reset except a power on condition using the fastest prescaler value approximately 15 ms It is therefore required to turn off the watchdog early during program startup the datasheet recommends a sequence like the following include lt stdint h gt include avr wdt h uint8_t mcusr_mirror __attribute__ section noinit void get_mcusr void attribute naked attribute section init3 void get mcusr void mcusr mirror MCUSR MCUSR 0 wdt disable Saving the value of MCUSR in mcusr mirror is only needed if the application later wants to examine the reset source but in particular clearing the watchdog reset flag before disabling the watchdog is required according to the datasheet Defines define wdt_reset volatile wdr define wdt_enable value define wdt_disable define WDTO 15MS 0 define WDTO_30MS 1 define WDTO_60MS 2 define WDTO_120MS 3 define WDTO_250MS 4 define WDTO 500MS 5 define W
299. er is needed since the flash ROM is the only way that the compiler can tell the target device the value this variable is going to be initialized to Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 9 Why do some 16 bit timer registers sometimes get trashed 65 Now if some programmer wants to make doubly sure their variables really get a 0 at program startup and adds an initializer just containing 0 on the right hand side they waste space While this waste of space applies to virtually any platform C is implemented on it s usually not noticeable on larger machines like PCs while the waste of flash ROM storage can be very painful on a small microcontroller like the AVR So in general variables should only be explicitly initialized if the initial value is non Zero Note Recent versions of GCC are now smart enough to detect this situation and revert variables that are explicitly initialized to 0 to the bss section Still other compilers might not do that optimization and as the C standard guarantees the initialization it is safe to rely on it Back to FAQ Index 11 9 Why do some 16 bit timer registers sometimes get trashed Some of the timer related 16 bit IO registers use a temporary register called TEMP in the Atmel datasheet to guarantee an atomic access to the register despite the fact that two separate 8 bit IO transfers are required to actually move the data Typically this includes access to th
300. erent sizes of data at the address given 5 4 Storing and Retrieving Strings in the Program Space Now that you can successfully store and retrieve simple data from Program Space you want to store and retrive strings from Program Space And specifically you want to store and array of strings to Program Space So you start off with your array like so char xstring table String i String 2 String 27 String 4 noting 5 and then you add your PROGMEM macro to end of the declaration char xstring table PROGMEM String 17 String 2 String 3 String 4 String 5 Right WRONG Unfortunately with GCC attributes they affect only the declaration that they are at tached to So in this case we successfully put the string table variable the array itself in the Program Space This DOES NOT put the actual strings themselves into Program Space At this point the strings are still in the Data Space which is probably not what you want In order to put the strings in Program Space you have to have explicit declarations for each string and put each string in Program Space char string 1 PROGMEM String 1 char string 2 PROGMEM String 2 char string 3 PROGMEM String 3 char string 4 PROGMEM String 4 char string 5 PROGMEM String 5 Then use the new symbols in your table like so Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 5 4 Stori
301. erface of the higher level char acter IO LCD driver 22 38 3 6 The implementation of the higher level LCD driver This driver builds on top of the HD44780 low level LCD controller driver and offers a character IO interface suitable for direct use by the standard IO facilities Where the low level HD44780 driver deals with setting up controller SRAM addresses writing data to the controller s SRAM and controlling display functions like clearing the display or mov ing the cursor this high level driver allows to just write a character to the LCD in the assumption this will somehow show up on the display Control characters can be handled at this level and used to perform specific actions on the LCD Currently there is only one control character that is being dealt with a newline character Xn is taken as an indication to clear the display and set the cursor into its initial position upon reception of the next character so a new line of text can be displayed Therefore a received newline character is remembered until more characters have been sent by the application and will only then cause the display to be cleared before continuing This provides a convenient abstraction where full lines of text can be sent to the driver and will remain visible at the LCD until the next line is to be displayed Further control characters could be implemented e g using a set of escape sequences That way it would be possible to implement
302. erform a software reset of AVR 83 11 321 am using floating point math Why is the compiled code so big Why deesmy codenot work 2 2 22222 5 84 11 33 What pitfalls exist when writing reentrant 4 2 84 11 34Why are some addresses of the EEPROM corrupted usually address Doro cc Gee ee G Bane See Uh ee 87 11 35 Why is my baud rate wrong 88 12 Building and Installing the GNU Tool Chain 88 12 1 Building and Installing under Linux FreeBSD and Others 89 122 Required Toal 209 pice Gees BARES 89 12 3 Upon Wools s non eee 90 12 4 GNU Binutils for the 90 12 5 OCC forthe AVR target oo co o m RR RR ERR n 92 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS lio AYR eee 92 1247 AVEDUDE 93 12 8 GDB for be AVR target uuum eor R orte v Res 93 125 RE RR A 94 2c 6okoncek ong e 9 s E Sh be x Rob 94 12 11Building and Installing under Windows 94 12 12Tools Required for Building the Toolchain for Windows 95 12 13Building the Toolchain for Windows 98 13 Using the GNU tools 104 13 1 Options for the 104 13 1 1 Machine specific options forthe
303. erstood by avr gcc The table matches them against the corresponding avr gcc architecture name and shows the preprocessor symbol declared by the mmcu option Architecture MCU name Macro avrl at90s1200 AVR_AT90S1200__ attinyll __AVR_ATtiny11__ attiny12 __AVR_ATtiny12__ avrl attiny15 AVR ATt nyl5 avrl attiny28 AVR 28 avr2 at90s2313 AVR 479052313 avr2 at90s2323 __AVR_AT90S2323__ avr2 at90s2333 AVR 479052233 avr2 at90s2343 AVR 479052343 avr2 attiny22 AVR 22 avr2 attiny26 __AVR_ATtiny26__ avr2 at90s4414 AVR 479054414 avr2 at90s4433 AVR 479054433 avr2 at90s4434 AVR 479054434 avr2 at90s8515 AVR 479058515 2 avr2 at90c8534 AVR 4790 8534 avr2 at90s8535 AVR 479058535 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 1 Options for the C compiler avr gcc 106 Architecture MCU name Macro avr2 avr25 1 at86rf401 AVR ATS6RF401 avr2 avr25 1 ata6289 AVR ATA6289 avr2 avr25 1 attiny13 __AVR_ATtiny13__ avr2 avr25 1 attiny13a AVR ATtiny13A avr2 avr25 1 attiny2313 __AVR_ATtiny2313__ avr2 avr25 1 attiny24 __AVR_ATtiny24__ avr2 avr25 1 attiny25 __AVR_ATtiny25__ avr2 avr25 1 attiny261 __AVR_ATtiny
304. escription loo m omo xXx eR Ros 380 24 9 PS File Relerence 22229 9 9 7x9 REX XS 380 2769 1 Detaled Description 22 222 22 gt 380 24 1UstrmompS Pile Referente us d ce ee 24 Ro ER DEES 380 24 70 1 Detailed Description 380 24 _ PS File Referente o os coii a 380 Detailed Description gt o cce ecc og Rey A Re 380 24 28pmepy o File Referenc 222222522552 x33 eS 380 24 12 1 Detailed Description lt lt sr cc esca RR ERAT 380 24 7380ncpy BS FileReferenc 4 0 cosc erer r E Rs 380 24 73 1 Detailed Description o 2 06 sos o 222 2 380 24 14strnlen S File Reference o oa coc cc ceremo m RR BR GR 380 24 741 Detailed Description soc RE RS 380 24 T5stnlen PS File Reference cac cos caca Rm mE S 380 2415 1 Detailed Description se 2 22906 RR RR 380 24 76strpbrk S File Reference os oom m dentes 380 24 76 1 Detailed Description 380 24 ITsupbik F S Pile Reference 2 2 2 2 o RR 380 24 77 1 Detailed Description lt lt EG 380 24 18stcheS File Kererence os cc A 380 278 1 Detailed Description lt lt sr a op o do o 380 24 TOstrchr PS File Reference osc cac x m xm mmm S 380 24 79 1 Detailed Description sos aa e oja a o 380 24 80strrev S File Reference ees ee RR es 380 24 60 1 Detailed Description st 255 ea eS 380 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 1 AVR
305. f This is the CRC used by PPP and IrDA See RFC1171 PPP protocol and IrDA IrLAP 1 1 Note Although the CCITT polynomial is the same as that used by the Xmodem protocol they are quite different The difference is in how the bits are shifted through the alorgithm Xmodem shifts the MSB of the CRC and the input first while CCITT shifts the LSB of the CRC and the input first The following is the equivalent functionality written in C Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 26 lt util crc16 h gt CRC Computations 282 uintl16 t crc ccitt update uintl16 t crc uint8 t data data 108 crc data data lt lt 4 return uint16 lt lt 8 hi8 crc uint8_t data gt gt 4 uint16 t data 3 22 26 2 3 static inline uint8 t crc ibutton update uint8 t __crc uint8 t data static Optimized Dallas now Maxim iButton 8 bit CRC calculation Polynomial x 8 x 5 x 4 1 0x8C Initial value 0 0 See http www maxim ic com appnotes cfm appnote number 27 The following is the equivalent functionality written in C uint8 t crc ibutton update uint8 t crc uint8 t data uint8 t i crc crc data for i 0 i lt 8 itt if cre amp 0x01 crc crc gt gt 1 0x8C else crc gt gt 1 return crc 22 26 2 4 static _ inline uint16_t crc xmodem update uintl6_t _ crc uint8 t data static Optimized CRC XMO
306. f interest to AVR users 1 Locate the archive library named libname a and use it to resolve currently unresolved symbols from it The library is searched along a path that con sists of builtin pathname entries that have been specified at compile time e g Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 3 Controlling the linker avr ld 114 usr local avr lib on Unix systems possibly extended by pathname entries as specified by L options that must precede the 1 options on the command line Lpath Additional location to look for archive libraries requested by 1 options e defsym symbol expr Define a global symbol symbol using expr as the value Print a linker map to stdout Map mapfile Print a linker map to mapfile cref Output a cross reference table to the map file in case is also present or to stdout e section start sectionname org Start section sectionname at absolute address org Tbss org e Tdata org e Ttext org Start the bss data or text section at org respectively e T scriptfile Use scriptfile as the linker script replacing the default linker script De fault linker scripts are stored in system specific location e g under usr local avr lib ldscripts on Unix systems and consist of the AVR architecture name avr2 through avr5 with the suffix x appended They describe how the various memory sections will be linked toget
307. f unsigned long long int uint64 t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h gt Standard Integer Types 156 Integer types capable of holding object pointers These allow you to declare variables of the same size as a pointer typedef int16 t intptr t e typedef uint16_t uintptr t Minimum width integer types Integer types having at least the specified width typedef int8 t int least8 t typedef uint8 t uint least8 t typedef int16 t int least16 t typedef uint16 tuint leastl6 t typedef int32 t int least32 t typedef uint32 t least32 t typedef int64 t int least64 t typedef uint64 t least64 t Fastest minimum width integer types Integer types being usually fastest having at least the specified width typedef int8 t int fast8 t typedef uint8 t uint fast8 t typedef int16 t int fast16 t typedef uint16 fastl6 t typedef int32 t int fast32 t typedef uint32 t fast32 t typedef int64 t int fast 4 t typedef uint64_t uint_fast64_t Greatest width integer types Types designating integer data capable of representing any value of any integer type in the corresponding signed or unsigned category typedef int64_t intmax_t typedef uint64_t uintmax t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h gt Standard Integer Types 157 Limits of specified width integer types C implementations should define these macros onl
308. file at the same place on the command line i e affer all the object files However since this re quires knowledge of where the build system will exactly find those library files this is deprecated for system libraries Back to FAQ Index 11 4 How to permanently bind a variable to a register This can be done with Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 5 How to modify MCUCR or WDTCR early 62 register unsigned char counter asm r3 Typically it should be safe to use r2 through r7 that way Registers r8 through r15 can be used for argument passing by the compiler in case many or long arguments are being passed to callees If this is not the case throughout the entire application these registers could be used for register variables as well Extreme care should be taken that the entire application is compiled with a consistent set of register allocated variables including possibly used library functions See C Names Used in Assembler Code for more details Back to FAQ Index 11 5 How to modify MCUCR or WDTCR early The method of early initialization MCUCR WDTCR or anything else is different and more flexible in the current version Basically write a small assembler file which looks like this begin xram S include lt avr io h gt section init1l ax progbits ldi r16 BV SRE BV SRW out SFR IO ADDR MCUCR r16 end xram S Assemble it link the result
309. fill normal address data define boot page erase address boot page erase normal address define boot page write address boot page write normal address define boot rww enable boot rww enable define boot lock bits set lock bits boot lock bits set lock bits define boot page fill safe address data define boot page erase safe address define boot page write safe address define boot rww enable safe define boot lock bits set safe lock bits Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 5 boot h File Reference 341 24 5 2 Define Documentation 24 5 2 1 define boot lock bits set lock bits Value LL extension uint8 t value uint8 t lock bits asm volatile Idi X30 Ane idi x31 mov r0 2 n t sts 0 1 n t spm n t i SFR MEM ADDR SPM REG r uint8 t BOOT LOCK BITS SET r value y r30 r31 24 5 2 2 define boot lock bits set alternate lock bits Value QL extension 4 uint8_t value uint8 t lock bits asm volatile Idi r30 lXnXc tidi r31 DAME mov r0 2 n t sts 0 1 n t spm n t word Oxffff n t nop nA t i _SFR_MEM_ADDR __SPM_REG r uint8 t BOOT LOCK BITS SET r value EO 30 TES 24 5 2 3 boot page erase alternate address Value extension N Pa Pep Generated on
310. first n characters of src are appended to dest Returns The strncat function returns a pointer to the resulting string dest 22 11 3 27 int strncmp const char 81 const char 52 size t len Compare two strings The strncmp function is similar to stremp except it only compares the first at most n characters of s1 and s2 Returns The strncmp function returns an integer less than equal to or greater than zero if s1 or the first n bytes thereof is found respectively to be less than to match or be greater than s2 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 206 22 11 3 28 char x strncpy char dest const char src size t len Copy a string The strncpy function is similar to strcpy except that not more than n bytes of src are copied Thus if there is no null byte among the first n bytes of src the result will not be null terminated In the case where the length of src 15 less than that of n the remainder of dest will be padded with nulls Returns The strncpy function returns a pointer to the destination string dest 22 11 3 29 size t strnlen const char src size t len Determine the length of a fixed size string The strnlen function returns the number of characters in the string pointed to by src not including the terminating 70 character but at most len In doing this strnlen looks only at the first len characters at
311. for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 191 The exit function terminates the application Since there is no environment to re turn to status is ignored and code execution will eventually reach an infinite loop thereby effectively halting all code processing Before entering the infinite loop inter rupts are globally disabled In a C context global destructors will be called before halting execution 22 10 4 12 void free void ptr The free function causes the allocated memory referenced by ptr to be made avail able for future allocations If pt is NULL no action occurs 22 10 4 13 charx itoa int val char x s int radix Convert an integer to a string The function itoa converts the integer value from val into an ASCII representation that will be stored under s The caller is responsible for providing sufficient storage in s Note The minimal size of the buffer s depends on the choice of radix For example if the radix is 2 binary you need to supply a buffer with a minimal length of 8 sizeof int 1 characters i e one character for each bit plus one for the string terminator Using a larger radix will require a smaller minimal buffer size Warning If the buffer is too small you risk a buffer overflow Conversion is done using the radix as base which may be a number between 2 binary conversion and up to 36 If radix is greater than 10 the next digit after 97
312. for avr libc by Doxygen 24 58 string h File Reference 378 char strpbrk const char s const char accept PURE char strrchr const char x int PURE char strrev char char strsep char const char size tstrspn const char 5 const char __accept ATTR PURE char strstr const char const char x ATTR PURE char strtok char const char char strtok_r char const char char char strupr char Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 58 string h File Reference 379 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 59 strlcat S File Reference 380 24 59 strlcat S File Reference 24 59 1 Detailed Description 24 60 strlcat P S File Reference 24 60 1 Detailed Description 24 61 strlcpy S File Reference 24 61 1 Detailed Description 24 62 strlcpy_P S File Reference 24 62 1 Detailed Description 24 63 strlen S File Reference 24 63 1 Detailed Description 24 64 strlen_P S File Reference 24 64 1 Detailed Description 24 65 strlwr S File Reference 24 65 1 Detailed Description 24 66 strncasecmp S File Reference 24 66 1 Detailed Description 24 67 strncasecmp PS File Reference 24 67 1 Detailed Description 24 68 strncat S File Reference 24 68 1 Detailed Description 24 69 strncat P S File Reference 24 69 1 Detailed Description 24 70 strncmp S File Reference Generated
313. for the C compiler avr gcc 107 Architecture MCU name Macro avr5 at90can64 AVR AT90CANOGA avr5 at90usb646 AVR AT90USB646 avr5 at90usb647 AVR AT90USB647 avr5 atmega16 AVR ATmegal6 avr5 atmegal61 __AVR_ATmegal61__ avr5 atmega162 AVR ATmegal62 avr5 atmega163 AVR ATmegal63 avr5 atmegal64p ATmegal64P avr5 atmega165 __AVR_ATmegal65__ avr5 atmega165p AVR ATmegal65P avr5 atmega 168 __AVR_ATmegal68__ avr5 atmega168p AVR ATmegal68P avr5 atmega169 AVR ATmegal69 avr5 atmegal60p AVR ATmegal69P avr5 atmegal6hva AVR ATmegal6HVA avr5 atmegal6m1 __AVR_ATmegal6M1__ avr5 atmega 1604 AVR ATmegal6U4 avr5 atmega32 AVR ATmega32 avr5 atmega323 AVR ATmega323 avr5 atmega324p AVR ATmega324P avr5 atmega325 AVR ATmega325 avr5 atmega325p AVR ATmega325P avr5 atmega3250 AVR ATmega3250 avr5 atmega3250p AVR ATmega3250P avr5 atmega328p AVR ATmega328P avr5 atmega329 AVR ATmega3290 avr5 atmega329p __AVR_ATmega329P__ avr5 atmega3290 AVR ATmega3290 avr5 atmega3290p AVR ATmega3290P avr5 atmega32c 1 AVR ATmega32Cl avr5 atmega32hvb AVR ATmega32HVB avr5 atmega32m 1 __AVR_ATmega32M1__ avr5 atmega32u4 AVR ATmega32U4 avr5 atmega32u6 AVR ATmega32U6 avr5 atmega406 ATmega406 avr5 atmega64 AVR ATmega64 avr5
314. fs h gt 265 Some of the newer AVRs contain a System Clock Prescale Register CLKPR that allows you to decrease the system clock frequency and the power consumption when the need for processing power is low Below are two macros and an enumerated type that can be used to interface to the Clock Prescale Register Note Not all AVR devices have a Clock Prescale Register On those devices without a Clock Prescale Register these macros are not available typedef enum lock div 1 lock div 2 lock div 4 m lock_div_8 lock_div_16 4 lock_div_32 5 lock_div_64 6 lock_div_128 7 clock_div_256 8 clock div t Il Clock prescaler setting enumerations clock prescale set x Set the clock prescaler register select bits selecting a system clock division setting They type of x is clock div t clock prescale get Gets and returns the clock prescaler register setting The return type is clock div t 22 20 Additional notes from lt avr sfr_defs h gt The avr sfr defs h file is included by all of the lt avr ioXxxx h gt files which use macros defined here to make the special function register definitions look like C variables or simple constants depending on the SFR ASM COMPAT define Some examples from lt avr iocanxx h gt to show how to define such macros fdefine PORTA SFR IO8 0x02 fdefine EEAR _SFR_IO16 0x21 fdefine UDRO SFR 0xC
315. function Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen FAQ Index 60 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 What registers are used by the compiler How do I put an array of strings completely in ROM How to use external RAM Which O flag to use How do I relocate code to a fixed address My UART is generating nonsense My ATmegal28 keeps crashing Port F is completely broken Why do all my foo bar strings eat up the SRAM Why does the compiler compile an 8 bit operation that uses bitwise operators into a 16 bit operation in assembly How to detect RAM memory and variable overlap problems Is it really impossible to program the ATtinyXX in C What is this clock skew detected message Why are many interrupt flags cleared by writing a logical 1 Why have programmed fuses the bit value 0 Which AVR specific assembler operators are available Why are interrupts re enabled in the middle of writing the stack pointer Why are there five different linker scripts How to add a raw binary image to linker output How do I perform a software reset of the AVR I am using floating point math Why is the compiled code so big Why does my code not work What pitfalls exist when writing reentrant code Why are some addresses of the EEPROM corrupted usually address zero Why is my baud rate wrong Generated on Fri M
316. g N r result N Wo addr32 N I SFR IO ADDR RAMPZ X result 24 34 2 10 define ELPM xmega addr Value extension N uint32 t X addr32 uint32 t addr uint8 t result N asm N N in tmp reg 2 n t out E SELA XRBMEM N movw r30 1 n t N elpm 0 Z n t N out 2 tmp reg N r result N 2 N I SFR IO ADDR RAMPZ NASO ESL result N Generated Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 34 pgmspace h File Reference 363 24 34 2 11 define LPM classic addr Value extension N uintl6 t _ addrl6 uintl6 t addr uint8 t _ result N asm N N lpm n t N mov 0 r0 n t N r result N z addrl6 N ro result N 24 34 2 12 define _LPM_dword_classic_ addr Value __extension__ A uintl6 t addrl6 uintl16 t addr N uint32 t _ result N asm N N lpm mov 0 ro Woe X adiw r30 1 lpm ARNEY mov B0 ro NET N adiw r30 1 TAMET N lpm n t mov CO ro N adiw r30 1 XXL X lpm MANE X mov D0 ro No pn N r result z __addrl16 1 __addr16 ro result N 24 34 2 13 define dword _ addr Value extension N uint
317. ga2561 ATmega324P ATmegal64P ATmega644P ATmega644 AT90USB162 9005 82 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 TIMO COMPA vect SIG OUTPUT Timer Counter Compare Match A ATtiny13 ATtiny43U ATtiny24 ATtiny44 ATtiny84 ATtiny45 ATtiny25 ATtiny85 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt avr interrupt h gt Interrupts 232 Vector name Old vector Description Applicable for device name TIMO_ SIG_ Timer Counter ATtiny13 ATtiny43U ATtiny24 ATtiny44 COMPB vect OUTPUT Compare Match ATtiny84 ATtiny45 ATtiny25 ATtiny85 COMPAREOB B TIMO OVF SIG Timer Counter0 ATtiny13 ATtiny43U ATtiny24 ATtiny44 vect OVERFLOWO Overflow ATtiny84 ATtiny45 ATtiny25 ATtiny85 TIMI SIG INPUT Timer Counter1 ATtiny24 ATtiny44 ATtiny84 CAPT_vect CAPTURE1 Capture Event TIM1_ SIG_ Timer Counter1 ATtiny24 ATtiny44 ATtiny84 ATtiny45 COMPA_vect OUTPUT_ Compare Match ATtiny25 ATtiny85 COMPAREIA A TIMI SIG Timer Counter1 ATtiny24 ATtiny44 ATtiny84 ATtiny45 COMPB_vect OUTPUT_ Compare Match ATtiny25 ATtiny85 COMPAREIB B OVF SIG Timer Counter1 ATtiny24 ATtiny44 ATtiny84 ATtiny45 vect OVERFLOWI Overflow ATtiny25 ATtiny85 TIMERO SIG INPUT ADC Conversion ATtiny261 ATtiny461 ATtiny861 CAPT vect CAPTUREO Complete TIMERO SIG TimerCoun
318. gal280 ATmegal28l RX vect USART3 Complete ATmega2560 ATmega2561 RECV USART3 SIG USART3 Tx ATmega640 ATmegal280 ATmegal28l TX vect USART3 Complete ATmega2560 ATmega2561 TRANS USART3 SIG USART3 Data ATmega640 ATmegal280 ATmegal28l UDRE vect USART3 register Empty ATmega2560 ATmega2561 DATA USART SIG USART Rx ATmegal6 ATmega32 ATmega323 AT vect USART Complete mega8 RECV SIG_ UART_RECV USART_RX_ SIG_ USART Rx AT90PWM3 AT90PWM2 AT90PWMI vect USART_ Complete ATmegal68P ATmega3250 ATmega3250P SIG ATmega328P ATmega3290 ATmega3290P UART RECV ATmega48P ATmega6450 ATmega6490 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 ATtiny2313 USART SIG USART Tx ATmegal6 ATmega32 ATmega323 AT TXC vect USART Complete mega8 TRANS SIG_UART_ TRANS Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt avr interrupt h gt Interrupts 241 Vector name Old vector Description Applicable for device name USART_TX_ SIG_ USART Tx AT90PWM3 AT90PWM2 AT90PWMI vect USART Complete ATmegal68P ATmega328P ATmega48P TRANS ATmega8535 ATmega88P ATmegal68 SIG_UART_ ATmega48 ATmega88 ATtiny2313 TRANS USART SIG USART Data AT90PWM3 AT90PWM2 AT90PWMI UDRE vect USART Register Empty ATmegal6 ATmegal68P ATmega32 AT DATA SIG mega323 ATmega3250 ATmega3250P AT UART DATA mega3
319. gen 22 6 lt math h gt Mathematics 149 22 6 3 7 double cos double x The cos function returns the cosine of __x measured in radians 22 6 3 8 double cosh double x The cosh function returns the hyperbolic cosine of x 22 6 3 9 double exp double x The exp function returns the exponential value of x 22 6 3 10 double fabs double x The fabs function computes the absolute value of a floating point number x 22 6 3 11 double double x double y The fdim function returns max __x __y 0 If __x or __y or both are NaN NaN is returned 22 6 3 12 double floor double x The floor function returns the largest integral value less than or equal to pressed as a floating point number X ex 22 6 3 13 double fma double x double y double 2 The fma function performs floating point multiply add This is the operation x __y __z but the intermediate result is not rounded to the destination type This sometimes improve the precision of a calculation 22 6 3 14 double fmax double x double The fmax function returns the greater of the two values __x and __y If an argument is NaN the other argument is returned If both arguments are NaN NaN is returned 22 6 3 15 double fmin double x double y The fmin function returns the lesser of the two values __x and y If an argument is NaN the other argument is returned If both arguments are NaN NaN is
320. ger types that could hold a far pointer i e a code pointer that can address more than 64 KB as well as standard names for all printf and scanf formatting options that are supported by the lt stdio h gt Standard IO facilities As the library does not support the full range of conversion specifiers from ISO 9899 1999 only those conversions that are actually implemented will be listed here The idea behind these conversion macros is that for each of the types defined by lt stdint h gt a macro will be supplied that portably allows formatting an object of that type in printf or scanf operations Example include lt inttypes h gt uint8_t smallval int32_t longval printf The hexadecimal value of smallval is PRIx8 the decimal value of longval is PRId32 n smallval longval Far pointers for memory access gt 64K typedef int32_t int_farptr_t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt inttypes h gt Integer Type conversions 135 typedef uint32 t farptr t macros for printf and scanf format specifiers For C these are only included if STDC LIMIT MACROS is defined before in cluding lt inttypes h gt define PRId8 d define PRIdLEASTS d define PRIdFASTS d define 1 define PRILEASTS i define PRUFASTS8 1 define PRId16 d define PRIGLEAST16 d define PRIGFAST16 d define PRIi16 i define PRILEASTI6
321. gets rebuilt In networked environments where the files are accessed from a file server this message can also happen if the file server s clock differs too much from the network client s clock In this case the solution is to use a proper time keeping protocol on both sys tems like NTP As a workaround synchronize the client s clock frequently with the server s clock Back to FAQ Index 11 25 Why are many interrupt flags cleared by writing a logical 1 Usually each interrupt has its own interrupt flag bit in some control register indicating the specified interrupt condition has been met by representing a logical 1 in the respec tive bit position When working with interrupt handlers this interrupt flag bit usually gets cleared automatically in the course of processing the interrupt sometimes by just Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 26 Why have programmed fuses the bit value 0 80 calling the handler at all sometimes e g for the U S ART by reading a particular hardware register that will normally happen anyway when processing the interrupt From the hardware s point of view an interrupt is asserted as long as the respective bit is set while global interrupts are enabled Thus it is essential to have the bit cleared before interrupts get re enabled again which usually happens when returning from an interrupt handler Only few subsystems require an explicit action to clear the in
322. gt Standard Integer Types 159 define UINT32_C value UL define INT64_C value _ CONCAT value LL define UINT64_C value _ CONCAT value ULL define INTMAX_C value _ CONCAT value LL define UINTMAX_C value _ CONCAT value ULL 22 8 2 Define Documentation 22 8 2 define INT16_C value value define a constant of type int16 t 22 8 2 2 ftdefine INTI6 MAX 0x7fff largest positive value an int16 t can hold 22 8 2 3 define INTI6 MIN 16 MAX 1 smallest negative value an int16 t can hold 22 8 2 4 define INT32_C value _CONCAT value L define a constant of type int32 t 22 8 2 5 define INT32 MAX Ox7fffffffL largest positive value an int32 t can hold 22 8 2 6 define INT32 MIN INT32 MAX IL smallest negative value an int32 t can hold 22 8 2 7 define INT64_C value CONCAT value LL define a constant of type int64_t 22 8 2 8 define INT64_MAX OXx 7fffffffffffffffLL largest positive value an int64_t can hold 22 8 2 9 define INT64 MIN INT64 MAX ILL smallest negative value an int64_t can hold Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h gt Standard Integer Types 160 22 8 2 10 define INT8_C value int8 t value define a constant of type int8 t 22 8 2 41 define INT8 MAX 0x7f largest positive value an int8 t can hold 22 8 2 12 define INT8 MIN INT8 MAX 1 smallest negative
323. h ROM 22 18 3 3 prog int32 t Type of an int32 t object located in flash ROM Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 255 22 18 3 4 prog int64 t Type of an int64 t object located in flash ROM Note This type is not available when the compiler option mint8 is in effect 22 18 3 5 prog int8 t Type of an int8 t object located in flash ROM 22 18 3 6 prog uchar Type of an unsigned char object located in flash ROM 22 18 3 7 prog uintl6 t Type of an uintl6 t object located in flash ROM 22 18 3 8 prog uint32 t Type of an uint32 t object located in flash ROM 22 18 3 9 prog uint64 t Type of an uint64 t object located in flash ROM Note This type is not available when the compiler option mint8 is in effect 22 18 3 10 prog uint8 t Type of an uint8 t object located in flash ROM 22 18 3 11 prog void Type of a void object located in flash ROM Does not make much sense by itself but can be used to declare a void object in flash ROM Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 256 22 18 4 Function Documentation 22 18 41 _ P memchr P PGM VOID P s int val size t len Scan flash memory for a character The memchr_P function scans the first len bytes of the flash memory area pointed to by s for the character val The first
324. har flags e char dtostrf double val signed char __ width unsigned char prec char s define DTOSTR ALWAYS SIGN 0x01 define DTOSTR PLUS SIGN 0x02 define 5 UPPERCASE 0x04 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 187 Defines define RAND MAX Ox7FFF Typedefs typedef int compar fn t const void const void Functions void abort void NORETURN int abs int __i long labs long i void bsearch const void key const void base size_t __nmemb size_t size int __compar const void const void div tdiv int num int __denom asm divmodhi4 tldiv long __num long __denom __asm__ __divmodsi4 void qsort void size_t __nmemb size t size compar fn t compar long strtol const char nptr char endptr int base unsigned long strtoul const char nptr char endptr int base long atol const char s PURE int atoi const char 5 PURE void exit int status ATTR NORETURN void malloc size t 5125 ATTR MALLOC void free void ptr void calloc size nele size t size MALLOC void realloc void size t size MALLOC double strtod const char nptr char endptr double const char nptr int rand void void srand unsign
325. hematics 148 22 6 2 3 define M SQRT2 1 4142135623730950488016887 The square root of 2 22 6 2 4 define builtin constant 22 6 3 Function Documentation 22 6 3 1 double acos double x The acos function computes the principal value of the arc cosine of x The returned value is in the range 0 pi radians domain error occurs for arguments not in the range 1 1 22 6 3 2 double asin double x The asin function computes the principal value of the arc sine of x The returned value is in the range pi 2 pi 2 radians A domain error occurs for arguments not in the range 1 1 22 6 3 3 double atan double x The atan function computes the principal value of the arc tangent of __x The returned value is in the range pi 2 pi 2 radians 22 6 3 4 double atan2 double y double x The atan2 function computes the principal value of the arc tangent of __y __x using the signs of both arguments to determine the quadrant of the return value The returned value is in the range pi radians 22 6 3 5 double ceil double x The ceil function returns the smallest integral value greater than or equal to x expressed as a floating point number 22 6 3 6 static double copysign double x double y static The copysign function returns x but with the sign of y They work even if xor __y are NaN or zero Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxy
326. her Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 3 Controlling the linker avr ld 115 13 3 2 Passing linker options from the C compiler By default all unknown non option arguments on the avr gcc command line i e all filename arguments that don t have a suffix that is handled by avr gcc are passed straight to the linker Thus all files ending in o object files and a object libraries are provided to the linker System libraries are usually not passed by their explicit filename but rather using the 1 option which uses an abbreviated form of the archive filename see above avr libc ships two system libraries 1ibc a and libm a While the standard library libc a will always be searched for unresolved references when the linker is started using the C compiler frontend i e there s always at least one implied 1c option the mathematics library 1ibm a needs to be explicitly requested using 1m See also the entry in the FAQ explaining this Conventionally Makefiles use the make macro LDLIBS to keep track of 1 and possibly L options that should only be appended to the C compiler command line when linking the final binary In contrast the macro LDFLAGS is used to store other command line options to the C compiler that should be passed as options during the linking stage The difference is that options are placed early on the command line while libraries are put at the end since they are t
327. hich by default restarts the application This could for example be the case for interrupts that are solely enabled for the purpose of getting the controller out of sleep_mode A handler for such an interrupt vector can be declared using the EMPTY INTERRUPT macro EMPTY_INTERRUPT ADC_vect Note There is no body to this macro Manually defined ISRs In some circumstances the compiler generated prologue and epilogue of the ISR might not be optimal for the job and a manually defined ISR could be considered particularly to speedup the interrupt handling One solution to this could be to implement the entire ISR as manual assembly code in a separate assembly file See Combining C and assembly source files for an example of how to implement it that way Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 45 lt avr interrupt h gt Interrupts 225 Another solution is to still implement the ISR in C language but take over the com piler s job of generating the prologue and epilogue This can be done using the ISR_ NAKED attribute to the ISRQ macro Note that the compiler does not generate any thing as prologue or epilogue so the final reti must be provided by the actual im plementation SREG must be manually saved if the ISR code modifies it and the compiler implied assumption of __zero_reg__ always being 0 could be wrong e g when interrupting right after of a MUL instruction ISR TIMER1_OV
328. ias is considerably smaller than the cost of maintaining full copies of each stream Yet providing an implementation that offers the complete set of standard streams was deemed to be useful Not only that writing printf instead of fprintf mystream saves typing work but since avr gcc needs to re sort to pass all arguments of variadic functions on the stack as opposed to passing them in registers for functions that take a fixed number of parameters the ability to pass one parameter less by implying st din will also save some execution time Defines define FILE struct file define stdin __iob 0 define stdout __iob 1 define stderr __iob 2 define EOF 1 define fdev_set_udata stream u do stream udata u while 0 define fdev_get_udata stream stream udata define fdev_setup_stream stream put get rwflag define FDEV SETUP READ SRD define FDEV SETUP WRITE SWR define FDEV SETUP RW SRD SWR define FDEV ERR 1 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 171 define FDEV 2 define FDEV SETUP 5 get rwflag define fdev_close define putc __c __ stream fputc __c __ stream define putchar __c fputc __c stdout define getc __stream fgetc __stream define getchar fgetc stdin Functions int fclose FILE stream int vfprintf FILE stream const cha
329. if you use this function This function will convert accented letters into random characters 22 3 2 15 int tolower int Converts the letter c to lower case if possible 22 3 2 16 int toupper int c Converts the letter c to upper case if possible 22 4 lt errno h gt System Errors 22 4 1 Detailed Description include lt errno h gt Some functions in the library set the global variable errno when an error occurs The file lt errno h gt provides symbolic names for various error codes Warning The errno global variable is not safe to use in a threaded or multi task system A race condition can occur if a task is interrupted between the call which sets error and when the task examines errno If another task changes errno during this time the result will be incorrect for the interrupted task Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt gt Integer Type conversions 134 Defines define EDOM 33 define ERANGE 34 22 4 3 Define Documentation 22 4 2 1 ffdefine EDOM 33 Domain error 22 4 2 2 ftdefine ERANGE 34 Range error 22 5 lt inttypes h gt Integer Type conversions 22 5 1 Detailed Description include lt inttypes h gt This header file includes the exact width integer definitions from lt stdint h gt and extends them with additional facilities provided by the implementation Currently the extensions include two additional inte
330. ight configure log Make make all install 2 gt amp 1 tee Spackage make log SRecord Open source code package Configure and build at the top of the source code tree Set PATH in order MikTex executables gt usr local bin usr bin bin mingw bin c cygwin bin install directory gt bin Configure configure prefix installdir infodir installdir info mandir installdir man 2 gt amp 1 tee package configure log Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 13 Building the Toolchain for Windows 103 Make make all install 2 gt amp 1 tee Spackage make log Build the tools below in Cygwin AVaRICE Open source code package Configure and build in a directory outside of the source code tree Set PATH in order lt executables gt usr local bin usr bin bin install directory gt bin Set location of LibUSB headers and libraries export CPPFLAGS I startdir libusb win32 device bin 1ibusb version include export CFLAGS I startdir libusb win32 device bin 1ibusb version include export LDFLAGS static L startdir libusb win32 device bin 1ibusb version lib gc Configure Sarchivedir configure prefix installdir datadir installdir doc mandir installdir man infodir installdir info 2 amp 1 tee avarice configure log Make make
331. ike Dallas iButton test vector uint8 t serno 0x02 Oxlc Oxb8 0x01 0 0 0 Oxa2 int checkcrc void uint8 t crc 0 i for i 0 i lt sizeof serno sizeof serno 0 i crc cro ibutton update crc serno i return crc must be 0 Functions e static _ inline uintl6 t crc16 update uint16 t crc uint8 t _ data e static inline uintl6 t crc xmodem update uint16 t crc uint8 t data e static inline uintl t crc ccitt update uint16 t crc uint8 t data e static _ inline uint8 t crc ibutton update uint8 t crc uint8 t data Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 26 lt util crc16 h gt CRC Computations 281 22 26 2 Function Documentation 22 26 2 1 static inline uintl6 t crcl6 update uint16 t crc uint8 t data static Optimized CRC 16 calculation Polynomial x 16 x 15 x 2 1 0xa001 Initial value Oxffff This CRC is normally used in disk drive controllers The following is the equivalent functionality written in C uintl6 t crcl6 update uintl16 t crc uint8 t a int i crc for i 0 i lt 8 i if crc amp 1 crc crc gt gt 1 0xA001 crc cre gt gt 1 return crc 22 26 2 2 static inline uintl6 t crc ccitt update uint16 t crc uint8 t data static Optimized CRC CCITT calculation Polynomial x 16 x 12 x 5 1 0x8408 Initial value Oxfff
332. iler Functions that don t have line number information will be completely skipped by a single step command in gdb This includes functions linked from a standard library but by default also functions defined in an assembler source file since the g compiler switch does not apply to the assembler So in order to debug an assembler input file possibly one that has to be passed through the C preprocessor it s the assembler that needs to be told to include line number information into the output file Other debug information like data types and variable allocation cannot be generated since unlike a compiler the assembler basically doesn t know about this This is done using the GNU assembler option gstabs Example avr as mmcu atmegal28 gstabs o foo o foo s When the assembler is not called directly but through the C compiler frontend either implicitly by passing a source file ending in S or explicitly using x assembler with cpp the compiler frontend needs to be told to pass the gstabs option down to the assembler This is done using Wa gstabs Please take care to only pass this option when compiling an assembler input file Otherwise the assembler code that results from the C compilation stage will also get line number information which confuses the debugger Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 13 How do pass an IO port as a parameter to a function 68 Note You can also use W
333. in 4 bit interface mode all byte IO to from the controller needs to be handled as two nibble IOs The functions hd44780_outnibble and 44780 innibble implement this They do not belong to the public interface so they are declared static Building upon these the public functions hd44780 outbyte and 44780 inbyte transfer one byte to from the controller The function h d44780 wait ready waits for the controller to become ready by continuously polling the controller s status which is read by performing a byte read with the RS signal cleard and examining the BUSY flag within the status byte This function needs to be called before performing any controller IO Finally hd44780 init initializes the LCD controller into 4 bit mode based on the initialization sequence mandated by the datasheet As the BUSY flag cannot be examined yet at this point this is the only part of this code where timed delays are used While the controller can perform a power on reset when certain constraints on Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 38 Using the standard IO facilities 330 the power supply rise time are met always calling the software initialization routine at startup ensures the controller will be in a known state This function also puts the interface into 4 bit mode which would not be done automatically after a power on reset 22 38 3 5 This function declares the public int
334. in particular it must not initiate a stop condition in order to not corrupt the ongoing transfer from the active master In this example upon detecting a lost arbitration condition the entire transfer is going to be restarted This will cause a new start condition to be initiated which will normally be delayed until the currently active master has released the bus Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 39 Example using the two wire interface TWI 336 Note 10 Next the device slave is going to be reselected using a so called repeated start con dition which is meant to guarantee that the bus arbitration will remain at the current master using the same slave address SLA but this time with read intent R W bit set to 1 in order to request the device slave to start transfering data from the slave to the master in the next packet Note 11 If the EEPROM device is still busy writing one or more cells after a previous write request it will simply leave its bus interface drivers at high impedance and does not respond to a selection in any way at all The master selecting the device will see the high level at SDA after transfering the SLA R W packet as a NACK to its selection request Thus the select process is simply started over effectively causing a repeated start condition until the device will eventually respond This polling procedure is recommended in the 24Cxx datasheet in order to minimize th
335. ing stops at white space or at the maximum field width whichever occurs first c Matches a sequence of width count characters default 1 the next pointer must be a pointer to char and there must be enough room for all the characters no terminating NUL is added The usual skip of leading white space is suppressed To skip white space first use an explicit space in the format Matches a nonempty sequence of characters from the specified set of accepted characters the next pointer must be a pointer to char and there must be enough room for all the characters in the string plus a terminating NUL character The usual skip of leading white space is suppressed The string is to be made up of characters in or not in a particular set the set is defined by the characters between the open bracket character and a close bracket character The set excludes those characters if the first character after the open bracket is a circum flex To include a close bracket in the set make it the first character after the open bracket or the circumflex any other position will end the set The hyphen character is also special when placed between two other characters it adds all intervening characters to the set To include a hyphen make it the last character before the final close bracket For instance 0 9 means the set of every thing except close bracket zero through nine and hyphen The string ends with the appearance of a character
336. ing xram o with other files in your program and this piece of code will be inserted in initialization code which is run right after reset See the linker script for comments about the new initN sections which one to use etc The advantage of this method is that you can insert any initialization code you want just remember that this is very early startup no stack and no zero reg yet and no program memory space is wasted if this feature is not used There should be no need to modify linker scripts anymore except for some very spe cial cases It is best to leave stack at its default value end of internal SRAM faster and required on some devices like ATmegal61 because of errata and add W1l Tdata 0x801100 to start the data section above the stack For more information on using sections see Memory Sections There is also an ex ample for Using Sections in C Code Note that in C code any such function would preferably be placed into section init3 as the code in init2 ensures the internal register zero reg is already cleared Back to FAQ Index Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 6 What is all this BV stuff about 63 11 6 What is all this BV stuff about When performing low level output work which is a very central point in microcon troller programming it is quite common that a particular bit needs to be set or cleared in some IO register While the device doc
337. int fast8 t 22 5 2 27 define PRIOLEASTIG o octal printf format for least16 t 22 5 2 28 define PRIOLEAST32 lo octal printf format for uint_least32_t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt inttypes h gt Integer Type conversions 140 22 5 2 29 define PRIOLEASTS o octal printf format for least8 t 22 5 2 30 define PRIoPTR PRIo16 octal printf format for uintptr t 22 5 2 31 define PRIu16 u decimal printf format for uint16 t 22 5 2 32 define PRIu32 lu decimal printf format for uint32_t 22 5 2 33 define PRIu8 u decimal printf format for uint8 t 22 5 2 34 define PRIuFASTI6 decimal printf format for uint_fast16_t 22 5 2 35 define PRIUFAST32 lu decimal printf format for fast32 t 22 5 2 36 define PRIuFASTS decimal printf format for uint fast8 t 22 5 2 37 define PRIULEAST16 decimal printf format for uint_least16_t 22 5 2 38 define PRIULEAST32 lu decimal printf format for least32 t 22 5 2 39 define PRIULEASTS decimal printf format for least8 t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt gt Integer Type conversions 141 22 5 2 40 define PRIuPTR PRIu16 decimal printf format for uintptr_t 22 5 2 41 define PRIX16 X uppercase hexadecimal printf format for uint16_t 22 5 2 42 define PRIx16 x hexadecimal printf forma
338. int scanf const char fmt intscanf P const char fmt int vscanf const char fmt va_list int sscanf const char buf const char fmt int sscanf_P const char buf const char fmt int fflush FILE xstream Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 41 stdlib h File Reference 373 24 41 stdlib h File Reference 24 411 Detailed Description Data Structures struct div t struct ldiv t Non standard i e non ISO C functions define RANDOM MAX Ox7FFFFFFF char x itoa int val char __s int __ radix char long int val char __ 5 int radix char utoa unsigned int val char x__s int radix char ultoa unsigned long int __ val char __s int radix long random void void srandom unsigned long seed long random unsigned long __ctx Conversion functions for double arguments Note that these functions are not located in the default library 1ibc a but in the mathematical library 1ibm a So when linking the application the 1m option needs to be specified define 5 ALWAYS SIGN 0x01 define DTOSTR PLUS SIGN 0x02 define DTOSTR_UPPERCASE 0x04 e char dtostre double val char s unsigned char __ prec unsigned char flags e char dtostrf double val signed char __ width unsigned char prec char s Defines define STDLIB H 1
339. is Makefile can only be used as input for the GNU version of make PRG demo OBJ demo o TARGET at90s2313 fMCU TARGET at90s2333 TARGET at90s4414 MCU_TARGET at90s4433 MCU_TARGET at90s4434 MCU_TARGET at90s8515 MCU_TARGET at90s8535 MCU_TARGET atmegal28 MCU_TARGET atmegal280 MCU_TARGET atmegal281 MCU_TARGET atmegal284p MCU_TARGET atmegal6 MCU_TARGET atmegal63 MCU_TARGET atmegal64p MCU_TARGET atmegal65 MCU_TARGET atmegal65p MCU_TARGET atmegal68 MCU_TARGET atmegal69 MCU_TARGET atmegal69p MCU_TARGET atmega2560 MCU_TARGET atmega2561 MCU_TARGET atmega32 MCU_TARGET atmega324p MCU_TARGET atmega325 MCU_TARGET atmega3250 MCU_TARGET atmega329 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 Asimple project 315 TARGET atmega3290 TARGET atmega48 TARGET atmega64 TARGET atmega640 fMCU TARGET atmega644 TARGET atmega644p TARGET atmega645 TARGET atmega6450 TARGET atmega649 TARGET atmega6490 MCU TARGET atmega8 TARGET atmega8515 TARGET atmega8535 TARGET atmega88 TARGET attiny2313 MCU_TARGET attiny24 MCU_TARGET attiny25 MCU_TARGET attiny26 MCU_TARGET attiny26 MCU_TARGET attiny44 MCU_TARGET attiny45 MCU_TARGET attiny46 MCU_TARGET attiny84 M
340. ise a zero base is taken as 10 decimal unless the next character is 0 in which case it is taken as 8 octal The remainder of the string is converted to an unsigned long value in the obvious manner stopping at the first character which is not a valid digit in the given base In bases above 10 the letter A in either upper or lower case represents 10 B represents 11 and so forth with 2 representing 35 If endptr is not NULL strtoul stores the address of the first invalid character in endptr If there were no digits at all however strtoul stores the original value of nptr in endptr Thus if npt r is not NO but xxendptr is 0 on return the entire string was valid The strtoul function return either the result of the conversion or if there was a lead ing minus sign the negation of the result of the conversion unless the original non negated value would overflow in the latter case strtoul returns ULONG MAX and errno is set to ERANGE If no conversion could be performed 0 is returned Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 196 22 10 4 29 char ultoa unsigned long int val char s int radix Convert an unsigned long integer to a string The function ultoa converts the unsigned long integer value from val into an ASCII representation that will be stored under s The caller is responsible for providing suf
341. it near address Note The address is a byte address The address is in the program space 22 18 2 11 define pgm read word address short pgm read word near address short Read a word from the program space with a 16 bit near address Note The address is a byte address The address is in the program space Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 254 22 18 2 12 define read word far address long ELPM word uint32 t address long Read a word from the program space with a 32 bit far address Note The address is a byte address The address is in the program space 22 18 2 13 define pgm read word near address short LPM word uint16 t address short Read a word from the program space with a 16 bit near address Note The address is a byte address The address is in the program space 22 18 2 14 define VOID P const prog void Used to declare a generic pointer to an object in program space 22 18 2 15 ffdefine PROGMEM PROGMEM Attribute to use in order to declare an object being located in flash ROM 22 18 2 16 define PSTR s const PROGMEM char s Used to declare a static pointer to a string in program space 22 18 3 Typedef Documentation 22 18 3 1 prog char Type of a char object located in flash ROM 22 18 3 2 prog intl6 t Type of an int16 t object located in flas
342. k definitions 288 22 30 2 Define Documentation 22 30 2 1 BAUD TOL 2 Input and output macro for lt util setbaud h gt Define the acceptable baud rate tolerance in percent If not set on entry it will be set to its default value of 2 22 30 2 2 define VALUE Output macro from lt util setbaud h gt Contains the calculated baud rate prescaler value for the UBRR register 22 30 2 3 define UBRRH VALUE Output macro from lt util setbaud h gt Contains the upper byte of the calculated prescaler value UBRR VALUE 22 30 2 4 define UBRRL VALUE Output macro from lt util setbaud h gt Contains the lower byte of the calculated prescaler value UBRR VALUE 22 30 2 5 define USE 2X 0 Output bacro from lt util setbaud h gt Contains the value 1 if the desired baud rate tolerance could only be achieved by setting the U2X bit in the UART configuration Contains 0 otherwise 2231 lt util twi h gt TWI bit mask definitions 22 31 1 Detailed Description include lt util twi h gt This header file contains bit mask definitions for use with the AVR TWI interface TWSR values Mnemonics TW MT xxx master transmitter Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 31 lt util twi h gt TWI bit mask definitions 289 TW MR xxx master receiver TW ST xxx slave transmitter TW SR xxx slave receiver fdefine TW START 0x08 define TW START 0x10 define TW MT
343. l setbaud 287 UBRRH VALUE util setbaud 287 UBRRL VALUE util setbaud 287 UINTI16 C avr stdint 161 UINT16 MAX avr stdint 161 uint16 t avr stdint 164 UINT32 C avr stdint 161 UINT32 MAX avr stdint 161 uint32 t avr stdint 164 UINT64 C avr stdint 161 UINT64 MAX avr stdint 162 uint64 t avr stdint 165 UINT8 C avr stdint 162 UINT8 MAX avr stdint 162 uint8 t avr stdint 165 uint farptr t avr inttypes 145 UINT FASTI6 MAX avr stdint 162 uint fastl6 t avr stdint 165 UINT FAST32 MAX avr stdint 162 uint fast32 t avr stdint 165 UINT FAST64 MAX avr stdint 162 uint fast64 t avr stdint 165 UINT FAST8 MAX avr stdint 162 uint fast8 t avr stdint 165 UINT LEASTI6 avr stdint 162 uint least16 t avr stdint 165 UINT LEAST32 MAX avr stdint 162 uint least32 t avr stdint 165 UINT LEAST64 MAX avr stdint 162 uint least64 t avr stdint 165 UINT LEAST8 MAX avr stdint 162 uint least8 t avr stdint 166 UINTMAX C avr stdint 163 UINTMAX MAX avr stdint 163 uintmax t avr stdint 166 UINTPTR MAX Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 404 avr stdint 163 uintptr t avr stdint 166 ultoa avr stdlib 194 ungetc avr stdio 178 USE 2X util setbaud 287 Using the standard IO facilities 324 util atomic ATOMIC BLOCK 277 ATOMIC FORCEON 277 ATOMIC RESTORESTATE 278 NONATOMIC BLOCK 278 NONATOMIC FORCEOFF 278 N
344. l6 t addrl16 uintl16 t addr se Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 34 pgmspace h File Reference 364 uint32 t result asm lpm SAO Z n t lpm BO 2 lpm CO 2 ADNET lpm DO Z r result z addr16 1 addrl6 result 24 34 2 14 define addr Value LL extension 4 uintl6 t _ addrl6 uintl6 t addr uint8 t _ result asm ipm 0 Z n t r result z addrl16 result Mot tu uw wn 24 34 2 15 define LPM float classic Value QL extension 4 uintl16 t addril6 uintl16 t addr float _ result asm lpm n t mov A0 ro n t adiw r30 1 Wa lpm n t mov B0 ro ADATT r30 1 n t 1pm inje mov CO ro adiw r30 1 n t lpm n t mov D0 ro VNDE r result z __addrl6 1 addr16 ro WO OBO Lun OPO A LE Pa Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 34 pgmspace h File Reference 365 result N 24 34 2 16 define _LPM_float_enhanced__ addr Value __extension__ uintl6 t _ addrl6 uintl6 t addr S float result N asm N X lpm SAO Z NnXE X lpm BO Z lpm 0 Z N lpm DO Z N r result z addrl16 i addrl6
345. lable in previous versions of this library but have eventually been deprecated over time finclude compat deprecated h These items are supplied within that header file for backward compatibility reasons only so old source code that has been written for previous library versions could easily be maintained until its end of life Use of any of these items in new code is strongly discouraged Allowing specific system wide interrupts In addition to globally enabling interrupts each device s particular interrupt needs to be enabled separately if interrupts for this device are desired While some devices maintain their interrupt enable bit inside the device s register set external and timer interrupts have system wide configuration registers Example Enable timer 1 overflow interrupts timer enable int BV TOIE1 Do some work Disable all timer interrupts timer enable int 0 Note Be careful when you use these functions If you already have a different interrupt enabled you could inadvertantly disable it by enabling another intterupt e static inline void timer enable int unsigned char ints define enable external int mask EICR mask define INTERRUPT signame define _ INTR ATTRS used Obsolete IO macros Back in a time when AVR GCC and avr libc could not handle IO port access in the di rect assignment form as they are handled now all IO port access had to be done through Genera
346. le Referen uos B E RR AER E 24 33 1 Detailed Description 2 22 22222 24 Mpemspaceh File Belerenee 2222 22 ceo RR 24 341 Detailed Description 24 34 2 Define Documentation Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen CONTENTS xiii 24 35 powerh Pile Reference 2 2 gt 366 2433 1 Detailed Description 225 2555565 eR 366 24 35 2 Deine Documentation css Rv RR 366 24 30setbaud h Fil Referente 2 22 2 2 2 22 367 24 36 1 Detailed Description 367 24 57 setjmp h File Reference sz o xen 367 2451 1 Detailed Description los XXE X ER Rcs 367 24 38sleep h Pile Referente o os ce coe ooo m RES 367 2738 1 Detaled D scrptlDI 2 2 367 24 39 stdmi h File Reference ous o o pedu ER 368 24 39 1 Detailed Description 368 24 40stdio h File Reference lt so oca s ngo eR RR REGE 371 2440 1 Detailed Description 371 2441gdhb h File Referenc uos 22 22 25522550506 Bee eS 373 2441 1 Detaled Description 45 373 24 42strcasecmip s File Referenc 2 376 244211 Detailed Description 376 24 43strcasecmp PS File Reference 376 2443 1 Detailed Description soc RR Rs 376 24 44strcasesir o File Reference 376 24 44 1 Detail
347. level source Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 3 Controlling the linker avr ld 113 1 include assembly e m include macro expansions n omit forms processing s include symbols file set the name of the listing file The various sub options be combined into a single a option list file must be the last one in that case 13 2 2 Examples for assembler options passed through the C compiler Remember that assembler options can be passed from the C compiler frontend using see above so in order to include the C source code into the assembler listing in file foo 1st when compiling foo c the following compiler command line can be used 5 avr gcc c 0 foo c o foo o Wa ahls foo lst In order to pass an assembler file through the C preprocessor first and have the assem bler generate line number debugging information for it the following command can be used avr gcc c x assembler with cpp o foo o foo S Wa gstabs Note that on Unix systems that have case distinguishing file systems specifying a file name with the suffix S upper case letter S will make the compiler automatically assume x assembler with cpp while using s would pass the file directly to the assembler no preprocessing done 13 3 Controlling the linker avr ld 13 3 1 Selected linker options While there are no machine specific options for avr ld a number of the standard op tions might be o
348. lly be the same register so Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 A simple project 305 take care to not clobber it TCCRIB TIMER1_CLOCKSOURCE Run device dependent timer 1 setup hook if present if defined TIMER1_SETUP_HOOK TIMER1_SETUP_HOOK endif x Set PWM value to 0 OCR 0 Enable as output DDROC BV 0 1 Enable timer 1 overflow interrupt TIMSK BV TOIE1 sei int main void iornit yy loop forever the interrupts are doing the rest x for Note 7 sleep mode return 0 22 36 3 Compiling and Linking This first thing that needs to be done is compile the source When compiling the compiler needs to know the processor type so the mmcu option is specified The Os option will tell the compiler to optimize the code for efficient space usage at the possible expense of code execution speed The g is used to embed debug info The debug info is useful for disassemblies and doesn t end up in the hex files so I usually specify it Finally the tells the compiler to compile and stop don t link This demo is small enough that we could compile and link in one step However real world projects will have several modules and will typically need to break up the building of the project into several compiles and one link 5 avr gcc g Os mmcu atmega8 c demo c The com
349. lock bit is programmed 22 12 2 5 define boot page erase address boot page erase normal address Erase the flash page that contains address Note address is a byte address in flash not a word address Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 12 avr boot h Bootloader Support Utilities 213 22 12 2 6 define boot page erase safe address Value do boot spm busy wait eeprom busy wait boot page erase address N while 0 Same as boot page erase except it waits for eeprom and spm operations to complete before erasing the page 22 12 2 7 define boot page fill address data boot page fill normal address data Fill the bootloader temporary page buffer for flash address with data word Note The address is a byte address The data is a word The AVR writes data to the buffer a word at a time but addresses the buffer per byte So increment your address by 2 between calls and send 2 data bytes in a word format The LSB of the data is written to the lower address the MSB of the data is written to the higher address 22 12 2 8 boot page fill safe address data Value do boot spm busy wait X eeprom busy wait N boot page fill address data N while 0 Same as boot page fill except it waits for eeprom and spm operations to complete before filling the page 22 12 2 9 define boot_page_write address boot_page_write
350. long Idiv_t quot The Quotient 23 2 2 2 long Idiv_t rem The Remainder The documentation for this struct was generated from the following file stdlib h 24 File Documentation 24 1 assert h File Reference 24 1 1 Detailed Description Defines define assert expression Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 2 atoi S File Reference 339 24 2 atoi S File Reference 24 2 1 Detailed Description 24 3 24 3 1 24 4 24 4 1 atol S File Reference Detailed Description atomic h File Reference Detailed Description Defines 24 5 24 5 1 define UTIL ATOMIC H 1 fdefine ATOMIC BLOCK type define NONATOMIC_BLOCK type define ATOMIC_RESTORESTATE define ATOMIC_FORCEON define NONATOMIC_RESTORESTATE define NONATOMIC_FORCEOFF boot h File Reference Detailed Description Defines define AVR BOOT H 1 define BOOTLOADER SECTION attribute section bootloader define COMMON RWWSB define COMMON ASRE RWWSRE define BLB12 5 define BLB11 4 define BLB02 3 define BLB01 2 define boot_spm_interrupt_enable SPM REG uint8_t _BV SPMIE define interrupt disable SPM REG amp uint8_t _ BV SPMIE define boot is spm interrupt SPM REG amp uint8 t BV SPMIE define boot rww busy SPM REG amp uint8 t COMMON ASB define boot spm busy SPM REG amp uint8 t SPM ENABLE
351. ly used when it is known that interrupts are disabled before the block s execution or when the side effects of disabling global interrupts at the block s completion are known and understood 22 25 2 6 define NONATOMIC RESTORESTATE This is a possible parameter for NONATOMIC BLOCK When used it will cause the NONATOMIC BLOCK to restore the previous state of the SREG register saved before the Global Interrupt Status flag bit was enabled The net effect of this is to make the NONATOMIC BLOCK s contents guaranteed non atomic without changing the state of the Global Interrupt Status flag when execution of the block completes Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 26 lt util crc16 h gt CRC Computations 280 22 26 util crc16 h CRC Computations 22 26 1 Detailed Description include util crcl6 h This header file provides a optimized inline functions for calculating cyclic redundancy checks CRC using common polynomials References See the Dallas Semiconductor app note 27 for 8051 assembler example and general CRC optimization suggestions The table on the last page of the app note is the key to understanding these implementations Jack Crenshaw s Implementing CRCs article in the January 1992 isue of Embedded Systems Programming This may be difficult to find but it explains CRC s in very clear and concise terms Well worth the effort to obtain a copy A typical application would look l
352. ly zero no decimal point character appears If a decimal point appears at least one digit appears before it gG The double argument is converted in style or e or F or E for G conver sions The precision specifies the number of significant digits If the precision is missing 6 digits are given if the precision is zero it is treated as 1 Style e is used if the exponent from its conversion is less than 4 or greater than or equal to the precision Trailing zeros are removed from the fractional part of the result a decimal point appears only if it is followed by at least one digit S Similar to the s format except the pointer is expected to point to a program memory ROM string instead of a RAM string In no case does a non existent or small field width cause truncation of a numeric field if the result of a conversion is wider than the field width the field is expanded to contain the conversion result Since the full implementation of all the mentioned features becomes fairly large three different flavours of vfprintf can be selected using linker options The default vf printf implements all the mentioned functionality except floating point conversions A minimized version of vfprintf is available that only implements the very basic in teger and string conversion facilities but only the additional option can be specified Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt
353. macros from this header file so they are placed right after the interrupt vectors and in front of any executable code However it can become a problem if there are too many of these constants or for bootloaders on devices with more than 64 KB of ROM All these functions will not work in that situation Defines define PROGMEM __ATTR_PROGMEM__ define PSTR s const PROGMEM char x s define read byte near address short LPM uint16 t address short define read word near address short LPM word uint16 t address short define pgm read dword near address short LPM dword uint16 t address short define read float near address short LPM float uintl6 t address short define read byte far address long ELPM uint32 t address long define pgm read word far address long ELPM word uint32 t address long define pgm read dword far address long ELPM dword uint32 t address long define read float far address long ELPM float uint32 t address long define pgm_read_byte address_short pgm_read_byte_near address_short define pgm_read_word address_short pgm_read_word_near address_short define pgm_read_dword address_short pgm_read_dword_near address_short define pgm_read_float address_short pgm_read_float_near address_short define PGM P const prog char define PGM VOID P const prog void Typedefs typedef void PROGMEM
354. mal integer which will restrict the conversion to at most this many characters from the input stream This field width is limited to at most 255 characters which is also the default value except for the c conversion that defaults to 1 The following conversion flags are supported Matches a literal character This is not a conversion d Matches an optionally signed decimal integer the next pointer must be a pointer to int i Matches an optionally signed integer the next pointer must be a pointer to int The integer is read in base 16 if it begins with Ox or OX in base 8 if it begins with 0 and in base 10 otherwise Only characters that correspond to the base are used o Matches an octal integer the next pointer must be a pointer to unsigned int u Matches an optionally signed decimal integer the next pointer must be a pointer to unsigned int x Matches an optionally signed hexadecimal integer the next pointer must be a pointer to unsigned int f Matches an optionally signed floating point number the next pointer must be a pointer to float E Equivalent to f Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 184 s Matches a sequence of non white space characters the next pointer must be a pointer to char and the array must be large enough to accept all the sequence and the terminating NUL character The input str
355. manually add 0x800000 to the address you pass to the linker as the start of the section Oth erwise the linker thinks you want to put the noinit section into the text section instead of data bss and will complain Alternatively you can write your own linker script to automate this FIXME need an example or ref to dox for writing linker scripts 4 6 The initN Sections These sections are used to define the startup code from reset up through the start of main These all are subparts of the text section The purpose of these sections is to allow for more specific placement of code within your program Note Sometimes it is convenient to think of the initN and finiN sections as functions but in reality they are just symbolic names which tell the linker where to stick a chunk of code which is not a function Notice that the examples for asm and C can not be called as functions and should not be jumped into The initN sections are executed in order from 0 to 9 init0 Weakly bound to __init If user defines init it will be jumped into immedi ately after a reset init1 Unused User definable init2 In C programs weakly bound to initialize the stack and to clear __zero_reg__ r1 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 4 7 The finiN Sections 23 init3 Unused User definable init4 For devices with gt 64 KB of init4 defines the code which takes care
356. mb unless an input error occured or end of file was encountered feof and ferror must be used to distinguish between these two conditions 22 9 3 15 int fscanf FILE stream const char fmt The function f scanf performs formatted input reading the input data from st ream See vfscanf for details 22 9 3 16 int fscanf_P FILE x stream const char fmt Variant of fscanf using a fmt string in program memory 22 9 3 17 size_t fwrite const void x p r size t size size t nmemb FILE _ stream Write nmemb objects size bytes each to stream The first byte of the first object is referenced by pt r Returns the number of objects successfully written i e nmemb unless an output error occured Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 178 22 9 3 18 char gets char str Similar to fgets except that it will operate on stream stdin and the trailing newline if any will not be stored in the string It is the caller s responsibility to provide enough storage to hold the characters read 22 9 3 19 int printf const char fmt The function printf performs formatted output to stream stderr See vfprintf for details 22 9 3 20 int printf const char fmt Variant of printf that uses a fmt string that resides in program memory 22 9 3 21 int puts const char str Write the string pointed to b
357. me of the Standard C Library functions that are commonly used on a PC environment have limitations or additional issues that a user needs to be aware of when used on an embedded system AVR Libc also contains the most documentation about the whole AVR toolchain 2 6 Building Software Even though GCC Binutils and avr libc are the core projects that are used to build software for the AVR there is another piece of software that ties it all together Make GNU Make is a program that makes things and mainly software Make interprets and executes a Makefile that is written for a project A Makefile contains dependency rules showing which output files are dependent upon which input files and instructions on how to build output files from input files Some distributions of the toolchains and other AVR tools such as MFile contain a Makefile template written for the AVR toolchain and AVR applications that you can copy and modify for your application See the GNU Make User Manual for more information 27 AVRDUDE After creating your software you ll want to program your device You can do this by using the program AVRDUDE which can interface with various hardware devices to program your processor AVRDUDE is a very flexible package the information about AVR processors and various hardware programmers is stored in a text database This database can be modified by any user to add new hardware or to add an AVR processor if it is not alread
358. mega__ addr define _ ELPM_float_classic__ addr define _ ELPM_float_enhanced__ addr define _ ELPM_float_xmega__ addr Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 34 pgmspace h File Reference 357 define ELPM addr ELPM classic addr define ELPM word addr ELPM word classic addr define ELPM dword addr ELPM dword classic addr define _ ELPM float addr ELPM float classic define read byte far address long ELPM uint32 t address long define pgm_read_word_far address_long __ELPM_word uint32_ t address_long define pgm_read_dword_far address_long __ELPM_dword uint32_ t address_long define pgm_read_float_far address_long __ELPM_float uint32_t address_ long define pgm_read_byte address_short pgm_read_byte_near address_short define pgm_read_word address_short pgm_read_word_near address_short define pgm_read_dword address_short pgm_read_dword_near address_short define pgm_read_float address_short pgm_read_float_near address_short define PGM P const prog char define PGM VOID P const prog void Typedefs typedef void PROGMEM prog void typedef char PROGMEM prog char typedef unsigned char PROGMEM prog uchar typedef int8 t PROGMEM prog int8 t typedef uint8 t PROGMEM prog uint8 t typedef int16 t PROGMEM prog int16 t typedef uint16 t PROGMEM prog uintl6 t typedef int32 t PROGMEM pr
359. method to define variables in Program Memory that is common between the two compilers IAR and AVR GCC Create a header file that has these definitions fif defined IAR C Compiler define FLASH DECLARE x flash x endif fif defined GNUC GNU Compiler fdefine FLASH DECLARE x x _ attribute jprogmem endif This code snippet checks for the IAR compiler or for the GCC compiler and defines a macro FLASH_DECLARE x that will declare a variable in Program Memory using the appropriate method based on the compiler that is being used Then you would used it like so FLASH DECLARE int mydata 10 6 Non Returning main To declare main to be a non returning function in IAR it is done like this C task void main void code To do the equivalent in AVR do this void main void attribute noreturn void main void Note See the GCC User Manual for more information on Function Attributes In AVR GCC a prototype for main is required so you can declare the function at tribute to specify that the main function is of type noreturn Then define main as normal Note that the return type for main is now void 10 7 Locking Registers The IAR compiler allows a user to lock general registers from r15 and down by using compiler options and this keyword syntax Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 Fre
360. mizations In GCC a host system is the system processor OS that the compiler runs on A target system is the system that the compiler compiles code for And a build system is the system that the compiler is built from source code on If a compiler has the Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 2 4 GNU Binutils 11 same system for host and for target it is known as a native compiler If a compiler has different systems for host and target it is known as a cross compiler And if all three build host and target systems are different it is known as a Canadian cross compiler but we won t discuss that here When GCC is built to execute on a host system such as FreeBSD Linux or Windows and it is built to generate code for the AVR microcontroller target then it is a cross compiler and this version of GCC is commonly known as AVR GCC In documentation or discussion AVR GCC is used when referring to GCC targeting specifically the AVR or something that is AVR specific about GCC The term GCC is usually used to refer to something generic about GCC or about GCC as a whole GCC is different from most other compilers GCC focuses on translating a high level language to the target assembly only AVR GCC has three available compilers for the AVR C language C and Ada The compiler itself does not assemble or link the final code GCC is also known as a driver program in that it knows about and dri
361. mp 153 setjmp h 366 SIG ATOMIC MAX avr stdint 161 SIG ATOMIC MIN avr stdint 161 SIGNAL avr interrupts 244 signbit avr math 151 sin avr math 151 sinh avr math 151 SIZE MAX avr stdint 161 sleep h 366 sleep cpu avr sleep 269 sleep disable avr sleep 270 sleep enable avr sleep 270 snprintf avr stdio 177 snprintf P avr stdio 177 sprintf avr stdio 177 sprintf P avr stdio 178 sqrt avr math 151 square avr math 151 avr stdio 178 sscanf P avr stdio 178 stderr avr stdio 173 stdin avr stdio 173 stdint h 367 stdio h 370 stdlib h 372 stdout avr stdio 173 strcasecmp avr string 200 strcasecmp S 375 strcasecmp P avr pgmspace 256 strcasecmp_P S 375 Strcasestr avr string 200 strcasestr S 375 strcasestr P avr pgmspace 256 strcat avr string 201 strcat S 375 strcat P avr pgmspace 256 strcat_P S 375 strchr avr string 201 strchr S 375 strchr P avr pgmspace 256 strchr P S 375 strchrnul avr string 201 strchrnul S 375 strchrnul P avr pgmspace 257 strchrnul_P S 375 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 401 strcmp avr string 201 strcmp S 375 strcmp P avr pgmspace 257 strcmp PS 375 strcpy avr string 202 strcpy S 375 strcpy P avr pgmspace 257 strepy_P S 375 strcspn avr string 202 strcspn S 375 strcspn P avr pgmspace 257 strcspn P S 375 strdup avr string 202 strdup
362. mpiler 6 avr libc and assembler programs 6 1 Introduction There might be several reasons to write code for AVR microcontrollers using plain assembler source code Among them are Code for devices that do not have RAM and are thus not supported by the C compiler Code for very time critical applications Special tweaks that cannot be done in C Usually all but the first could probably be done easily using the inline assembler facility of the compiler Although avr libc is primarily targeted to support programming AVR microcontrollers using the C and C language there s limited support for direct assembler usage as well The benefits of it are Use of the C preprocessor and thus the ability to use the same symbolic constants that are available to C programs as well as a flexible macro concept that can use any valid C identifier as a macro whereas the assembler s macro concept is basically targeted to use a macro in place of an assembler instruction Use of the runtime framework like automatically assigning interrupt vectors For devices that have RAM initializing the RAM variables can also be utilized Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 6 2 Invoking the compiler 31 6 2 Invoking the compiler For the purpose described in this document the assembler and linker are usually not invoked manually but rather using the C compiler frontend avr gcc that in turn will call the assem
363. mspace 255 memmove avr_string 199 memmove S 354 memrchr avr_string 200 memrchr S 354 memrchr_P avr_pgmspace 255 memrchr_P S 354 memset avr string 200 memset S 354 modf avr math 150 NAN NONATOMIC RESTORESTATE util atomic 278 outb deprecated items 294 outp deprecated items 294 parity h 354 parity even bit util parity 285 PGM P avr pgmspace 250 pgm read byte avr pgmspace 250 pgm read byte far avr pgmspace 251 pgm read byte near avr pgmspace 251 pgm read dword avr pgmspace 251 pgm read dword far avr pgmspace 251 pgm read dword near avr pgmspace 251 pgm read float avr pgmspace 252 pgm read float far avr pgmspace 252 pgm read float near avr pgmspace 252 pgm read word avr pgmspace 252 pgm read word far avr pgmspace 252 pgm read word near avr pgmspace 253 PGM VOID P avr pgmspace 253 pgmspace h 355 ELPM classic 387 ELPM dword enhanced 357 dword xmega 358 ELPM enhanced 358 ELPM float enhanced 359 ELPM float xmega 359 avr math 147 NONATOMIC BLOCK util atomic 278 NONATOMIC FORCEOFF util atomic 278 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 397 ELPM word classic 360 ELPM word enhanced 360 ELPM word xmega 361 ELPM xmega 361 classic 361 LPM dword classic 362 LPM dword enhanced 362 LPM enhanced 363 LPM
364. n Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 167 22 8 3 25 typedef uint64 t uint least64 t unsigned int with at least 64 bits Note This type is not available when the compiler option mint8 is in effect 22 8 3 26 typedef uint8 t uint least8 t unsigned int with at least 8 bits 22 8 3 27 typedef uint64 t uintmax t largest unsigned int available 22 8 3 28 typedef uintl6 t uintptr t Unsigned pointer compatible type 22 9 lt stdio h gt Standard IO facilities 22 9 1 Detailed Description include lt stdio h gt Introduction to the Standard IO facilities This file declares the standard IO facili ties that are implemented in avr libc Due to the nature of the underlying hardware only a limited subset of standard IO is implemented There is no actual file implementa tion available so only device IO can be performed Since there s no operating system the application needs to provide enough details about their devices in order to make them usable by the standard IO facilities Due to space constraints some functionality has not been implemented at all like some of the printf conversions that have been left out Nevertheless potential users of this implementation should be warned the printf and scanf families of functions although usually associated with presumably simple things like the famous Hello world program are actually fairly complex which cause
365. n is not mint8 compatible although if you only care about testing for equality this function should be safe to use 22 11 37 void memcpy void dest const void src size t len Copy a memory area The memcpy function copies len bytes from memory area src to memory area dest The memory areas may not overlap Use memmove if the memory areas do overlap Returns The memcpy function returns a pointer to dest 22 11 3 8 void x memmem const void s7 size t len const void s2 size t len2 The memmem function finds the start of the first occurrence of the substring 52 of length 1en2 in the memory area s1 of length 1en1 Returns memmem function returns a pointer to the beginning of the substring or NULL if the substring is not found If 1en2 is zero the function returns s1 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 201 22 11 3 9 void x memmove void dest const void src size t len Copy memory area memmove function copies len bytes from memory area src to memory area dest The memory areas may overlap Returns The memmove function returns a pointer to dest 22 11 3 10 void x memrchr const void src int val size t len The memrchr function is like the memchr function except that it searches back wards from the end of the 1en bytes pointed to by src instead of forwards from the front Glibc GNU extension
366. n the ATmega16 that ships with the STK500 development kit The only external part needed is a potentiometer attached to the ADC It is connected to a 10 pin ribbon cable for port A both ends of the poten tiometer to pins 9 GND and 10 and the wiper to pin 1 port 0 A bypass capacitor from pin 1 to pin 9 like 47 nF is recommendable Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 37 A more sophisticated project 318 Figure 6 Setup of the STK500 The coloured patch cables are used to provide various interconnections As there are only four of them in the STK500 there are two options to connect them for this demo The second option for the yellow green cable is shown in parenthesis in the table Alternatively the squid cable from the ICE can be used if available Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 37 A more sophisticated project 319 Port Header Color Function Connect to DO 1 brown RxD RXD of the RS 232 header 2 grey TxD TXD of the RS 232 header D2 3 black button SWO pin 1 down switches header D3 4 red button up SWI 2 switches header D4 5 green button SW2 pin 3 ADC switches header D5 6 blue LED LEDO pin 1 LEDs header D6 7 green clock out LEDI pin 2 LEDs header D7 8 white 1 second LED 3 flash LEDs header GND 9 unused VCC 10 unu
367. ncation occurred 22 11 3 23 size t strlen const char src Calculate the length of a string The strlen function calculates the length of the string src not including the terminat ing 0 character Returns The strlen function returns the number of characters in src Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 205 22 11 3 24 char x strlwr char x s Convert a string to lower case The strlwr function will convert a string to lower case Only the upper case alphabetic characters A Z are converted Non alphabetic characters will not be changed Returns The strlwr function returns a pointer to the converted string 22 11 3 25 strncasecmp const char 57 const char 52 size t len Compare two strings ignoring case The strncasecmp function is similar to strcasecmp except it only compares the first len characters of 51 Returns The strncasecmp function returns an integer less than equal to or greater than Zero if s1 or the first 1en bytes thereof is found respectively to be less than to match or be greater than s2 A consequence of the ordering used by strncasecmp is that if 51 is an initial substring of 52 then 51 is considered to be less than 52 22 11 3 26 char x strncat char dest const char x src size t len Concatenate two strings The strncat function is similar to strcat except that only the
368. nction does not cause a prologue epilogue Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 91 A few of libc functions 53 Function Units 2 25 Avr4 atoi 12345 Flash bytes 82 82 78 78 74 74 Stack bytes 2 2 MCU clocks 155 149 atol 12345 Flash bytes 122 122 118 118 118 118 Stack bytes 2 2 MCU clocks 221 219 dtostre 1 2345 Flash bytes 1184 1072 1088 978 1088 978 5 6 0 Stack bytes 17 17 MCU clocks 1313 1152 dtostrf 1 2345 Flash bytes 1676 1564 1548 1438 1548 1438 15 6 s Stack bytes 36 36 MCU clocks 1608 1443 itoa 12345 s Flash bytes 150 150 134 134 134 134 10 Stack bytes 4 4 MCU clocks 1172 1152 12345L s Flash bytes 220 220 200 200 200 200 10 Stack bytes 9 9 MCU clocks 3174 3136 malloc 1 Flash bytes 554 554 506 506 506 506 Stack bytes 4 4 MCU clocks 196 178 realloc void Flash bytes 1152 1040 1042 932 1042 932 0 1 Stack bytes 20 20 MCU clocks 303 280 qsort s Flash bytes 1242 1130 990 880 1008 898 sizeof s 1 cmp Stack bytes 38 38 MCU clocks 20914 16678 sprintf min s Flash bytes 1216 1104 1090 980 1086 976 12345 Stack bytes 59 59 MCU clocks 1846 1711 sprintf s Flash bytes 1674 1562 1542 1432 1498 1388 12345 Stack bytes 58 58 MCU clocks 1610 1528 sprintf fit s Flash bytes 3334 3222 3
369. nd the vector table contents Also all the fix ups have been satisfied In other words the listing generated by this option reflects the actual code that the processor will run avr objdump h 5 demo elf gt demo lst Here s the output as saved in the demo 1st file demo elf file format elf32 avr Sections Idx Name Size VMA LMA File off Algn 0 text 00000110 00000000 00000000 00000074 2 1 CONTENTS ALLOC LOAD READONLY CODE 1 bss 00000003 00800060 00800060 00000184 2xx0 ALLOC 2 debug aranges 00000020 00000000 00000000 00000184 2xx0 CONTENTS READONLY DEBUGGING 3 debug pubnames 00000035 00000000 00000000 000001a4 2xx0 CONTENTS READONLY DEBUGGING 4 debug info 00000105 00000000 00000000 00000149 2xx0 CONTENTS READONLY DEBUGGING 5 debug abbrev 000000cf 00000000 00000000 000002de 2 0 CONTENTS READONLY DEBUGGING 6 debug line 0000014d 00000000 00000000 000003ad 2 0 CONTENTS READONLY DEBUGGING 7 debug frame 00000040 00000000 00000000 000004fc 2xx2 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 A simple project 307 8 debug str CONTE 00000 CONTE Disassembly of section 00000000 vectors 02 12 22 81 4 80 G TE 8 7e a 7 7 10 1 122 79 14 78 16 77 18 76 la 75 1 74 1 73 20 72 225771 24 70 00000026 26 Tl 28 2 d4 2 00000032 2
370. nerated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 45 lt avr interrupt h gt Interrupts 243 22 15 2 3 define EMPTY_INTERRUPT vector include lt avr interrupt h gt Defines an empty interrupt handler function This will not generate any prolog or epilog code and will only return from the ISR Do not define a function body as this will define it for you Example EMPTY_INTERRUPT ADC_vect 22 15 2 4 define ISR vector attributes include avr interrupt h Introduces an interrupt handler function interrupt service routine that runs with global interrupts initially disabled by default with no attributes specified The attributes are optional and alter the behaviour and resultant generated code of the interrupt routine Multiple attributes may be used for a single function with a space seperating each attribute Valid attributes ISR BLOCK ISR_NOBLOCK ISR NAKED and ISR ALIASOF vect vector must be one of the interrupt vector names that are valid for the particular MCU type 22 15 2 5 define ISR_ALIAS vector target vector include avr interrupt h Aliases a given vector to another one in the same manner as the 5 ALIASOF at tribute for the ISR macro Unlike 5 ALIASOF attribute macro however this is compatible for all versions of GCC rather than just GCC version 4 2 onwards Note This macro creates a trampoline function for the aliased macro This will result in
371. ng and Retrieving Strings in the Program Space 29 PGM P string table PROGMEM string 1 string 2 string 3 string 4 string 5 Now this has the effect of putting string table in Program Space where string table is an array of pointers to characters strings where each pointer is a pointer to the Program Space where each string is also stored The PGM P type above is also a macro that defined as a pointer to a character in the Program Space Retrieving the strings are a different matter You probably don t want to pull the string out of Program Space byte by byte using the pgm read byte macro There are other functions declared in the lt avr pgmspace h gt header file that work with strings that are stored in the Program Space For example if you want to copy the string from Program Space to a buffer in RAM like an automatic variable inside a function that is allocated on the stack you can do this void foo void char buffer 10 for unsigned char i 0 i lt 5 itt strcpy_P buffer read word amp string table il Display buffer on LCD return Here the string table array is stored in Program Space so we access it normally as if were stored in Data Space then take the address of the location we want to access and use the address as a parameter to read word We use read word macro to read the string pointer out of the string table a
372. ng the standard IO facilities 325 22 38 Using the standard IO facilities This project illustrates how to use the standard IO facilities stdio provided by this library It assumes a basic knowledge of how the stdio subsystem is used in standard C applications and concentrates on the differences in this library s implementation that mainly result from the differences of the microcontroller environment compared to a hosted environment of a standard computer This demo is meant to supplement the documentation not to replace it 22 38 1 Hardware setup The demo is set up in a way so it can be run on the ATmega16 that ships with the STK500 development kit The UART port needs to be connected to the RS 232 spare port by a jumper cable that connects PDO to RxD and PD1 to TxD The RS 232 channel is set up as standard input st din and standard output st dout respectively In order to have a different device available for a standard error channel stderr industry standard LCD display with an HD44780 compatible LCD controller has been chosen This display needs to be connected to port A of the STK500 in the following way Port Header Function 1 LCD D4 AI 2 LCD D5 A2 3 LCD D6 A3 4 LCD D7 A4 5 LCD R W 5 6 LCDE A6 7 LCDRS 7 8 unused GND 9 GND VCC 10 Vec Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 38 Using the standard IO facilities 326
373. not in the or with a circumflex in set or when the field width runs out Note that usage of this conversion enlarges the stack expense p Matches a pointer value as printed by p in printf the next pointer must be a pointer to void n Nothing is expected instead the number of characters consumed thus far from the input is stored through the next pointer which must be a pointer to int This is not a conversion although it can be suppressed with the flag These functions return the number of input items assigned which can be fewer than provided for or even zero in the event of a matching failure Zero indicates that while there was input available no conversions were assigned typically this is due to an invalid input character such as an alphabetic character for a d conversion The value EOF is returned if an input failure occurs before any conversion such as an end of file occurs If an error or end of file occurs after conversion has begun the number of conversions which were successfully completed is returned By default all the conversions described above are available except the floating point conversions and the width is limited to 255 characters The float point conversion will be available in the extended version provided by the library 1ibscanf flt a Also in this case the width is not limited exactly it is limited to 65535 characters To link a program against the extended version use the following compiler
374. nst char fmt int printf P const char fmt int vprintf const char fmt va list ap int sprintf char x__s const char x__fmt int sprintf_P char __s const char x__fmt int snprintf char __s size_t __n const char __fmt int snprintf_P char __s size_t __n const char x__fmt int vsprintf char __s const char __fmt va list ap int vsprintf P char __s const char fmt va_list ap int vsnprintf char s size t n const char fmt va_list ap int vsnprintf P char __s size_t __n const char __fmt va list ap int fprintf FILE stream const char fmt int fprintf P FILE stream const char fmt int fputs const char str FILE stream int fputs_P const char str FILE stream int puts const char str int puts P const char str size t fwrite const void ptr size t _ size size t nmemb FILE stream int fgetc FILE stream int ungetc int __c FILE stream char fgets char str int size FILE stream char gets char str size_t fread void ptr size t size size t nmemb FILE stream void clearerr FILE stream int feof FILE stream int ferror FILE stream int vfscanf FILE stream const char fmt va list int vfscanf P FILE stream const char fmt va list int fscanf FILE stream const char fmt int fscanf P FILE stream const char fmt
375. nstall them If you specified a destination that isn t owned by your account you ll need root access to install them To install make install You should now have the programs from binutils installed into SPREFIX bin Don t forget to set your PATH environment variable before going to build avr gcc Note The official version of binutils might lack support for recent AVR devices A patch that adds more AVR types can be found at http www freebsd org cgi cvsweb cgi ports devel avr binutils files patch ne Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 5 GCC for the AVR target 92 12 5 GCC for the AVR target Warning You must install avr binutils and make sure your path is set properly before in stalling avr gcc The steps to build avr gcc are essentially same as for binutils bunzip2 c gcc version tar bz2 tar xf 5 cd gcc lt version gt mkdir obj avr cd obj avr configure prefix PREFIX target avr enable languages c c disable nls disable libssp with dwarf2 make make install To save your self some download time you can alternatively download only the gcc core version tar bz2 and gcc c lt version gt tar bz2 parts of the gcc Also if you don t need support you only need the core part and should only enable the C language support Note Early versions of these tools did not support The stdc libs are not included with C for AV
376. nttypes 139 avr pgmspace 253 PRIuLEAST8 prog_int16_t avr_inttypes 139 avr_pgmspace 253 PRIuPTR prog_int32_t avr_inttypes 139 PRIX16 avr_inttypes 140 PRIx16 avr_inttypes 140 PRIX32 avr_inttypes 140 PRIx32 avr_inttypes 140 PRIX8 avr_inttypes 140 PRIx8 avr_inttypes 140 PRIXFAST16 avr_inttypes 140 PRIxFAST 16 avr_inttypes 140 PRIXFAST32 avr_inttypes 140 PRIxFAST32 avr inttypes 140 PRIXFAST8 avr_inttypes 140 PRIxFASTS8 avr inttypes 141 PRIXLEASTI16 avr inttypes 141 PRIxLEAST16 avr_inttypes 141 PRIXLEAST32 avr_inttypes 141 PRIxLEAST32 avr inttypes 141 PRIXLEAST8 avr_inttypes 141 PRIxLEAST8 avr_inttypes 141 PRIXPTR avr_inttypes 141 avr_pgmspace 253 prog int64 t avr pgmspace 253 prog int8 t avr pgmspace 254 prog uchar avr pgmspace 254 prog uint16 t avr pgmspace 254 prog uint32 t avr pgmspace 254 prog uint64 t avr pgmspace 254 prog uint8 t avr pgmspace 254 prog void avr pgmspace 254 PROGMEM avr pgmspace 253 PSTR avr pgmspace 253 PTRDIFF MAX avr stdint 161 PTRDIFF MIN avr stdint 161 putc avr stdio 173 putchar avr stdio 173 puts avr stdio 177 puts P avr stdio 177 qsort avr stdlib 191 quot div t 336 ldiv t 337 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 399 rand avr stdlib 192 RAND MAX avr stdlib 187 rand r avr stdlib 192 random avr stdlib 192 RANDOM MAX avr
377. o be used to resolve global symbols that are still unresolved at this point Specific linker flags can be passed from the C compiler command line using the W1 compiler option see above This option requires that there be no spaces in the appended linker option while some of the linker options above like Map or def sym would require a space In these situations the space can be replaced by an equal sign as well For example the following command line can be used to compile foo c into an executable and also produce a link map that contains a cross reference list in the file foo map avr gcc O o foo out Wl Map foo map Wl cref foo c Alternatively a comma as a placeholder will be replaced by a space before passing the option to the linker So for a device with external SRAM the following command line would cause the linker to place the data segment at address 0x2000 in the SRAM avr gcc mmcu atmegal28 o foo out Wl Tdata 0x802000 See the explanation of the data section for why 0x800000 needs to be added to the actual value Note that the stack will still remain in internal RAM through the symbol _ Stack that is provided by the run time startup code This is probably a good idea anyway since internal RAM access is faster and even required for some early devices that had hardware bugs preventing them from using a stack in external RAM Note also that the heap for malloc will still be placed after all the variables in th
378. o the application has no initialized data The bss segment where uninitialized data is stored starts at location 0x60 The next available address in the bss segment is location 0x63 so the application uses 3 bytes of uninitialized data The eeprom segment where EEPROM variables are stored starts at location 0 0 The next available address in the eeprom segment is also location 0 0 so there aren t any EEPROM variables 22 36 6 Generating Intel Hex Files We have a binary of the application but how do we get it into the processor Most if not all programmers will not accept a GNU executable as an input file so we need to do a little more processing The next step is to extract portions of the binary and save the information into hex files The GNU utility that does this is called avr objcopy The ROM contents can be pulled from our project s binary and put into the file demo hex using the following command avr objcopy j text j data O ihex demo elf demo hex The resulting demo hex file contains 1000000012 081 080 07 07 100010001AC079C078C077C07 1000200072C071C070C011241 10003000CDBF10E0A0E6B0E00 10004000E1F74DD061C01F920 EC07DC07CC07BC06C 6C075C074C073C08C F BECFESD4E0DEBF26 1C01D92A336B1072D F920FB60F921124AD 00050002F933 000600061003 1000700061008 100080003F912 1000900029F02 1000A00030916 1000800021153 000C0006000D 000D0001ABC8 1000E0008FBD8 F938F9380916 09162002F5F3 3E
379. o two different UARTS that way or the put and get functions could keep internal state between calls there Format strings in flash ROM All the printf and scanf family functions come in two flavours the standard name where the format string is expected to be in SRAM as well as a version with the suffix P where the format string is expected to reside in the flash ROM The macro PSTR explained in lt avr pgmspace h gt Program Space Utilities becomes very handy for declaring these format strings Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 169 Running stdio without malloc By default fdevopen requires malloc As this is often not desired in the limited environment of a microcontroller an alternative option is provided to run completely without malloc The macro fdev setup stream is provided to prepare a user supplied FILE buffer for operation with stdio Example include lt stdio h gt static int uart_putchar char c FILE xstream static FILE mystdout FDEV SETUP STREAM uart putchar NULL _FDEV_SETUP_WRITE static int uart putchar char c FILE xstream if c uart putchar Nr stream loop until bit is set UCSRA UDR c return 0 int main void init_uart stdout amp mystdout printf Hello world n return 0 This example uses the initializer form FDEV_SETUP_STREAM rather than
380. of the bits found in the AVR datasheet There may be some descrepencies between the register names found in the IAR IO header files and the AVR GCC IO header files 10 3 Interrupt Service Routines ISRs As mentioned above the C language Standard strangely does not specify a standard way of declaring and defining an ISR Hence every compiler seems to have their own special way of doing so IAR declares an ISR like so pragma vector TIMERO OVF interrupt void MotorPWMBottom code In AVR you declare an ISR like so ISR PCINTI_vect code AVR GCC uses the ISR macro to define an ISR This macro requries the header file include lt avr interrupt h gt The names of the various interrupt vectors are found in the individual processor IO header files that you must include with lt avr io h gt Note The names of the interrupt vectors in AVR GCC has been changed to match the names of the vectors in IAR This significantly helps in porting applications from IAR to AVR GCC 10 4 Intrinsic Routines IAR has a number of intrinsic routine such as enable interrupts disable interrupts watchdog reset Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 10 5 Flash Variables 57 These intrinsic functions compile to specific AVR opcodes SEL CLI WDR There are equivalent macros that are used in AVR GCC however they are not located in a single include file
381. of the intended meaning of the const keyword const is used to tell the compiler that the data is to be read only It is used to help make it easier for the compiler to make certain transformations or to help the compiler check for incorrect usage of those variables For example the const keyword is commonly used in many functions as a modifier on the parameter type This tells the compiler that the function will only use the parameter as read only and will not modify the contents of the parameter variable const was intended for uses such as this not as a means to identify where the data should be stored If it were used as a means to define data storage then it loses its correct meaning changes its semantics in other situations such as in the function pa rameter example 5 3 Storing and Retrieving Data in the Program Space Let s say you have some global data unsigned char mydata 11 10 0x00 0x01 0 02 0 03 0 04 0 05 0 06 0 07 0 08 0 09 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 11 0 12 0 13 0 14 0 15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D Ox1E Ox1F 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0 28 0 29 0 2 0x2B 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 0x44 0x45 0 46 0 47 0x48 0x49 0x4A 0x4B 0x4C Ox4D Ox4E 0x4F 0x50 0x51 0x52 0x53 0x54 0x55 0x56 0x57 0x58 0x59 Ox5A 0x5B
382. og int32 t typedef uint32 t PROGMEM prog uint32 t typedef int 4 t PROGMEM prog int64 t typedef uint64_t PROGMEM prog uint64 t Functions PGM VOID P P PGM VOID B int __ val size_t len int memcmp P const void PGM VOID size t PURE void memcpy P void PGM VOID size_t void memmem_P const void size t VOID P size_t _ ATTR PURE PGM VOID memrchr P PGM_VOID_P int val size t len char strcat P char PGM P PGM_P strchr P PGM_P int __ val Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 34 pgmspace h File Reference 358 PGM P strchrnul_P int __ val int strcmp P const char PGM P PURE char strcpy P char PGM P int strcasecmp P const char PGM_P ATTR PURE char strcasestr P const char P PURE size tstrcspn P const char s PGM P reject ATTR PURE size_t strlcat P char size t size t strlcpy P char PGM P size t size t strlen P PGM P size t strnlen P size_t int strncmp P const char PGM P size 0 PURE int strncasecmp const char P size 0 PURE char strncat_P char PGM P size_t char strncpy P char size t char strpbrk P const char s PGM P accept ATTR PURE P strrchr_P PGM P in
383. ok r S 380 strtol avr stdlib 193 strtoul avr stdlib 194 strupr avr string 207 strupr S 380 supported devices 2 tan avr math 151 tanh avr math 152 timer enable int deprecated items 295 toascii ctype 132 tolower ctype 132 tools optional 89 tools required 88 toupper ctype 132 trunc avr_math 152 TW_BUS_ERROR util_twi 289 TW_MR_ARB_LOST util_twi 289 TW_MR_DATA_ACK util_twi 289 TW_MR_DATA_NACK util_twi 289 TW_MR_SLA_ACK util_twi 289 TW_MR_SLA_NACK util_twi 289 TW_MT_ARB_LOST util_twi 289 TW_MT_DATA_ACK util_twi 289 TW_MT_DATA_NACK util_twi 289 TW_MT_SLA_ACK util_twi 289 TW_MT_SLA_NACK util_twi 289 TW_NO_INFO util_twi 289 TW_READ util_twi 290 TW_REP_START util_twi 290 TW_SR_ARB_LOST_GCALL_ACK util_twi 290 TW_SR_ARB_LOST_SLA_ACK util_twi 290 TW_SR_DATA_ACK util_twi 290 TW_SR_DATA_NACK util_twi 290 TW_SR_GCALL_ACK util_twi 290 TW_SR_GCALL_DATA_ACK util_twi 290 TW_SR_GCALL_DATA_NACK util_twi 290 TW_SR_SLA_ACK util_twi 290 TW_SR_STOP Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 403 util twi 290 TW ST LOST SLA ACK util twi 291 TW ST ACK util twi 291 TW ST DATA NACK util twi 291 TW ST LAST DATA util twi 291 TW ST SLA util twi 291 TW START util twi 291 TW STATUS util twi 291 TW STATUS MASK util twi 291 TW WRITE util twi 291 twi h 380 UBRR VALUE uti
384. on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 70 1 Detailed Description 24 71 strncmp PS File Reference 24 71 1 Detailed Description 20470 trnenv S File Reference 24 88 strtok r S File Reference 381 Variables e static char p 24 88 24 88 1 24 89 24 89 1 24 90 24 90 1 Defines strtok r S File Reference Detailed Description strupr S File Reference Detailed Description twi h File Reference Detailed Description define TWIH 1 TWSR values Mnemonics TW MT xxx master transmitter TW MR xxx master receiver TW ST xxx slave transmitter TW SR xxx slave receiver define TW START 0x08 define TW REP START 0x10 define TW MT SLA ACK 0x18 define TW MT SLA NACK 0x20 define TW MT ACK 0x28 define TW MT DATA NACK 0x30 define TW MT ARB LOST 0x38 fdefine TW MR ARB LOST 0x38 define TW MR SLA ACK 0x40 define TW MR SLA NACK 0x48 define TW MR DATA ACK 0x50 define TW MR DATA NACK 0x58 define TW ST SLA 0xA8 fdefine TW ST LOST SLA OxBO define TW ST 0xB8 define TW ST DATA NACK 0xCO define TW ST LAST DATA 0xC8 define TW SR SLA ACK 0x60 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 91 wdt h File Reference 382 fdefine TW SR LOST SLA 0x68 fdefine TW SR GCALL 0x70 define TW SR LOST 0x78 define TW SR DATA ACK 0x80 define TW SR DAT
385. on entry exit this saves some space at the cost of a slightly increased execution time mtiny stack Change only the low 8 bits of the stack pointer mno tablejump Deprecated use no jump tables instead e mshort calls Use rjmp rcall limited range on gt 8K devices avr2 and avr4 architec tures less than 8 KB or flash memory this is always the case On avr3 and avr5 architectures calls and jumps to targets outside the current function will by default use jmp ca11 instructions that can cover the entire address range but that require more flash ROM and execution time nrtl Dump the internal compilation result called RTL into comments in the generated assembler code Used for debugging avr gcc e msize Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 1 Options for the C compiler avr gcc 110 Dump the address size and relative cost of each statement into comments in the gen erated assembler code Used for debugging avr gcc mdeb Generate lots of debugging information to stderr 13 1 2 Selected general compiler options The following general gcc options might be of some interest to AVR users On Optimization level n Increasing n is meant to optimize more an optimization level of 0 means no optimization at all which is the default if no O option is present The special option Os is meant to turn on all 02 optimizations that are not expected
386. oo Another option is to use Unix assembler style numeric labels They are explained in How do I trace an assembler file in avr gdb The above example would then look like define loop until bit is clear port bit asm volatile 1 abic 0 SI Niye emp Ib no outputs x I SFR IO ADDR port I bit 7 6 C Stub Functions Macro definitions will include the same assembler code whenever they are referenced This may not be acceptable for larger routines In this case you may define a C stub function containing nothing other than your assembler code void delay uint8 t ms uintl6 t cnt asm volatile An Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 77 C Names Used in Assembler Code 47 L_dl1 mov 0 A2 n t mov B0 B2 Xn 412 n t sbiw 0 1 n t brne L 12 n t dec 1 n t brne L_dli n t amp w cnt r ms r delay_count The purpose of this function is to delay the program execution by a specified number of milliseconds using a counting loop The global 16 bit variable delay count must contain the CPU clock frequency in Hertz divided by 4000 and must have been set before calling this routine for the first time As described in the clobber section the routine uses a local variable to hold a temporary value Another use for a local variable is a return value The following function returns a 16
387. or You can override this by supplying a function named BADISR_vect which should be defined with ISR as such The name BADISR vect is actually an alias for vector default The latter must be used inside assembly code in case lt avr interrupt h gt is not included include avr interrupt h ISR BADISR vect user code here Nested interrupts AVR hardware clears the global interrupt flag in SREG be fore entering an interrupt vector Thus normally interrupts will remain disabled inside the handler until the handler exits where the RETI instruction that is emitted by the compiler as part of the normal function epilogue for an interrupt handler will even tually re enable further interrupts For that reason interrupt handlers normally do not nest For most interrupt handlers this is the desired behaviour for some it is even required in order to prevent infinitely recursive interrupts like UART interrupts or level triggered external interrupts In rare circumstances though it might be desired to re enable the global interrupt flag as early as possible in the interrupt handler in order to not defer any other interrupt more than absolutely needed This could be done using an sei instruction right at the beginning of the interrupt handler but this still leaves few instructions inside the compiler generated function prologue to run with global in terrupts disabled The compiler can be instructed to insert an SEI ins
388. or 1 AT90PWM3 AT90PWM2 AT90PWM1 ANALOG_ COMP_2_vect SIG_ Analog Com COMPARATOR parator 2 AT90PWM3 AT90PWM2 AT90PWM1 ANALOG_ COMP_vect SIG_ COMPARATOR Analog Com parator AT90CAN128 AT90CAN32 AT90CANGA ATmegal03 ATmegal28 ATmegal284P ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega48P ATmega64 ATmega645 ATmega6450 ATmega649 ATmega6490 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 AT90USB162 9005 82 9005 1287 9005 1286 AT90USB647 AT90USB646 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 45 lt avr interrupt h gt Interrupts 227 Vector name Old vector Description Applicable for device name ANA_ SIG_ Analog Com 9051200 419052313 AT90S2333 COMP vect COMPARATOR parator AT90S4414 AT90S4433 419054434 AT90S8515 419058535 ATmegal6 ATmegal61 ATmegal62 ATmegal63 ATmega32 ATmega323 ATmega8 AT mega8515 ATmega8535 ATtiny11 ATtiny12 ATtiny13 ATtiny15 ATtiny2313 ATtiny26 ATtiny28 ATtiny43U ATtiny48 ATtiny24 ATtiny44 ATtiny84 ATtiny45 ATtiny25 ATtiny85 ATtiny261 ATtiny461 ATtiny861 CANIT_vect SIG_CAN_ CAN Transfer AT90CAN128 AT90CAN32 AT90CAN
389. ore as a way is needed to distinguish between the various displays This is where the second parameter can be used the reference to the stream itself instead of keeping the state inside a private variable of the function it can be kept inside a private object that is attached to the stream itself A reference to that private object can be at tached to the stream e g inside the function 1cd init that then also needs to be passed a reference to the stream using fdev_set_udata and can be accessed inside putchar using fdev get udata 22 38 3 7 uart h Public interface definition for the RS 232 UART driver much like in Icd h except there is now also a character input function available As RS 232 input is line buffered in this example the macro RX_BUF SIZE deter mines the size of that buffer 22 38 3 8 uart c This implements stdio compatible RS 232 driver using AVR s standard UART or USART in asynchronous operation mode Both char acter output as well as character input operations are implemented Character output takes care of converting the internal newline n into its external representation carriage return line feed V r n Character input is organized as a line buffered operation that allows to minimally edit the current line until it is sent to the application when either a carriage return r or newline n character is received from the terminal The line editing functions implemented are
390. oun tered and store the characters in the buffer pointed to by str Unless an error was encountered while reading the string will then be terminated with a NUL character If an error was encountered the function returns NULL and sets the error flag of stream which can be tested using ferror Otherwise a pointer to the string will be returned 22 9 3 9 int fprintf FILE stream const char fmt The function fprintf performs formatted output to stream See vfprintf for details Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 177 22 9 3 10 int fprintf_P FILE stream const char Variant of fprintf that uses a fmt string that resides in program memory 22 9 3 11 intfputc int FILE stream The function fputc sends the character c though given as type int to st ream It returns the character or EOF in case an error occurred 22 9 3 12 int fputs const char str FILE stream Write the string pointed to by str to stream st ream Returns on success and EOF on error 22 9 3 13 int fputs_P const char str FILE x stream Variant of fputs where st x resides in program memory 22 9 3 14 size_t fread void x p r size t size size t nmemb FILE stream Read nmemb objects size bytes each from st ream to the buffer pointed to by ptr Returns the number of objects successfully read i e nme
391. ound function rounds x to the nearest integer but rounds halfway cases away from zero instead of to the nearest even integer This function is similar to round function but it differs in type of return value and in that an overflow is possible Returns The rounded long integer value If __x is not a finite number an overflow was this realization returns the LONG MIN value 0x80000000 22 6 3 27 double modf double x double iptr The modf function breaks the argument __x into integral and fractional parts each of which has the same sign as the argument It stores the integral part as a double in the object pointed to by __iptr The modf function returns the signed fractional part of x Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 6 lt math h gt Mathematics 152 Note This implementation skips writing by zero pointer However the GCC 4 3 can replace this function with inline code that does not permit to use NULL address for the avoiding of storing 22 6 3 28 double pow double x double y The function pow returns the value of __x to the exponent y 22 6 3 29 double round double x The round function rounds x to the nearest integer but rounds halfway cases away from zero instead of to the nearest even integer Overflow is impossible Returns The rounded value If __x is an integral or infinite x itself is returned If __x is NaN then NaN is returned
392. p OBJDIR 0 bin echo Converting lt 85 I binary O elf32 avr rename section data progmem data contents alloc load readonly data redefine sym binary bin start redefine sym binary bin end end redefine sym binary bin size size sym Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 31 How do perform a software reset of the AVR 83 5 lt Gecho extern const char PROGMEM gt x h Gecho extern const char x _end PROGMEM gt gt x h Gecho extern const char size sym gt gt x h Gecho define 5 size 5 size sym gt gt x h Back to FAQ Index 11 31 How do I perform a software reset of the AVR The canonical way to perform a software reset of the AVR is to use the watchdog timer Enable the watchdog timer to the shortest timeout setting then go into an infinite do nothing loop The watchdog will then reset the processor The reason why this is preferable over jumping to the reset vector is that when the watchdog resets the AVR the registers will be reset to their known default settings Whereas jumping to the reset vector will leave the registers in their previous state which is generally not a good idea CAUTION Older AVRs will have the watchdog timer disabled on a reset For these older AVRs doing a soft reset by enabling the watchdog is easy as the
393. p 2 uint16 t count 24 10 File Reference 24 10 1 Detailed Description Defines define ERRNO 1 define EDOM 33 define ERANGE 34 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 2411 fdevopen c File Reference 348 Variables int errno 2411 fdevopen c File Reference 24 11 1 Detailed Description Functions FILE x fdevopen int put char FILE int get FILE 24 12 ffs S File Reference 24 12 1 Detailed Description 24 13 ffsl S File Reference 24 13 1 Detailed Description 24 14 ffsll S File Reference 24 14 1 Detailed Description 24 15 fuse h File Reference 24 15 1 Detailed Description Defines define AVR FUSE H 1 define FUSEMEM attribute section fuse define FUSES fuse t fuse FUSEMEM 24 16 interrupt h File Reference 24 16 1 Detailed Description et Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 17 inttypes h File Reference 349 Defines Global manipulation of the interrupt flag The global interrupt flag is maintained in the I bit of the status register SREG define sei define cli Macros for writing interrupt handler functions define ISR vector attributes define SIGNAL vector define EMPTY INTERRUPT vector define ISR_ALIAS vector target vector reti define BADISR vect ISR attributes define ISR BLOCK define ISR NOBLOCK define ISR
394. pilation will create a demo o file Next we link it into a binary called demo elf Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 A simple project 306 avr gcc g mmcu atmega8 o demo elf demo o It is important to specify the MCU type when linking The compiler uses the mmcu option to choose start up files and run time libraries that get linked together If this option isn t specified the compiler defaults to the 8515 processor environment which is most certainly what you didn t want 22 36 4 Examining the Object File Now we have a binary file Can we do anything useful with it besides put it into the processor The GNU Binutils suite is made up of many useful tools for manipulating object files that get generated One tool is avr objdump which takes information from the object file and displays it in many useful ways Typing the command by itself will cause it to list out its options For instance to get a feel of the application s size the h option can be used The output of this option shows how much space is used in each of the sections the stab and stabstr sections hold the debugging information and won t make it into the ROM file An even more useful option is 5 This option disassembles the binary file and inter sperses the source code in the output This method is much better in my opinion than using the 5 with the compiler because this listing includes routines from the libraries a
395. pped address of the io port to the function so that you can read and write to it in the function Here s the object code generated for the function call set bits func correct amp PORTB 0x55 112 65 e5 141 r22 0x55 1 8 5 114 88 e3 141 r24 0x38 56 116 90 141 r25 0 00 270 118 0e 94 7c 00 11 Oxf8 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 13 How do pass an IO port as a parameter to a function 70 You can clearly see that 0 0038 is correctly passed for the address of the 10 port Looking at the disassembled object code for the body of the function we can see that the function is indeed performing the operation we intended void set bits func correct volatile uint8 t xport uint8 t mask f8 fc 01 movw r30 r24 port mask fa 80 81 ld r24 Z Fo 86 2b or r24 r22 fe 80 83 st Z r24 100 08 95 ret Notice that we are accessing the io port via the LD and ST instructions The port parameter must be volatile to avoid a compiler warning Note Because of the nature of the IN and OUT assembly instructions they can not be used inside the function when passing the port in this way Readers interested in the details should consult the Instruction Set datasheet Finally we come to the macro version of the operation In this contrived example the macro is the most efficient method with respect to both execution speed and code size set bits macro PORTB 0 0 Lies
396. present this in their definition by a bit wise inversion of a mask For example the FUSE EESAVE fuse in the ATmegal28 is defined as define FUSE EESAVE _BV 3 Note The _BV macro creates a bit mask from a bit number It is then inverted to repre sent logical values for a fuse memory byte To combine the fuse bits macros together to represent a whole fuse byte use the bitwise AND operator like so FUSE_BOOTSZO amp FUSE_BOOTSZ1 amp FUSE EESAVE amp FUSE SPIEN amp FUSE JTAGEN Each device I O header file also defines macros that provide default values for each fuse byte that is available LFUSE DEFAULT is defined for a Low Fuse byte HFUSE DEFAULT is defined for a High Fuse byte EFUSE DEFAULT is defined for Ex tended Fuse byte If FUSE MEMORY SIZE gt 3 then the I O header file defines macros that pro vide default values for each fuse byte like so FUSEO0 DEFAULT FUSEI DEFAULT FUSE2 DEFAULT FUSE3 DEFAULT FUSE4 DEFAULT API Usage Example Putting all of this together is easy Using C99 s designated initializers include avr io h FUSES low LFUSE DEFAULT high FUSE BOOTSZO0 FUSE BOOTSZ1 amp FUSE EESAVE amp FUSE SPIEN FUSE JTAGEN extended EFUSE DEFAULT Generated Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 14 lt avr fuse h gt Fuse Support 221 int main void return 0 Or using the variable directly instead of the FUSES macro
397. prog void e typedef char PROGMEM prog char typedef unsigned char PROGMEM prog uchar typedef int8 t PROGMEM prog int8 t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 251 typedef uint8 t PROGMEM prog uint8 t typedef int16 t PROGMEM prog int16 t typedef uint16 t PROGMEM prog uintl6 t typedef int32 t PROGMEM prog int32 t typedef uint32 t PROGMEM prog uint32 t typedef int 4 t PROGMEM prog int64 t typedef uint64_t PROGMEM prog uint64 t Functions PGM VOID P memchr_P PGM VOID P int __ val size_t len int memcmp P const void x PGM VOID size t PURE void memcpy P void PGM_VOID_P size_t PGM VOID P memrchr P PGM_VOID_P int __ val size_t len int strcasecmp P const char PGM_P ATTR PURE char strcat P char P P strchr P PGM_P int __ val PGM P strchrnul P int __ val int stremp_P const char PGM P PURE char strcpy P char P size tstrcspn P const char s PGM_P reject ATTR PURE size t strlcat P char P size t size t strlcpy P char P size t size t strlen P PGM P int strncasecmp_P const char x P size 0 PURE char strncat_P char PGM P size_t int strncmp P const char PGM P size t PURE char strncpy P char size t size t strnlen P PGM size_t ch
398. quently Asked Questions 59 regvar no init volatile unsigned int filteredTimeSinceCommutation 814 This line locks r14 for use only when explicitly referenced in your code thorugh the var name filteredTimeSinceCommutation This means that the compiler cannot dispose of it at its own will To do this in AVR do this register unsigned char counter asm r3 Typically it should be possible to use r2 through r15 that way Note Do not reserve r0 or rl as these are used internally by the compiler for a temporary register and for a zero value Locking registers is not recommended in AVR GCC as it removes this register from the control of the compiler which may make code generation worse Use at your own risk 11 Frequently Asked Questions 11 4 FAQ Index 1 My program doesn t recognize a variable updated within an interrupt routine 2 I get undefined reference to for functions like sin 3 How to permanently bind a variable to a register 4 How to modify MCUCR or WDTCR early 5 What is all this BV stuff about 6 CanIuse on the AVR 7 Shouldn t I initialize all my variables 8 Why do some 16 bit timer registers sometimes get trashed 9 How do I use a define d constant in an asm statement 10 Why does the PC randomly jump around when single stepping through my pro gram in avr gdb 11 How do I trace an assembler file in avr gdb 12 How do I pass an IO port as a parameter to a
399. r fmt va_list int vfprintf P FILE stream const char fmt va list ap intfputc int __c FILE stream int printf const char fmt int printf P const char fmt int vprintf const char fmt va list ap int sprintf char s constchar fmt int sprintf_P char __s const char __fmt int snprintf char __s size_t __n const char __fmt int snprintf_P char __s size_t ___n const char x__fmt int vsprintf char __s const char __fmt va_list ap int vsprintf P char __s const char __fmt va list ap int vsnprintf char 5 517 t const char x__fmt va_list ap int vsnprintf P char __s size_t __n const char __fmt va_list ap int fprintf FILE stream const char fmt int fprintf P FILE stream const char __fmt int fputs const char str FILE stream int fputs_P const char str FILE stream int puts const char str int puts P const char str size t fwrite const void ptr size t _ size size t nmemb FILE stream int fgetc FILE stream int ungetc int c FILE stream char fgets char str int size FILE stream char gets char str size_t fread void size t size size t nmemb FILE stream void clearerr FILE stream int feof FILE stream int ferror FILE stream int vfscanf FILE stream const char fmt va list Generated
400. r t N asm X mov _ tmp reg 0 N swap 0 n t N eor 0 tmp reg n t N mov tmp reg 0 n t N lsr 0 n t N lar 0 mane N eor 0 tmp reg x GC IE N 0 unsigned char val X 1 gt gt 1 amp 1 Returns lif val has an odd number of bits set 22 30 lt util setbaud h gt Helper macros for baud rate calculations 22 30 1 Detailed Description define F CPU 11059200 define BAUD 38400 include lt util setbaud h gt This header file requires that on entry values are already defined for F_CPU and BAUD In addition the macro BAUD_TOL will define the baud rate tolerance in percent that is acceptable during the calculations The value of BAUD_TOL will default to 2 This header file defines macros suitable to setup the UART baud rate prescaler registers of an AVR All calculations are done using the C preprocessor Including this header file causes no other side effects so it is possible to include this file more than once supposedly with different values for the BAUD parameter possibly even within the same function Assuming that the requested BAUD is valid for the given F_CPU then the macro UBRR VALUE is set to the required prescaler value Two additional macros are pro vided for the low and high bytes of the prescaler respectively UBRRL VALUE is set to the lower byte of the UBRR VALUE and UBRRH VALUE is set to the upper
401. r devices with more than 64 KB of code memory Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 2 Options for the assembler avr as 112 13 2 Options for the assembler avr as 13 2 1 Machine specific assembler options mmcu architecture mmcu MCU name avr as understands the same mmcu options as avr gcc By default avr2 is assumed but this can be altered by using the appropriate arch pseudo instruction inside the assembler source file e mmall opcodes Turns off opcode checking for the actual MCU type and allows any possible AVR opcode to be assembled e mno skip bug Don t emit a warning when trying to skip a 2 word instruction with a CPSE SBIC SBIS SBRC SBRS instruction Early AVR devices suffered from a hardware bug where these instructions could not be properly skipped e mno wrap For RIMP RCALL instructions don t allow the target address to wrap around for de vices that have more than 8 KB of memory gstabs Generate stabs debugging symbols for assembler source lines This enables avr gdb to trace through assembler source files This option must not be used when assembling sources that have been generated by the C compiler these files already contain the appropriate line number information from the C source files e a cdhImns file Turn on the assembler listing The sub options are c omit false conditionals e d omit debugging directives h include high
402. r to not impose a too high CPU load by these interrupt service routines This is the main reason to implement the entire interrupt handling in fine tuned assembly code rather than in C In order to verify parts of the algorithm and the underlying hardware the demo has been set up in a way so the pin compatible but more expensive ATtiny45 or its siblings ATtiny25 and ATtiny85 could be used as well In that case no separate assembly code is required as two timer channels are avaible 22 35 1 Hardware setup The incoming PWM pulse train is fed into PB4 It will generate a pin change interrupt there on eache edge of the incoming signal The outgoing PWM is generated through OCOB of timer channel 0 PB1 For demon stration purposes a LED should be connected to that pin like one of the LEDs of an STK500 The controllers run on their internal calibrated RC oscillators 1 2 MHz on the AT Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 35 Combining C and assembly source files 299 tiny13 and 1 0 MHz on the ATtiny45 22 35 2 A code walkthrough 22 35 2 1 asmdemo c After the usual include files two variables are defined The first one pwm incoming is used to communicate the most recent pulse width de tected by the incoming PWM decoder up to the main loop The second variable actually only constitutes of a single bit intbits pwm received This bit will be set whenever the incoming PWM decoder has updated
403. r obj avr cd obj avr configure prefix PREFIX make make install Ur Xr Xr or Xr Xo 12 8 GDB for the AVR target GDB also uses the configure system so to build and install bunzip2 c gdb version tar bz2 tar xf cd gdb version mkdir obj avr cd obj avr configure prefix PREFIX target avr make make install Ur Xr X ro Xr Xo Note If you are planning on using avr gdb you will probably want to install either simulavr or avarice since avr gdb needs one of these to run as a a remote target backend Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 9 SimulAVR 94 12 9 SimulAVR SimulAVR also uses the configure system so to build and install gunzip c simulavr version tar gz tar xf cd simulavr version mkdir obj avr cd obj avr configure prefix PREFIX make make install Note You might want to have already installed avr binutils avr gcc and avr libc if you want to have the test programs built in the simulavr source 12 10 AVaRICE Note These install notes are not applicable to avarice 1 5 or older You probably don t want to use anything that old anyways since there have been many improvements and bug fixes since the 1 5 release AVaRICE also uses the configure system so to build and install gunzip c avarice version tar gz tar xf cd avarice version mkdir obj avr cd obj avr configure prefix PRE
404. r the actual delay algorithms Functions e void delay loop 1 uint8_t count e void delay loop 2 uintl6 t count 22 28 2 Function Documentation 22 28 21 void delay loop 1 uint8 t count Delay loop using 8 bit counter count so up to 256 iterations are possible The value 256 would have to be passed as 0 The loop executes three CPU cycles per iteration not including the overhead the compiler needs to setup the counter register Thus at a CPU speed of 1 MHz delays of up to 768 microseconds can be achieved 22 28 2 2 void delay loop 2 uintl6 t count Delay loop using a 16 bit counter count so up to 65536 iterations are possible The value 65536 would have to be passed as 0 The loop executes four CPU cycles per iteration not including the overhead the compiler requires to setup the counter register pair Thus at a CPU speed of 1 MHz delays of up to about 262 1 milliseconds be achieved 22 29 lt util parity h gt Parity bit generation 22 29 1 Detailed Description finclude lt util parity h gt This header file contains optimized assembler code to calculate the parity bit for a byte Defines define parity even bit val Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 30 lt util setbaud h gt Helper macros for baud rate calculations 286 22 29 2 Define Documentation 22 29 21 define parity even bit val Value extension N unsigned cha
405. r volunteers to analyze the problem and to get it fixed for future versions of the software You can also help to fix bugs in various software projects or to add desirable new features Volunteers are always welcome 3 Memory Areas and Using malloc 3 1 Introduction Many of the devices that are possible targets of avr libc have a minimal amount of RAM The smallest parts supported by the C environment come with 128 bytes of RAM This needs to be shared between initialized and uninitialized variables sections data and bss the dynamic memory allocator and the stack that is used for calling subroutines and storing local automatic variables Also unlike larger architectures there is no hardware supported memory management which could help in separating the mentioned RAM regions from being overwritten by each other The standard RAM layout is to place data variables first from the beginning of the internal RAM followed by bss The stack is started from the top of internal RAM growing downwards The so called heap available for the dynamic memory allocator will be placed beyond the end of bss Thus there s no risk that dynamic memory will ever collide with the RAM variables unless there were bugs in the implementation of the allocator There is still a risk that the heap and stack could collide if there are large requirements for either dynamic memory or stack space The former can even happen if the allocations aren t
406. rchr_P function locates the first occurrence of val converted to a char in the string pointed to by s in program space The terminating null character is considered to be part of the string The strchr P function is similar to strchr except that s is pointer to a string in program space Returns The strchr_P function returns a pointer to the matched character or NULL if the character is not found 22 18 410 P strchrnul P PGM int c The strchrnul P function is like strchr P except that if c is not found in s then it returns a pointer to the null byte at the end of s rather than NULL Glibc GNU extension Returns The strchrnul P function returns a pointer to the matched character or a pointer to the null byte at the end of s i e ststrlen s if the character is not found 22 18 4 11 stremp_P const char 51 P 52 The stremp_P function is similar to strcmp except that 52 is pointer to a string in program space Returns The strcmp function returns an integer less than equal to or greater than zero if s1 is found respectively to be less than to match or be greater than s2 A consequence of the ordering used by strcmp P is that if s1 is an initial substring of s2 then s1 is considered to be less than s2 22 18 4 12 char x strepy_P char dest P src The strcpy function is similar to strcpy except that src is a pointer to a string in program
407. rder MikTex executables gt usr local bin usr bin bin mingw bin c cygwin bin install directory gt bin Set location of LibUSB headers and libraries export CPPFLAGS I libusb win32 device bin 1libusb version include export CFLAGS I libusb win32 device bin 1ibusb version include export LDFLAGS L libusb win32 device bin 1ibusb version lib gcc Configure configure prefix installdir datadir installdir sysconfdir installdir bin enable doc disable versioned doc 2 gt amp 1 tee package configure log Make make k all install 2 gt amp 1 tee Spackage make log Convert line endings in avrdude config file to Windows line endings Delete backup copy of avrdude config file in install directory if exists Insight GDB Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 13 Building the Toolchain for Windows 102 Open source code pacakge and patch as necessary Configure and build in a directory outside of the source code tree Set PATH in order MikTex executables gt usr local bin usr bin bin mingw bin c cygwin bin install directory gt bin Configure CFLAGS D USE MINGW ACCESS LDFLAGS static Sarchivedir configure prefix installdir target avr with gmp usr local with mpfr usr local enable doc 2 amp 1 tee ins
408. rds while implementing this library Commonly this refers to the C library as described by the ANSI X3 159 1989 and ISO IEC 9899 1990 ANSI C standard as well as parts of their successor ISO IEC 9899 1999 C99 Some additions have been inspired by other standards like IEEE Std 1003 1 1988 POSIX 1 while other extensions are purely AVR specific like the entire program space string interface Unless otherwise noted functions of this library are not guaranteed to be reentrant In particular any functions that store local state are known to be non reentrant as well as functions that manipulate IO registers like the EEPROM access routines If these functions are used within both standard and interrupt contexts undefined behaviour will result See the FAQ for a more detailed discussion 1 3 Supported Devices The following is a list of AVR devices currently supported by the library Note that actual support for some newer devices depends on the ability of the compiler assembler to support these devices at library compile time megaAVR Devices atmegal03 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 1 3 Supported Devices atmega128 atmega1280 atmega1281 atmega1284p atmega16 atmegal61 atmega162 atmega 163 atmegal64p atmega 165 atmega165p atmega 168 atmegal68p atmega2560 atmega2561 atmega32 atmega323 atmega324p atmega325 atmega325p atmega3250 atmega3
409. returned 22 6 3 16 double fmod double x double The function fmod returns the floating point remainder of x y Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 6 lt math h gt Mathematics 150 22 6 3 17 double frexp double x int x pexp The frexp function breaks a floating point number into a normalized fraction and an integral power of 2 It stores the integer in the int object pointed to by pexp If __xis anormal float point number the frexp function returns the value v such that v has a magnitude in the interval 1 2 1 or zero and __x equals v times 2 raised to the power pexp If __x is zero both parts of the result are zero If __x is not a finite number the frexp returns __x as is and stores 0 by pexp Note This implementation permits a zero pointer as a directive to skip a storing the exponent 22 6 3 18 double hypot double x double y The hypot function returns sqrt __x __x y This is the length of the hy potenuse of a right triangle with sides of length x and __y or the distance of the point y from the origin Using this function instead of the direct formula is wise since the error is much smaller No underflow with small x and y No overflow if result is in range 22 6 3 19 static int isfinite double x static The isfinite function returns a nonzero value if xis finite not plus or minus infinity and not NaN 22
410. ription Applicable for device LOWLEVEL IO PINS vect SIG PIN Low level Input on Port B ATtiny28 OVRIT vect SIG CAN OVERFLOW 1 CAN Overrun Timer 90 128 AT90CAN32 AT90CAN64 PCINTO_vect SIG_PIN_ CHANGEO Pin Change Inter rupt Request 0 ATmegal62 ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega32HVB AT mega406 ATmega48P ATmega645 ATmega6450 ATmega649 ATmega6490 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 ATmegal280 ATmegal281 ATmega2560 AT mega2561 ATmega324P ATmegal64P ATmega644P ATmega644 AT tiny13 ATtiny43U ATtiny48 ATtiny24 AT tiny44 ATtiny84 ATtiny45 ATtiny25 ATtiny85 90 5 162 9005 82 9005 1287 AT90USB1286 AT90USB647 AT90USB646 PCINTI vect SIG PIN CHANGEI Pin Change Inter rupt Request 1 ATmegal62 ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega32HVB AT mega406 ATmega48P ATmega645 ATmega6450 ATmega649 ATmega6490 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 ATmegal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATtiny43U ATtiny48 AT tiny24 ATtiny44 ATtiny84 9005 162 AT90USB82 PCINT2_vect SIG_PIN_ CHANGE2 Pin Change
411. ro Register rO may be freely used by your assembler code and need not be restored at the end of your code It s a good idea to use tmp reg and zero reg instead of rO or r1 just in case a new compiler version changes the register usage definitions 7 3 Input and Output Operands Each input and output operand is described by a constraint string followed by a C expression in parantheses AVR GCC 3 3 knows the following constraint characters Note The most up to date and detailed information on contraints for the avr can be found in the gcc manual The x register is r27 r26 the y register is r29 r28 and the z register is 3126530 Generated Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7 3 Input and Output Operands 40 Constraint Used for Range a Simple upper registers r16 to r23 b Base pointer registers Z pairs d Upper register r16 to r31 e Pointer register pairs X y Z q Stack pointer register SPH SPL T Any register r0 to r31 t Temporary register rO W Special upper register 124 r26 128 r30 pairs X Pointer register pair X 127 126 y Pointer register pair Y y 129 128 7 Pointer register pair Z z 31 130 G Floating point constant 0 0 I 6 bit positive integer 0 to 63 constant J 6 bit negative integer 63 to 0 constant K Integer constant 2 L Integer constant 0 1 Lower registers r0 to r15 M 8 bit integer constant 0 to
412. rray Remember that a pointer is 16 bits or word size The read word macro will return a 16 bit unsigned integer We then have to typecast it as a true pointer to program memory PGM P This pointer is an address in Program Space pointing to the string that we want to copy This pointer is then used as a parameter to the function st rcpy_P The function st rcpy P is just like the regular st rcpy function except that it copies a string from Program Space the second parameter to a buffer in the Data Space the first parameter There are many string functions available that work with strings located in Program Space All of these special string functions have a suffix of P in the function name Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 5 5 Caveats 30 and are declared in the lt avr pgmspace h gt header file 5 5 Caveats The macros and functions used to retrieve data from the Program Space have to gen erate some extra code in order to actually load the data from the Program Space This incurs some extra overhead in terms of code space extra opcodes and execution time Usually both the space and time overhead is minimal compared to the space savings of putting data in Program Space But you should be aware of this so you can mini mize the number of calls within a single function that gets the same piece of data from Program Space It is always instructive to look at the resulting disassembly from the co
413. rs which had not been passed as operands you need to inform the compiler about this The following example will do an atomic increment It increments an 8 bit value pointed to by a pointer variable in one go without being interrupted by an interrupt routine or another thread in a multithreaded environment Note that we must use a pointer because the incremented value needs to be stored before interrupts are enabled asm volatile eli n t ld r24 0 An Nt inc r24 An NE St a0 r24 n t sei Nn e ptr r24 The compiler might produce the following code cli ld r24 7 inc r24 st 27 r24 sei One easy solution to avoid clobbering register r24 is to make use of the special tem porary register reg defined by the compiler asm volatile ld _ tmp reg a0 n t inc _ tmp reg St a0 _ tmp reg FEM sei Ent e ptr The compiler is prepared to reload this register next time it uses it Another problem with the above code is that it should not be called in code sections where interrupts are disabled and should be kept disabled because it will enable interrupts at the end We may store the current status but then we need another register Again we can solve this without clobbering a fixed but let the compiler select it This could be done with the help of a local C variable Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7
414. rt of GDB AVaRICE uisp avrdude All the people who currently maintain the tools and or have submitted sugges tions patches and bug reports See the AUTHORS files of the various tools And lastly all the users who use the software If nobody used the software we would probably not be very motivated to continue to develop it Keep those bug reports coming Todo List Group avr_boot From email with Marek On smaller devices all except AT mega64 128 SPM_REG is in the I O space accessible with the shorter in and out instructions since the boot loader has a limited size this could be an important optimization 18 Deprecated List Global SIGNAL Do not use SIGNAL in new code Use ISR instead Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 19 Module Index 123 Global ISR ALIAS For new code the use of ISR ISR_ALIASOF is recom mended Global timer enable int Global enable external int Global INTERRUPT Global inp Global outp Global inb Global outb Global sbi Global cbi 19 Module Index 19 1 Modules Here is a list of all modules lt alloca h gt Allocate space in the stack 129 lt assert h gt Diagnostics 130 lt ctype h gt Character Operations 131 lt errno h gt System Errors 133 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 19 1 Modules 124 lt inttypes h gt Integer Type conversions 134 lt math h gt Math
415. s piciously looking name of a ISR function i e one that after macro replacement does not start with vector Vector name Old vector Description Applicable for device name Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt avr interrupt h gt Interrupts 226 Vector name Old name vector Description Applicable for device ADC vect SIG ADC ADC Conversion Complete 9052333 419054433 AT90S4434 AT90S8535 AT90PWM216 AT90PWM2B AT90PWM316 AT90PWM3B AT90PWM3 AT90PWM2 AT90PWM1 AT90CANI28 AT90CAN32 AT90CAN64 ATmegal03 ATmegal28 ATmegal284P ATmegal6 ATmegal63 ATmegal65 ATmegal65P ATmegal68P ATmegal69 ATmegal69P ATmega32 ATmega323 ATmega325 ATmega3250 ATmega3250P ATmega328P ATmega329 ATmega3290 ATmega3290P ATmega48P ATmega64 ATmega645 ATmega6450 ATmega649 ATmega6490 8 ATmega8535 ATmega88P ATmegal68 ATmega48 ATmega88 ATmega640 AT megal280 ATmegal281 ATmega2560 ATmega2561 ATmega324P ATmegal64P ATmega644P ATmega644 ATtinyl3 AT tinyl5 ATtiny26 ATtiny43U ATtiny48 ATtiny24 ATtiny44 ATtiny84 ATtiny45 ATtiny25 ATtiny85 ATtiny261 ATtiny461 ATtiny861 9005 1287 AT90USB1286 AT90USB647 AT90USB646 ANALOG_ COMP_0_vect SIG_ Analog Com COMPARATORQ parator 0 AT90PWM3 AT90PWM2 AT90PWM 1 ANALOG_ COMP_1_vect SIG COMPARATOR Analog Com parat
416. s to allow addressing up to 128 program memory space There is a mint8 option see Options for the C compiler avr gcc to make int 8 bits but that is not supported by avr libc and violates C standards int must be at least 16 bits It may be removed in a future release Call used registers r18 r27 r30 r31 May be allocated by gcc for local data You may use them freely in assembler subroutines Calling C subroutines can clobber any of them the caller is re sponsible for saving and restoring Call saved registers r2 r17 r28 r29 May be allocated by gcc for local data Calling C subroutines leaves them un changed Assembler subroutines are responsible for saving and restoring these registers if changed r29 r28 Y pointer is used as a frame pointer points to local data on stack if necessary The requirement for the callee to save preserve the contents of these registers even applies in situations where the compiler as signs them for argument passing Fixed registers r0 r1 Never allocated by gcc for local data but often used for fixed purposes rO temporary register be clobbered by any C code except interrupt handlers which save it may be used to remember something for a while within one piece of assembler code rl assumed to be always zero in any C code be used to remember something for while within one piece of assembler code but must then be cleared after use r1 This includes
417. s from a Unix origin its pseudo op and overall assembler syntax is slightly different than the one being used by other assemblers Numeric constants follow the C notation prefix for hexadecimal constants expressions use a C like syntax Some common pseudo ops include byte allocates single byte constants ascii allocates a non terminated string of characters asciz allocates a VO terminated string of characters C string data switches to the data section initialized RAM variables text switches to the text section code and ROM constants set declares a symbol as a constant expression identical to equ global or globl declares a public symbol that is visible to the linker g function entry point global variable extern declares a symbol to be externally defined this is effectively a comment only as gas treats all undefined symbols it encounters as globally undefined any way Note that org is available in gas as well but is a fairly pointless pseudo op in an as sembler environment that uses relocatable object files as itis the linker that determines the final position of some object in ROM or RAM Along with the architecture independent standard operators there are some AVR specific operators available which are unfortunately not yet described in the official documentation The most notable operators are 108 Takes the least significant 8 bits of a 16 bit integer Generated on Fri Mar 13
418. s their inclusion to eat up a fair amount of code space Also they are not fast due to the nature of interpreting the format string at run time Whenever possible resorting to the sometimes non standard predetermined conversion facilities that are offered by avr libc will usually cost much less in terms of speed and code size Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 168 Tunable options for code size vs featureset In order to allow programmers a code size vs functionality tradeoff the function vfprintf which is the heart of the printf family can be selected in different flavours using linker options See the documentation of vfprintf for a detailed description The same applies to vfscanf and the scanf family of functions Outline of the chosen API standard streams st din stdout and stderr are provided but contrary to the C standard since avr libc has no knowledge about appli cable devices these streams are not already pre initialized at application startup Also since there is no notion of file whatsoever to avr libc there is no function fopen that could be used to associate a stream to some device See note 1 Instead the function devopen is provided to associate a stream to a device where the device needs to provide a function to send a character to receive a character or both There is no differentiation between text and binary
419. section lma eeprom 0 O srec lt 8 echo empty 8 not generated exit 0 ur o eeprom bin elf OBJCOPY j eeprom change section lma eeprom 0 O binary lt S echo empty 8 not generated exit 0 oe ur 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 x hex x srec dox eps png pdf eps PRG eps png PRG png pdf pdf eps fig S FIG2DEV L eps lt pdf fig S FIG2DEV L pdf lt 560 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 37 A more sophisticated project 317 fig S FIG2DEV L png lt SG 22 36 86 Reference to the source code The source code is installed under Sprefix share doc avr libc examples demo where prefix is a configuration option For Unix systems it is usually set to either usror usr local 22 37 A more sophisticated project This project extends the basic idea of the simple project to control a LED with a PWM output but adds methods to adjust the LED brightness It employs a lot of the basic concepts of avr libc to achieve that goal Understanding this project assumes the simple project has been understood in full as well as being acquainted with the basic hardware concepts of an AVR microcontroller 22 37 Hardware setup The demo is set up in a way so it can be run o
420. sed Figure 7 Wiring of the STK500 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 37 A more sophisticated project 320 The following picture shows the alternate wiring where LEDI is connected but SW2 is not Figure 8 Wiring option 2 of the STK500 As an alternative this demo can also be run on the popular ATmega8 controller or its successor ATmega88 as well as the ATmega48 and ATmegal68 variants of the latter These controllers do not have a port named A so their ADC inputs are located on port C instead thus the potentiometer needs to be attached to port C Likewise the output is not on port D pin 5 but on port B pin 1 PB1 Thus the above cabling scheme needs to be changed so that PB1 connects to LEDO pin PD6 remains unconnected When using the STK500 use one of the jumper cables for this connection All other port D pins should be connected the same way as described for the ATmegal6 above When not using an STK500 starter kit attach the LEDs through some resistor to Vcc low active LEDs and attach pushbuttons from the respective input pins to GND The internal pull up resistors are enabled for the pushbutton pins so no external resistors are needed Finally the demo has been ported to the ATtiny2313 as well As this AVR does not offer an ADC everything related to handling the ADC is disabled in the code for that MCU type Also port D of this controller type only features
421. self scrolling display lines etc The public function 1 init first calls the initialization entry point of the lower level HD44780 driver and then sets up the LCD in a way we d like to display cleared non blinking cursor enabled SRAM addresses are increasing so characters will be written left to right The public function lcd_putchar takes arguments that make it suitable for be ing passed as a put function pointer to the stdio stream initialization functions and macros fdevopen FDEV SETUP STREAM etc Thus it takes two argu ments the character to display itself and a reference to the underlying stream object and it is expected to return 0 upon success This function remembers the last unprocessed newline character seen in the function local static variable nl seen If a newline character is encountered it will simply set this variable to a true value and return to the caller As soon as the first non newline character is to be displayed with n1 seen still true the LCD controller is told to clear the display put the cursor home and restart at SRAM address 0 other characters are sent to the display Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 38 Using the standard IO facilities 331 The single static function internal variable n1 seen works for this purpose If mul tiple LCDs should be controlled using the same set of driver functions that would not work anym
422. settings are defined for these two bits If BOOT LOCK BITS 0 EXIST is defined then the two BLBO lock bits are avail able to the user and 4 mode settings are defined for these two bits If BOOT LOCK BITS 1 EXIST is defined then the two BLB1 lock bits are avail able to the user and 4 mode settings are defined for these two bits If BOOT LOCK APPLICATION TABLE BITS EXIST is defined then two lock bits are available to set the locking mode for the Application Table Section which is used in the XMEGA family If BOOT LOCK APPLICATION BITS EXIST is defined then two lock bits are available to set the locking mode for the Application Section which is used in the family If BOOT LOCK BOOT BITS EXIST is defined then two lock bits are available to set the locking mode for the Boot Loader Section which is used in the XMEGA family The AVR lockbit modes have inverted values logical 1 for an unprogrammed dis abled bit and logical for a programmed enabled bit The defined macros for each individual lock bit represent this in their definition by a bit wise inversion of a mask For example the LB MODE 3 macro is defined as define LB MODE 3 OxFC To combine the lockbit mode macros together to represent a whole byte use the bitwise AND operator like so Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 47 lt avr lock h gt Lockbit Support 248 LB MODE 3 amp BLBO MODE 2 lt
423. src and never beyond src len Returns The strnlen function returns strlen src if that 15 less than len or len if there is no 0 character among the first len characters pointed to by src 22 11 3 30 char x strpbrk const char s const char accept The strpbrk function locates the first occurrence in the string s of any of the characters in the string accept Returns The strpbrk function returns a pointer to the character in s that matches one of the characters in accept or NULL if no such character is found The terminating Zero is not considered as a part of string if one or both args are empty the result will NULL 22 11 3 31 char x strrchr const char src int val Locate character in string The strrchr function returns a pointer to the last occurrence of the character val in the string src Here character means byte these functions do not work with wide or multi byte characters Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 207 Returns The strrchr function returns a pointer to the matched character or NULL if the character is not found 22 11 3 32 char x strrev char s Reverse a string The strrev function reverses the order of the string Returns The strrev function returns a pointer to the beginning of the reversed string 22 11 3 33 char x strsep char xx sp const char delim Parse a string into tokens
424. st properly correspond after type promotion with the conversion specifier After the the following appear in sequence Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 180 Zero or more of the following flags The value should be converted to an alternate form For c d i s and u conversions this option has no effect For o conversions the precision of the number is increased to force the first character of the output string to a zero except if a zero value is printed with an explicit precision of zero For x and X conversions a non zero result has the string or OX for X conversions prepended to it 0 zero Zero padding For all conversions the converted value is padded on the left with zeros rather than blanks If a precision is given with a numeric conversion d i o u i x and X the 0 flag is ignored negative field width flag the converted value is to be left adjusted on the field boundary The converted value is padded on the right with blanks rather than on the left with blanks or zeros A overrides a 0 if both are given space A blank should be left before a positive number produced by a signed conversion d or i A sign must always be placed before a number produced by a signed conversion overrides a space if both are used optional decimal digit string specifying a minimum
425. start do clear bss loop 92 st X ri lt do_clear_bss_start gt 36 cpi 07 cpc 7 brne do real e0 rjmp vector 8 iocompat h DOWN TIMER1 vect r26 27 8 1 154 194 0x63 nli Note 1 Note 2 99 0x3a do clear bss loop Oxde main 0x108 exit Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 Asimple project 308 46 1f 92 push 1 48 Of 92 push 4a Of b6 jin EO 0x3f 5 63 4c Of 92 push r0 4e 11 24 eor rl rl Zr 92 push r18 D 3 93 push r19 54 gt B 93 push r24 static uintl16 t pwm Note 3 static uint8 t direction switch direction x Note 4 56 80 91 60 00 145 r24 0x0060 88 23 r24 r24 Gl 4 brne 48 Ox8e vector 8 0 48 gt case UP if pwm TIMER1_TOP 20 91 61 00 145 r18 0x0061 62 30 91 62 00 lds r19 0x0062 66 2t bf subi r18 OxFF 255 68 3f 4f Spet 41 9 ORFE 5255 6a 30 93 62 00 sts 0x0062 r19 6e 20 93 61 00 sts 0x0061 r18 72 83 e0 ldi r24 0x03 3 74 2f 3f cpi r18 OxFF 255 265 328 017 19 r24 78 09 I breq 66 Oxbc vector 840 76 gt if pwm 0 direction UP break OCR pwm Note 5 Ja 3b bd out 0x2b r19 43 7c 2a bd out 0 2 r18 42 7e 8f 91 pop r24 80 3f 91 pop r19 827 2 91 pop r18 84 Of 90 pop r0 86 Of be Out 0x3tf r
426. sy SPM REG amp uint8 t SPM ENABLE define boot spm busy wait do while boot busy define GET LOW FUSE BITS 0x0000 define GET BITS 0x0001 define GET EXTENDED FUSE BITS 0x0002 define GET HIGH FUSE BITS 0 0003 fidefine boot lock fuse bits get address fidefine boot signature byte get addr Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 12 avr boot h Bootloader Support Utilities 211 define boot page fill address data boot page fill normal address data define boot page erase address boot page erase normal address define boot page write address boot page write normal address define boot rww enable boot rww enable define boot lock bits set lock bits boot lock bits set lock bits define boot page fill safe address data define boot page erase safe address define boot page write safe address define boot rww enable safe define boot lock bits set safe lock bits 22 12 2 Define Documentation 22 12 21 define boot is interrupt SPM REG amp uint8 t BV SPMIE Check if the SPM interrupt is enabled 22 12 2 2 boot lock bits set lock bits boot lock bits set lock bits Set the bootloader lock bits Parameters lock bits mask of which Boot Loader Lock Bits to set Note In this context a set bit will be written to a zero value Note also that only BLBxx bi
427. t 222298 246 22 18 lt avr pgmspace h gt Program Space Utilities 249 22 18 1 Detailed Description 222 2222 249 22 18 2 Define Documentation 222 2 2 2 251 22182 Typedef Documentation 2222222 254 22 18 4 Function Documentation 256 22 19 avr power h Power Reduction Management 262 22 20Additional notes from lt avr sfr_defsh gt 265 22 21 lt avr sfr_defs h gt Special function registers 267 221 1 Detailed Description gt 26640644400 b ee x m 267 22 21 2 Define DoCuMenIAtION 2 22 222 22 268 22 22 lt avr sleep h gt Power Management and Sleep 260 22 22 1 Detailed Description 522222225425 52 5 269 22 22 2 Function Documentation 270 22 23 lt avr version h gt avr libc version macros 271 22 23 Detailed Description lt lt lt ros m ee be ee tad 271 22 23 2 Define Documentation 2 272 2224 avr wdt h Watchdog timer handling 272 22 24 Detaded Description lt sem mm mm Rs 272 22 24 2 Define Documentation lt lt lt o c espars ortan o 274 22 25 lt util atomic h gt Atomically and Non Atomically Executed Code Blocks276 22 25 1 Detailed Description gt gt sss RR REA 276 22222 uro o9 oo 222559555 278 22 26 lt util crc16 h gt CRC Computations 280
428. t val char strsep P char sp PGM P delim size tstrspn P const char s PGM P accept PURE char strstr P const char PGM P ATTR PURE 24 34 2 Define Documentation 24 34 2 1 define ELPM classic Value extension N uint32 t addr32 uint32 t addr uint8 t _ result N asm N N out 2 SUI b mov r31 SBI n t b mov r30 A1 n t N elpm n t x mov 30 r0 n t N r result N __addr32 N I SFR IO ADDR RAMPZ s Wy E30 N result N Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 34 pgmspace h File Reference 359 24 34 2 2 define ELPM dword enhanced addr Value extension N uint32 t addr32 uint32 t addr uint32 t _ result X asm N N Out 325 c1 n t movw r30 1 n t N elpm A0 Z n t elpm BO Z n t elpm CO 2 n t X elpm DO 2 n t r result addr32 N I SFR IO ADDR RAMPZ N Fr30T tes result X 24 34 2 3 define ELPM dword xmega addr Value extension N uint32 t addr32 uint32 t addr uint32 t _ result X asm N N in tmp reg 2 n t N eub m2 BEI NN HA N movw r30 1 elpm A0 Z n t N elpm 0 Z4 N elpm CO Z N elpm 5
429. t char 52 Compare two strings The strcmp function compares the two strings s1 and s2 Returns The strcmp function returns an integer less than equal to or greater than zero if s1 is found respectively to be less than to match or be greater than s2 A consequence of the ordering used by strcmp is that if s1 is an initial substring of S2 then s1 is considered to be less than s2 22 11 3 18 char x strcpy char x dest const char src Copy a string The strcpy function copies the string pointed to by src including the terminating 0 character to the array pointed to by dest The strings may not overlap and the destination string dest must be large enough to receive the copy Returns The strcpy function returns a pointer to the destination string dest Note If the destination string of a strcpy is not large enough that is if the programmer was stupid lazy and failed to check the size before copying then anything might happen Overflowing fixed length strings is a favourite cracker technique 22 11 3 19 size t strcspn const char s const char x reject The strcspn function calculates the length of the initial segment of s which consists entirely of characters not in re ject Returns The strcspn function returns the number of characters in the initial segment of s which are not in the string reject The terminating zero is not considered as a part of string 22 11 3 20 char x strd
430. t cover file written completely in assembler language refer to avr libc and assembler programs for this Copyright C 2001 2002 by egnite Software GmbH Permission is granted to copy and distribute verbatim copies of this manual provided that the copyright notice and this permission notice are preserved on all copies Permis sion is granted to copy and distribute modified versions of this manual provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7 1 asm Statement 37 This document describes version 3 3 of the compiler There may be some parts which hadn t been completely understood by the author himself and not all samples had been tested so far Because the author is German and not familiar with the English language there are definitely some typos and syntax errors in the text As a programmer the author knows that a wrong documentation sometimes might be worse than none Any way he decided to offer his little knowledge to the public in the hope to get enough response to improve this document Feel free to contact the author via e mail For the latest release check http www ethernut de Herne 17th of May 2002 Harald Kipp harald kipp at egnite de Note As of 26th of July 2002 this document has been merged into the documentation for avr libc The latest version is now available at
431. t for uint16 t 22 5 2 43 define PRIX32 IX uppercase hexadecimal printf format for uint32 t 22 5 2 44 define PRIx32 Ix hexadecimal printf format for uint32 t 22 5 2 45 define PRIX8 X uppercase hexadecimal printf format for uint8 t 22 5 2 46 define PRIx8 x hexadecimal printf format for uint8 t 22 5 2 47 define PRIXFASTI6 X uppercase hexadecimal printf format for uint 16 t 22 5 2 48 define PRIXFAST16 x hexadecimal printf format for uint_fast16_t 22 5 2 49 define PRIXFAST32 IX uppercase hexadecimal printf format for uint_fast32_t 22 5 2 50 define PRIXFAST32 Ix hexadecimal printf format for uint_fast32_t Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 5 lt gt Integer Type conversions 142 22 5 2 5 define PRIXFASTS X uppercase hexadecimal printf format for uint fast8 t 22 5 2 52 define PRIxFASTS x hexadecimal printf format for uint_fast8_t 22 5 2 53 define PRIXLEAST16 X uppercase hexadecimal printf format for uint_least16_t 22 5 2 54 define PRIXLEASTI6 x hexadecimal printf format for leastl t 22 5 2 55 define PRIXLEAST32 IX uppercase hexadecimal printf format for uint least32 t 22 5 2 56 define PRIXLEAST32 Ix hexadecimal printf format for uint_least32_t 22 5 2 57 define PRIXLEASTS X uppercase hexadecimal printf format for least8 t 22 5 2 58 itdefine PRIXLEASTS x hexadecim
432. tarting with GCC 4 3 RAMPZ is automatically saved for ISRs so nothing further is needed if only using interrupts Some OSes may automatically preserve RAMPZ during context switching Check the OS Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen documentation before assuming it does Otherwise protect calls with cli sei ATOMIC BLOCKY or use explicit OS locking printf printf vprintf vprintf nitel nite POA Alters flags and character count in global FILE eat Ant Use only in one thread Or if returned character eaint nnimnartant da 11 34 Why are some addresses of the EEPROM corrupted usually address zero 87 It s not clear one would ever want to do character input simultaneously from more than one thread anyway but these entries are included for completeness An effort will be made to keep this table up to date if any new issues are discovered or introduced Back to FAQ Index 11 34 Why are some addresses of the EEPROM corrupted usually address zero The two most common reason for EEPROM corruption is either writing to the EEP ROM beyond the datasheet endurance specification or resetting the AVR while an EEPROM write is in progress EEPROM writes can take up to tens of milliseconds to complete So that the CPU is not tied up for that long of time an internal state machine handles EEPROM write requests The EEPROM state machine e
433. te interrupt protection before accessing variable ctr so it is guaranteed to be consistently tested If the global interrupt state were uncer tain before entering the ATOMIC_BLOCK it should be executed with the parameter ATOMIC_RESTORESTATE rather than ATOMIC_FORCEON Defines define ATOMIC_BLOCK type define NONATOMIC_BLOCK type define ATOMIC RESTORESTATE define ATOMIC FORCEON define NONATOMIC RESTORESTATE define NONATOMIC FORCEOFF 22 25 2 Define Documentation 22 25 2 1 define ATOMIC BLOCK type Creates a block of code that is guaranteed to be executed atomically Upon entering the block the Global Interrupt Status flag in SREG is disabled and re enabled upon exiting the block from any exit path Two possible macro parameters are permitted ATOMIC RESTORESTATE and ATOMIC FORCEON 22 25 22 define ATOMIC FORCEON This is a possible parameter for ATOMIC BLOCK When used it will cause the ATOMIC BLOCK to force the state of the SREG register on exit enabling the Global Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 25 lt util atomic h gt Atomically and Non Atomically Executed Code 79 Interrupt Status flag bit This saves on flash space as the previous value of the SREG register does not need to be saved at the start of the block Care should be taken that ATOMIC FORCEON is only used when it is known that interrupts are enabled before the block s execution or wh
434. te__ section eeprom Attribute expression causing a variable to be allocated within the eeprom section 22 13 2 4 define eeprom_busy_wait do while eeprom_is_ready Loops until the eeprom is no longer busy Returns Nothing Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 43 lt avr eeprom h gt EEPROM handling 218 22 13 2 5 define eeprom_is_ready Returns 1 if EEPROM is ready for a new read write operation 0 if not 22 13 3 Function Documentation 22 13 3 1 static inline void eeprom read block void x __dst const void src size t n static Read a block of __n bytes from EEPROM address src to SRAM _ dst 22 13 3 2 static _ ATTR PURE inline uint8 t eeprom read byte const uint8 t p static Read one byte from EEPROM address p 22 13 3 3 static _ ATTR_PURE inline uint32 t eeprom read dword const uint32 static Read 32 bit double word little endian from EEPROM address p 22 13 3 4 static _ ATTR PURE inline uintl6 t eeprom read word const uint16 t static Read one 16 bit word little endian from EEPROM address p 22 13 3 5 static inline void eeprom write block const void src void dst size t n static Write a block of __n bytes to EEPROM address dst from src Note The argument order is mismatch with common functions like strcpy 22 13 3 6 static inline void eeprom write byte uint8
435. ted on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 32 lt compat deprecated h gt Deprecated items 294 specific macros that eventually resulted in inline assembly instructions performing the desired action These macros became obsolete as reading and writing IO ports can be done by simply using the IO port name in an expression and all bit manipulation including those on IO ports can be done using generic C bit manipulation operators The macros in this group simulate the historical behaviour While they are supposed to be applied to IO ports the emulation actually uses standard C methods so they could be applied to arbitrary memory locations as well define inp port port define outp val port port val define inb port port define outb port val port val define sbi port bit port 1 lt lt bit define cbi port bit port amp 1 lt lt bit 22 32 2 Define Documentation 22 32 21 define cbi port bit port amp 1 lt lt bit Deprecated Clear bit in IO port port 22 32 2 2 define enable external int mask __EICR mask Deprecated This macro gives access to the GIMSK register or EIMSK register if using an AVR Mega device or GICR register for others Although this macro is essentially the same as assigning to the register it does adapt slightly to the type of device being used This macro is unavailable if none of the registers listed above are
436. ter0 ATmegal68 ATmega48 ATmega88 AT COMPA vect OUTPUT Compare Match mega640 ATmegal280 ATmegal281 COMPAREOA A ATmega2560 ATmega2561 AT mega324P ATmegal64P ATmega644P ATmega644 ATmegal6HVA ATtiny2313 ATtiny48 ATtiny261 ATtiny461 AT tiny861 AT9OUSB162 9005 82 AT90USB1287 AT90USB1286 AT90USB647 AT90USB646 TIMERO SIG Timer Counter 0 AT90PWM3 AT90PWM2 AT90PWMI COMPB vect OUTPUT Compare Match ATmegal284P ATmegal68P ATmega328P COMPAREOB B ATmega32HVB ATmega48P AT SIG mega88P ATmegal68 ATmega48 AT OUTPUT mega88 ATmega640 ATmega1280 COMPAREO ATmegal281 ATmega2560 ATmega2561 B ATmega324P ATmegal64P ATmega644P ATmega644 ATmegal6HVA ATtiny2313 48 ATtiny261 ATtiny461 AT tiny861 AT9OUSB162 9005 82 9005 1287 AT90USB1286 AT90USB647 AT90USB646 TIMERO SIG Timer Counter0 AT90PWM3 AT90PWM2 AT90PWM 1 COMP A OUTPUT Compare Match vect COMPAREOA A SIG OUTPUT COMPAREO A TIMERO SIG Timer Counter0 AT90CAN128 AT90CAN32 AT90CANGA COMP_vect OUTPUT_ Compare Match ATmegal03 ATmegal28 ATmegal6 AT COMPAREO megal61 ATmegal62 ATmegal65 megal65P ATmegal69 ATmegal69P AT mega32 ATmega323 ATmega325 AT mega3250 ATmega3250P ATmega329 AT mega3290 ATmega3290P ATmega64 AT mega645 ATmega6450 ATmega649 AT mega6490 ATmega8515 ATmega8535 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 15 lt
437. ternal RAM this will be larger than RAMEND E2END The last EEPROM address FLASHEND The last byte address in the Flash program space SPM PAGESIZE For devices with bootloader support the flash pagesize in bytes to be used for the SPM instruction E2PAGESIZE The size of the EEPROM page 22 7 lt avr lock h gt Lockbit Support Introduction Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 47 lt avr lock h gt Lockbit Support 247 The Lockbit API allows a user to specify the lockbit settings for the specific AVR device they are compiling for These lockbit settings will be placed in a special section in the ELF output file after linking Programming tools can take advantage of the lockbit information embedded in the ELF file by extracting this information and determining if the lockbits need to be programmed after programming the Flash and EEPROM memories This also allows a single ELF file to contain all the information needed to program an AVR To use the Lockbit API include the lt avr io h gt header file which in turn automatically includes the individual I O header file and the lt avr lock h gt file These other two files provides everything necessary to set the AVR lockbits Lockbit API Each I O header file may define up to 3 macros that controls what kinds of lockbits are available to the user If LOCK BITS EXIST is defined then two lock bits are available to the user and 3 mode
438. terrupt request when using interrupt handlers The notable exception is the TWI interface where clearing the interrupt indicates to proceed with the TWI bus hardware handshake so it s never done automatically However if no normal interrupt handlers are to be used or in order to make extra sure any pending interrupt gets cleared before re activating global interrupts e g an external edge triggered one it can be necessary to explicitly clear the respective hardware interrupt bit by software This is usually done by writing a logical 1 into this bit position This seems to be illogical at first the bit position already carries a logical 1 when reading it so why does writing a logical 1 to it clear the interrupt bit The solution is simple writing a logical 1 to it requires only a single OUT instruction and it is clear that only this single interrupt request bit will be cleared There is no need to perform a read modify write cycle like an SBI instruction since all bits in these control registers are interrupt bits and writing a logical O to the remaining bits as it is done by the simple OUT instruction will not alter them so there is no risk of any race condition that might accidentally clear another interrupt request bit So instead of writing TIFR BV TOVO wrong x simply use TIFR _BV TOVO Back to FAQ Index 11 26 Why have programmed fuses the bit value 0 Basically fuses are just a bit in a special EEPROM
439. terrupt will be suspended and the upper layer will be notified that the incoming PWM measurement data is available Function main first initializes the hardware by calling ioinit and then waits until some incoming PWM value is available If it is the output PWM will be adjusted by computing the relative value of the incoming PWM Finally the pin change interrupt is re enabled and the CPU is put to sleep 22 35 2 2 project h order for the interrupt service routines to be as fast as pos sible some of the CPU registers are set aside completely for use by these routines so the compiler would not use them for C code This is arranged for in project h The file is divided into one section that will be used by the assembly source code and another one to be used by C code The assembly part is distinguished by the prepro cessing macro __ASSEMBLER__ which will be automatically set by the compiler Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 35 Combining C and assembly source files 300 front end when preprocessing an assembly language file and it contains just macros that give symbolic names to a number of CPU registers The preprocessor will then replace the symbolic names by their right hand side definitions before calling the as sembler In code the compiler needs to see variable declarations for these objects This is done by using declarations that bind a variable permanently to a
440. th stdout and stderr fdevopen uses calloc und thus malloc in order to allocate the storage for the new stream Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 176 Note If the macro _ STDIO_FDEVOPEN_COMPAT_12 is declared before including lt stdio h gt a function prototype for fdevopen will be chosen that is backwards compatible with avr libc version 1 2 and before This is solely intented for pro viding a simple migration path without the need to immediately change all source code Do not use for new code 22 9 3 4 int feof FILE stream Test the end of file flag of st ream This flag can only be cleared by acall to clearerr 22 9 3 5 int ferror FILE x stream Test the error flag of st ream This flag can only be cleared by a call to clearerr 22 9 3 6 int fflush FILE x stream Flush stream This is a null operation provided for source code compatibility only as the standard IO implementation currently does not perform any buffering 22 9 3 7 int fgetc FILE x stream The function fgetc reads a character from st ream It returns the character or EOF in case end of file was encountered or an error occurred The routines feof or ferror must be used to distinguish between both situations 22 9 3 8 char fgets char x str int size FILE x __ stream Read at most size 1 bytes from st ream until a newline character was enc
441. that the right hand side consists of a CPP macro which will be substituted by its value 6 in this case before actually being passed to the assembler Note 4 The assembler uses integer operations in the host defined integer size 32 bits or longer when evaluating expressions This is in contrast to the C compiler that uses the C type int by default in order to calculate constant integer expressions In order to get a 100 KHz output we need to toggle the PD6 line 200000 times per second Since we use timer 0 without any prescaling options in order to get the de sired frequency and accuracy we already run into serious timing considerations while accepting and processing the timer overflow interrupt the timer already continues to count When pre loading the TCCNTO register we therefore have to account for the number of clock cycles required for interrupt acknowledge and for the instructions to reload TCCNTO 4 clock cycles for interrupt acknowledge 2 cycles for the jump from the interrupt vector 2 cycles for the 2 instructions that reload TCCNTO This is what the constant fuzz is for Note 5 External functions need to be declared to be global main is the application entry point that will be jumped to from the ininitalization routine in crts1200 0 Note 6 The main loop is just a single jump back to itself Square wave generation itself is completely handled by the timer 0 overflow interrupt service A sleep instruction using
442. the most common software development toolchain available on Unix and Linux systems Hopefully the following overview will be helpful in putting everything in perspective 2 2 FSF and GNU According to its website the Free Software Foundation FSF established in 1985 is dedicated to promoting computer users rights to use study copy modify and redis tribute computer programs The FSF promotes the development and use of free soft ware particularly the GNU operating system used widely in its GNU Linux variant The FSF remains the primary sponsor of the GNU project The GNU Project was launched in 1984 to develop a complete Unix like operating system which is free software the GNU system GNU is a recursive acronym for GNU s Not Unix it is pronounced guh noo approximately like canoe One of the main projects of the GNU system is the GNU Compiler Collection or GCC and its sister project GNU Binutils These two open source projects provide a foun dation for a software development toolchain Note that these projects were designed to originally run on Unix like systems 2 3 GCC GCC stands for GNU Compiler Collection GCC is highly flexible compiler system It has different compiler front ends for different languages It has many back ends that generate assembly code for many different processors and host operating systems All share a common middle end containing the generic parts of the compiler including a lot of opti
443. the definitions for the API The LOCKBITS macro defines a global variable to store the lockbit data This variable is assigned to its own linker section Assign the desired lockbit values immediately in the variable initialization The lock section in the ELF file will get its values from the initial variable assignment ONLY This means that you can NOT assign values to this variable in functions and the new values will not be put into the ELF lock section The global variable is declared in the LOCKBITS macro has two leading underscores which means that it is reserved for the implementation meaning the library so it will not conflict with a user named variable You must initialize the lockbit variable to some meaningful value even if it is the de fault value This is because the lockbits default to a logical 1 meaning unprogrammed Normal uninitialized data defaults to all locgial zeros So it is vital that all lockbits are initialized even with default data If they are not then the lockbits may not pro grammed to the desired settings and can possibly put your device into an unrecoverable state Be sure to have the mmcu device flag in your compile command line and your linker command line to have the correct device selected and to have the correct I O header file included when you include lt avr io h gt You can print out the contents of the lock section in the ELF file by using this command line avr objdump s j lock EL
444. thing to do is this finclude avr pgmspace h PGM P array 2 PROGMEM Foo Bar int main void char buf 32 strcpy P buf array 1 return 0 The result is not what you want though What you end up with is the array stored in ROM while the individual strings end up in RAM in the data section To work around this you need to do something like this finclude avr pgmspace h const char foo PROGMEM Foo const char bar PROGMEM Bar PGM P array 2 PROGMEM foo bar int main void Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 11 15 How do I put an array of strings completely in ROM 73 char buf 32 PGM P p int i memcpy P amp p amp array i sizeof PGM P strcpy P buf p return 0 Looking at the disassembly of the resulting object file we see that array is in flash as such 00000026 array 2 67 2 00 0x002e 28 2 00 word 0 002 0000002 bar 2 42 61 72 00 Bar 0000002e foo 2e 46 6f 6f 00 Foo foo is at addr 0x002e bar is at addr 0x002a array is at addr 0x0026 Then in main we see this memcpy P amp p amp array i sizeof 70 66 Of add r22 r22 72 77 1f adc L235 23 74 6a 5d subi r22 OxDA 2332118 76 sbci r23 OxFF 7 255 8 42 0 ldi r20 0x02 2 50 0 ldi r21 0x00 0 des ce 01 movw r24 r28 7e 81 96 adiw r24 0x21 33
445. tion data and two symbols will be created named binary foo bin start and binary foo bin end These symbols can be referred to inside a C source to access these data Ifthe goal is to have those data go to flash ROM similar to having used the PROGMEM attribute in C source code the sections have to be renamed while copying and it s also useful to set the section flags avr objcopy rename section data progmem data contents alloc load readonly data I binary O elf3 Note that all this could be conveniently wired into a Makefile so whenever oo bin changes it will trigger the recreation of and a subsequent relink of the final ELF file Below are two Makefile fragments that provide rules to convert a txt file to an object file and to convert a bin file to an object file S OBJDIR 0 txt echo Converting lt cp lt tmp echo n 0 tr 0 N000 gt gt S x tmp 85 I binary O elf32 avr rename section data progmem data contents alloc load readonly data redefine sym binary tmp start redefine sym binary 5 tmp end end redefine sym binary 5 tmp size size sym x tmp Q Gecho extern const char 5 PROGMEM gt x h echo extern const char x _end PROGMEM gt gt x h Gecho extern const char size sym gt gt x h Gecho define 5 size int size sym gt gt x h Grm tm
446. tion system and different versions of the DLL On the other hand MinGW MSYS can compile code as native Win32 applications However this means that programs designed for Unix and Linux i e that use POSIX functionality will not compile as MinGW MSYS does not provide that POSIX layer for you Therefore most programs that compile on both types of host systems usually must provide some sort of abstraction layer to allow an application to be built cross platform MinGW MSYS does provide somewhat of a POSIX environment that allows you to build Unix and Linux applications as they woud normally do with a configure step and a make step Cygwin also provides such an environment This means that building the AVR toolchain is very similar to how it is built in Linux described above The main differences are in what the PATH environment variable gets set to pathname differences and the tools that are required to build the projects under Windows We ll take a look at the tools next 12 12 Tools Required for Building the Toolchain for Windows These are the tools that are currently used to build WinAVR 20070525 or later This list may change either the version of the tools or the tools themselves as improve ments are made MinGW MSYS http downloads sourceforge net mingw MinGW 5 1 4 exe use mirror superb east gt Put MinGW 5 1 4 exe in its own directory for example C MinGWSetup Run MinGW 5 1 4 exe Select Download and inst
447. to increase code size Note that at O3 gcc attempts to inline all simple functions For the AVR target this will normally constitute a large pessimization due to the code increasement The only other optimization turned on with O3 is frename registers which could rather be enabled manually instead A simple O option is equivalent to 01 Note also that turning off all optimizations will prevent some warnings from being issued since the generation of those warnings depends on code analysis steps that are only performed when optimizing unreachable code unused variables See also the appropriate FAQ entry for issues regarding debugging optimized code Wa assembler options e WL1 linker options Pass the listed options to the assembler or linker respectively 4 4 Generate debugging information that can be used by avr gdb ffreestanding Assume a freestanding environment as per the C standard This turns off automatic builtin functions though they can still be reached by prepending builtin to Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 13 1 Options for the C compiler avr gcc 111 the actual function name It also makes the compiler not complain when main is declared with a void return type which makes some sense in a microcontroller environment where the application cannot meaningfully provide a return value to its environment in most cases main won t even return any
448. to access read the data will no longer work The code that gets generated will retrieve the data that 15 located at the address of the mydata array plus offsets indexed by the i and 3 variables However the final address that is calculated where to the retrieve the data points to the Data Space Not the Program Space where the data is actually located It is likely that you will be retrieving some garbage The problem is that AVR GCC does not intrinsically know that the data resides in the Program Space The solution is fairly simple The rule of thumb for accessing data stored in the Program Space is to access the data as you normally would as if the variable is stored in Data Space like so byte mydata i 3 then take the address of the data byte amp mydata il j 1 then use the appropriate read macro and the address of your data becomes the parameter to that macro byte pgm read byte amp mydata i l jl Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 5 4 Storing and Retrieving Strings the Program Space 28 The read macros take an address that points to the Program Space and re trieves the data that is stored at that address This is why you take the address of the offset into the array This address becomes the parameter to the macro so it can gen erate the correct code to retrieve the data from the Program Space There are different read macros to read diff
449. to the HD44780 LCD controller Public functions are available to initialize the controller into 4 bit mode to wait for the controller s busy bit to be clear and to read or write one byte from or to the controller As there are two different forms of controller IO one to send a command or receive the controller status RS signal clear and one to send or receive data to from the controller s SRAM RS asserted macros are provided that build on the mentioned function primitives Finally macros are provided for all the controller commands to allow them to be used symbolically The HD44780 datasheet explains these basic functions of the controller in more detail 22 38 3 4 hd44780 c This is the implementation of the low level HD44780 LCD controller driver On top a few preprocessor glueing tricks are used to establish symbolic access to the hardware port pins the LCD controller is attached to based on the application s definitions made in defines h The h 44780 pulse e function asserts a short pulse to the controller s E en able pin Since reading back the data asserted by the LCD controller needs to be performed while E is active this function reads and returns the input data if the param eter readback is true When called with a compile time constant parameter that is false the compiler will completely eliminate the unused readback operation as well as the return value as part of its optimizations As the controller is used
450. to the resulting string dest 22 18 4 19 int strncmp P const char x s1 P 52 size t n The strncmp_P function is similar to stremp_P except it only compares the first at most n characters of s1 and s2 Returns The strncmp function returns an integer less than equal to or greater than zero if s1 or the first n bytes thereof is found respectively to be less than to match or be greater than s2 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 18 avr pgmspace h Program Space Utilities 261 22 18 4 20 char x strncpy P char dest src size The strncpy function is similar to strcpy except that not more than n bytes of src are copied Thus if there is no null byte among the first n bytes of src the result will not be null terminated In the case where the length of src is less than that of n the remainder of dest will be padded with nulls Returns The strncpy function returns a pointer to the destination string dest 22 18 4 21 size t strnlen P P src size t len Determine the length of a fixed size string The strnlen function is similar to strnlen except that src is a pointer to a string in program space Returns The strnlen_P function returns strlen_P src if that is less than len or len if there is no 0 character among the first 1 characters pointed to by src 22 18 4 22 char x strpbrk P const ch
451. tration purposes st din and stdout are connected to a stream that will perform UART IO while stderr is arranged to output its data to the LCD text display Finally a main loop follows that accepts simple commands entered via the RS 232 connection and performs a few simple actions based on the commands First a prompt is sent out using printf which takes a program space string The string is read into an internal buffer as one line of input using fgets While it would be also possible to use get s which implicitly reads from stdin get s has no control that the user s input does not overflow the input buffer provided so it should never be used at all If fgets fails to read anything the main loop is left Of course normally the main loop of a microcontroller application is supposed to never finish but again for demon strational purposes this explains the error handling of stdio fgets will return NULL in case of an input error or end of file condition on input Both these condi tions are in the domain of the function that is used to establish the stream uart_ putchar in this case In short this function returns EOF in case of a serial line break condition extended start condition has been recognized on the serial line Common PC terminal programs allow to assert this condition as some kind of out of band signalling on an RS 232 connection When leaving the main loop a goodbye message is sent to stan
452. truction right at the beginning of an interrupt handler by declaring the handler the following way ISR XXX_vect ISR_NOBLOCK where XXX_vect is the name of a valid interrupt vector for the MCU type in question as explained below Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 45 lt avr interrupt h gt Interrupts 224 Two vectors sharing the same code In some circumstances the actions to be taken upon two different interrupts might be completely identical so a single implementa tion for the ISR would suffice For example pin change interrupts arriving from two different ports could logically signal an event that is independent from the actual port and thus interrupt vector where it happened Sharing interrupt vector code can be accomplished using the ISR_ALIASOF attribute to the ISR macro ISR PCINTO_vect Code to handle the event ISR PCINT1 vect ISR ALIASOF PCINTO vect Note There is no body to the aliased ISR Note that the ISR_ALIASOF feature requires GCC 4 2 or above or a patched version of GCC 4 1 x See the documentation of the 5 ALIAS macro for an implementa tion which is less elegant but could be applied to all compiler versions Empty interrupt service routines In rare circumstances in interrupt vector does not need any code to be implemented at all The vector must be declared anyway so when the interrupt triggers it won t execute the BADISR vect code w
453. ts can be programmed by this command For example to disallow the SPM instruction from writing to the Boot Loader memory section of flash you would use this macro as such boot lock bits set BV BLB11 Note Like any lock bits the Boot Loader Lock Bits once set cannot be cleared again except by a chip erase which will in turn also erase the boot loader itself Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 12 avr boot h Bootloader Support Utilities 212 22 12 2 3 define boot lock bits set safe lock bits Value do boot spm busy wait X eeprom busy wait boot lock bits set lock bits N while 0 Same as boot lock bits set except waits for eeprom and spm operations to complete before setting the lock bits 22 12 2 4 boot lock fuse bits get address result Value extension N uint8 t result N asm volatile N N Idi r30 3 n t N ldi r31 O n t sts 1 2 n t N lpm 0 Z n t gt ex Lo result X i SFR MEM ADDR SPM REG N UINES_t LOCK BITS SET N M address N ro r30 r31 Read the lock or fuse bits at address Parameter address can be any of GET LOW FUSE BITS GET LOCK BITS GET EXTENDED FUSE BITS or GET HIGH FUSE BITS Note The lock and fuse bits returned are the physical values ie a bit returned as 0 means the corresponding fuse or
454. two cycle penalty for the aliased vector compared to the ISR the vector is aliased to due to the JMP RJMP opcode used Deprecated For new code the use of ISR ISR_ALIASOF is recommended Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 45 lt avr interrupt h gt Interrupts 244 Example ISR INTO_vect PORTB 42 ISR ALIAS INT1 vect INTO vect 22 15 2 6 define ISR ALIASOF target vector include avr interrupt h The ISR is linked to another ISR specified by the vect parameter This is compatible with GCC 4 2 and greater only Use this attribute in the attributes parameter of the ISR macro 22 15 2 7 define ISR BLOCK f include avr interrupt h Identical to an ISR with no attributes specified Global interrupts are initially disabled by the AVR hardware when entering the ISR without the compiler modifying this state Use this attribute in the attributes parameter of the ISR macro 22 15 2 8 define ISR NAKED f include avr interrupt h ISR is created with no prologue or epilogue code The user code is responsible for preservation of the machine state including the SREG register as well as placing a reti at the end of the interrupt routine Use this attribute in the attributes parameter of the ISR macro 22 15 2 9 ISR NOBLOCK f include lt avr interrupt h gt ISR runs with global interrupts initially enabled The interrupt enable flag is activate
455. u define PRIULEAST32 lu define PRIuFAST32 lu define PRIx32 Ix define PRIXLEAST32 Ix define PRIXFAST32 1 define PRIX32 IX define PRIXLEAST322 IX define PRIXFAST32 IX define PRIoPTR PRIo16 define PRIuPTR PRIu16 define PRIxPTR PRIx16 define PRIXPTR PRIX16 define SCNd16 d define SCNdLEAST16 d define SCNdFAST 16 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 24 17 inttypes h File Reference 351 define SCNi16 1 define SCNiLEAST16 1 define SCNiFAST16 1 define SCNd32 Id define SCNdLEAST32 Id define SCNdFAST32 Id define SCNi32 li define SCNILEAST32 li define SCNiFAST32 li define SCNdPTR SCNd16 define SCNiPTR SCNi16 define SCNo16 o define SCNoLEAST16 o define SCNoFAST16 o define SCNul6 u define SCNuLEASTI6 define SCNuFAST 16 u define SCNx16 x define SCNxLEAST16 x define SCNxFAST16 define SCNo32 lo define SCNoLEAST32 1o define SCNoFAST32 lo define SCNu32 lu define SCNuLEAST32 lu define SCNuFAST32 lu define SCNx32 Ix define SCNxLEAST32 Ix define SCNxFAST32 Ix define SCNoPTR SCNol6 define SCNuPTR SCNu16 define SCNxPTR SCNx16 Typedefs Far pointers for memory access gt 64K typedef int32_t int_farptr_t typedef uint32_t uint_farptr_t Generated on Fri Mar 13 16 47 36 2009 for avr libe by Doxygen 24 18 io h File Reference 352 24 18 io h File Reference
456. ugh Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 A simple project 304 22 36 2 Source Code gt ob fin fin enu ISR voi ioi THE BEER WARE LICENSE Revision 42 lt joerg FreeBSD ORG gt wrote this file long as you retain this notice you can do whatever you want with this stuff If we meet some day and you think this stuff is worth it you can buy me a beer in return Joerg Wunsch Simple AVR demonstration Controls a LED that can be directly connected from OC1 OC1A to GND The brightness of the LED is controlled with the PWM After each period of the PWM the PWM value is either incremented or decremented that s all Id demo c v 1 9 2006 01 05 21 30 10 joerg wunsch Exp clude lt inttypes h gt clude lt avr io h gt clude avr interrupt h clude lt avr sleep h gt clude iocompat h Note 1 m UP DOWN TIMER1 OVF vect x Note 2 x static uintl16 t pwm Note 3 static uint8 t direction switch direction Note 4 case UP if pwm direction DOWN break case DOWN if pwm 0 direction UP break OCR pwm Note 5 d nit void Note 6 Timer 1 is 10 bit PWM 8 bit PWM on some ATtinys TCCRIA 1 INIT Start timer 1 x NB TCCRIA and TCCRIB could actua
457. umentation provides mnemonic names for the various bits in the IO registers and the AVR device specific IO definitions reflect these names in definitions for numerical constants a way is needed to convert a bit number usually within a byte register into a byte value that can be assigned directly to the register However sometimes the direct bit numbers are needed as well e g in an SBI instruction so the definitions cannot usefully be made as byte values in the first place So in order to access a particular bit number as a byte value use the BV macro Of course the implementation of this macro is just the usual bit shift which is done by the compiler anyway thus doesn t impose any run time penalty so the following applies _BV 3 gt 1 lt lt 3 gt 0x08 However using the macro often makes the program better readable BV stands for bit value in case someone might ask you Example clock timer 2 with full IO clock CS2x 0b001 toggle OC2 output on compare match COM2x 0b01 and clear timer on compare match CTC2 1 Make OC2 PD7 an output TCCR2 _BV COM20 _BV CTC2 _BV CS20 DDRD _BV PD7 Back to FAQ Index 11 7 I use C the AVR Basically yes C is supported assuming your compiler has been configured and compiled to support it of course Source files ending in cc cpp or C will automati cally cause the compiler frontend to invoke the C compiler Alternatively
458. up const char s1 Duplicate a string The strdup function allocates memory and copies into it the string addressed by sl including the terminating null character Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 1 lt string h gt Strings 204 Warning The strdup function calls malloc to allocate the memory for the duplicated string The user is responsible for freeing the memory by calling free Returns The strdup function returns a pointer to the resulting string dest If malloc cannot allocate enough storage for the string strdup will return NULL Warning Be sure to check the return value of the strdup function to make sure that the function has succeeded in allocating the memory 22 11 3 21 size tstrlcat char dst const char src size t siz Concatenate two strings Appends src to string dst of size siz unlike strncat siz is the full size of dst not space left At most siz 1 characters will be copied Always NULL terminates unless siz lt strlen dst Returns The strlcat function returns strlen src MIN siz strlen initial dst If retval gt siz truncation occurred 22 11 3 22 size_t strlcpy char x dst const char src size_t siz Copy a string Copy src to string dst of size siz At most siz 1 characters will be copied Always NULL terminates unless siz 0 Returns The strlcpy function returns strlen src If retval gt siz tru
459. up must be of type FILE The arguments put and get are identical to those that need to be passed to fdevopen The rwflag argument can take one of the values FDEV SETUP READ FDEV SETUP WRITE or FDEV SETUP RW for read write or read write intent respec tively Note No assignments to the standard streams will be performed by fdev setup stream If standard streams are to be used these need to be assigned by the user See also under Running stdio without malloc Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 174 22 9 2 12 define FILE struct file FILE is the opaque structure that is passed around between the various standard IO functions 22 9 2 13 define getc __stream fgetc __stream The macro getc used to be a fast macro implementation with a functionality iden tical to fgetc For space constraints in avr libc it is just an alias for fgetc 22 9 2 14 define getchar void fgetc stdin The macro get char reads a character from st din Return values and error handling is identical to fgetc 22 9 2 15 define putc c _ stream fputc c stream The macro put c used to be a fast macro implementation with a functionality iden tical to fputc For space constraints in avr libc it is just an alias for fputc 22 9 2 16 define putchar c fputc stdout The macro put char sends character c to stdout 22 0 2 17 define
460. used to tell the compiler about modifications done by the assembler code This part may be omitted all other parts are required but may be left empty If your assembler routine won t use any input or output operand two colons must still follow the assembler code string A good example is a simple statement to disable interrupts asm volatile cli Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 7 2 Assembler Code 39 7 22 Assembler Code You can use the same assembler instruction mnemonics as you d use with any other assembler And you can write as many assembler statements into one code string as you like and your flash memory is able to hold Note The available assembler directives vary from one assembler to another To make it more readable you should put each statement on a seperate line asm volatile nopNnNt nop n t 40 The linefeed and tab characters will make the assembler listing generated by the com piler more readable It may look a bit odd for the first time but that s the way the compiler creates it s own assembler code You may also make use of some special registers Symbol Register _ SREG Status register at address Ox3F Stack pointer high byte at address OX3E ASP Stack pointer low byte at address 0x3D tmp reg Register rO used for temporary storage zero reg Register r1 always ze
461. usr local with mpfr usr local enable doc disable libssp 2 gt amp 1 tee package configure log Make make all html install 2 gt amp 1 tee package make log Manually copy the HTML documentation from the source code tree to the installation tree avr libc Open source code package Configure and build at the top of the source code tree Set PATH in order usr local bin mingw bin bin lt MikTex executables gt lt install directory gt bin lt Doxygen executables gt lt NetPBM executables gt lt fig2dev executable lt Ghostscript executables gt c cygwin bin Xo X X X X X Configure configure host avr prefix installdir enable doc disable versioned doc enable html doc enable pdf doc enable man doc mandir installdir man datadir installdir 2 gt amp 1 tee Spackage configure log Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 12 13 Building the Toolchain for Windows 101 Make make all install 2 gt amp 1 tee package make log Manually change location of man page documentation Move the examples to the top level of the install tree Convert line endings in examples to Windows line endings Convert line endings in header files to Windows line endings AVRDUDE Open source code package Configure and build at the top of the source code tree Set PATH in o
462. ut 2000 characters at 9600 Bd they might block for too long The loop itself then acts on the interrupt indication bitfields as appropriate and will eventually put the CPU on sleep at its end to conserve power The first interrupt bit that is handled is the software timer at a frequency of approx imately 100 Hz The CLOCKOUT pin will be toggled here so e g an oscilloscope can be used on that pin to measure the accuracy of our software clock Then the LED flasher for LED2 We are alive LED is built It will flash that LED for about 50 ms and pause it for another 950 ms Various actions depending on the operation mode follow Finally the 3 second backup timer is implemented that will write the PVM value back to EEPROM once it is not changing anymore The ADC interrupt will just adjust the PWM value only Finally the UART Rx interrupt will dispatch on the last character received from the UART the string literals that are used as informational messages within main are placed in program memory so no SRAM needs to be allocated for them This is done by using the PSTR macro and passing the string to printstr 22 37 4 The source code The source code is installed under Sprefix share doc avr libc examples largedemo largedemo c where prefix is a configuration option For Unix systems it is usually set to either usr usr local Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 38 Usi
463. utput compare match or 1 for older devices pin which is used to control the LED varies between different AVRs The file iocompat h tries to abstract between all this differences using some preprocessor ifdef statements so the actual program itself can operate on a common set of symbolic names The macros defined by that file are OCR the name of the OCR register used to control the PWM usually either or OCR1A DDROC the name of the DDR data direction register for the OC output TIMI the pin number of the OCI A output within its port TOP the TOP value of the timer used for the PWM 1023 for 10 bit PWMs 255 for devices that can only handle an 8 bit PWM TIMI INIT the initialization bits to be set into control register 1A in order to setup 10 bit or 8 bit phase and frequency correct PWM mode Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 A simple project 303 e TIMER1 CLOCKSOURCE the clock bits to set in the respective control regis ter to start the PWM timer usually the timer runs at full CPU clock for 10 bit PWMs while it runs on a prescaled clock for 8 bit PWMs Note 2 ISR is a macro that marks the function as an interrupt routine In this case the function will get called when timer 1 overflows Setting up interrupts is explained in greater detail in lt avr interrupt h gt Interrupts Note 3
464. val int ffsll long long __ val void memccpy void const void int size t void memchr const void int size t PURE int memcmp const void const void size t ATTR_PURE void memcpy void const void size t void memmem const void size_t const void size t PURE void memmove void const void size_t void memrchr const void int size_t PURE void memset void int size t char strcat char const char char strchr const char int PURE char strchrnul const char int PURE int strcmp const char const char X ATTR PURE char strcpy char const char int strcasecmp const char const char x ATTR_PURE char strcasestr const char const char x ATTR PURE size tstrcspn const char s const char reject ATTR_PURE char strdup const char 51 size_t strlcat char const char size_t size t strlcpy char const char size_t size t strlen const char x ATTR PURE char strlwr char char strncat char const char size_t int strncmp const char const char size t ATTR PURE char strncpy char const char size_t int strncasecmp const char const char size t ATTR_PURE size t strnlen const char size_t PURE Generated on Fri Mar 13 16 47 36 2009
465. value an int8 t can hold 22 8 2 13 define INT FASTI6 MAX INTI6 MAX largest positive value an int fast16 t can hold 22 8 2 44 define INT FAST16 MIN INT16 MIN smallest negative value an int fast16 t can hold 22 8 2 45 define INT FAST32 MAX INT32 largest positive value an int fast32 t can hold 22 8 2 16 define INT FAST32 MIN INT32 MIN smallest negative value an int fast32 t can hold 22 8 2 17 define INT FAST64 MAX INT64 MAX largest positive value an int fast64 t can hold 22 8 2 18 define INT FAST64 MIN INT64 MIN smallest negative value an int fast64 t can hold 22 8 2 19 define INT FAST8 MAX INT8 MAX largest positive value an int fast8 t can hold 22 8 2 20 define INT FAST8 MIN INT8 MIN smallest negative value an int fast8 t can hold Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h gt Standard Integer Types 161 22 8 2 21 INT LEASTI16 MAX INTI6 largest positive value an int least16 t can hold 22 8 2 22 itdefine INT LEAST16 MIN INT16 MIN smallest negative value an int least16 t can hold 22 8 2 23 define INT LEAST32 MAX INT32 largest positive value an int least32 t can hold 22 8 2 24 define INT LEAST32 MIN INT32 MIN smallest negative value an int least32 t can hold 22 8 2 25 define INT LEAST64 MAX INT64 MAX largest positive value an int least64 t can hold 22 8 2 26 define INT LEAST64 MIN INT6
466. ves other programs seamlessly to create the final output The assembler and the linker are part of another open source project called GNU Binutils GCC knows how to drive the GNU assembler gas to assemble the output of the compiler GCC knows how to drive the GNU linker Id to link all of the object modules into a final executable The two projects GCC and Binutils are very much interrelated and many of the same volunteers work on both open source projects When GCC is built for the AVR target the actual program names are prefixed with avr So the actual executable name for AVR GCC is avr gcc The name avr gcc is used in documentation and discussion when referring to the program itself and not just the whole AVR GCC system See the GCC Web Site and GCC User Manual for more information about GCC 2 4 GNU Binutils The name GNU Binutils stands for Binary Utilities It contains the GNU assembler gas and the GNU linker ld but also contains many other utilities that work with binary files that are created as part of the software development toolchain Again when these tools are built for the AVR target the actual program names are prefixed with avr For example the assembler program name for a native assembler is as even though in documentation the GNU assembler is commonly referred to as gas But when built for an AVR target it becomes avr as Below is a list of the programs that are included in Binutils avr
467. vr stdio 184 vsprintf avr stdio 184 vsprintf P avr stdio 184 wdt h 381 wdt disable avr watchdog 273 wdt enable avr watchdog 273 wdt reset avr watchdog 273 WDTO 120MS avr watchdog 273 WDTO 15 5 avr watchdog 274 WDTO 15 avr watchdog 274 WDTO 250MS avr watchdog 274 WDTO 2S avr watchdog 274 WDTO_30MS avr_watchdog 274 WDTO_4S avr_watchdog 274 WDTO 500MS avr watchdog 275 WDTO 60MS avr watchdog 275 WDTO 8S avr watchdog 275 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen
468. vr version h gt avr libc macros 270 avr wdt h Watchdog timer handling 271 lt compat deprecated h gt items 292 lt compat ina90 h gt Compatibility with IAR EWB 3 x 295 lt ctype h gt Character Operations 130 lt errno h gt System Errors 132 lt inttypes h gt Integer Type conversions 133 lt math h gt Mathematics 145 lt setjmp h gt Non local goto 152 lt stdint h gt Standard Integer Types 154 lt stdio h gt Standard IO facilities 166 lt stdlib h gt General utilities 185 lt string h gt Strings 196 lt util atomic h gt Atomically and Non Atomically Executed Code Blocks 275 lt util crc16 h gt CRC Computations 279 EEPROM handling version Deprecated lt util delay h gt Convenience functions for busy wait delay loops 282 lt util delay_basic h gt Basic busy wait delay loops 283 lt util parity h gt Parity bit generation 284 lt util setbaud h gt Helper macros for baud rate calculations 285 lt util twi h gt TWI bit mask definitions 287 PATH 88 PREFIX 88 prefix 88 BV avr sfr 267 _EEGET avr_eeprom 216 _EEPUT avr_eeprom 216 _FDEV_EOF avr_stdio 171 _FDEV_ERR avr_stdio 171 _FDEV_SETUP_READ avr_stdio 171 _FDEV_SETUP_RW avr_stdio 171 _FDEV_SETUP_WRITE avr_stdio 171 _FFS avr_string 197 AVR_LIBC_DATE avr_version 271 AVR_LIBC_DATE_STRING__ avr_version 271 AVR_LIBC_MAJOR avr_version 271 AVR_LIBC_MINOR avr_version 271 __AVR_LIBC_REVI
469. watchdog will then be disabled after the reset On newer AVRs once the watchdog is enabled then it stays enabled even after a reset For these newer AVRs a function needs to be added to the init3 section i e during the startup code before main to disable the watchdog early enough so it does not continually reset the AVR Here is some example code that creates a macro that can be called to perform a soft reset include avr wdt h define soft reset do wdt_enable WDTO_15MS for while 0 gE For newer such as the 1281 also add this function to your code to then disable the watchdog after a reset e g after a soft reset include avr wdt h Function Pototype Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 1132 Iam using floating point math Why is the compiled code so big Why does my code not work 84 void wdt init void attribute naked attribute section init3 Function Implementation void wdt init void MCUSR 0 wdt disable return Back to FAQ Index 11 32 I am using floating point math Why is the compiled code so big Why does my code not work You are not linking in the math library from AVR LibC GCC has a library that is used for floating point operations but it is not optimized for the AVR and so it generates big code or it could be incorrect This can happen even when you ar
470. way However this also turns off all optimizations normally done by the compiler which assume that functions known by a certain name behave as described by the standard E g applying the function strlen to a literal string will normally cause the compiler to immediately replace that call by the actual length of the string while with f freestanding it will always call strlen at run time e funsigned char Make any unqualfied char type an unsigned char Without this option they default to a signed char e unsigned bitfields Make any unqualified bitfield type unsigned By default they are signed fshort enums Allocate to an enum type only as many bytes as it needs for the declared range of possible values Specifically the enum type will be equivalent to the smallest integer type which has enough room fpack struct Pack all structure members together without holes no jump tables Do not generate tablejump instructions By default jump tables can be used to op timize switch statements When turned off sequences of compare statements are used instead Jump tables are usually faster to execute on average but in particular for switch statements where most of the jumps would go to the default label they might waste a bit of flash memory NOTE The tablejump instructions use the LPM assembler instruction for access to jump tables Always use no jump tables switch if compiling a bootloader fo
471. will be the letter a If radix is 10 and val is negative a minus sign will be prepended The itoa function returns the pointer passed as s 22 10 4 14 long labs long i The labs function computes the absolute value of the long integer i Note The abs and labs functions are builtins of gcc Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 192 22 10 4 15 Idiv_t Idiv long num long __denom The Idiv function computes the value num denom and returns the quotient and re mainder in a structure named 1div t that contains two long integer members named quot and rem 22 10 4 16 char long int val char x 5 int radix Convert a long integer to a string The function Itoa converts the long integer value from val into an ASCII represen tation that will be stored under s The caller is responsible for providing sufficient storage in s Note The minimal size of the buffer s depends on the choice of radix For example if the radix is 2 binary you need to supply a buffer with a minimal length of 8 sizeof long int 1 characters i e one character for each bit plus one for the string terminator Using a larger radix will require a smaller minimal buffer size Warning If the buffer is too small you risk a buffer overflow Conversion is done using the radix as base which may be a number between 2 binary conversion and up to 36 If
472. written EEPROMs have limited write endurance The datasheet specifies the number of EEP ROM writes that are guaranteed to function across the full temperature specification of the AVR for a given byte A read should always be performed before a write to see if the value in the EEPROM actually needs to be written so not to cause unnecessary EEPROM vwear AVRs use a paging mechanism for doing EEPROM writes This is almost entirely transparent to the user with one exception When a byte is written to the EEPROM Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 1135 Why is my baud rate wrong 88 the entire EEPROM page is also transparently erased and re written which will cause wear to bytes that the programmer did not explicitly write If it is desired to extend EEPROM write lifetimes in an attempt not to exceed the datasheet EEPROM write endurance specification for a given byte then writes must be in multiples of the EEP ROM page size and not sequential bytes The EEPROM write page size varies with the device The EEPROM page size is found in the datasheet section on Memory Pro gramming generally before the Electrical Specifications near the end of the datasheet The failure mechanism for an overwritten byte page is generally one of stuck bits i e a bit will stay at a one or zero state regardless of the byte written Also a write followed by a read may return the correct data but the data will change with the
473. xpects to have all of the EEPROM registers setup then an EEPROM write request to start the process Once the EEPROM state machine has started changing EEPROM related registers during an EEPROM write is guaranteed to corrupt the EEPROM write process The datasheet always shows the proper way to tell when a write is in progress so that the registers are not changed by the user s program The EEPROM state machine will always complete the write in progress unless power is removed from the device As with all EEPROM technology if power fails during an EEPROM write the state of the byte being written is undefined In older generation AVRs the EEPROM Address Register EEAR is initialized to zero on reset be it from Brown Out Detect Watchdog or the Reset Pin If an EEPROM write has just started at the time of the reset the write will be completed but now at address zero instead of the requested address If the reset occurs later in the write process both the requested address and address zero may be corrupted To distinguish which AVRs may exhibit the corrupt of address zero while a write is in process during a reset look at the initial value section for the EEPROM Address Register If EEAR shows the initial value as 0x00 or 0x0000 then address zero and possibly the one being written will be corrupted Newer parts show the initial value as undefined these will not corrupt address zero during a reset unless it was address zero that was being
474. xternal memory interface Depending on the device to be used and the application details further registers affecting the external memory operation like XMCRA and XMCRB and or further bits in MCUCR might be configured Refer to the datasheet for details If the external RAM is going to be used to store the variables from the C program 1 e the data and or bss segment in that memory area it is essential to set up the external memory interface early during the device initialization so the initialization of these variable will take place Refer to How to modify MCUCR or WDTCR early for a description how to do this using few lines of assembler code or to the chapter about memory sections for an example written in C The explanation of malloc contains a discussion about the use of internal RAM vs external RAM in particular with respect to the various possible locations of the heap area reserved for malloc It also explains the linker command line options that are required to move the memory regions away from their respective standard locations in internal RAM Finally if the application simply wants to use the additional RAM for private data storage kept outside the domain of the C compiler e g through a char variable initialized directly to a particular address it would be sufficient to defer the initializa tion of the external RAM interface to the beginning of main so no tweaking of the init3 section is necessary The s
475. xygen INDEX fdevopen avr stdio 174 fdevopen c 347 fdim avr math 148 feof avr stdio 175 ferror avr stdio 175 fflush avr_stdio 175 ffs avr_string 198 ffs S 347 ffsl avr string 198 ffsl S 347 ffsll avr_string 198 ffsll S 347 fgetc avr_stdio 175 fgets avr_stdio 175 FILE avr_stdio 172 floor avr_math 148 fma avr_math 148 fmax avr_math 148 fmin avr_math 148 fmod avr_math 148 fprintf avr_stdio 175 fprintf_P avr_stdio 175 fputc avr stdio 176 fputs avr stdio 176 fputs P avr stdio 176 fread avr stdio 176 free avr stdlib 190 frexp avr math 148 fscanf avr stdio 176 fscanf P avr stdio 176 fuse h 347 fwrite avr stdio 176 GET EXTENDED FUSE BITS avr boot 214 GET HIGH FUSE BITS avr boot 214 GET LOCK BITS avr boot 215 GET LOW FUSE BITS avr boot 215 getc avr stdio 173 getchar avr stdio 173 gets avr stdio 176 hypot avr math 149 inb deprecated items 293 INFINITY avr math 146 inp deprecated items 293 installation 87 installation avarice 93 installation avr libc 91 installation avrdude 92 installation avrprog 92 installation binutils 89 installation gcc 91 Installation gdb 92 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen INDEX 394 installation simulavr 93 INTI6 C avr stdint 158 INTI6 MAX avr stdint 158 INT16 MIN avr stdint 158 10116 t avr stdint 163
476. y listed Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 2 8 GDB Insight DDD 14 2 8 GDB Insight DDD The GNU Debugger GDB is a command line debugger that can be used with the rest of the AVR toolchain Insight is GDB plus a GUI written in Tcl Tk Both GDB and Insight are configured for the AVR and the main executables are prefixed with the target name avr gdb and avr insight There is also a text mode GUI for GDB avr gdbtui DDD Data Display Debugger is another popular GUI front end to GDB available on Unix and Linux systems 2 9 AVaRICE AVaRICE is a back end program to AVR GDB and interfaces to the Atmel JTAG In Circuit Emulator ICE to provide emulation capabilities 2 10 SimulAVR SimulAVR is an AVR simulator used as a back end with AVR GDB Unfortunately this project is currently unmaintained and could use some help 2 11 Utilities There are also other optional utilities available that may be useful to add to your toolset SRecord is a collection of powerful tools for manipulating EPROM load files It reads and writes numerous EPROM file formats and can perform many different ma nipulations MF ile is a simple Makefile generator is meant as an aid to quickly customize Make file to use for your AVR application 2 12 Toolchain Distributions Distros All of the various open source projects that comprise the entire toolchain are normally distributed as source code It is left up
477. y on RESET R1 C3 can be omitted as well leaving only the AVR the LED the bypass capacitor C4 and perhaps R2 For the ATmega8 48 88 168 use 1 pin 15 at the DIP 28 package to connect the LED to Additionally this demo has been ported to many different other AVRs The lo cation of the respective OC pin varies between different AVRs and it is mandated by the AVR hardware Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 36 A simple project 302 SCK PB7 19 m RESET MISO PB6 E MOSI PBS XTAL2 PB4 igpft OCI PB3 XTAL1 Uns 18pf 2 ss AIN1 PB1 LED5MM R2 D1 Di See note 8 Na INT1 PD3 Gkb AINO PBO 4 ICP PDE GND T1 PD5 TO PD4 INTO PD2 TXD PD1 RXD PDO AT90S2313P PRPFFE EEERRERE Figure 5 Schematic of circuit for demo project The source code is given in demo c For the sake of this example create a file called demo c containing this source code Some of the more important parts of the code are Note 1 As the AVR microcontroller series has been developed during the past years new features have been added over time Even though the basic concepts of the timer counterl are still the same as they used to be back in early 2001 when this simple demo was written initially the names of registers and bits have been changed slightly to reflect the new features Also the port and pin mapping of the o
478. y provides the setjmp and longjmp functions setjmp and longjmp are useful for dealing with errors and interrupts encountered in a low level subroutine of a program Note setjmp and longjmp make programs hard to understand and maintain If possi ble an alternative should be used longjmp can destroy changes made to global register variables see How to per manently bind a variable to a register For a very detailed discussion of setimp longjmp see Chapter 7 of Advanced Pro gramming in the UNIX Environment by W Richard Stevens Example include setjmp h jmp buf env int main void if setjmp env handle error main processing loop which calls foo some where Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 227 lt setjmp h gt Non local goto 154 void foo void blah blah blah if err longjmp env 1 Functions intsetjmp buf jmpb void longjmp jmp buf __jmpb int ret ATTR NORETURN 22 7 3 Function Documentation 22 7 2 1 void longjmp jmp buf jmpb int ret Non local jump to a saved stack context finclude set jmp h longjmp restores the environment saved by the last call of setjmp with the corre sponding jmpb argument After longjmp is completed program execution contin ues as if the corresponding call of setjmp had just returned the value ret Note longjmp cannot cause 0 to be
479. y str and a trailing newline character to stdout 22 9 3 22 int puts_P const char str Variant of puts where str resides in program memory 22 9 3 23 int scanf const char fmt The function scanf performs formatted input from stream stdin See vfscanf for details 22 9 3 24 int scanf_P const char fmt Variant of scanf where fmt resides in program memory 22 9 3 25 int snprintf char s size t n const char fmt Like sprintf but instead of assuming s to be of infinite size no more than n characters including the trailing NUL character will be converted to s Returns the number of characters that would have been written to s if there were enough space 22 9 3 26 int snprintf_P s size t const char x fmt Variant of snprintf that uses a fmt string that resides in program memory Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 9 lt stdio h gt Standard IO facilities 179 22 9 3 27 int sprintf char s const char fmt Variant of printf that sends the formatted characters to string s 22 9 3 28 int sprintf_P char s const char fmt Variant of sprintf that uses a fmt string that resides in program memory 22 9 3 29 int sscanf const char x buf const char The function sscanf performs formatted input reading the input data from the buffer pointed to by buf See vfscanf for details 22
480. y when STDC LIMIT MACROS is defined before lt stdint h gt is included define INT8 MAX Ox7f define INT8 MIN 8 MAX 1 define UINTS8 CONCAT INT8 MAX U x 2U 1U define INTI6 MAX Ox7fff define INTI6 MIN 6 MAX 1 define UINTI6 MAX CONCAT INT16 MAX U 2U 1U define INT32 MAX Ox7fffffffL define INT32 MIN CCINT32 MAX IL fdefine UINT32 MAX CONCAT INT32 U 2UL 100 define INT64 MAX 7 define INT64 MIN INT64 MAX ILL define UINT 4 MAX CONCAT INT64 MAX U x 2ULL LULL Limits of minimum width integer types define INT LEAST8 MAX 8 MAX fdefine INT LEAST8 MIN INT8 MIN define UINT LEASTS MAX UINT8 MAX define INT LEASTI6 INTI6 MAX define INT LEASTI6 MIN INT16 MIN define UINT LEASTI6 MAX UINTI6 MAX fdefine INT LEAST32 MAX INT32 MAX define INT LEAST32 MIN INT32 MIN define UINT LEAST32 MAX UINT32 fdefine INT LEAST64 MAX INT64 MAX define INT LEAST64 MIN INT64 MIN define UINT LEAST64 MAX UINT64 MAX Limits of fastest minimum width integer types define INT FAST8 MAX 8 MAX define INT FAST8 MIN INT8 MIN define UINT FASTS MAX UINT8 MAX define INT FASTI6 define INT FASTI6 MIN INT16 MIN define UINT FASTI6 MAX UINTI6 define INT FAST32 MAX INT32 Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 8 lt stdint h gt Standard
481. ze The contents of the array should be in ascending sorted order according to the compar ison function referenced by compar The compar routine is expected to have two arguments which point to the key object and to an array member in that order and should return an integer less than equal to or greater than zero if the key object is found respectively to be less than to match or be greater than the array member The bsearch function returns a pointer to a matching member of the array or a null pointer if no match is found If two members compare as equal which member is matched is unspecified Generated on Fri Mar 13 16 47 36 2009 for avr libc by Doxygen 22 10 lt stdlib h gt General utilities 190 22 10 4 7 void calloc size_t size t size Allocate nele elements of size each Identical to calling malloc using nele size as argument except the allocated memory will be cleared to zero 22 10 4 8 div tdiv int num int denom The div function computes the value num denom and returns the quotient and re mainder in a structure named div t that contains two int members named quot and rem 22 10 4 9 char dtostre double _ val char x s unsigned char _ prec un signed char flags The dtostre function converts the double value passed in val into an ASCII repre sentation that will be stored under s The caller is responsible for providing sufficient storage in s Conversion is done in the
Download Pdf Manuals
Related Search
Related Contents
Please click here to our Electric Pump TemBreak Moulded Case Circuit Breakers Kingston Technology ValueRAM 16GB 1600MHz DDR3L Commande groupée Page 1 Page 2 調達要求番号ニ 2ー2 7~ー 。 9 3-。 ー ー B-AQ SU-16T 取扱説明書 Copyright © All rights reserved.
Failed to retrieve file