Close or Esc Key

Arduino Projects   |   Raspberry Pi   |   Electronic Circuits   |   AVR   |   PIC   |   8051   |   Electronic Projects

Problem in Programming------AVR-------

8 posts / 0 new
Last post
Manoj
Manoj's picture
Offline
Last seen: 2 months 3 weeks ago
Joined: 17/06/2017 - 10:59
Problem in Programming------AVR-------
Hi i am new in AVR, very minimum knowledge of C Programming.
i just want to make a project on simple watel level controller. 
there are 3 wire which detect water level 
i:e Full, Half, 1/4
Full: when PB.3, 4, 5 are high
Half: when PB. 4, 5 high
1/4: when only PB.5 high
if no switch is pressed start all three relays and buzzer and show massage tank is start filling
 
Problems:
1. the massaege on lcd is not satble it repets again and again.
2. massage is not displaying in order i want 
3. i want order i:e
PB.3 = 1
PB.5 = 1
PB.5 = 1 
 TANK IS FULL
 
PB.3 = 0
PB.5 = 1
PB.5 = 1 
 TANK IS HALF
 
PB.3 = 0
PB.5 = 0
PB.5 = 1 
 TANK IS 1/4
 
PB.3 = 0
PB.5 = 0
PB.5 = 0 
 TANK IS EMply ,satrts Relays and Buzzer
 
Plz help me in programming, give me solid programming concept, like externel intrrupt or switch caes etc.
i cant chage ports, i have a dovelopments board so all ports are fixed 
 
 
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
 
/*PORTD = LCD Data line
PB.0 = RS
PB.1 = R/w
PB.2 = EN
PB.3 = Switch 1
PB.4 = Switch 2
PB.5 = Switch 3 
PC.1 = Buzzer
PC.2 = Relay 1
PC.3 = Relay 2
PC.4 = Relay 3 */
 
int main()
{
DDRD = 0xFF; //set PORTD as out put 8 bit lcd data line
DDRB = 0b00000111; //Set PB.0,1 and 2 as Output
DDRC = 0b11111111; //PORTC as output
init_lcd();
_delay_ms(1000);
lcd_cmd(0x80); //Goto Line-1,first position
lcd_send_string("Wait...");
_delay_ms(100);
lcd_cmd(0xC0); //Goto Line-2, first position
_delay_ms(100);
lcd_send_string("Booting");
while (1)
{
PORTC = 0xFF;
if ((bit_is_set(PINB,PB3))&&(bit_is_set(PINB,PB4))&&(bit_is_set(PINB,PB5))) // All 3 Switch Pressed
{
PORTC=PORTC & 0x00; // All 3 Relay and Buzzer ON
lcd_cmd(0x01); //Clear the lcd
_delay_ms(100);
lcd_cmd(0x80); //Goto Line-1,first position
lcd_send_string("Tank is ");
_delay_ms(100);
lcd_cmd(0xC0); //Goto Line-2, first position
_delay_ms(100);
lcd_send_string("Full");
}
else if ((bit_is_clear(PINB,PB3))&&(bit_is_set(PINB,PB4))&&(bit_is_set(PINB,PB5))) // 2 Switch Pressed
{
PORTC=PORTC & 0x00; // All 3 Relay and Buzzer ON
lcd_cmd(0x01); //Clear the lcd
_delay_ms(100);
lcd_cmd(0x80); //Goto Line-1,first position
lcd_send_string("TANK IS");
_delay_ms(100);
lcd_cmd(0xC0); //Goto Line-2, first position
_delay_ms(100);
lcd_send_string("HALF");
}
else if ((bit_is_clear(PINB,PB3))&&(bit_is_clear(PINB,PB4))&&(bit_is_set(PINB,PB5))) // 1 Switch Pressed
{
PORTC=PORTC & 0x00; // All 3 Relay and Buzzer ON
lcd_cmd(0x01); //Clear the lcd
_delay_ms(100);
lcd_cmd(0x80); //Goto Line-1,first position
lcd_send_string("TANK IS");
_delay_ms(100);
lcd_cmd(0xC0); //Goto Line-2, first position
_delay_ms(100);
lcd_send_string("1/4");
}
else if ((bit_is_clear(PINB,PB3))&&(bit_is_clear(PINB,PB4))&&(bit_is_clear(PINB,PB5))) // No Switch is Pressed
{
PORTC=PORTC & 0xFF;
//PORTC = 0x00;
lcd_cmd(0x01); //Clear the lcd
_delay_ms(100);
lcd_send_string("TANK EMPTY");
_delay_ms(100);
lcd_cmd(0xC0); //Goto Line-2, first position
_delay_ms(100);
lcd_send_string("PUMP ON");
}
}
 }
 
