1. 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.
    Dismiss Notice

PARKINK LOT control.. help

Discussion in 'Homework Help' started by omani girl, Apr 28, 2009.

  1. omani girl

    omani girl New Member

    Joined:
    Apr 14, 2009
    Messages:
    3
    Likes:
    0
    my project work in ATTINY26 microcontoller.

    I used:

    infrared sensor

    LCD

    motor

    the number of parking is 20 . I do the program to write full or not full by increment for enterance car only . but the code of infrared sensor dosen't work correctly when I did the implement. I want the LCD read 'NOT FULL'. if the the numbers of car enter is less than 20 . and read Full when it more or equal 20

    please check my code. in increment. I think there is some thing missing


    PHP:
    #define F_CPU 1000000UL /* crystal frequency in Hz*/
    #include <ctype.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
    #define setbit(port, bit) (port) |= (1 << (bit))
    #define clearbit(port, bit) (port) &= ~(1 << (bit))

    // function for initializing the LCD
    void LCD_init()
    {
    PORTA=0x38; // Function set: 2 Line, 8-bit, 5x7 dots
    clearbit(PORTB,5); // clear the RS pin
    _delay_ms(45);
    setbit(PORTB,6); // set the Enable pin
    _delay_ms(45);
    clearbit(PORTB,6); // clear the RS pin
    _delay_ms(45); // wait until the LCD finished execution
    PORTA=0x0F; //Display on, Cursor blinking command
    clearbit(PORTB,5);
    _delay_ms(45);
    setbit(PORTB,6);
    _delay_ms(45);
    clearbit(PORTB,6);
    _delay_ms(45); //wait until the LCD finished execution
    PORTA=0x01; // clear LCD
    clearbit(PORTB,5);
    _delay_ms(45);
    setbit(PORTB,6);
    _delay_ms(45);
    clearbit(PORTB,6);
    _delay_ms(45); //wait until the LCD finished execution
    PORTA=0x06; // Entry mode, auto increment with no shift
    clearbit(PORTB,5);
    _delay_ms(45);
    setbit(PORTB,6);
    _delay_ms(45);
    clearbit(PORTB,6);
    _delay_ms(45); //wait until the LCD finished execution
    }

    // function for sending data to the LCD
    void LCD_sendata(unsigned char y)
    {
    // this will place the ASCII equivalent of the argument
    // sent by the main program on PORTA  LCD (DB0-DB7) input
    // thus the character will be recognized and displayed by the LCD
    PORTA=y;
    setbit(PORTB,5);
    _delay_ms(45);
    setbit(PORTB,6);
    _delay_ms(45);
    clearbit(PORTB,6);
    _delay_ms(45); //wait until the LCD finished execution
    }
               


    int main()
    {
    unsigned char x, y=0; // 8 bit variables


    _delay_ms(45); // wait for the LCD to be ON
    _delay_ms(45);
    _delay_ms(45);
    LCD_init(); // call the LCD initialization function
    // NOT FULL will be displayed until the counter is greater
    // than the no. parkings (e.g 20)
    LCD_sendata('N'); // call function for sending a character to LCD
    LCD_sendata('O');
    LCD_sendata('T');
    LCD_sendata(' ');
    LCD_sendata('F');
    LCD_sendata('U');
    LCD_sendata('L');
    LCD_sendata('L');
    while(1) // repeat forever
    {
    x = PINB & 1; // read pins of port B and mask the unusigned bits
    if(x==1){ // check the infrared sensor output
    y++;
    } // increment counter

    if(y>=20) // compare the counter with no. of parking
    {
    PORTA=0x01; // clear LCD before displaying the new string
    clearbit(PORTB,5);
    _delay_ms(45);
    setbit(PORTB,6);
    _delay_ms(45);
    clearbit(PORTB,6);
    _delay_ms(45); //wait until the LCD finished execution
    LCD_sendata('F'); // call function for sending a character to LCD
    LCD_sendata('U');
    LCD_sendata('L');
    LCD_sendata('L');
    break;

    }
    }
    return 0;
    }
     
  2. edeca

    edeca Active Member

    Joined:
    Apr 8, 2008
    Messages:
    589
    Likes:
    38
    Location:
    England
    After a quick chat, the problem appears to be that the check for whether the sensor is on always triggers.

    This is either because the hardware is wrong, or because the check for the sensor is inverted.

    If you are sure that you are checking the right pin, you might like to try:

    Code (text):
    if(x==0){ // check the infrared sensor output
    y++;
    } // increment counter
    But without seeing the circuit, it is impossible to tell.
     
    • Like Like x 1
  3. edeca

    edeca Active Member

    Joined:
    Apr 8, 2008
    Messages:
    589
    Likes:
    38
    Location:
    England
    OK so it's actually just a debouncing issue. Should have spotted that first. Try this instead:

    Code (text):
    if(x==1){ // check the infrared sensor output
    y++;
    while(PINB & 1);
    } // increment counter
     

Share This Page