- •Table of Contents
- •1. Introduction
- •2. CodeVisionAVR Integrated Development Environment
- •2.1 Working with Files
- •2.1.1 Creating a New File
- •2.1.2 Opening an Existing File
- •2.1.3 Files History
- •2.1.4 Editing a File
- •2.1.5 Saving a File
- •2.1.6 Renaming a File
- •2.1.7 Printing a File
- •2.1.8 Closing a File
- •2.1.9 Using the Navigator
- •2.1.10 Using Code Templates
- •2.1.11 Using Clipboard History
- •2.2 Working with Projects
- •2.2.1 Creating a New Project
- •2.2.2 Opening an Existing Project
- •2.2.3 Adding Notes or Comments to the Project
- •2.2.4 Configuring the Project
- •2.2.4.1 Adding or removing a File from the Project
- •2.2.4.2 Setting the C Compiler Options
- •2.2.4.3 Executing an User Specified Program before Make
- •2.2.4.4 Transferring the Compiled Program to the AVR Chip after Make
- •2.2.4.5 Executing an User Specified Program after Make
- •2.2.5 Obtaining an Executable Program
- •2.2.5.1 Checking the Project for Syntax Errors
- •2.2.5.2 Compiling the Project
- •2.2.5.3 Making the Project
- •2.2.6 Closing a Project
- •2.3 Tools
- •2.3.1 The AVR Studio Debugger
- •2.3.2 The AVR Chip Programmer
- •2.3.3 The Serial Communication Terminal
- •2.3.4 Executing User Programs
- •2.3.4.1 Configuring the Tools Menu
- •2.4 IDE Settings
- •2.4.1 The View Menu
- •2.4.2 Configuring the Editor
- •2.4.3 Configuring the Assembler
- •2.4.4 Setting the Debugger Path
- •2.4.5 AVR Chip Programmer Setup
- •2.4.6 Serial Communication Terminal Setup
- •2.5 Accessing the Help
- •2.6 Transferring the License to another computer
- •2.7 Connecting to HP InfoTech's Web Site
- •2.8 Contacting HP InfoTech by E-Mail
- •2.9 Quitting the CodeVisionAVR IDE
- •3. CodeVisionAVR C Compiler Reference
- •3.1 The Preprocessor
- •3.2 Comments
- •3.3 Reserved Keywords
- •3.4 Identifiers
- •3.5 Data Types
- •3.6 Constants
- •3.7 Variables
- •3.7.1 Specifying the SRAM Storage Address for Global Variables
- •3.7.2 Bit Variables
- •3.7.3 Allocation of Variables to Registers
- •3.7.4 Structures
- •3.7.5 Unions
- •3.7.6 Enumerations
- •3.7.7 Global Variables Memory Map File
- •3.8 Defining Data Types
- •3.9 Type Conversions
- •3.10 Operators
- •3.11 Functions
- •3.12 Pointers
- •3.13 Accessing the I/O Registers
- •3.13.1 Bit level access to the I/O Registers
- •3.14 Accessing the EEPROM
- •3.15 Using Interrupts
- •3.16 SRAM Memory Organization
- •3.17 Using an External Startup File
- •3.18 Including Assembly Language in Your Program
- •3.18.1 Calling Assembly Functions from C
- •3.19 Creating Libraries
- •3.20 Using the AVR Studio Debugger
- •3.20.1 Using the AVR Studio Debugger version 3
- •3.20.2 Using the AVR Studio Debugger version 4.06 or later
- •3.21 Hints
- •3.22 Limitations
- •4. Library Functions Reference
- •4.1 Character Type Functions
- •4.2 Standard C Input/Output Functions
- •4.3 Standard Library Functions
- •4.4 Mathematical Functions
- •4.5 String Functions
- •4.6 Variable Length Argument Lists Macros
- •4.7 Non-local Jump Functions
- •4.8 BCD Conversion Functions
- •4.9 Gray Code Conversion Functions
- •4.10 Memory Access Functions
- •4.11 LCD Functions
- •4.11.1 LCD Functions for displays with up to 2x40 characters
- •4.11.2 LCD Functions for displays with 4x40 characters
- •4.11.3 LCD Functions for displays connected in 8 bit memory mapped mode
- •4.12 I2C Bus Functions
- •4.12.3 Philips PCF8563 Real Time Clock Functions
- •4.12.4 Philips PCF8583 Real Time Clock Functions
- •4.14 1 Wire Protocol Functions
- •4.14.3 Maxim/Dallas Semiconductor DS2430 EEPROM Functions
- •4.14.4 Maxim/Dallas Semiconductor DS2433 EEPROM Functions
- •4.15 SPI Functions
- •4.16 Power Management Functions
- •4.17 Delay Functions
- •5. CodeWizardAVR Automatic Program Generator
- •5.1 Setting the AVR Chip Options
- •5.2 Setting the External SRAM
- •5.3 Setting the Input/Output Ports
- •5.4 Setting the External Interrupts
- •5.5 Setting the Timers/Counters
- •5.6 Setting the UART or USART
- •5.7 Setting the Analog Comparator
- •5.8 Setting the Analog-Digital Converter
- •5.9 Setting the ATmega406 Voltage Reference
- •5.10 Setting the ATmega406 Coulomb Counter
- •5.11 Setting the SPI Interface
- •5.12 Setting the Universal Serial Interface - USI
- •5.13 Setting the I2C Bus
- •5.13.1 Setting the LM75 devices
- •5.13.2 Setting the DS1621 devices
- •5.13.3 Setting the PCF8563 devices
- •5.13.4 Setting the PCF8583 devices
- •5.13.5 Setting the DS1307 devices
- •5.14 Setting the 1 Wire Bus
- •5.15 Setting the 2 Wire Bus
- •5.16 Setting the CAN Controller
- •5.17 Setting the ATmega169/329/3290/649/6490 LCD Controller
- •5.18 Setting the LCD
- •5.19 Setting the USB Controller
- •5.20 Setting Bit-Banged Peripherals
- •5.21 Specifying the Project Information
- •6. License Agreement
- •6.1 Software License
- •6.2 Liability Disclaimer
- •6.3 Restrictions
- •6.4 Operating License
- •6.5 Back-up and Transfer
- •6.6 Terms
- •6.7 Other Rights and Restrictions
- •7. Technical Support
- •8. Contact Information
CodeVisionAVR
3.7.7 Global Variables Memory Map File
During compilation the C compiler generates a Global Variables Memory Map File, in which are specified the SRAM address location, register allocation and size of the global variables used by the program.
This file has the .map extension and can be viewed using the menu File|Open command or by pressing the Open button on the toolbar.
Structure and union members are listed individually along with their corresponding address and size. This file is useful during program debugging using the AVR Studio debugger.
3.8 Defining Data Types
User defined data types are declared using the typedef reserved keyword.
The syntax is:
typedef [<storage modifier>] <type definition> <identifier>;
The symbol name <identifier> is assigned to <type definition>.
Examples:
/* type definitions */ typedef unsigned char byte; typedef eeprom struct {
int a; char b[5];
} eeprom_struct_type;
/* variable declaration */ byte alfa;
eeprom eeprom_struct_type struct1;
© 1998-2007 HP InfoTech S.R.L. |
Page 86 |
CodeVisionAVR
3.9 Type Conversions
In an expression, if the two operands of a binary operator are of different types, then the compiler will convert one of the operands into the type of the other.
The compiler uses the following rules:
If either of the operands is of type float then the other operand is converted to the same type.
If either of the operands is of type long int or unsigned long int then the other operand is converted to the same type.
Otherwise, if either of the operands is of type int or unsigned int then the other operand is converted to the same type.
Thus char type or unsigned char type gets the lowest priority.
Using casting you can change these rules.
Example:
void main(void) { int a, c;
long b;
/* The long integer variable b will be treated here as an integer */ c=a+(int) b;
}
It is important to note that if the Project|Configure|C Compiler|Code Generation|Promote char to int option isn't checked or the #pragma promotechar+ isn't used, the char, respectively unsigned char, type operands are not automatically promoted to int , respectively unsigned int, as in compilers targeted for 16 or 32 bit CPUs.
This helps writing more size and speed efficient code for an 8 bit CPU like the AVR. To prevent overflow on 8 bit addition or multiplication, casting may be required. The compiler issues warnings in these situations.
Example:
void main(void) { unsigned char a=30; unsigned char b=128; unsigned int c;
/* This will generate an incorrect result, because the multiplication is done on 8 bits producing an 8 bit result, which overflows. Only after the multiplication, the 8 bit result is promoted to unsigned int */
c=a*b;
/* Here casting forces the multiplication to be done on 16 bits, producing an 16 bit result, without overflow */
c=(unsigned int) a*b;
}
© 1998-2007 HP InfoTech S.R.L. |
Page 87 |
CodeVisionAVR
The compiler behaves differently for the following operators:
+= -= *= /= %= &= |= ^= <<= >>=
For these operators, the result is to be written back onto the left-hand side operand (which must be a variable). So the compiler will always convert the right hand side operand into the type of left-hand side operand.
3.10 Operators
The compiler supports the following operators:
+-
*/
%++
--=
==~
!!=
<>
<= >=
&&&
| ||
^?
<<>>
-= |
+= |
/= |
%= |
&= |
*= |
^= |
|= |
>>= |
<<= |
© 1998-2007 HP InfoTech S.R.L. |
Page 88 |
CodeVisionAVR
3.11 Functions
You may use function prototypes to declare a function.
These declarations include information about the function parameters. Example:
int alfa(char par1, int par2, long par3);
The actual function definition may be written somewhere else as:
int alfa(char par1, int par2, long par3) { /* Write some statements here */
}
The old Kernighan & Ritchie style of writing function definitions is not supported. Function parameters are passed through the Data Stack.
Function values are returned in registers R30, R31, R22 and R23 (from LSB to MSB).
© 1998-2007 HP InfoTech S.R.L. |
Page 89 |
