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

[atmega16a][hd44780] - Czarne kwadraty w pierwszej linii, najpierw działało...

prot0n 22 Sty 2014 14:08 1323 4
  • #1 22 Sty 2014 14:08
    prot0n
    Poziom 2  

    Witam

    Z gory przepraszam za brak polskich znakow.
    Na początku zbudowalem schemat zgodnie z tym tutorialem tylko ,ze z atmega16a
    Popodlaczalem jednak do tych samych portow itp...

    newbiehack . com/MicrocontrollersABeginnersGuideIntroductionandInterfacinganLCD.aspx

    newbiehack . com/MicrocontrollersABeginnersGuideOurFirstLCDProgram.aspx

    Zrobilem uklad, podlaczylem programator i... dzialalo. Potem chcialem zmienic jedna literke wiec w kodzie zmienilem, zaprogramowalem ponownie i niestety pierwsza linia zamienila sie w kwadraty. Porobilem testy ciaglasci i wszystko bylo ok, jednak problem nadal ten sam. Wiec zbudowalem uklad z innej strony:

    www . protostack . com/blog/2010/04/character-lcd-displays-part-2/

    i zaadaptowalem do atmega16a. Niestety rowniez nie dziala, w zalaczniku efekt moich dzialan.

    Pytanie, co jest zle? Czy jest mozliwosc ze lcd jest uszkodzone? Moglo to sie zdarzyc np. podczas nieodpiecia lcd od mikrokontrolera podczas programowania?

    Z gory dziekuje

    0 4
  • #2 22 Sty 2014 14:23
    Wojtek75
    Poziom 23  

    Jesteś podpięty tym wyświetlaczem do portu C w uC, wyłączyłeś JTAG w bitach konfiguracyjnych?

    0
  • #3 22 Sty 2014 14:34
    prot0n
    Poziom 2  

    Code:

    #include <avr/io.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include <stdio.h>
     
    //Define functions
    //==========================================================
    void io_init(void);                         //Initializes IO
    void send_nibble(unsigned char __rs, unsigned char __data);
     
    //==========================================================
     
    int main (void)
    {
        MCUCSR |=(1<<JTD);
        MCUCSR |=(1<<JTD);
       
        io_init();
       
       _delay_ms(15);
       send_nibble(0,0b0010);   //Set to 4 bit operation (note: 1 nibble operation)
       _delay_ms(5);
       
       send_nibble(0,0b0010);   //Function set, 4 bit
       send_nibble(0,0b1000);
     
       send_nibble(0,0b0000);   //Display ON, Cursor On, Cursor Blinking
       send_nibble(0,0b1111);
     
       send_nibble(0,0b0000);   //Clear Display
       send_nibble(0,0b0001);
     
       send_nibble(0,0b0000);  //Entry Mode, Increment cursor position, No display shift
       send_nibble(0,0b0110);
     
       send_nibble(1,0b0100);  //H
       send_nibble(1,0b1000);
     
       send_nibble(1,0b0110);  //e
       send_nibble(1,0b0101);
     
       send_nibble(1,0b0110);  //l
       send_nibble(1,0b1100);
     
       send_nibble(1,0b0110);  //l
       send_nibble(1,0b1100);
     
       send_nibble(1,0b0110);  //o
       send_nibble(1,0b1111);
     
       send_nibble(1,0b0010);  //Space
       send_nibble(1,0b0000);
     
       send_nibble(1,0b0101);  //w
       send_nibble(1,0b0111);
     
       send_nibble(1,0b0110);  //o
       send_nibble(1,0b1111);
     
       send_nibble(1,0b0111);  //r
       send_nibble(1,0b0010);
     
       send_nibble(1,0b0110);  //l
       send_nibble(1,0b1100);
       
       send_nibble(1,0b0110);  //d
       send_nibble(1,0b0100);
     
        return(0);
    }
     
    void io_init (void)
    {
        /*
        PC 7: N/A
        PC 6: Reset
        PC 5: Enable
        PC 4: Register Select
        PC 3: Data 7
        PC 2: Data 6
        PC 1: Data 5
        PC 0: Data 4 
        */
       
        DDRC = 0b00111111;
    }
     
    void send_nibble(unsigned char __rs, unsigned char __data)
    {
       PORTC = (__rs<<4) | __data | 0b00100000;      // Set RS &amp; Data. Set EN=High
       _delay_ms(1);
       PORTC = (__rs<<4) | __data;                   // Set RS &amp; Data. Set EN=Low
       _delay_ms(1);
    }


    Tak, jtag jest wylaczany, mimo to efekt ten sam.

    0
  • Pomocny post
    #4 22 Sty 2014 15:45
    Wojtek75
    Poziom 23  

    Dlaczego sobie utrudniasz życie? Sposób konfiguracji i wysyłania znaków w tym kodzie powyżej to jakiś sadyzm.
    Na tej stronie: http://radzio.dxp.pl/hd44780/ masz sprawdzone wielokrotnie funkcje obsługi tego typu wyświetlaczy. Trzeba tylko dostosować konfigurację połączeń w pliku *.h i zainkludować do swojego projektu.
    Pamiętaj żeby w main dodać tą linię:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    ewentualnie wyłączyć JTAG tradycyjnie przy pomocy fuse jeżeli masz zamiar korzystać z portu C. Upewnij się jeszcze czy uC pracuje z dokładnie taką częstotliwością jaką deklarujesz w projekcie.

    Przykład do wyświetlenia czegokolwiek przy wykorzystaniu funkcji Radzia:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 22 Sty 2014 16:23
    prot0n
    Poziom 2  

    Problem rozwiazany jednak te instrukcje do wyswietlacza lepiej dac przed while(1) bo mryga. Dzieki za pomoc!!

    0