Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterownik do akwarium - źle działa.

Leon90 21 Lis 2012 13:47 1590 14
  • #1 21 Lis 2012 13:47
    Leon90
    Poziom 11  

    Witam!
    Ostatnio próbuje zbudować sterownik do akwarium. Zaczynam od pomiaru temperatury za pomocą DS18B20. Korzystam z zestawu EvB 4.3, ATmega32. Po wgraniu programu na wyświetlaczu LCD nic się nie pojawia i nie mam pomysłu co robić. Na początku pojawił się error, że nie odnajduje pliku config.h więc przeniosłem go z podobnego projektu sterownika. Po buildzie wyskakuje tylko jeden warning: "F_CPU not defined for <util/delay.h>". Dołączam link do artykułu: http://www./ja/elektronika/ds18b20.pdf . Z góry dzięki za pomoc

    Poniżej zamieszczam kod programu:

    Code:

    #include <avr/io.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include "HD44780.h"




    //makra
    #define WE 0
    #define PORT_1Wire PIND
    #define SET_1Wire DDRD &=~ _BV(WE)
    #define CLEAR_1Wire DDRD |= _BV(WE)

    char buf [8];

    unsigned char RESET_PULSE(void)
    {
       unsigned char PRESENCE;
       CLEAR_1Wire;
       _delay_us(500);
       SET_1Wire;
       _delay_us(30);
       if(bit_is_clear(PORT_1Wire, WE))
       {PRESENCE=1;}
       else
       {PRESENCE=0;}
       return PRESENCE;
    }

    void send(char bit)
    {
       CLEAR_1Wire;
       _delay_us(5);
       if(bit==1)
          SET_1Wire;
       _delay_us(80);
       SET_1Wire;
    }

    unsigned char read(void)
    {
       unsigned char PRESENCE=0;
       CLEAR_1Wire;
       _delay_us(2);
       SET_1Wire;
       _delay_us(15);
       if(bit_is_set(PORT_1Wire, WE))
          PRESENCE=1;
       else
          PRESENCE=0;
       return (PRESENCE);
    }

    void send_byte(char wartosc)
    {
       unsigned char i;
       unsigned char pom;
       
       for (i=0;i<8;i++)
       {
          pom=wartosc>>i;
          pom &= 0x01;
          send(pom);
       }
       _delay_us(100);
    }

    unsigned char read_byte(void)
    {
       unsigned char i;
       unsigned char wartosc=0;

       for(i=0;i<8;i++)
       {
          if(read())




             wartosc|=0x01<<i;
          _delay_us(15);
       }
       return(wartosc);
    }

    int main(void)
    {
       unsigned char sprawdz;
       char temp1=0, temp2=0;
       LCD_Initalize();
       LCD_Clear();
       LCD_WriteText("1-Wire");
       _delay_ms(200);
       LCD_Clear();
       for(;;)
       {
          sprawdz=RESET_PULSE();
          if(sprawdz==1)
          {
             send_byte(0xCC);
             send_byte(0x44);
             _delay_ms(750);

             sprawdz=RESET_PULSE();
             send_byte(0xCC);
             send_byte(0xBE);

             temp1=read_byte();
             temp2=read_byte();

             sprawdz=RESET_PULSE();
          
             float temp=0;
             temp=(float)(temp1+(temp2*256))/16;

             dtostrf(temp,1,1,buf);
             LCD_GoTo(0,0);
             LCD_WriteText(buf);
             _delay_ms(200);
          }
          else
          {
             LCD_GoTo(0,0);
             LCD_WriteText("Cisza");
          }

       }
    }

    0 14
  • Arrow Multisolution Day
  • #3 21 Lis 2012 13:56
    Leon90
    Poziom 11  

    Dołączam linijke kodu

    Code:
    #define F_CPU 1000000UL 

    ale to nic nie zmienia.

    0
  • Arrow Multisolution Day
  • #5 21 Lis 2012 14:14
    Leon90
    Poziom 11  

    Code:

    //-------------------------------------------------------------------------------------------------
    // Wyświetlacz alfanumeryczny ze sterownikiem HD44780
    // Sterowanie w trybie 4-bitowym odczytu flagi zajętości
    // z dowolnym przypisaniem sygnałów sterujących
    // Plik : HD44780.c   
    // Mikrokontroler : Atmel AVR
    // Kompilator : avr-gcc
    // Autor : Radosław Kwiecień
    // Źródło : http://radzio.dxp.pl/hd44780/
    // Data : 24.03.2007
    // Update : 19.08.2012
    //-------------------------------------------------------------------------------------------------
    #include "HD44780.h"

    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wystawiająca półbajt na magistralę danych
    //
    //-------------------------------------------------------------------------------------------------
    void _LCD_OutNibble(unsigned char nibbleToWrite)
    {

    if(nibbleToWrite & 0x01)
       LCD_DB4_PORT |= LCD_DB4;
    else
       LCD_DB4_PORT  &= ~LCD_DB4;

    if(nibbleToWrite & 0x02)
       LCD_DB5_PORT |= LCD_DB5;
    else
       LCD_DB5_PORT  &= ~LCD_DB5;

    if(nibbleToWrite & 0x04)
       LCD_DB6_PORT |= LCD_DB6;
    else
       LCD_DB6_PORT  &= ~LCD_DB6;

    if(nibbleToWrite & 0x08)
       LCD_DB7_PORT |= LCD_DB7;
    else
       LCD_DB7_PORT  &= ~LCD_DB7;
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wystawiająca półbajt na magistralę danych
    //
    //-------------------------------------------------------------------------------------------------
    unsigned char _LCD_InNibble(void)
    {
    unsigned char tmp = 0;

    if(LCD_DB4_PIN & LCD_DB4)
       tmp |= (1 << 0);
    if(LCD_DB5_PIN & LCD_DB5)
       tmp |= (1 << 1);
    if(LCD_DB6_PIN & LCD_DB6)
       tmp |= (1 << 2);
    if(LCD_DB7_PIN & LCD_DB7)
       tmp |= (1 << 3);
    return tmp;
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
    //
    //-------------------------------------------------------------------------------------------------
    void _LCD_Write(unsigned char dataToWrite)
    {
    LCD_DB4_DIR |= LCD_DB4;
    LCD_DB5_DIR |= LCD_DB5;
    LCD_DB6_DIR |= LCD_DB6;
    LCD_DB7_DIR |= LCD_DB7;

    LCD_RW_PORT &= ~LCD_RW;
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite >> 4);
    LCD_E_PORT &= ~LCD_E;
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite);
    LCD_E_PORT &= ~LCD_E;
    while(LCD_ReadStatus()&0x80);
    }

    void _LCD_JustWrite(unsigned char dataToWrite)
    {
    LCD_DB4_DIR |= LCD_DB4;
    LCD_DB5_DIR |= LCD_DB5;
    LCD_DB6_DIR |= LCD_DB6;
    LCD_DB7_DIR |= LCD_DB7;

    LCD_RW_PORT &= ~LCD_RW;
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite >> 4);
    LCD_E_PORT &= ~LCD_E;
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite);
    LCD_E_PORT &= ~LCD_E;
    }
    //-------------------------------------------------------------------------------------------------
    // Bezwzględny zapis rozkazu
    //-------------------------------------------------------------------------------------------------
    void LCD_JustWriteCommand(unsigned char commandToWrite)
    {
    LCD_RS_PORT &= ~LCD_RS;
    _LCD_JustWrite(commandToWrite);
    }
    //-------------------------------------------------------------------------------------------------
    // Bezwzględny zapis danych
    //-------------------------------------------------------------------------------------------------
    void LCD_JustWriteData(unsigned char dataToWrite)
    {
    LCD_RS_PORT |= LCD_RS;
    _LCD_JustWrite(dataToWrite);
    }
    //-------------------------------------------------------------------------------------------------
    // Sprawdzenie zajętości sterownika
    //-------------------------------------------------------------------------------------------------
    unsigned char LCD_NotBusy(void)
    {
    if(LCD_ReadStatus() != 0x80)
       {
       return 1;
       }
    else
       {
       return 0;
       }
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja odczytu bajtu z wyświetacza (bez rozróżnienia instrukcja/dane).
    //
    //-------------------------------------------------------------------------------------------------

    unsigned char _LCD_Read(void)
    {
    unsigned char tmp = 0;
    LCD_DB4_DIR &= ~LCD_DB4;
    LCD_DB5_DIR &= ~LCD_DB5;
    LCD_DB6_DIR &= ~LCD_DB6;
    LCD_DB7_DIR &= ~LCD_DB7;

    LCD_RW_PORT |= LCD_RW;
    LCD_E_PORT |= LCD_E;
    tmp |= (_LCD_InNibble() << 4);
    LCD_E_PORT &= ~LCD_E;
    LCD_E_PORT |= LCD_E;
    tmp |= _LCD_InNibble();
    LCD_E_PORT &= ~LCD_E;
    return tmp;
    }

    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu rozkazu do wyświetlacza
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteCommand(unsigned char commandToWrite)
    {
    LCD_RS_PORT &= ~LCD_RS;
    _LCD_Write(commandToWrite);
    }

    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja odczytu bajtu statusowego
    //
    //-------------------------------------------------------------------------------------------------
    unsigned char LCD_ReadStatus(void)
    {
    LCD_RS_PORT &= ~LCD_RS;
    return _LCD_Read();
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu danych do pamięci wyświetlacza
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteData(unsigned char dataToWrite)
    {
    LCD_RS_PORT |= LCD_RS;
    _LCD_Write(dataToWrite);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja odczytu danych z pamięci wyświetlacza
    //
    //-------------------------------------------------------------------------------------------------
    unsigned char LCD_ReadData(void)
    {
    LCD_RS_PORT |= LCD_RS;
    return _LCD_Read();
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wyświetlenia napisu na wyswietlaczu.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteText(char * text)
    {
    while(*text)
      LCD_WriteData(*text++);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja ustawienia współrzędnych ekranowych
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_GoTo(unsigned char x, unsigned char y)
    {
    LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja czyszczenia ekranu wyświetlacza.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Clear(void)
    {
    LCD_WriteCommand(HD44780_CLEAR);
    _delay_ms(2);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Home(void)
    {
    LCD_WriteCommand(HD44780_HOME);
    _delay_ms(2);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Procedura inicjalizacji kontrolera HD44780.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Initalize(void)
    {
    unsigned char i;
    LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń
    LCD_DB5_DIR |= LCD_DB5; //
    LCD_DB6_DIR |= LCD_DB6; //
    LCD_DB7_DIR |= LCD_DB7; //
    LCD_E_DIR    |= LCD_E;   //
    LCD_RS_DIR    |= LCD_RS;  //
    LCD_RW_DIR    |= LCD_RW;  //
    _delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
    LCD_RS_PORT &= ~LCD_RS; // wyzerowanie linii RS
    LCD_E_PORT &= ~LCD_E;  // wyzerowanie linii E
    LCD_RW_PORT &= ~LCD_RW;
    for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
      {
      LCD_E_PORT |= LCD_E; //  E = 1
      _LCD_OutNibble(0x03); // tryb 8-bitowy
      LCD_E_PORT &= ~LCD_E; // E = 0
      _delay_ms(5); // czekaj 5ms
      }

    LCD_E_PORT |= LCD_E; // E = 1
    _LCD_OutNibble(0x02); // tryb 4-bitowy
    LCD_E_PORT &= ~LCD_E; // E = 0

    _delay_ms(1); // czekaj 1ms
    LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
    LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosći pamieci DDRAM
    LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
    }

    Jest to biblioteka do wyświetlacza LCD
    Pytanie może wydać się głupie ale czy z tego kodu wynika, że LCD mam podpiąć pod PORTE? Jeżeli tak to czy mam pozmieniać te definicje na PORTC?

    0
  • #6 21 Lis 2012 14:57
    perlon
    Poziom 19  

    Weź plik

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i tam pozmieniaj przypisania portów.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Oznacza linię E wyświetlacza a nie PORTE kontrolera.

    0
  • #7 21 Lis 2012 15:20
    Leon90
    Poziom 11  

    ok pozmieniałem wszystko w pliku "HD44780". Cały wyświetlacz podpiąłem pod PORTB ale na wyświetlaczu dalej nic :/

    0
  • #10 21 Lis 2012 22:17
    perlon
    Poziom 19  

    A nic oznacza że kręcenie kontrastem podświetla górną linię w pełnych prostokątach? Jeżeli tak to wyświetlacz nie zainicjowany.

    0
  • #11 22 Lis 2012 06:21
    Leon90
    Poziom 11  

    NA wyświetlaczu, po naciśnięciu przycisku RESET pierwsza linia zapełnia się prostokątami a potem zero reakcji.

    0
  • #13 22 Lis 2012 12:31
    Eres1989
    Poziom 10  

    Witam ,
    Ostatnimi czasy miałem podobny problem co kolega ale sobie poradziłem :D .

    Pozdrawiam i życzę powodzenia .

    P.S. rozwiązanie jest trywialne wiesz jak?

    0
  • #14 28 Lis 2012 16:53
    Leon90
    Poziom 11  

    Okazało się, że mój LCD był źle podpięty. Niestety na wyświetlaczu pojawia się temperatura -0,1 stopnia i ani drgnie :/

    0
  • #15 01 Gru 2012 08:17
    Leon90
    Poziom 11  

    Mógłby mi ktoś powiedzieć, gdzie w tym przypadku szukać błędu ?

    0