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

ADuC 842 LCD jezyk C lub ASM

04 Maj 2008 12:45 2275 10
  • Poziom 11  
    Witam Koleżanki i Kolegów.
    Temat był tu wałkowany tysiące razy, jednak od dłuższego czasu niemoge wybrnąć z sytuacji. Piszę kod na nowo wzorując sie na przykładach i dalej mi to nie lata. Niemoge odpalić LCD podłaczonego do swojego ADuC. Mam ciągle te czarne kwadraty. Stwierdzilem, że będę sterował bit po bicie zeby uniknąć błędu. Z drugiej strony mam to wszystko podłaczone pod P0.
    RS - P0.7
    RW - P0.6
    EN - P0.4
    DB4 P0.3
    ...
    DB7 - P0.0

    PONIŻEJ WRZUCAM KOD PROGRAMU JAKI UDALO MI SIE STWOZYC. dOMYSLNE OPOZNIENIE dELAY(1) TO OKOLO 10 ms. Dalem takie duze aby rowniez miec z glowy ewentualne problemy z czasami. Czy ktoś nmogl by mi pomóc i rzucic na to okiem? :)
    Code:
    #include <ADuC842.h>
    
    //#include <REG52.H>


    void Delay(int e)
    {
    int d;
     while(e)
     {    //pamietaj ze maks musi byc o 1 wiekszy niz wychodzi z obliczen, patrz kolejnosc w for
       for(d=0;d<100;d++){};      //okolo 10 ms
       e--;                
     }
    }

    void Lcd_init(void)
    {
      char i,k;
      Delay(50);
       E  = 0;
       Delay(1);
       for(i=0;i<4;i++)
      {
       E  = 1;
       RS = 0;
       RW = 0;
      DB7 = 0;
      DB6 = 0;
      DB5 = 1;
      DB4 = 1;
       E  = 0;
       Delay(10);
     };
       for(k=0;k<3;k++){
       E  = 1;
       RS = 0;
       RW = 0;
      DB7 = 0;
      DB6 = 0;
      DB5 = 1;
      DB4 = 0;
       E  = 0;         
      Delay(10);      };
       E  = 1;
       RS = 0;
       RW = 0;
      DB7 = 1;
      DB6 = 0;
      DB5 = 0;
      DB4 = 0;
       E  = 0;
     
      Delay(10);
       E  = 1;
       RS = 0;
       RW = 0;
      DB7 = 1;
      DB6 = 0;
      DB5 = 0;
      DB4 = 0;
       E  = 0;

      Delay(10);
       E  = 1;
       RS = 0;
       RW = 0;
      DB7 = 0;
      DB6 = 0;
      DB5 = 0;
      DB4 = 0;
       E  = 0;
     
      Delay(10);
       E  = 1;
       RS = 0;
       RW = 0;
      DB7 = 0;
      DB6 = 0;
      DB5 = 0;
      DB4 = 1;
       E  = 0;

    }

    void main(void)
    {
    PLLCON = 0x057;
    Lcd_init();
    while(1)
       {
       RD =! RD;   //punkt kontrolny
       Delay(100);   //czas na mruganie diody
       };
    }


    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • Poziom 19  
    Znaczy sie uzywasz zwyklego lcd na HD44780 tak?

    U mnie to wyglada tak:

    Code:


    #include "naglowkowy.h"
     
    /************************ #include<LCD_init.h> ***************************************************/

    #define LCD     PORTB
    #define E        3                           
    #define RS     2                            

    #define SET_E   LCD |=    _BV(E)                  
    #define CLR_E   LCD &= ~_BV(E)

    #define SET_RS  LCD |=    _BV(RS)
    #define CLR_RS  LCD &= ~_BV(RS)

    void LCD_init (void)
       {
       Waitms(15);          // czekaj 15ms na ustabilizowanie się napięcia zasilającego
       CLR_E;                // E = 0
       CLR_RS;             // RS = 0
       char i;             // zmianna licznikowa
       for(i = 0; i < 3; i++)    // trzykrotne powtórzenie bloku instrukcji
            {
            SET_E;             // E = 1
            LCD &= 0x3F;       //
            CLR_E;             // E = 0
            Waitms(5);          // czekaj 5ms
            }
       SET_E;                // E = 1
       LCD &= 0x2E;          //
       CLR_E;                // E = 0
       Waitms(1);             // czekaj 1ms

       write_command(0x28);    // interfejs 4-bity, 2-linie, znak 5x7   
       write_command(0x08);    // wyłącz LCD, kursor i miganie
       write_command(0x01);    // czyść LCD
       write_command(0x06);    // bez przesuwania w prawo
       write_command(0x0C);    // włącz LCD, bez kursora i mrugania
       }
       
             
    //**********************************************************************************************/


    To powinno Ci pomoc. Zerknij tez na http://radzio.dxp.pl/hd44780/ - genialna stronka!
  • Poziom 15  
    Pokaż schemat połączenia.
    Czy dałeś rezystory podciągające dla portu 0?
  • Poziom 11  
    Ad 1. Tak, używam HD44780. Co prawda twój kod niewiele mi pomaga, ale postaram się z niego coś wyniesc. Niemam biblioteki lcd_init i mam wszystko na porcie P0. Czyli En, RS, RW też i w tym może tkwić szkopuł, że musze uważać co wysyłam na ten port. Płytka jest tak zrobiona, że cały ten port jest przygotowany pod sterowanie LCD. Jasne, że moge to na pajączku puścić, ale nie wykożystam wtedy zalet płytki i miejsca mocowania LCD.

    Ad 2.
    Schemat podałem na początku. Wszystko jest na P0. RW niejest do masy, jest rezystor podciągający 10 kOhm na każdym z pinów.

    Z góry dziękuję za pomoc :)
  • Poziom 19  
    U mnie to wygląda tak:
    1. Linia RW jest zawsze do masy.
    2. Po włączeniu zasilania czekam 15 ms pozniej linie RS i linie E daje na zero (na początku maja byc na 1)
    3. I teraz trzy razy robie tak:
    - daje linie E na 1
    - na port od LCD robie tzw iloczyn bitowy 0b00111111
    - daje linie E na 0
    - czekam 1ms
    4. I teraz daje linie E na 1
    5. robie znowu iloczyn bitowy na porcie od lcd z 0b00101110
    6. pozniej zeruje E i czekam 1ms
    7. pozniej następ wpisanie kilku komend

    Napisz konkretnie z czego nie rozumiesz z mojego kodu

    Ok sprawdz cos takiego:

    Code:

    #include <ADuC842.h>
    //#include <REG52.H>


    void Delay(int e)
    {
    int d;
     while(e)
     {    //pamietaj ze maks musi byc o 1 wiekszy niz wychodzi z obliczen, patrz kolejnosc w for
       for(d=0;d<100;d++){};      //okolo 10 ms
       e--;               
     }
    }

    void Lcd_init(void)
    {
      char i,k;
      Delay(50);
     
      RW = 0; //!!!!
     
      E  = 0;
      RS = 0;
       
       Delay(1);
       
       
       for(i=0;i<3;i++)
      {
       E  = 1;
     
      DB7 = 0;
      DB6 = 0;
      DB5 = 1;
      DB4 = 1;
       
         E  = 0;
     
           Delay(1);
     }
     
     E = 1;
     
      DB7 = 0;
      DB6 = 0;
      DB5 = 1;
      DB4 = 0;
     
     Delay(1);
     
     E = 0;
     
     Delay(1);
    ///////////////////////////////////////////////////////////////////
       RS = 0;
       E  = 1;          // 4bity , 2 linie / znak 5x7
       
      DB7 = 1;
      DB6 = 0;
      DB5 = 0;
      DB4 = 0;
     
       E  = 0;
       Delay(1);
       E  = 1;
     
       DB7 = 0;
       DB6 = 0;
       DB5 = 1;
       DB4 = 0; 
       
       E = 0;
               
     Delay(1);
    ///////////////////////////////////////////////////////////////////
       RS = 0;
       E  = 1;          // wylacz lcd, kursor miganie
       
      DB7 = 1;
      DB6 = 0;
      DB5 = 0;
      DB4 = 0;
     
       E  = 0;
       Delay(1);
       E  = 1;
     
       DB7 = 0;
       DB6 = 0;
       DB5 = 0;
       DB4 = 0; 
       
       E = 0;
     Delay(1);
    ///////////////////////////////////////////////////////////////////
       RS = 0;
       E  = 1;       //   czysc lcd
       
      DB7 = 0;
      DB6 = 0;
      DB5 = 0;
      DB4 = 1;
     
       E  = 0;
       Delay(1);
       E  = 1;
     
       DB7 = 0;
       DB6 = 0;
       DB5 = 0;
       DB4 = 0; 
       
       E = 0;
               
     Delay(1);
    ///////////////////////////////////////////////////////////////////
       RS = 0;
       E  = 1;          // bez przesuwania w prawo
       
      DB7 = 0;
      DB6 = 1;
      DB5 = 1;
      DB4 = 0;
     
       E  = 0;
       Delay(1);
       E  = 1;
     
       DB7 = 0;
       DB6 = 0;
       DB5 = 0;
       DB4 = 0; 
       
       E = 0;
               
     Delay(1);
    ///////////////////////////////////////////////////////////////////
       RS = 0;
       E  = 1;          // wlacz lcd , bez kursowra i mrugania
       
      DB7 = 1;
      DB6 = 1;
      DB5 = 0;
      DB4 = 0;
     
       E  = 0;
       Delay(1);
       E  = 1;
     
       DB7 = 0;
       DB6 = 0;
       DB5 = 0;
       DB4 = 0; 
       
       E = 0;
               
    //////////////////////////////////////////////////////////// 

    }

    void main(void)
    {
    PLLCON = 0x057;
    Lcd_init();
    while(1)
       {
       RD =! RD;   //punkt kontrolny
       Delay(100);   //czas na mruganie diody
       };
    }


    PS. Pisanie w ten sposob programu czyli zapalanie bit po bicie to masakra :)

    Dodano po 37 [minuty]:


    Zapis komend wyglada tak:
    1. RS =0
    2. E = 1
    3. czterry ostatnie bity
    4. E = 0
    5. E = 1
    6. cztery pierwsze bity
    7. E= 0
  • Poziom 11  
    Cześć,
    z braku czasu długo nie odpowiadałem, teraz usiadłem i znalazłem potencjalny problem. W Keilu zauważyłem, że przy zmianie stanu pojedyńczego bitu na P0 zmienia sie on na 0, ale już niena jedynkę TZN:
    #sbit EN = P0^4

    void main(void)
    {
    EN = 0; //wystawi 0 na tym bicie tego portu
    EN = 1; //wystawi 1 tylko w okienu P0: ponizej w Pins: ten bit nie zmieni sie juz na 1. Na innych portach działa to normalnie, tzn 1 wystawia tu i tu. Jak to rozwiązać?

    ...}
  • Poziom 24  
    Czesc Pirat, w Twoim programie na poczatku dajesz komende 3 - ok , moze byc, nastepna to 28h i to jest juz zle bowiem nie masz wlaczonego trybu 4-bitowego , 2 co prawda go wlacza lecz wyswietlacz inaczej to potraktuje i 8 nie bedzie do niej mlodsza polowka lecz poczatkiem nastepnej komendy tj 88h a wiec set adres (binarnie : 1 + 7bitow adresuDDRAM), nastepna komenda to 01h - display screen.
    Na pewno nie o to Ci chodzilo , no i oczywiscie nie ma komendy wlaczajacej ekran wyswietlacza (0Ch).Poza tym lina E=1 a potem E=0
  • Poziom 11  
    hej hej,
    tak, wiem tamten program jest spalony, napisałem nowy, jak go potestuje to umieszczę jeśli niebędzie chodził. Okazało się jednak, że uC nie wystawia stanów logicznych na pinach a jedynie w pamięci? Z tym mam największy problem. Proszę o pomoc, co właściwie jest z tym portem 0 w ADuC842
  • Poziom 11  
    Ok, zauważyłem, że stan logiczny wysoki na tym porcie mam 1,5 V a niski 0V. Czy 1,5V wystarczy do sterowania lcd?
  • Poziom 11  
    Napisałem nowy kod. Czy ktoś mógłby mi go sprawdzić? w symulatorze wyglądaże jest ok, ale jak odpalam na płytce to niechce chodzić :(
    połączenia jak na początku wątku
  • Poziom 11  
    Wyświetlacz uruchomiłem, sam program jeszcze troche zmieniłem. Dziękuję wszystkim za zainteresowanie tematem. :)
    Pozdrawiam