AVR C Library
AVR C Library
1 | Page
www.xplorelabz.com
2 | Page
www.xplorelabz.com
Contents
Introduction ......................................................................................................................................................................... 5
ADC ...................................................................................................................................................................................... 6
ADC_Init() ........................................................................................................................................................................................................ 6
ADC_StartConversion()................................................................................................................................................................................ 6
Keypad ................................................................................................................................................................................18
KEYPAD_Init().................................................................................................................................................................................................18
KEYPAD_WaitForKeyRelease() ...................................................................................................................................................................19
KEYPAD_WaitForKeyPress() ........................................................................................................................................................................19
KEYPAD_ScanKey() ..........................................................................................................................................................................................20
KEYPAD_GetKey() ............................................................................................................................................................................................21
UART ...................................................................................................................................................................................22
UART_Init() .....................................................................................................................................................................................................22
3 | Page
www.xplorelabz.com
UART_RxChar().................................................................................................................................................................................................22
UART_TxChar().................................................................................................................................................................................................23
UART_TxString() ............................................................................................................................................................................................23
UART_RxString() ............................................................................................................................................................................................24
UART_TxNumber() ............................................................................................................................................................................................25
I2C .......................................................................................................................................................................................26
I2C_Init() .......................................................................................................................................................................................................26
I2C_Start() .....................................................................................................................................................................................................26
I2C_Stop() .......................................................................................................................................................................................................27
I2C_Write() .....................................................................................................................................................................................................27
I2C_Read() .......................................................................................................................................................................................................27
RTC_DS1307 ........................................................................................................................................................................28
DS1307_Init().................................................................................................................................................................................................28
DS1307_SetTime() ..........................................................................................................................................................................................29
DS1307_SetDate() ..........................................................................................................................................................................................29
DS1307_GetTime() ..........................................................................................................................................................................................30
DS1307_GetDate() ..........................................................................................................................................................................................31
EEPROM ..............................................................................................................................................................................32
EEPROM_WriteByte() .....................................................................................................................................................................................32
EEPROM_ReadByte()........................................................................................................................................................................................33
EEPROM_WriteNBytes() .................................................................................................................................................................................33
EEPROM_ReadNBytes() ...................................................................................................................................................................................34
EEPROM_WriteString() .................................................................................................................................................................................34
EEPROM_ReadString() ...................................................................................................................................................................................35
EEPROM_Erase() ..............................................................................................................................................................................................35
4 | Page
www.xplorelabz.com
Introduction
Overview:
This manual is designed to help embedded programmers and students, rapidly exploit the Avr(Atmega)-Controller
for embedded applications. This manual has been targeted at embedded systems programmers and Students who have
basic knowledge of Avr(Atmega32/Avr) architecture and C-Language.
This manual provides the reference to all the library functions which are grouped under respective .c file.
The .c files convention is as per the peripherals. The peripherals (lcd, keypad..) are connected to default PORTs which can be
connect to required PORTs by changing the #defines .
Reference:
It is recommended to go through the below reference documents and datasheets before interfacing any
peripherals.
1. The Avr Microcontroller and Embedded Systems by Muhammad Ali Mazidi.
2. Atmega32 DataSheet.
3. Embedded C by Michael J Pont .
4. Any of the 16x2 lcd datasheet.
5. RTC-DS1307 from Dallas Semiconductors.
Feedback:
Suggestions for additions and improvements in code and documentation are always welcome. Please send your
feedback via e-mail to feedback@xplorelabz.com
Disclaimer:
The libraries have been tested for Atmega16 on different development boards. We strongly believe that the library
works on any Atmega boards. However, Xplore Labz disclaims any kind of hardware failure resulting out of usage of
libraries, directly or indirectly. Documentation may be subject to change without prior notice.
The usage of tools and software demonstrated in the document are for educational purpose only, all rights
pertaining to these belong to the respective owners. Users must ensure license terms are adhered to, for any use of the
demonstrated software.
5 | Page
www.xplorelabz.com
ADC
/*---------------------------------------------------------------------------------Avr ADC library.
Filename: adc.c
Controller: Atmega8/16/32/128
Oscillator: 11.0592 MHz
Author: XploreLabz
website: www.xplorelabz.com
Reference:Atmega32 dataSheet
----------------------------------------------------------------------------------*/
#include<avr/io.h>
#include <util/delay.h>
#include "adc.h"
/*---------------------------------------------------------------------------------ADC_Init()
----------------------------------------------------------------------------------* I/P Arguments: none.
* Return value
: none
* description :This function initializes the ADC control registers
-----------------------------------------------------------------------------------*/
void ADC_Init()
{
ADCSRA=0x81;
ADMUX=0x00;
}
/*---------------------------------------------------------------------------------ADC_StartConversion()
----------------------------------------------------------------------------------* I/P Arguments: char(channel number).
* Return value
: int(10 bit ADC result)
* description
:This function does the ADC conversioin for the Selected Channel
and returns the converted 10bit result
------------------------------------------------------------------------------------*/
ADCSRA=0xc1;
6 | Page
www.xplorelabz.com
LCD_8_bit Mode
/*--------------------------------------------------------------------------------AVR LCD library for 8-bit mode
Filename: lcd_8_bit.c
Controller: Atmega Family(8,16,32,64,128)
Oscillator: 11.0592 MHz
Author: XploreLabz
website: www.xplorelabz.com
---------------------------------------------------------------------------------Note:
1.Pin connection for LCD display in 8-bit mode is as shown below.
By default the LCD is connected to PORTB(databus) and PORTD(controlbus).
2.The code can be modified to connect the LCD to any of the PORTs
by changing the "#define ".
-----------------------------------------------------------------------------------*/
/* io.h contains the defnition of all ports and SFRs
delay.h contains the in built delay routines(us and ms routines)*/
#include <avr\io.h>
#include <util\delay.h>
#include "lcd.h"
#define databus_direction DDRC
#define controlbus_direction DDRD
//
//
#define databus
PORTC
#define control_bus PORTD
//
LCD databus connected to PORTB
LCD Control bus connected to PORTD
#define rs 5
#define rw 6
#define en 7
//
#define
#define
#define
#define
LCDMaxLines 2
LCDMaxChars 16
LineOne 0x80
LineTwo 0xc0
www.xplorelabz.com
/*--------------------------------------------------------------------------------LCD_Init()
---------------------------------------------------------------------------------* Function name: LCD_Init()
* I/P Arguments: none.
* Return value
: none
* description
-----------------------------------------------------------------------------------*/
void LCD_Init()
{
_delay_ms(50);
databus_direction = 0xff;
// Configure both databus and controlbus as output
controlbus_direction = 0xff;
LCD_CmdWrite(0x38);
// LCD 2lines, 5*7 matrix
LCD_CmdWrite(0x0E); // Display ON cursor ON
LCD_CmdWrite(0x01); // Clear the LCD
LCD_CmdWrite(0x80); // Move the Cursor to First line First Position
/*--------------------------------------------------------------------------------LCD_Clear()
---------------------------------------------------------------------------------* I/P Arguments: none.
* Return value
: none
* description
:This function clears the LCD and moves the cursor to first Position
-----------------------------------------------------------------------------------*/
void LCD_Clear()
{
LCD_CmdWrite(0x01); // Clear the LCD and go to First line First Position
LCD_CmdWrite(LineOne);
/*--------------------------------------------------------------------------------LCD_GoToLineOne()
---------------------------------------------------------------------------------* I/P Arguments: none.
* Return value
: none
* description
-----------------------------------------------------------------------------------*/
void LCD_GoToLineOne()
{
LCD_CmdWrite(LineOne);
}
8 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------LCD_GoToLineTwo()
---------------------------------------------------------------------------------* I/P Arguments: none.
* Return value
: none
* description
-----------------------------------------------------------------------------------*/
void LCD_GoToLineTwo()
{
LCD_CmdWrite(LineTwo);
/*--------------------------------------------------------------------------------LCD_GoToXY()
---------------------------------------------------------------------------------* I/P Arguments: char row,char col
row -> line number(line1=0, line2=1),
For 2line LCD the I/P argument should be either 0 or 1.
col -> char number.
For 16-char LCD the I/P argument should be betwen 0-15.
* Return value
: none
* description
-----------------------------------------------------------------------------------*/
void LCD_GoToXY(char row, char col)
{
char pos;
if(row<LCDMaxLines)
{
pos= LineOne | (row << 6); // take the line number
//row0->pos=0x80
if(col<LCDMaxChars)
pos= pos+col;
LCD_CmdWrite(pos);
row1->pos=0xc0
}
}
9 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------LCD_CmdWrite()
* --------------------------------------------------------------------------------* I/P Arguments: 8-bit command supported by LCD.
* Return value
: none
* description :This function sends a command to LCD in the following steps.
step1: Send the I/P command to LCD.
step2: Select the Control Register by making RS low.
step3: Select Write operation making RW low.
step4: Send a High-to-Low pulse on Enable PIN with some delay_us.
----------------------------------------------------------------------------------*/
void LCD_CmdWrite( char cmd)
{
databus=cmd;
// Send the command to LCD
control_bus &=~(1<<rs); // Select the Command Register by pulling RS LOW
control_bus &=~(1<<rw); // Select the Write Operation by pulling RW LOW
control_bus |=1<<en;
// Send a High-to-Low Pusle at Enable Pin
_delay_us(1);
control_bus &=~(1<<en);
_delay_ms(1);
/*--------------------------------------------------------------------------------LCD_DataWrite()
---------------------------------------------------------------------------------* I/P Arguments: ASCII value of the char to be displayed.
* Return value
: none
* description :
This function sends a character to be displayed on LCD in the following steps.
step1: Send the character to LCD.
step2: Select the Data Register by making RS high.
step3: Select Write operation making RW low.
step4: Send a High-to-Low pulse on Enable PIN with some delay_us.
-----------------------------------------------------------------------------------*/
void LCD_DataWrite( char dat)
{
databus=dat;
// Send the
control_bus |=1<<rs;
// Select
control_bus &=~(1<<rw); // Select
control_bus |=1<<en;
// Send a
_delay_us(1);
control_bus &=~(1<<en);
_delay_ms(1);
data to LCD
the Data Register by pulling RS HIGH
the Write Operation by pulling RW LOW
High-to-Low Pusle at Enable Pin
/*---------------------------------------------------------------------------------
10 | Page
www.xplorelabz.com
LCD_DisplayString()
---------------------------------------------------------------------------------* I/P Arguments: String(Address of the string) to be displayed.
* Return value
: none
* description
:
This function is used to display the ASCII string on the lcd.
1.The string_ptr points to the first char of the string
and traverses till the end(NULL CHAR).
2.Each time a char is sent to LCD_DataWrite funtion to display.
-----------------------------------------------------------------------------------*/
void LCD_DisplayString(char *string_ptr)
{
while(*string_ptr)
LCD_DataWrite(*string_ptr++);
}
/*--------------------------------------------------------------------------------LCD_DisplayNumber()
---------------------------------------------------------------------------------* Function name: LCD_DisplayNumber()
* I/P Arguments: unsigned int.
* Return value
: none
* description
__________Take 1 by dividing by 10000 and add 0X30 to obtain the ASCII value,
|
then take the 4-digit remainder(2345).
|
| _________Take 2 by dividing by 1000 and add 0X30 to obtain the ASCII value,
||
then take the 3-digit remainder(345)
||
|| ________Take 3 by dividing by 100
and add 0X30 to obtain the ASCII value,
|||
then take the 2-digit remainder(45).
|||
||| _______Take 4 by dividing by 10
and add 0X30 to obtain the ASCII value,
|||| ______Take 5 the remainder of 45 and add 0X30 to obtain the ASCII value,.
|||||
12345
-----------------------------------------------------------------------------------*/
void LCD_DisplayNumber(unsigned int num)
{
LCD_DataWrite((num/10000)+0x30);
num=num%10000;
LCD_DataWrite((num/1000)+0x30);
num=num%1000;
LCD_DataWrite((num/100)+0x30);
num=num%100;
LCD_DataWrite((num/10)+0x30);
LCD_DataWrite((num%10)+0x30);
11 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------LCD_ScrollMessage()
---------------------------------------------------------------------------------* I/P Arguments: char *msg_ptr
msg_ptr -> pointer to the string to be scrolled
* Return value
: none
* description :This function scrolls the given message on the first line.
1.16 chars are displayed at atime.
2.Pointer is incremented to skip a char each time to give the illusion of
moving chars
3.If the chars are less than 16, then the BlankSpaces are displayed.
-----------------------------------------------------------------------------------*/
_delay_ms(500);
}
LCD_CmdWrite(0x0E);
12 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------LCD_DisplayRtcTime()
---------------------------------------------------------------------------------* I/P Arguments: char hour,char min,char sec
hour,min,sec should be packed BCD format, as read from DS1307
* Return value
* description
: none
:This function display hour,min,sec read from DS1307.
___________ Display the higher nibble of hour after adding 0x30(ASCII conversion)
|
Display the lower nibble of hour after adding 0x30(ASCII conversion)
|
|
________ Display the higher nibble of min after adding 0x30(ASCII conversion)
|
|
Display the lower nibble of min after adding 0x30(ASCII conversion)
|
|
|
|
_____ Display the higher nibble of sec after adding 0x30(ASCII conversion)
|
|
|
Display the lower nibble of sec after adding 0x30(ASCII conversion)
|
|
|
10;10;40
-----------------------------------------------------------------------------------*/
void LCD_DisplayRtcTime(char hour,char min,char sec)
{
LCD_DataWrite(((hour>>4) & 0x0f) + 0x30);
LCD_DataWrite((hour & 0x0f) + 0x30);
LCD_DataWrite(':');
LCD_DataWrite(((min>>4) & 0x0f) + 0x30);
LCD_DataWrite((min & 0x0f) + 0x30);
LCD_DataWrite(':');
LCD_DataWrite(((sec>>4) & 0x0f) + 0x30);
LCD_DataWrite((sec & 0x0f) + 0x30);
13 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------LCD_DisplayRtcDate()
---------------------------------------------------------------------------------* I/P Arguments: char day,char month,char year
day,month,year should be packed BCD format, as read from DS1307
* Return value
* description
: none
:This function display day,month,year read from DS1307.
-----------------------------------------------------------------------------------*/
void LCD_DisplayRtcDate(char day,char month,char year)
{
LCD_DataWrite(((day>>4) & 0x0f) + 0x30);
LCD_DataWrite((day & 0x0f) + 0x30);
LCD_DataWrite('/');
LCD_DataWrite(((month>>4) & 0x0f) + 0x30);
LCD_DataWrite((month & 0x0f) + 0x30);
LCD_DataWrite('/');
LCD_DataWrite(((year>>4) & 0x0f) + 0x30);
LCD_DataWrite((year & 0x0f) + 0x30);
14 | Page
www.xplorelabz.com
LCD_4_bit Mode
/*---------------------------------------------------------------------------------AVR LCD library for 4-bit mode
Filename: lcd_4_bit.c
Controller: Atmega Family(8,16,32,64,128)
Oscillator: 11.0592 MHz
Author: XploreLabz
website: www.xplorelabz.com
---------------------------------------------------------------------------------Note:
1.Pin connection for LCD display in 4-bit mode.
2.By default the LCD is connected to PORTB.
3.The code can be modified to connect the LCD to any of the PORTs by changing the
"#define databus PORTB".
----------------------------------------------------------------------------------*/
/* io.h contains the defnition of all ports and SFRs
delay.h contains the in built delay routines(us and ms routines)*/
#include <avr\io.h>
#include <util\delay.h>
#include "lcd.h"
#define databus_direction DDRB // LCD data and Control bus Direction Configuration
#define databus
PORTB
#define control_bus PORTB
#define rs 0
#define rw 1
#define en 2
//
//
#define
#define
#define
#define
LCDMaxLines 2
LCDMaxChars 16
LineOne 0x80
LineTwo 0xc0
www.xplorelabz.com
/*---------------------------------------------------------------------------------LCD_Init()
---------------------------------------------------------------------------------* Function name: LCD_Init()
* I/P Arguments: none.
* Return value : none
* description :This function is used to initialize the lcd in 4-bit mode
----------------------------------------------------------------------------------*/
void LCD_Init()
{
_delay_ms(50);
databus_direction = 0xff; // Configure both databus and controlbus as output
LCD_CmdWrite(0x02);
//Initilize the LCD in 4bit Mode
LCD_CmdWrite(0x28);
LCD_CmdWrite(0x0E);
// Display ON cursor ON
LCD_CmdWrite(0x01);
// Clear the LCD
LCD_CmdWrite(0x80);
// Move the Cursor to First line First Position
}
/*---------------------------------------------------------------------------------LCD_CmdWrite()
-----------------------------------------------------------------------------------* I/P Arguments: 8-bit command supported by LCD.
* Return value : none
* description :This function sends a command to LCD in the following steps.
step1: Send the Higher Nibble of the I/P command to LCD.
step2: Select the Control Register by making RS low.
step3: Select Write operation making RW low.
step4: Send a High-to-Low pulse on Enable PIN with some delay_us.
step5: Send the Lower Nibble of the I/P command to LCD.
step6: Select the Control Register by making RS low.
step7: Select Write operation making RW low.
step8: Send a High-to-Low pulse on Enable PIN with some delay_us.
----------------------------------------------------------------------------------*/
void LCD_CmdWrite( char cmd)
{
databus=(cmd & 0xf0);
// Send the Higher Nibble of the command to LCD
control_bus &=~(1<<rs); // Select the Command Register by pulling RS LOW
control_bus &=~(1<<rw); // Select the Write Operation by pulling RW LOW
control_bus |=1<<en;
// Send a High-to-Low Pusle at Enable Pin
_delay_us(1);
control_bus &=~(1<<en);
_delay_us(10);
www.xplorelabz.com
_delay_ms(1);
/*--------------------------------------------------------------------------------LCD_DataWrite()
---------------------------------------------------------------------------------* Function name: LCD_DataWrite()
* I/P Arguments: ASCII value of the char to be displayed.
* Return value : none
* description :
This function sends a character to be displayed on LCD in the following steps.
step1: Send the higher nibble of the character to LCD.
step2: Select the Data Register by making RS high.
step3: Select Write operation making RW low.
step4: Send a High-to-Low pulse on Enable PIN with some delay_us.
step5: wait for some time
step6: Send the lower nibble of the character to LCD.
step7: Select the Data Register by making RS high.
step8: Select Write operation making RW low.
step9: Send a High-to-Low pulse on Enable PIN with some delay_us.
----------------------------------------------------------------------------------*/
void LCD_DataWrite( char dat)
{
databus=(dat & 0xf0);
control_bus |=1<<rs;
control_bus &=~(1<<rw);
control_bus |=1<<en;
_delay_us(1);
control_bus &=~(1<<en);
_delay_us(10);
//
//
//
//
databus=((dat <<4) & 0xf0); // Send the Lower Nibble of the Data to LCD
control_bus |=1<<rs;
// Select the Data Register by pulling RS HIGH
control_bus &=~(1<<rw);
// Select the Write Operation by pulling RW LOW
control_bus |=1<<en;
// Send a High-to-Low Pusle at Enable Pin
_delay_us(1);
control_bus &=~(1<<en);
_delay_ms(1);
17 | Page
www.xplorelabz.com
Keypad
/*---------------------------------------------------------------------------------Avr 4x4 Keypad Library
Filename: keypad.c
Controller:Atmega8/16/32/128
Oscillator: 11.0592 MHz
Author: XploreLabz
website: www.xplorelabz.com
---------------------------------------------------------------------------------Note:
1.Rows are connected to lower 4-bits of PORTC
1.Cols are connected to higher 4-bits of PORTC
----------------------------------------------------------------------------------*/
#include
#include
#include
#include
<avr\io.h>
<util\delay.h>
"keypad.h"
"lcd.h"
{
RowColDirection=0xf0;
18 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------KEYPAD_WaitForKeyRelease()
---------------------------------------------------------------------------------* I/P Arguments:none
* Return value
: none
{
unsigned char key;
do
{
ROW=0x0f;
key=COL & 0x0f;
}while(key!=0x0f);
//
//
//
//
/*--------------------------------------------------------------------------------KEYPAD_WaitForKeyPress()
---------------------------------------------------------------------------------* I/P Arguments:none
* Return value
: none
{
unsigned char key;
do
{
do
{
ROW=0x0f;
// Pull the ROW lines to low and Column lines high.
key=COL & 0x0F;
// Read the Columns, to check the key press
}while(key==0x0f); // Wait till the Key is pressed,
// if a Key is pressed the corresponding Column line go low
_delay_ms(1);
ROW=0x0f;
key=COL & 0x0F;
}while(key==0x0f);
}
19 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------KEYPAD_ScanKey()
---------------------------------------------------------------------------------* I/P Arguments:none
* Return value
* description : This function scans all the rows to decode the key pressed.
1.Each time a ROW line is pulled low to detect the KEY.
2.Column Lines are read to check the key press.
3.If any Key is pressed then corresponding Column Line goes low.
4.Return the ScanCode(Combination of ROW & COL) for decoding the key.
-----------------------------------------------------------------------------------*/
unsigned char KEYPAD_ScanKey()
{
unsigned char ScanKey = 0xe0,i, key;
for(i=0;i<0x04;i++)
{
ROW=ScanKey + 0x0F;
key=COL & 0x0F;
if(key!= 0x0F)
break;
}
key = key + (ScanKey & 0xf0);
return(key);
}
20 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------KEYPAD_GetKey()
---------------------------------------------------------------------------------* I/P Arguments: none
* Return value
* Description: This function waits till a key is pressed and returns its ASCII Value
1. Wait till the previous key is released..
2. Wait for the new key press.
3. Scan all the rows one at a time for the pressed key.
4. Decode the key pressed depending on ROW-COL combination and returns its
ASCII value.
-----------------------------------------------------------------------------------*/
unsigned char KEYPAD_GetKey()
{
unsigned char key;
KEYPAD_WaitForKeyRelease();
_delay_ms(1);
KEYPAD_WaitForKeyPress();
key = KEYPAD_ScanKey();
switch(key)
{
case 0xe7: key='0';
case 0xeb: key='1';
case 0xed: key='2';
case 0xee: key='3';
case 0xd7: key='4';
case 0xdb: key='5';
case 0xdd: key='6';
case 0xde: key='7';
case 0xb7: key='8';
case 0xbb: key='9';
case 0xbd: key='A';
case 0xbe: key='B';
case 0x77: key='C';
case 0x7b: key='D';
case 0x7d: key='E';
case 0x7e: key='F';
default: key='z';
}
return(key);
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
// Return the key
21 | Page
www.xplorelabz.com
UART
/*-------------------------------------------------------------------------------AVR UART library for Serial Communication for 9600 baud rate at 11.0592Mhz
Filename: uart.c
Controller: Atmega8/16/32/128
Oscillator: 11.0592 MHz
Author: XploreLabz
website: www.xplorelabz.com
---------------------------------------------------------------------------------*/
#include<avr/io.h>
/*------------------------------------------------------------------------------UART_Init()
---------------------------------------------------------------------------------* I/P Arguments: none.
* Return value
: none
* description :This function is used to initialize the UART at 9600 baud rate
by below configuration.
------------------------------------------------------------------------------------*/
void UART_Init()
{
UCSRB=
UCSRC=
UCSRA=
UBRRH=
UBRRL=
0x18;
0x86;
0x00;
0;
71;
}
/*---------------------------------------------------------------------------------UART_RxChar()
---------------------------------------------------------------------------------* I/P Arguments: none.
* Return value
: char
* description :This function is used to receive a char from UART module.
It waits till a char is received ie.till RXC is set,
RXC will be set once a CHAR is received.
Finally returns the received char.
------------------------------------------------------------------------------------*/
char UART_RxChar()
{
while((UCSRA & (1<<RXC))==0);
return(UDR);
22 | Page
www.xplorelabz.com
/*---------------------------------------------------------------------------------UART_TxChar()
-----------------------------------------------------------------------------------* I/P Arguments: char--> data to be transmitted.
* Return value
: none.
* description :This function is used to transmit a char through UART module.
It waits till previous char is transmitted ie.till UDRE is set.
UDRE will be set once a CHAR is transmitted ie UDR becomes empty.
Finally the new Char to be transmitted is loaded into UDR.
------------------------------------------------------------------------------------*/
void UART_TxChar(char ch)
{
while((UCSRA & (1<<UDRE))==0); // Wait till Transmitter(UDR) register becomes Empty
UDR =ch;
// Load the data to be transmitted
}
/*---------------------------------------------------------------------------------UART_TxString()
----------------------------------------------------------------------------------* I/P Arguments: String(Address of the string) to be transmitted.
* Return value : none
* description :This function is used to transmit the ASCII string through UART..
The string_ptr points to the first char of the string.
And it is incremented each time to traverse till the end(NULL CHAR).
Each time a char is sent to UART_TxChar() fun to transmit it through UART
----------------------------------------------------------------------------------_*/
void UART_TxString(char *string_ptr)
{
while(*string_ptr)
UART_TxChar(*string_ptr++);
}
23 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------UART_RxString()
---------------------------------------------------------------------------------* I/P Arguments: *string_ptr
Address of the string where the received data needs to be stored
* Return value : none
* description
:
1.This function is used to receive a ASCII string through UART
till the carriage_return/New_line
2.The string_ptr points to the begining of the string and each
time UART_RxChar() function is called to receive a char and copy
it into the buffer(STRING) and incrment string_ptr.
3.Once the carriage_return/New_line is encountered the loop
is breaked and the String is NULL terminated.
*****NOTE*******:
1.The received char is ECHOED back,
if not required then comment UART_TxChar(ch) in the code.
2.BackSlash is not taken care.
----------------------------------------------------------------------------------_*/
void UART_RxString(char *string_ptr)
{
char ch;
while(1)
{
ch=UART_RxChar();
UART_TxChar(ch);
//Reaceive a char
//Echo back the received char
24 | Page
www.xplorelabz.com
/*---------------------------------------------------------------------------------UART_TxNumber()
-----------------------------------------------------------------------------------* I/P Arguments: unsigned int.
* Return value : none
* description
----------Take 1 by dividing by 10000 and add 0X30 to obtain the ASCII value,
|
then take the 4-digit remainder(2345).
|
| ---------Take 2 by dividing by 1000 and add 0X30 to obtain the ASCII value,
||
then take the 3-digit remainder(345)
||
|| --------Take 3 by dividing by 100
and add 0X30 to obtain the ASCII value,
|||
then take the 2-digit remainder(45).
|||
||| -------Take 4 by dividing by 10
and add 0X30 to obtain the ASCII value,
|||| ------Take 5 the remainder of 45 and add 0X30 to obtain the ASCII value,.
|||||
12345
------------------------------------------------------------------------------------*/
25 | Page
www.xplorelabz.com
I2C
/*---------------------------------------------------------------------------------*
Avr I2C library
Filename: I2C.c
Controller: Atmega8/16/32/128
Oscillator: 11.0592 MHz
Author: XploreLabz
website: www.xplorelabz.com
Refer Atmega32 for register description.
----------------------------------------------------------------------------------*/
#include<avr\io.h>
#include<util\delay.h>
#include "i2c.h"
/*--------------------------------------------------------------------------------I2C_Init()
---------------------------------------------------------------------------------* I/P Arguments: none.
* Return value
: none
* description :This function is used to initialize the
I2c Module.
------------------------------------------------------------------------------------*/
void I2C_Init()
{
TWSR=0x00; //set presca1er bits to zero
TWBR=0x46; //SCL frequency is 100K for XTAL = 7.3728M
TWCR=0x04; //enab1e TWI module
}
/*---------------------------------------------------------------------------------*
I2C_Start()
----------------------------------------------------------------------------------*
* I/P Arguments: none.
* Return value
: none
* description
____________
|
|
________|
|______
_________
|
|
____|
|____________
-----------------------------------------------------------------------------------*/
void I2C_Start()
{
TWCR = ((1<<TWINT) | (1<<TWSTA) | (1<<TWEN));
while (!(TWCR & (1<<TWINT)));
26 | Page
www.xplorelabz.com
/*----------------------------------------------------------------------------------I2C_Stop()
-----------------------------------------------------------------------------------* I/P Arguments: none.
* Return value
: none
* description :This function is used to generate I2C Stop Condition.
Stop Condition: SDA goes High when SCL is High.
____________
SCL:
|
|
________|
|______
_________________
SDA:
|
__________|
------------------------------------------------------------------------------------*/
void I2C_Stop(void)
{
TWCR = ((1<< TWINT) | (1<<TWEN) | (1<<TWSTO));
_delay_us(10) ; //wait for a short time
}
/*---------------------------------------------------------------------------------*
I2C_Write()
----------------------------------------------------------------------------------*
* I/P Arguments: unsigned char-->8bit data to be sent.
* Return value
: none
* description :This function is used to send a byte on SDA line using I2C protocol
8bit data is sent bit-by-bit on each clock cycle.
MSB(bit) is sent first and LSB(bit) is sent at last.
Data is sent when SCL is low.
___
___
___
___
___
___
___
___
___
_
SCL:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__|
|___|
|___|
|___|
|___|
|___|
|___|
|___|
|___|
|___|
SDA:
D8
D7
D6
D5
D4
D3
D2
D1
D0
-----------------------------------------------------------------------------------*/
void I2C_Write(unsigned char dat)
{
TWDR = dat ;
TWCR = ((1<< TWINT) | (1<<TWEN));
while (!(TWCR & (1 <<TWINT)));
}
/*-----------------------------------------------------------------------------------*
I2C_Read()
------------------------------------------------------------------------------------*
* I/P Arguments: char: Acknowledgement for the Ninth clock cycle.
* Return value
: Unsigned char(received byte)
* description :This fun is used to receive a byte on SDA line using I2C protocol.
8bit data is received bit-by-bit each clock and finally packed into Byte.
MSB(bit) is received first and LSB(bit) is received at last.
___
___
___
___
___
___
___
___
___
SCL:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__|
|___|
|___|
|___|
|___|
|___|
|___|
|___|
|___|
|___|
SDA:
D8
D7
D6
D5
D4
D3
D2
D1
D0
-------------------------------------------------------------------------------------*/
unsigned char I2C_Read(unsigned char ack)
{
TWCR = ((1<< TWINT) | (1<<TWEN) | (ack<<TWEA));
while ( !(TWCR & (1 <<TWINT)));
return TWDR;
}
27 | Page
www.xplorelabz.com
RTC_DS1307
/*-------------------------------------------------------------------------------DS1307 library
Filename: DS1307.c
Controller: Atmega8/16/32/128
Oscillator: 11.0592 MHz
Author: XploreLabz
website: www.xplorelabz.com
---------------------------------------------------------------------------------*/
#include <avr\io.h>
#include <util\delay.h>
#include "ds1307.h"
#include "i2c.h"
// DS1307 ID
#define SEC_ADDRESS
#define DATE_ADDRESS
#define CONTROL 0x07
/*--------------------------------------------------------------------------------DS1307_Init()
---------------------------------------------------------------------------------* I/P Arguments: none.
* Return value
: none
* description :This function is used to initialize the Ds1307 RTC.
Ds1307 ic is enabled by sending the DS1307 id on the I2C bus.
After selecting DS1307, write 0x00 into Control register of Ds1307
------------------------------------------------------------------------------------*/
void DS1307_Init()
{
I2C_Init();
I2C_Start();
I2C_Write(DS1307_ID);
I2C_Write(CONTROL);
I2C_Write(0x00);
I2C_Stop();
}
28 | Page
www.xplorelabz.com
/*---------------------------------------------------------------------------------DS1307_SetTime()
----------------------------------------------------------------------------------* I/P Arguments: char,char,char-->hh,mm,ss to initilize the time into DS1307.
* Return value
: none
* description
{
I2C_Start();
/*--------------------------------------------------------------------------------DS1307_SetDate()
---------------------------------------------------------------------------------* I/P Arguments: char,char,char-->day,month,year to initilize the Date into DS1307.
* Return value
: none
* description
{
I2C_Start();
I2C_Stop();
}
29 | Page
www.xplorelabz.com
/*---------------------------------------------------------------------------------DS1307_GetTime()
----------------------------------------------------------------------------------* I/P Arguments: char *,char *,char *-->pointers to get the hh,mm,ss.
* Return value
: none
* description
{
I2C_Start();
I2C_Write(DS1307_ID);
// connect to DS1307 by sending its ID on I2c Bus
I2C_Write(SEC_ADDRESS); // Request Sec RAM address at 00H
I2C_Stop();
I2C_Start();
I2C_Write(0xD1);
*s_ptr = I2C_Read(1);
*m_ptr = I2C_Read(1);
*h_ptr = I2C_Read(0);
I2C_Stop();
30 | Page
www.xplorelabz.com
/*---------------------------------------------------------------------------------DS1307_GetDate()
----------------------------------------------------------------------------------* I/P Arguments: char *,char *,char *-->pointers to get the y,m,d.
* Return value
: none
* description
{
I2C_Start();
I2C_Write(DS1307_ID);
// connect to DS1307 by sending its ID on I2c Bus
I2C_Write(DATE_ADDRESS);
// Request DAY RAM address at 04H
I2C_Stop();
I2C_Start();
I2C_Write(0xD1);
*d_ptr = I2C_Read(1);
*m_ptr = I2C_Read(1);
*y_ptr = I2C_Read(0);
I2C_Stop();
31 | Page
www.xplorelabz.com
EEPROM
/*---------------------------------------------------------------------------------------*
Avr Eeprom library
Filename: eeprom.c
Controller: Atmega8/16/32/128
Oscillator: 11.0592 MHz
Author: XploreLabz
website: www.xplorelabz.com
Reference: Atmega8/16/32 dataSheet for Control register description.
----------------------------------------------------------------------------------------*/
#include<avr\io.h>
#include<util\delay.h>
/*The below value should be set depending on the controller
by refering the respective data sheet*/
/*--------------------------------------------------------------------------------------EEPROM_WriteByte()
---------------------------------------------------------------------------------------* I/P Arguments: int,char-->eeprom_address at which eeprom_data is to be written.
* Return value
: none
* description:This function is used to write the data at specified EEPROM_address..
1. Wait till previous write operation is completed(ie wait till EEWE becomes zero).
2.Load the eeprom address into EEAR at which the data has to be stored.
3.Load the data into EEDR which has to be stored in Eeprom.
4.Set the EEMWE(Eeprom Master Write Enable) and within four clock cycles
set EEWE(Eeprom Write Enable) to trigger the Eeprom Write Opeartion.
----------------------------------------------------------------------------------------*/
void EEPROM_WriteByte(unsigned int eeprom_Address, unsigned char eeprom_Data)
{
while(EECR & (1<<EEWE));
EEAR = eeprom_Address;
EEDR = eeprom_Data;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
32 | Page
www.xplorelabz.com
/*----------------------------------------------------------------------------------------EEPROM_ReadByte()
-----------------------------------------------------------------------------------------* I/P Arguments: int-->eeprom_address from where eeprom_data is to be read.
* Return value
: char-->data read from Eeprom.
* description: This function is used to read the data from specified EEPROM_address.
1.WAit for completion of previous Write operation.
2.EEWE will be cleared once EEprom write is completed.
3.Load the eeprom address into EEAR from where the data needs to be read.
4.Trigger the eeprom read operation by setting EERE(Eeprom Read Enable).
5.Wait for some time and collect the read data from EEDR.
-----------------------------------------------------------------------------------------*/
unsigned char EEPROM_ReadByte(unsigned int eeprom_Address)
{
while(EECR & (1<<EEWE));
EEAR = eeprom_Address;
EECR |=(1<<EERE);
_delay_ms(1);
return EEDR;
/*--------------------------------------------------------------------------------------EEPROM_WriteNBytes()
---------------------------------------------------------------------------------------* I/P Arguments: int,-->eeprom_address from where the N-bytes are to be written.
char*-->Pointer to the N-bytes of data to be written.
char --> Number of bytes to be written
* Return value
: none
* description:
This function is used to write N-bytes of data at specified EEPROM_address.
EEPROM_WriteByte() function is called to write a byte at atime.
Source(RAM) and destination(EEPROM) address are incremented after each write
NoOfBytes is Decemented each time a byte is written.
Above Operation is carried out till all the bytes are written(NoOfBytes!=0)
---------------------------------------------------------------------------------------*/
void EEPROM_WriteNBytes(unsigned int EepromAddr, unsigned char *RamAddr, char NoOfBytes)
{
while(NoOfBytes !=
{
0)
}
}
33 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------------EEPROM_ReadNBytes()
---------------------------------------------------------------------------------------* I/P Arguments: int,-->eeprom_address from where the N-bytes is to be read.
char*-->Pointer into which the N-bytes of data is to be read.
char --> Number of bytes to be Read
* Return value
: none
* description:
This function is used to Read N-bytes of data from specified EEPROM_address.
EEPROM_ReadByte() func is called to read a byte at a time.
Source(RAM) and destination(EEPROM) address are incremented each time.
NoOfBytes is Decemented after a byte is read.
Above Operation is carried out till all the bytes are read(NoOfBytes!=0)
---------------------------------------------------------------------------------------*/
void EEPROM_ReadNBytes(unsigned int EepromAddr, unsigned char *RamAddr, char NoOfBytes)
{
while(NoOfBytes != 0)
{
*RamAddr = EEPROM_ReadByte(EepromAddr);//Read a byte from EEPROM to RAM
EepromAddr++;
//Incerement the Eeprom Address
RamAddr++;
//Increment the RAM Address
NoOfBytes--;
//Decrement NoOfBytes after Reading each Byte
}
}
/*--------------------------------------------------------------------------------------EEPROM_WriteString()
---------------------------------------------------------------------------------------* I/P Arguments: int,-->eeprom_address where the String is to be written.
char*-->Pointer to String which has to be written.
* Return value
: none
{
do
{
EEPROM_WriteByte(eeprom_address,*source_address); //Write a byte from RAM to EEPROM
source_address++;
//Increment the RAM Address
eeprom_address++;
//Increment the Eeprom Address
} while(*(source_address-1) !=0);
34 | Page
www.xplorelabz.com
/*--------------------------------------------------------------------------------------EEPROM_ReadString()
---------------------------------------------------------------------------------------* I/P Arguments: int,-->eeprom_address from where the String is to be read.
char*-->Pointer into which the String is to be read.
* Return value
: none
{
char eeprom_data;
do
{
eeprom_data = EEPROM_ReadByte(eeprom_address); //Read a byte from EEPROM to RAM
*destination_address = eeprom_data;
//Copy the data into String Buffer
destination_address++;
//Increment the RAM Address
eeprom_address++;
//Increment the Eeprom Address
}while(eeprom_data!=0);
/*----------------------------------------------------------------------------------------EEPROM_Erase()
-----------------------------------------------------------------------------------------* I/P Arguments: none
* Return value
: none
{
unsigned int eeprom_address;
for(eeprom_address=0;eeprom_address<MaxEepromSize;eeprom_address++)
{
EEPROM_WriteByte(eeprom_address,0xff); // Write Each memory location with OxFF
}
}
35 | Page
www.xplorelabz.com
36 | Page
www.xplorelabz.com
Step 2: Browse to your project folder and provide the project name and click on Ok.
37 | Page
www.xplorelabz.com
Step 3: Once the project is saved a new dialog box Device Selection opens, Select Atmega32 and click OK.
Step 4:Once the project is successfully created the below window opens with the initil .c file .
38 | Page
www.xplorelabz.com
Step 5: Write your program using the library functions and save it.
Note: Include the respective header files before calling any library functions.
39 | Page
www.xplorelabz.com
Step 7: Add the Source(.c) and header( .h) files by browsing to the project folder.
40 | Page
www.xplorelabz.com
Step 8: The included library files can be seen in Solution Explorer on the right side.
Step 9: Compile the project by clicking on Build Solution from Build menu (or press F7). Project complies if there are no
errors. If there are any errors fix them and re-compile.
41 | Page
www.xplorelabz.com
Step 10: Configure the Controller Freq by selecting the project properties from Project menu.
Note: As the Inbuilt delay routines as used the freq needs to be specified to generate accurate delays.
42 | Page
www.xplorelabz.com
Step 11: Select the Symbols from Tool Chain menu and Click on Add Item in Defined Symbols(-D) box.
Step 12: Provide the Controller (Target Board) frequency as F_CPU=xxx Hz .In this case it is 11.0592Mhz.
43 | Page
www.xplorelabz.com
Step 13: Configuring the optimization levels: Select the Optimization from ToolChain menu. Select the required optimization
level from drop down. Refer WinAvr/Gcc documents for more optimization details.
Step 14: Seletcting the targed tool chain : Select the Advanced option on the left side, now click the link shown in blue
colourTools->Options->Toochain ->Flavour Configuretion.
44 | Page
www.xplorelabz.com
Step 15: From the drop down select WinAVR and set it as Default toolchain by clicking on Set As Default.
Note:
Above two Steps( 14 & 15) needs to be performed for the first time, ie till the WinAVR is configured as default Toolchain .
Step 14: Finally recompile after all configurations. Hex file will be generated with the project name in the selected
Project->Debug folder.
45 | Page
www.xplorelabz.com
46 | Page
www.xplorelabz.com
Step 2: Connect the usb isp programmer to the targed device and select the required ic from the drop down menu.
Step 3: Configuring the fuse and lock bits : Select the Fuses and Lock bits from the Command menu.
f
47 | Page
www.xplorelabz.com
Step 4: A new window opens to read/write the fuse bits. Now read the fuse bits of the target. If the below window doesnt
open then double check the connection(six pin connector). Still the problem persists then remove the usb cable and
reconnect it.
Step 5: Mode1: No memory lock Feature should be selected else the controller gets locked and cannot be reprogrammed..
Step5: the Source of the clock should be selected from the drop down menu as shown below. In this the external high
frequency is selected as the target device is running at 11.0592Mhz freq.
48 | Page
www.xplorelabz.com
Step 6: After configuring the lock and fuse bits, write them back into the target controller. Double check the memory lock
and crystal features as shown in step 4 and 5 before writing the fuse bits.
Note: Step 4,5,6 needs to be performed only once, once the fuse bits are written they will be saved.
Step 7: Browse and select the hex file that needs to be flashed into the target device.
49 | Page
www.xplorelabz.com
Step8: Click the flash option as show below to program the target device.
Step9: Once the target is programmed a new pop up window will be displayed to notify the same. And the controller starts
executing and no external hard reset is required.
50 | Page
www.xplorelabz.com