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.

MMnet03 , EVBnet03 plus uruchomienie LCD

13 Mar 2008 13:50 1719 4
  • Poziom 11  
    witam wszystkich,
    Mam moduł MMnet03, który zawiera atmege128, mam problem z uruchomieniem LCD w interfejsie 8bitowym, chce to zrobic jak jak jest w dokumentacji rys18 http://www.propox.com/download/docs/MMnet03_pl.pdf

    Tzn, tak jak podłącze sie bezpośrednio do portów uC które są wyprowadzone na płycie,to wyświetlacz w interfejsie 4bitowym mi działa odpowiednio po drobnej przeróbce kodu)

    Na rys18 w wyżej wymienionej dokumentacji robi sie to tak że LCD jest widziany pod dwoma adresami 0xff04 instrukcji i 0xff05 danych, odpowiednio trzeba ustawić jeszcze rejestr konfiguracyjny aby SEL1 było jako zapis strobu
    oto mój kod:(kompilator AVR-GCC)

    #include <avr/io.h>
    #define LCD_instrukcje (*(unsigned char *) (0xFF04)) // Adres pamieci pod który wysłąmy instrukcje
    #define LCD_dane (*( char *) (0xFF05)) // Adres pamieci pod który wysłąmy dane
    #define Mnet_conf (*(unsigned char *) (0xFF01))


    ///////////////////////////////////////////
    // Procedura sterowania LCD
    /////////////////////////////////////////
    void delay_LCD(void)
    {
    unsigned int a = 0x0ff;
    while(a--);
    }

    void waitms(char x)
    {
    unsigned char a, b; // zmnienne licznikowe
    for( ; x > 0; --x) // ta pętla zostanie wykonana x-razy
    for(b = 10; b > 0; --b) // a ta 10 razy
    for(a = 100; a > 0; --a) // natomiast ta 100 razy
    __asm("nop"); // dodatkowa instrukcja opóźniająca o 1 cykl
    // razem to da opóźnienie ok. x * 1ms
    // x od 0 do 255
    }

    void LCD_steruj (int instrukcja)
    {
    LCD_instrukcje = instrukcja; // Wpisz instrukcje do adresu pamięci
    waitms(3); // Odpowiednie opóznienie aby wykonała się pojedyncza instrukcja

    }


    /////////////////////////////////////////////////
    // Procedura inicjalizująca LCD
    ///////////////////////////////////////////////

    void LCD_start (void)
    {

    int i;
    // Odblokowanie zewnętrzne SRAM/XMEM
    //MCUCR |= _BV(SRE);

    // Wybór stanu oczekiwania gdy
    // przestrzeń adresowa SRAM jest skonfigurowana jako jeden sektor

    // Czekaj jeden cykl maszynowy przy strobie zapisu/odczytu
    //XMCRB &= ~_BV(1);
    //MCUCR |= _BV(6);

    waitms(15); // Czekaj 15 ms Na wykonanie się procedury zerującej sterownik LCD
    // Zawsze po włączeniu zasilania

    MCUCR =0xc0;
    //DDRB=0xff;

    for (i=0;i<3;i++)
    {
    LCD_steruj(0x30); // Wyśli 0x30 do lcd

    }
    //LCD_steruj(0x2);
    delay_LCD();
    LCD_steruj(0x38); // Interfejs 8 bitowy, 2 linie, matryca 5x10
    delay_LCD();
    LCD_steruj(0x0C); // Włączenie lcd, wyłączenie kursora, wyłączenie migania kursora
    delay_LCD();
    LCD_steruj(0x01); // Wyczyszczenie ekranu i przesuniecie kursora do pozycji początkowej
    delay_LCD();
    LCD_steruj(0x06); // 0000110b zachowanie kursora
    delay_LCD();
    LCD_steruj(0x87); // 10000111b ustaw kursor na 0
    }

    //////////////////////////////////////////////////////////////////
    // Procedura wyświetlania pojedynczego znaku na LCD
    //////////////////////////////////////////////////////////////////


    void pisz_znak (char znak) // Procedura wyswietlcja pojedynczy
    {
    LCD_dane = znak; // Wpisuje pojedynczy znak na lcd
    waitms(1); // Opóznienie potrzebne do wyświetlenia jednego znaku
    }

    void write_text(char * s)
    {
    while(*s) // do napotkania 0
    {
    pisz_znak(*s); // zapisz znak wskazywany przez s na LCD
    s++; // zwiększ s (przygotuj nastepny znak)
    }
    }
    //////////////////////////////////////////////////////
    ///main
    ////////////////////////////////////////////////////////
    int main(void)
    {
    DDRB=0xFF;
    DDRA=0xFF;
    Mnet_conf=0xf0;//tu ustawiam jako zapis strobu czyli na 5bit powienn byc 1,
    LCD_start();
    //M_BANK =15;
    write_text("ala ma kotka");
    return 0;
    }

    Pozdrawiam,
    Piotrek
  • Poziom 2  
    kod masz i rozumiem, że coś nie działa, tak? kompiluje się? błędów nie ma? wyświetlacz w ogóle reaguje?
  • Poziom 11  
    witam ponownie

    to tak kompiluje bez błędów oczywiście), jest właśnie dziwna sprawa wyświetli mi zadany tekst, ale jak wyłączę i ponownie włączę układ nie ma reakcji na wyświetlaczu nic nie drgnie, ponownie wgranie tego samego kodu nic nie daje muszę wgrać najpierw plik .hex(jakieś demo z serwerkiem) który był na samym początku jak kupiłem układ i dopiero wgram ponownie ten program z tekstem "ala ma kota" to wyświetli mi ten zadany tekst i sytuacja sie powtarza ponownie jeśli znów wył/zał układ(,
    Pewnie jakiś bit trzeba ustawić odpowiednio ale w dokumentacji słowem nie ma o tym lub przeoczyłem ale kilka nocy już nad spędziłem, pisałem do propoxu ale wciąż czekam na odpowiedz(( może ktos mila ten sam problem

    Pozdrawiam
    Piotrek
  • Pomocny post
    Poziom 2  
    Jak mi sie uda odblokować swoją atmegę to sprawdzę u siebie ten kod na obsługę wyświetlacza
  • Poziom 11  
    No dzieki juz mam he najciekawsze to ze kod jest dobry, trzeba bylo tylko zastosowac biblioeki nut/Os-a