Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Atmega16??

Status
Not open for further replies.

mona:)

New Member
Hi every body
i have a question about ATmega16 (may be the answer seems obvious but plz help me , i know notthing about AVRs).
i want to sense 8 optional voltage (each one is for special purpose) and then compare them with 8 diffrent REF voltage and finaly show the percentag on a LCD....( the inputs are port A(analog to digatal convertor)).
1) which ports should be connected to Lcd?( i saw some exmpels but in all of them porta was connected to LCD)??
thanks mona:)
 
It is not necessary to connect the LCD to port A only you can connect to the any port which is free for you....
As you said that your PortA is busy with ADC inputs then you can use any other port...
 
Firstly just try to write simple LCD programme if you are new to programming...
Something like below:
#define F_CPU 12000000 //Change the F_CPU value to that you're using in your hardware, I used 12Mhz
#include <avr/io.h>
#include <util/delay. h>


#define dataport PORTB
#define commport PORTD
#define rs PD4
#define wr PD5
#define en PD6


int LCD_init(void);
int LCD_SendData(void);
int wrcomm(void);
int wrdata(void);


int main(void)
{
DDRB = 0xFF; //Set PortA as output port
DDRD = 0x70 //Set PortD 4, 5, 6 pin as output pins
LCD_init(); //Initialise LCD
LCD_SendData( ); //Write to LCD
return 1;
}


int LCD_init()

{
dataport = 0x38; //initialize LCD 2 lines, 5x7 matrix
wrcomm(); //Right the command byte to command register
dataport = 0x01; //Clear LCD
wrcomm(); //Right the command byte to command register
dataport = 0x0E; //Display on Cursor Blinking
wrcomm(); //Right the command byte to command register
dataport = 0x80; //Cursor at line 1, position 1
wrcomm(); //Right the command byte to command register
dataport = 0x1C; //Shift Entire Display To Right
wrcomm(); //Right the command byte to command register
return 1;
}


/*********** **** <<Sending Data To LCD Display>> ************ ***/

int LCD_SendData(void)

{
unsigned char j[] = "Data To Write";
int i;
for(i = 0; i < sizeof j; i++)
{
dataport = j;
wrdata();
}
return 1;
}


/******* <<Righting the command byte to command register>> ********/
int wrcomm(void)
{
commport &= ~(1 << rs); //Setting RS = 0, selecting command register
commport &= ~(1 << wr); //Setting RW = 0
commport |= (1 << en); //EN = 1
commport &= ~(1 << en); //EN = 0, thus giving high to low pulse on Enable pin
_delay_ms(10); //10ms delay
return 1;

}


/********** <<Righting the Data byte to Data register>> **********/
int wrdata(void)
{
commport |= (1 << rs); //Setting RS = 1, selecting data register
commport &= ~(1 << wr); //Setting RW = 0
commport |= (1 << en); //EN = 1
commport &= ~(1 << en); //EN = 0, thus giving high to low pulse on Enable pin
_delay_ms(10) ; //10ms delay
return 1;
}
 
thank u Dj but the code u have written is so diffrent with what i saw in som toturials i've write sth could u check it?
thanks

#include <mega16.h>

#include <delay.h>

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>

#define ADC_VREF_TYPE 0xE0

// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}

// Declare your global variables here

void main(void)
{
char Vref[8]={1,2,3,4,5,6,7,8};
float V;
char buffer[20];
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTA=0xFF;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x82;

// LCD module initialization
lcd_init(16);

while (1)
{
if(PINA.0!=0)
{V=PINA.0;
V=V*100/Vref[0];
printf(buffer,"%d",V);
lcd_clear();
lcd_puts(buffer);
}
else
if(PINA.1!=0)
{V=PINA.1;
V=V*100/Vref[1];
printf(buffer,"%d",V);
lcd_clear();
lcd_puts(buffer);
}
else
if(PINA.2!=0)
{V=PINA.2;
V=V*100/Vref[2];
printf(buffer,"%d",V);
lcd_clear();
lcd_puts(buffer);
}
else
if(PINA.3!=0)
{V=PINA.3;
V=V*100/Vref[3];
printf(buffer,"%d",V);
lcd_clear();
lcd_puts(buffer);
}
else
if(PINA.4!=0)
{V=PINA.4;
V=V*100/Vref[4];
printf(buffer,"%d",V);
lcd_clear();
lcd_puts(buffer);
}
else
if(PINA.5!=0)
{V=PINA.5;
V=V*100/Vref[5];
printf(buffer,"%d",V);
lcd_clear();
lcd_puts(buffer);
}
else
if(PINA.6!=0)
{V=PINA.6;
V=V*100/Vref[6];
printf(buffer,"%d",V);
lcd_clear();
lcd_puts(buffer);
}
else
if(PINA.7!=0)
{V=PINA.7;
V=V*100/Vref[7];
printf(buffer,"%d",V);
lcd_clear();
lcd_puts(buffer);
}
else
lcd_puts("ready");
// Place your code here

};
}
 
oh excuse me all the printfs are sprintf and i dont know compiler errors "undefinded symbol 'sprintf'"???
 
PINA.1 will read the bit portA pin no. 1...
Make sure that you have make that pin as input by using
DDRA.1 = 0; // make PINA.1 input
PORTA.1 = 1; // enable pullup
or you can do that by using the port also or port pin as i have shown above...
 
yes i know that , and i make it as input but could i put its value in to variable "V" and do "V=V*100/Vref[1];
" and send it to lcd??
 
Last edited:
Status
Not open for further replies.

Latest threads

Back
Top