//LCD function
/*------------------------------------------------------------------------------------------------------------*/
//Function for sending commands to LCD
void lcd_cmd(unsigned char command)
{
PORTD = command; //Put command on the Data Bus
PORTB = 0b00000100; //Enable LCD for command writing
_delay_ms(50);
PORTB = 0b00000000; //Disable LCD again
_delay_ms(50);
}
//Function for sending Data to LCD
void lcd_data(unsigned char data)
{
PORTD= data; //Put data on Data Bus
PORTB = 0b00000101; //Set R/S (Register Select) to High, and Enable to High
_delay_ms(50);
PORTB = 0b00000000; //Disable LCD again
_delay_ms(50);
}
//Function to send String to LCD
void lcd_send_string(char* string)
{
while(*string)
{
lcd_data(*string); //Send value of pointer as data to LCD
string++; //Increment string pointer
}
}
//Function to InitiALLISE LCD
void init_lcd()
{
lcd_cmd(0x38); //Setup both lines of LCD
lcd_cmd(0x0E); //Set Cursor off - Enable LCD
lcd_cmd(0x01); //Clear Screen
lcd_cmd(0x80); //Goto first position
}
Hari Prasaath K
Hari Prasaath K's picture
Offline
Last seen: 21 hours 40 min ago
Joined: 20/01/2015 - 23:56
AVR Project

On what basis your saying the LCD is not stale, whether LCD is blinking. whether you are using push button for testing?

Here you have given the conditions, based on the condition only it will display. Not able to get your question in what manner you are saying.

to display in order. give the conditions one by one and test.

Manoj
Manoj's picture
Offline
Last seen: 2 months 3 weeks ago
Joined: 17/06/2017 - 10:59
AVR
Thanks Mr. Hari for Replying, i am saying that when it goes in any if case the message shows again and again, like if all three Ports are hight (PB3,4,5) it should show message on screen "TANK IS FULL", it is showing message correctly but LCD cleares after some time and again this message starts typing on screen And Yes currently i am using Switches for I/P and i just want to display message if any switch is pressed and starts relay and buzzer when no switch is pressed, After Posting this Forum i hv done some R&D on my Code, and now Code is #include #define F_CPU 1000000UL #include /*PORTD = LCD Data line PB.0 = RS PB.1 = R/w PB.2 = EN PB.3 = Switch 1 PB.4 = Switch 2 PB.5 = Switch 3 PC.1 = Buzzer PC.2 = Relay 1 PC.3 = Relay 2 PC.4 = Relay 3 */ int main() { DDRD = 0xFF; //set PORTD as out put 8 bit lcd data line DDRB = 0b00000111; //Set PB.0,1 and 2 as Output DDRC = 0xFF; //PORTC as output PORTB = 0x00; init_lcd(); _delay_ms(1000); lcd_cmd(0x80); //Goto Line-1,first position lcd_send_string("Wait..."); _delay_ms(100); lcd_cmd(0xC0); //Goto Line-2, first position _delay_ms(100); lcd_send_string("Booting"); while (1) { PORTC=0xFF; if (bit_is_set(PINB,PB3) && bit_is_set(PINB,PB4) && bit_is_set(PINB,PB5)) // All 3 Switch Pressed { PORTC=PORTC & 0x00; // All 3 Relay and Buzzer OFF lcd_cmd(0x01); //Clear the lcd _delay_ms(100); lcd_cmd(0x80); //Goto Line-1,first position lcd_send_string("Tank is "); _delay_ms(100); lcd_cmd(0xC0); //Goto Line-2, first position _delay_ms(100); lcd_send_string("Full"); _delay_ms(1000); } else if (bit_is_clear(PINB,PB3) && bit_is_set(PINB,PB4) && bit_is_set(PINB,PB5)) // 2 Switch Pressed { PORTC=PORTC & 0x00; // All 3 Relay and Buzzer OFF lcd_cmd(0x01); //Clear the lcd _delay_ms(100); lcd_cmd(0x80); //Goto Line-1,first position lcd_send_string("TANK IS"); _delay_ms(100); lcd_cmd(0xC0); //Goto Line-2, first position _delay_ms(100); lcd_send_string("HALF"); _delay_ms(1000); } else if (bit_is_clear(PINB,PB3) && bit_is_clear(PINB,PB4) && bit_is_set(PINB,PB5)) // 1 Switch Pressed { PORTC=PORTC & 0x00; // All 3 Relay and Buzzer OFF lcd_cmd(0x01); //Clear the lcd _delay_ms(100); lcd_cmd(0x80); //Goto Line-1,first position lcd_send_string("TANK IS"); _delay_ms(100); lcd_cmd(0xC0); //Goto Line-2, first position _delay_ms(100); lcd_send_string("1/4"); _delay_ms(1000); } else if(bit_is_clear(PINB,PB3) && bit_is_clear(PINB,PB4) && bit_is_clear(PINB,PB5)) // No Switch is Pressed { PORTC=PORTC & 0xFF; // All 3 Relay and Buzzer ON lcd_cmd(0x01); //Clear the lcd _delay_ms(100); lcd_send_string("TANK EMPTY"); _delay_ms(100); lcd_cmd(0xC0); //Goto Line-2, first position _delay_ms(100); lcd_send_string("PUMP ON"); _delay_ms(1000); } } } //LCD function /*------------------------------------------------------------------------------------------------------------*/ //Function for sending commands to LCD void lcd_cmd(unsigned char command) { PORTD = command; //Put command on the Data Bus PORTB = 0b00000100; //Enable LCD for command writing _delay_ms(50); PORTB = 0b00000000; //Disable LCD again _delay_ms(50); } //Function for sending Data to LCD void lcd_data(unsigned char data) { PORTD= data; //Put data on Data Bus PORTB = 0b00000101; //Set R/S (Register Select) to High, and Enable to High _delay_ms(50); PORTB = 0b00000000; //Disable LCD again _delay_ms(50); } //Function to send String to LCD void lcd_send_string(char* string) { while(*string) { lcd_data(*string); //Send value of pointer as data to LCD string++; //Increment string pointer } } //Function to InitiALLISE LCD void init_lcd() { lcd_cmd(0x38); //Setup both lines of LCD lcd_cmd(0x0E); //Set Cursor off - Enable LCD lcd_cmd(0x01); //Clear Screen lcd_cmd(0x80); //Goto first position }
Hari Prasaath K
Hari Prasaath K's picture
Offline
Last seen: 21 hours 40 min ago
Joined: 20/01/2015 - 23:56
AVR Code

