logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega32 problem z LCD [C]

Joahim_Skywalker 18 Sty 2010 18:29 2109 17
REKLAMA
  • #1 7555259
    Joahim_Skywalker
    Poziom 12  
    Witam.

    Od jakiegoś czasu próbuję nauczyć się obsługi LCD. Próbuję skompilować jakieś programy znalezione na internecie. Niestety bez skutku. W załączniku przesyłam przykładowy program który znalazłem gdzieś w sieci. Niestety u mnie nic się nie wyświetla. Kompiluję w WinAvr. Tak samo korzystałem z linku poniżej:
    http://wkretak.pl/readarticle.php?article_id=16
    Fuse ustawiłem w programi avrdude: HI: D0; LO:EF Jtag powienien być wyłączony.

    Proszę o pomoc.

    Załącznik:
  • REKLAMA
  • Pomocny post
    #2 7555284
    michalko12
    Specjalista - Mikrokontrolery
    Joahim_Skywalker napisał:
    Witam.
    Próbuję skompilować jakieś programy znalezione na internecie. Niestety bez skutku.


    Nie możesz skompilować, czy coś Ci nie działa?

    Na pewno brak konfiguracji portów.
  • REKLAMA
  • #3 7555321
    Joahim_Skywalker
    Poziom 12  
    Podczas kompilacji nie ma błędów. Ale na wyświetlaczu widać tylko kwadraciki. Raz tylko udało mi się doprowadzić do stanu gdzie pojawiały się krzaki, ale w zasadzie bez rewelacji.
  • REKLAMA
  • Pomocny post
    #4 7555364
    m.bartczak
    Poziom 16  
    Tak z ciekawości - brakuje mi jeszcze jakiegokolwiek schematu...

    Uzupełnienie - ten schemat z linku co podałeś ma zupełnie inną konfigurację podłączenia pinów niż ta co jest u Ciebie w kodzie.
  • #5 7555484
    Joahim_Skywalker
    Poziom 12  
    Mam dołączony tylko LCD następująco w przypadku programu który załączyłem:
    // PD0 - R/S
    // PD1 - E
    // PD2 - D4
    // PD3 - D5
    // PD4 - D6
    // PD5 - D7

    Atmega32 problem z LCD [C]

    Dodano po 3 [minuty]:

    Link i program to dwa różne programy. Tylko podałem źródło z jakiego korzystałem i nie przyniosło efektu mimo że kompilacja przebiegła prawidłowo. A wyświetlacz podłączałem tak jak było odpowiednio zalecone w dla poszczególnych kodów.
  • Pomocny post
    #6 7555610
    michalko12
    Specjalista - Mikrokontrolery
    Joahim_Skywalker napisał:
    Mam dołączony tylko LCD następująco w przypadku programu który załączyłem:
    // PD0 - R/S
    // PD1 - E
    // PD2 - D4
    // PD3 - D5
    // PD4 - D6
    // PD5 - D7

    Zobacz jaki będzię efekt tego kodu :

    	while(1)
    	{
    	
    		LCDclr();
    		LCDstring(name,5);
    		LCDsendChar(space);
    		_delay_ms(1000);
    
    
    	
    		LCDclr();
    		LCDstring(website,5);
    		LCDsendChar(space);
    		_delay_ms(1000);
    
    	}
    
  • #7 7555662
    Joahim_Skywalker
    Poziom 12  
    Niestety brak efektu :-(
  • Pomocny post
    #9 7555839
    michalko12
    Specjalista - Mikrokontrolery
    Joahim_Skywalker napisał:
    Niestety brak efektu :-(


    Zmień fusy na
    Lo: 0x61
    Hi:0xD1
    Ex:0xFF

    i spróbuj na tym kodzie co wcześniej podałem
  • REKLAMA
  • #10 7556738
    Joahim_Skywalker
    Poziom 12  
    Po zmianie fuse zamiast prostokątów pokazały się krzaczki i na końcu kursor. Jak wgrałem program od Pana m.bartczak niestety nie zadziałało przy żadnej konfiguracji fuse.
  • Pomocny post
    #11 7557001
    michalko12
    Specjalista - Mikrokontrolery
    Joahim_Skywalker napisał:
    Po zmianie fuse zamiast prostokątów pokazały się krzaczki i na końcu kursor. Jak wgrałem program od Pana m.bartczak niestety nie zadziałało przy żadnej konfiguracji fuse.

    A z tym spróbowałeś?
       while(1)
       {
       
          LCDclr();
          LCDstring(name,5);
          LCDsendChar(space);
          _delay_ms(1000);
    
    
       
          LCDclr();
          LCDstring(website,5);
          LCDsendChar(space);
          _delay_ms(1000);
    
       }
  • Pomocny post
    #12 7557157
    m.bartczak
    Poziom 16  
    Czy pamiętałeś aby w moim kodzie zmienić przypisania portów?

    Domyślne ustawienie u mnie jest następujące:

    
    #define LCD_RS_DIR		DDRA
    #define LCD_RS_PORT 	PORTA
    #define LCD_RS			(1 << PA2)
    
    #define LCD_E_DIR		DDRA
    #define LCD_E_PORT		PORTA
    #define LCD_E			(1 << PA3)
    
    #define LCD_DB4_DIR		DDRA
    #define LCD_DB4_PORT	PORTA
    #define LCD_DB4			(1 << PA4)
    
    #define LCD_DB5_DIR		DDRA
    #define LCD_DB5_PORT	PORTA
    #define LCD_DB5			(1 << PA5)
    
    #define LCD_DB6_DIR		DDRA
    #define LCD_DB6_PORT	PORTA
    #define LCD_DB6			(1 << PA6)
    
    #define LCD_DB7_DIR		DDRA
    #define LCD_DB7_PORT	PORTA
    #define LCD_DB7			(1 << PA7)
    


    - czy li wszystko na porcie A
  • #13 7557640
    Joahim_Skywalker
    Poziom 12  
    I właśnie to mnie najbardziej dołuje, że próbowałem jak Panowie radzili, ale nie ma efektu. Program od P. m.bartczaka skompilował się bez błędów i bez warningów - efekt: ekran pusty. Natomiast ten drugi miał warningi dotyczące nieużywanych zadeklarowanych zmiennych oraz :'LCDstring' discards qualifiers from pointer target type. Ale wydaje mi się że to nie powinno mieć wpływu na krzaki wyświetlone na LCD.

    Dodano po 1 [minuty]:

    Co do podłączenia samego LCD to mam podłączone poprawnie.

    Dodano po 48 [sekundy]:

    Podłączyłem po prostu pod port A.

    Dodano po 2 [godziny] 30 [minuty]:

    Udało mi się dojść do stanu gdy wyświetlony jest kursor przy wykorzystaniu programu Pana michałko.12. Niestety nic się nie wyświetla. Przed kursorem jest wolna ilość pól tak jak by na zadane litery. Taki stan osiągnąłem jedynie na PORTC
  • Pomocny post
    #14 7558490
    m.bartczak
    Poziom 16  
    Wiem że mój program działa na 'żywym' sprzęcie :) I pewnie programy kolegów też. Pozostają podstawowe pytania:

    Czy używasz jakiejś płytki testowej czy 'pajączek'? - jeśli tak, to sprawdź kondensatory, stabilizację napięcia, układ resetu ect.

    Daj może cały schemat, bo mi się kończą pomysły jeśli chodzi o stronę programistyczną.
  • #15 7558817
    michalko12
    Specjalista - Mikrokontrolery
    Joahim_Skywalker napisał:
    Mam dołączony tylko LCD następująco w przypadku programu który załączyłem:
    // PD0 - R/S
    // PD1 - E
    // PD2 - D4
    // PD3 - D5
    // PD4 - D6
    // PD5 - D7

    Atmega32 problem z LCD [C]

    Dodano po 3 [minuty]:

    Link i program to dwa różne programy. Tylko podałem źródło z jakiego korzystałem i nie przyniosło efektu mimo że kompilacja przebiegła prawidłowo. A wyświetlacz podłączałem tak jak było odpowiednio zalecone w dla poszczególnych kodów.


    Tu jest problem jeszcze:

    void LCDsendChar(uint8_t ch)		
    {	 
    	//4 MSB bits
    	LDP=((ch>>2)&0b00111100);
    	LCP|=1<<LCD_RS|1<<LCD_E;
    	_delay_ms(1);
    	LCP&=0<<LCD_E|0<<LCD_RS;	
    	_delay_ms(1);
        //4 LSB bits
    	LDP=((ch<<2)&0b00111100);
    	LCP|=1<<LCD_RS|1<<LCD_E;
    	_delay_ms(1);
    	LCP&=0<<LCD_E|0<<LCD_RS;	
    	_delay_ms(1);
    }
    
    //Sends Command to LCD
    void LCDsendCommand(uint8_t cmd)	
    {
    	//4 MSB bits
    	LDP=((cmd>>2)&0b00111100);
    	LCP|=1<<LCD_E;		
    	_delay_ms(1);
    	LCP&=~(1<<LCD_E);
    	_delay_ms(1);
    	//4 LSB bits
    	LDP=((cmd<<2)&0b00111100);
    	LCP|=1<<LCD_E;		
    	_delay_ms(1);
    	LCP&=~(1<<LCD_E);
    	_delay_ms(1);			
    }


    Ta biblioteka jest prawie uniwersalna. Te dwie procedury trzeba dostosowac do konkretnego podłączenia portu
  • #16 7560232
    Joahim_Skywalker
    Poziom 12  
    Udało mi się zaprogramować LCD.

    Zmieniłem procedurę tak jak zalecił Pan michalko12 (niestety nie jest to moja robota gdyż mam braki w zakresie programowania AVR - znalazłem w sieci). Poniżej przedstawiam co dokładnie uległo zmianie:
    
    void LCDsendCommand(uint8_t cmd)   
    {
       
        LCP|=1<<LCD_E;//E->1
        LDP_ZERO;
        if((cmd >> 4) & (1 << 0)) {LDP|=1<<LCD_D4;};
        if((cmd >> 4) & (1 << 1)) {LDP|=1<<LCD_D5;};
        if((cmd >> 4) & (1 << 2)) {LDP|=1<<LCD_D6;};
        if((cmd >> 4) & (1 << 3)) {LDP|=1<<LCD_D7;};
        LCP&=~(1<<LCD_E);//E->0
       
        ////
        LCP|=1<<LCD_E;// E->1
        LDP_ZERO;
        if((cmd) & (1 << 0)) {LDP|=1<<LCD_D4;};
        if((cmd) & (1 << 1)) {LDP|=1<<LCD_D5;};
        if((cmd) & (1 << 2)) {LDP|=1<<LCD_D6;};
        if((cmd) & (1 << 3)) {LDP|=1<<LCD_D7;};
        LCP&=~(1<<LCD_E);//E->0
        _delay_ms(1);
       
        LCP_ZERO;
        LDP_ZERO;
    }
    /////////////
    void LCDsendChar(uint8_t ch)       
    {   
        LCP|=1<<LCD_RS;//RS->1;
        LCDsendCommand(ch);
    } 
    
    


    A to zmieniłem w pliku conf.h:
    
    
    //podl wyswietlacza
    #define LDP PORTC
    #define LCD_D4 2
    #define LCD_D5 3
    #define LCD_D6 4
    #define LCD_D7 5
    #define LCP PORTC
    #define LCD_E 1
    #define LCD_RS 0
    #define LDDR DDRC
    #define LCDR DDRC
    // 
    #define LDP_ZERO LDP&=~(1<<LCD_D4)&~(1<<LCD_D5)&~(1<<LCD_D6)&~(1<<LCD_D7)
    #define LCP_ZERO LCP&=~(1<<LCD_E)&~(1<<LCD_RS) 
    
    


    Obecnie wszystko działa bez zarzutów. Wychodzi na to, że problemem był sam kod, a nie defekt sprzętu więc schematu nie wklejam.

    Dziękuję Panom michalko12 oraz m.bartczak za zaangażowanie.
  • #17 7560611
    polprzewodnikowy
    Poziom 26  
    Masz podłączone piny PD0 - PD3 do masy? Spróbuj je odłączyć i zobaczyć efekt na wcześniejszych kodach.
  • #18 7561074
    Joahim_Skywalker
    Poziom 12  
    Podłączyłem jak radził Pan polprzewodnikowy, nawet wcześniej każdy pin zwarłem pojedynczo do masy, ale tak jak wcześniej nie przyniosło to żadnych efektów.
REKLAMA