Muhammad Faran
Newbie level 4
- Joined
- Apr 2, 2014
- Messages
- 5
- Helped
- 0
- Reputation
- 0
- Reaction score
- 0
- Trophy points
- 1
- Activity points
- 36
i am using atmega16 and want to set its internal frequency to 8Mhz as i am making a frequency counter using avrstudio 5 but i am having problem when i run my protues file as it does not display frequency count on lcd...
please help its urgent
please help its urgent
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#define F_CPU 8000000UL
#define LCD_RS_PIN 5
#define LCD_RW_PIN 6
#define LCD_ENABLE_PIN 7
#define LCD_DATA_PORT PORTA
#define LCD_DATA_DDR DDRA
#define LCD_DATA_PIN PINA
#define LCD_CNTRL_PORT PORTC
#define LCD_CNTRL_DDR DDRC
#define LCD_CNTRL_PIN PINC
unsigned long int freq; // to store value of frequency value
unsigned int i=0,dur; //i=number of overflows in one second
// dur to store the value of TCNT1 register
char buffer[8]; // to store the frequency value as a string to be displayed on lcd
// Timer1 overflow interrupt service routine
ISR(TIMER1_OVF_vect)
{
// Place your code here
i++ ; // count the number of overflows in one second
}
int main(void)
{
_delay_ms(1000);
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
DDRC=0xFF;
DDRA=0xFF;
_delay_ms(1000);
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
_delay_ms(500);
// LCD module initialization
LCD_init();
_delay_ms(500);
sei();
while (1)
{
// Place your code here
_delay_ms(1000);
TIMSK=0x04;
TCCR1B=0x07;
_delay_ms(1000);
TCCR1B=0x00;
TIMSK=0x00;
dur=TCNT1;
freq = dur + i*65536; //MAIN FREQUENCY VALUE IS HERE
TCNT1=0x0000;
i=0;
_delay_ms(1000);
LCD_goto(0,0);
_delay_ms(2000);
LCD_print("freq=");
_delay_ms(1500);
LCD_goto(0,1);
_delay_ms(1000);
itoa(freq,buffer,10);
_delay_ms(1000);
LCD_print(buffer);
_delay_ms(1000);
};
}
void LCD_goto(unsigned char y, unsigned char x)
{
unsigned char firstAddress[] = {0x80,0xC0,0x94,0xD4};
LCD_send_command(firstAddress[y-1] + x-1);
_delay_ms(10);
}
void LCD_send_command(unsigned char cmnd)
{
LCD_DATA_PORT = cmnd;
LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
LCD_CNTRL_PORT &= ~(1<<LCD_RS_PIN);
LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
_delay_ms(2);
LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
_delay_ms(100);
}
void lcd_data(unsigned char data)
{
LCD_DATA_PORT = data;
LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
LCD_CNTRL_PORT |= (1<<LCD_RS_PIN);
LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
_delay_ms(2);
LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
_delay_ms(100);
}
void LCD_print(char *string)
{
unsigned char j=0;
_delay_ms(100);
while(string[j]!=0)
{
lcd_data(string[j]);
_delay_ms(100);
j++;
}
}
void LCD_init()
{
LCD_CNTRL_DDR = 0xFF;
LCD_CNTRL_PORT = 0x00;
LCD_DATA_DDR = 0xFF;
LCD_DATA_PORT = 0x00;
_delay_ms(100);
LCD_send_command(0x38);
_delay_ms(100);
LCD_send_command(0x0C);
_delay_ms(100);
LCD_send_command(0x01);
_delay_ms(100);
LCD_send_command(0x06);
_delay_ms(100);
}