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

Problem z biblioteką HD44780.

Sand_Man 12 Kwi 2010 10:16 2175 12
REKLAMA
  • #1 7951066
    Sand_Man
    Poziom 11  
    Ściągnąłem biblioteki ze strony http://radzio.dxp.pl/hd44780/ .
    Początkowo ustawienia oryginalne zmieniłem na:
    E -> PB2
    R/W -> GND
    RS -> PB0
    D4 -> PD4
    D5 -> PD5
    D6 -> PD6
    D7 -> PD7
    I one działały. A po zmianie ustawień portów program przestał działać.
    Na wyświetlaczu 2x16 pojawiają się jedynie kwadratu w pierwszej linii.
    Fragment kodu odpowiadający za konfiguracje potrów z oryginalnego pliku hd44780.h :
    
    #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)
    
    
    

    A tu po moich zmianach:
    
    //-------------------------------------------------------------------------------------------------
    //
    // Konfiguracja sygnałów sterujących wyświetlaczem.
    // Można zmienić stosownie do potrzeb.
    //
    //-------------------------------------------------------------------------------------------------
    #define LCD_RS_DIR		DDRB
    #define LCD_RS_PORT 	PORTB
    #define LCD_RS			(1 << PB0)
    
    #define LCD_E_DIR		DDRB
    #define LCD_E_PORT		PORTB
    #define LCD_E			(1 << PB1)
    
    #define LCD_DB4_DIR		DDRB
    #define LCD_DB4_PORT	PORTB
    #define LCD_DB4			(1 << PB4)
    
    #define LCD_DB5_DIR		DDRB
    #define LCD_DB5_PORT	PORTB
    #define LCD_DB5			(1 << PB5)
    
    #define LCD_DB6_DIR		DDRB
    #define LCD_DB6_PORT	PORTB
    #define LCD_DB6			(1 << PB6)
    
    #define LCD_DB7_DIR		DDRB
    #define LCD_DB7_PORT	PORTB
    #define LCD_DB7			(1 << PB7)
    

    Gdzie może być błąd?
  • REKLAMA
  • #2 7951075
    _Robak_
    Poziom 33  
    Jaka to atmega? Może sprawdź czy na 100% jest dobrze wszystko podłączone;)
  • #3 7951093
    Sand_Man
    Poziom 11  
    Mikro kontroler to Atmega8 zamontowana na płytce ZL16AVR z kamami. Podłączenia sprawdzałem kilka razy i nie wiem co jest grane.
  • REKLAMA
  • #4 7951113
    _Robak_
    Poziom 33  
    A jak programujesz procesor, bo na porcie b jest interfejs ISP. Sprawdź czy jeszcze gdzieś nie są zdefiniowane porty.
  • #5 7951139
    Sand_Man
    Poziom 11  
    Atmege programuje z poziomu AVRstudio za pomocą programatora AVRISP mkII.
    Do programu jak narazie dolączona jest tylko biblioteka hd44780.
    cały program jak narazie wygląda tak:
    
    #include<avr/io.h> 
    #include<util/delay.h> 
    //#include <avr/signal.h>
    #include <avr/interrupt.h>
    #include "HD44780.h" 
    #include "HD44780.c"
    /*********************************************************************
    Funkcja licząca impulsy z czujników
    **********************************************************************/
    int licznik(unsigned long licz)
    {
    }
    /***********************************************************************
    Program glowny
    ************************************************************************/
    int main(void)						 
    { 
    
    int i;
    
    DDRC = 0x00;
    PORTC= 0xff;
    
    LCD_Initalize();					//Inicjalizacja wyświetlacza 
    
    while (1) 
    { 
    LCD_GoTo(0,0); 						// LCD_GoTo(x,y)
    LCD_WriteText("V1=");				//Wyświetlenie tekstu
    	if(bit_is_set(PINC,PC0))		// Odczyt stanu na pinie 0 portu C
    		{
    			for(i=0;i<9999;i++)
    			{
    				LCD_GoTo(3,0); 		// LCD_GoTo(x,y)
    				LCD_WriteText("i");	//Wyświetlenie prędkości
    			}
    		}
    		
    } 
    	return (0); 					//Powrót do początku programu 
    
    }
    
  • REKLAMA
  • #6 7952921
    francus
    Poziom 11  
    to spróbuj zaprogramować procesor ale z odłączonym lcd, a później podepnij lcd i zresetuj procka, bo ten sposób jak masz to zaprogramowane to podczas przesyłania programu do procka na wyświetlacz też jakieś śmiecie odbiera bo pin E z lcd masz zapięty na SCK z SPI
  • REKLAMA
  • #7 7953632
    jacobs242
    Poziom 18  
    Moim zdaniem podłączenie wyświetlacza na piny programowania w niczym nie przeszkadza. Sam tak robiłem wiele razy i jest ok, tylko wyświetlają się dziwne znaki na wyświetlaczu.
  • #8 7962985
    Sand_Man
    Poziom 11  
    Próbowałem wszystkiego i nadal nic. Jedyne co pojawia sie na wyświetlaczu to kwadraty. Nie mam pojęcia co może być przyczyną. Może to że na płytce ZL16avr jest zamontowany oscylator na pinach 6 i 7 portu B. Ale z kolei fuse bity nie zostały zmieniane i uc pracuje na ich oryginalnej konfiguracji. Ma ktoś jeszcze jakieś pomysły co może być grane?
  • #9 7963104
    grzewoj
    Poziom 27  
    Jeżeli na oryginalnych ustawieniach działało, to problem MUSI istnieć w kodzie.
    napisałeś:
    Cytat:

    Początkowo ustawienia oryginalne zmieniłem na:
    E -> PB2
    R/W -> GND
    RS -> PB0
    D4 -> PD4
    D5 -> PD5
    D6 -> PD6
    D7 -> PD7


    wydaje mi się że po prostu źle skonfigurowałeś wyświetlacz, spróbuj tego:

    
    //------------------------------------------------------------------------------------------------- 
    // 
    // Konfiguracja sygnałów sterujących wyświetlaczem. 
    // Można zmienić stosownie do potrzeb. 
    // 
    //------------------------------------------------------------------------------------------------- 
    #define LCD_RS_DIR      DDRB 
    #define LCD_RS_PORT    PORTB 
    #define LCD_RS         (1 << PB0) //pin RS wyświetlacza do PB0 zgodnie z założeniem początkowym
    
    #define LCD_E_DIR      DDRB 
    #define LCD_E_PORT      PORTB 
    #define LCD_E         (1 << PB2) //pin E wyświetlacza do PB2 zgodnie z założeniem początkowym
    
    #define LCD_DB4_DIR      DDRB 
    #define LCD_DB4_PORT   PORTB 
    #define LCD_DB4         (1 << PD4) 
    
    #define LCD_DB5_DIR      DDRB 
    #define LCD_DB5_PORT   PORTB 
    #define LCD_DB5         (1 << PD5) 
    
    #define LCD_DB6_DIR      DDRB 
    #define LCD_DB6_PORT   PORTB 
    #define LCD_DB6         (1 << PD6) 
    
    #define LCD_DB7_DIR      DDRB 
    #define LCD_DB7_PORT   PORTB 
    #define LCD_DB7         (1 << PD7)
    
  • #10 7963472
    elonica
    Poziom 12  
    Witam

    Moim zdaniem po pierwsze sprawdź, czy wszystkie Twoje porty chodzą jako wyjścia i zmieniają stany. W atmedze8 to nie jest problem, ale często nacinałem się na fuse JTAG Enable który to przywłaszcza sobie jeden pin w wyższych atmegach.
  • #11 7963515
    grzewoj
    Poziom 27  
    kod źródłowy biblioteki wskazuje na to że porty są właściwie konfigurowane, kolega pisze że przeprowadza testy na ATmega8 więc nie powinien mieć tego typu problemów.
  • #12 7963563
    elonica
    Poziom 12  
    Tak, ale :

    1. może być upalony któryś pin
    2. może być gdzieś zimny lut
    3. Jeśli sprwadzisz po kolei stany na pinach to jest większe prawdopodobieństwo, że problem tkwi w sofcie.

    oczywiście zakładam, że nie ma pod ręką oscyloskopu, coby transmisję sprawdzić.

    Kolejnym radosnym :) motywem jest złe ustawienie kontrastu, ale zakładam, że to nie tutaj jeśli działał na starej bibliotece.
  • #13 7964040
    gothye
    Poziom 33  
    czy naprawdę nikt nie widzi złej konfiguracji :?:

    #define LCD_RS_DIR      DDRB 
    #define LCD_RS_PORT    PORTB 
    #define LCD_RS         (1 << PB0) //pin RS wyświetlacza do PB0 zgodnie z założeniem początkowym 
    
    #define LCD_E_DIR      DDRB 
    #define LCD_E_PORT      PORTB 
    #define LCD_E         (1 << PB2) //pin E wyświetlacza do PB2 zgodnie z założeniem początkowym 
    
    #define LCD_DB4_DIR      DDRD  // <-- to 
    #define LCD_DB4_PORT   PORTD  // <-- i to tez zmieniasz
    #define LCD_DB4         (1 << PD4) 
    
    #define LCD_DB5_DIR      DDRD
    #define LCD_DB5_PORT   PORTD 
    #define LCD_DB5         (1 << PD5) 
    
    #define LCD_DB6_DIR      DDRD 
    #define LCD_DB6_PORT   PORTD 
    #define LCD_DB6         (1 << PD6) 
    
    #define LCD_DB7_DIR      DDRD 
    #define LCD_DB7_PORT   PORTD 
    #define LCD_DB7         (1 << PD7)



    skoro piny d4-dy są podłaczone do port D ,to po co było PORTB :?:
REKLAMA