Please attach the code in the aligned format. 

Manoj
Manoj's picture
Offline
Last seen: 2 months 3 weeks ago
Joined: 17/06/2017 - 10:59
I am saying that when it goes

I am saying that when it goes in any if case the message shows again and again, 

like if all three Ports are hight (PB3,4,5) it should show message on screen "TANK IS FULL", 
it is showing message correctly but LCD cleares after some time and again this message starts typing on screen 
Yes currently i am using Switches for I/P 
i just want to display message if any switch is pressed and starts relay and buzzer when no switch is pressed
 
After Posting this Forum i hv done some R&D on my Code, and now Code is
 
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
 
/*PORTD = LCD Data line
PB.0 = RS
PB.1 = R/w
PB.2 = EN
PB.3 = Switch 1
PB.4 = Switch 2
PB.5 = Switch 3
PC.1 = Buzzer
PC.2 = Relay 1
PC.3 = Relay 2
PC.4 = Relay 3 */
 
int main()
{
DDRD = 0xFF; //set PORTD as out put 8 bit lcd data line
DDRB = 0b00000111; //Set PB.0,1 and 2 as Output
DDRC = 0xFF; //PORTC as output
PORTB = 0x00;
init_lcd();
_delay_ms(1000);
lcd_cmd(0x80); //Goto Line-1,first position
lcd_send_string("Wait...");
_delay_ms(100);
lcd_cmd(0xC0); //Goto Line-2, first position
_delay_ms(100);
lcd_send_string("Booting");
while (1)
{
PORTC=0xFF;
if (bit_is_set(PINB,PB3) && bit_is_set(PINB,PB4) && bit_is_set(PINB,PB5)) // All 3 Switch Pressed
{
PORTC=PORTC & 0x00; // All 3 Relay and Buzzer OFF
lcd_cmd(0x01); //Clear the lcd
_delay_ms(100);
lcd_cmd(0x80); //Goto Line-1,first position
lcd_send_string("Tank is ");
_delay_ms(100);
lcd_cmd(0xC0); //Goto Line-2, first position
_delay_ms(100);
lcd_send_string("Full");
_delay_ms(1000);
}
else if (bit_is_clear(PINB,PB3) && bit_is_set(PINB,PB4) && bit_is_set(PINB,PB5)) // 2 Switch Pressed
{
PORTC=PORTC & 0x00; // All 3 Relay and Buzzer ON
lcd_cmd(0x01); //Clear the lcd
_delay_ms(100);
lcd_cmd(0x80); //Goto Line-1,first position
lcd_send_string("TANK IS");
_delay_ms(100);
lcd_cmd(0xC0); //Goto Line-2, first position
_delay_ms(100);
lcd_send_string("HALF");
_delay_ms(1000);
}
else if (bit_is_clear(PINB,PB3) && bit_is_clear(PINB,PB4) && bit_is_set(PINB,PB5)) // 1 Switch Pressed
{
PORTC=PORTC & 0x00; // All 3 Relay and Buzzer ON
lcd_cmd(0x01); //Clear the lcd
_delay_ms(100);
lcd_cmd(0x80); //Goto Line-1,first position
lcd_send_string("TANK IS");
_delay_ms(100);
lcd_cmd(0xC0); //Goto Line-2, first position
_delay_ms(100);
lcd_send_string("1/4");
_delay_ms(1000);
}
else if(bit_is_clear(PINB,PB3) && bit_is_clear(PINB,PB4) && bit_is_clear(PINB,PB5)) // No Switch is Pressed
{
PORTC=PORTC & 0xFF;
lcd_cmd(0x01); //Clear the lcd
_delay_ms(100);
lcd_send_string("TANK EMPTY");
_delay_ms(100);
lcd_cmd(0xC0); //Goto Line-2, first position
_delay_ms(100);
lcd_send_string("PUMP ON");
_delay_ms(1000);
}
}
}
 
