EngineersGarage

  • Engineers Garage Main Site
  • Visit our active EE Forums
    • EDABoard.com
    • Electro-Tech-Online
  • Projects & Tutorials
    • Circuits
    • Electronic Projects
    • Tutorials
    • Components
  • Digi-Key Store
    • Cables, Wires
    • Connectors, Interconnect
    • Discrete
    • Electromechanical
    • Embedded Computers
    • Enclosures, Hardware, Office
    • Integrated Circuits (ICs)
    • Isolators
    • LED/Optoelectronics
    • Passive
    • Power, Circuit Protection
    • Programmers
    • RF, Wireless
    • Semiconductors
    • Sensors, Transducers
    • Test Products
    • Tools
  • Advertise
You are here: Home / Topics / Problem in Programming——AVR——-

Problem in Programming——AVR——-

|

Microcontroller › AVR › Problem in Programming——AVR——-

  • This topic has 8 replies, 6 voices, and was last updated 6 years, 5 months ago by Saatwik.
Viewing 9 posts - 1 through 9 (of 9 total)
  • Author
    Posts
  • June 20, 2017 at 5:53 am #4670
    Manoj
    Participant
    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
    }
    June 20, 2017 at 11:44 am #14617
    Hari Prasaath K
    Participant

    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.

    June 23, 2017 at 4:57 am #14618
    Manoj
    Participant

    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
    }

    June 23, 2017 at 11:12 am #14619
    Hari Prasaath K
    Participant

    Please attach the code in the aligned format. 

    June 24, 2017 at 5:13 am #14620
    Manoj
    Participant

    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
    }
    June 29, 2017 at 4:39 am #14622
    Guru
    Participant

    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…

    July 16, 2017 at 12:23 pm #14631
    Ashutosh Bhatt
    Participant

    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?

    July 28, 2017 at 5:54 pm #14638
    Faroogh
    Participant

    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 != '')
    {
    lcd_data(string); //Send value of pointer as data to LCD
    i++; //Increment string pointer
    }
     
     
     
    i will send you my code if needed

     

    February 16, 2019 at 7:01 am #15021
    Saatwik
    Participant

    you can get help from this project https://www.engineersgarage.com/microcontroller/8051projects/liquid-level-alarm-AT89C51-circuit

  • Author
    Posts
Viewing 9 posts - 1 through 9 (of 9 total)
  • You must be logged in to reply to this topic.
Log In

RSS Recent Posts

  • More fun with ws2812 this time XC8 and CLC July 16, 2025
  • Pic18f25q10 osccon1 settings swordfish basic July 16, 2025
  • Pickit 5 July 16, 2025
  • turbo jet fan - feedback appreciated. July 16, 2025
  • I Wanna build a robot July 16, 2025

Stay Up To Date

Newsletter Signup
EngineersGarage

Copyright © 2025 WTWH Media LLC. All Rights Reserved. The material on this site may not be reproduced, distributed, transmitted, cached or otherwise used, except with the prior written permission of WTWH Media
Privacy Policy | Advertising | About Us

Search Engineers Garage

  • Engineers Garage Main Site
  • Visit our active EE Forums
    • EDABoard.com
    • Electro-Tech-Online
  • Projects & Tutorials
    • Circuits
    • Electronic Projects
    • Tutorials
    • Components
  • Digi-Key Store
    • Cables, Wires
    • Connectors, Interconnect
    • Discrete
    • Electromechanical
    • Embedded Computers
    • Enclosures, Hardware, Office
    • Integrated Circuits (ICs)
    • Isolators
    • LED/Optoelectronics
    • Passive
    • Power, Circuit Protection
    • Programmers
    • RF, Wireless
    • Semiconductors
    • Sensors, Transducers
    • Test Products
    • Tools
  • Advertise