//LCD function
/*------------------------------------------------------------------------------------------------------------*/
//Function for sending commands to LCD
void lcd_cmd(unsigned char command)
{
PORTD = command; //Put command on the Data Bus
PORTB = 0b00000100; //Enable LCD for command writing
_delay_ms(50);
PORTB = 0b00000000; //Disable LCD again
_delay_ms(50);
}
//Function for sending Data to LCD
void lcd_data(unsigned char data)
{
PORTD= data; //Put data on Data Bus
PORTB = 0b00000101; //Set R/S (Register Select) to High, and Enable to High
_delay_ms(50);
PORTB = 0b00000000; //Disable LCD again
_delay_ms(50);
}
//Function to send String to LCD
void lcd_send_string(char* string)
{
while(*string)
{
lcd_data(*string); //Send value of pointer as data to LCD
string++; //Increment string pointer
}
}
//Function to InitiALLISE LCD
void init_lcd()
{
lcd_cmd(0x38); //Setup both lines of LCD
lcd_cmd(0x0E); //Set Cursor off - Enable LCD
lcd_cmd(0x01); //Clear Screen
lcd_cmd(0x80); //Goto first position
}
Guru
Guru's picture
Offline
Last seen: 2 months 1 week ago
Joined: 27/06/2017 - 11:50
Programming with AVR AT90USBKEY2

Hi I am working with AT90USBKEY2 and I am new to it.. ie..AT90USB1287 chip.....Can someone please share some related programs...All I find is most of the programs related to Atmega16....Plesae share some link....ATmega324p is also fine,since it is almost similar to AT90USB1287....It will be of huge help...

Ashutosh Bhatt
Ashutosh Bhatt's picture
Offline
Last seen: 1 week 5 days ago
Joined: 21/12/2010 - 15:59
first check whether you are

first check whether you are getting exact 1 and 0 logic levels on your port pins?

it depends on your HW circuit? your all connections are OK?

Faroogh
Faroogh's picture
Offline
Last seen: 3 weeks 2 days ago
Joined: 24/01/2016 - 19:43
Hi there is Problem in your

Hi there is Problem in your Code

like following Finction

 

void lcd_send_string(char* string)
{
while(*string)
{
lcd_data(*string); //Send value of pointer as data to LCD
string++; //Increment string pointer
}
}
 
use it like this
 
void lcd_send_string(char* string)
{
int i=0;
while(string[i] != '\0')
{
lcd_data(string[i]); //Send value of pointer as data to LCD
i++; //Increment string pointer
}
 
 
 
i will send you my code if needed