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

[ATtiny26][C/AVR Studio] Problem z układem

krzema12 31 Sty 2010 15:13 1374 2
REKLAMA
  • #1 7621524
    krzema12
    Poziom 12  
    Witam!
    Właśnie próbuję obsłużyć wyświetlacz oparty na sterowniku HD44780 w trybie 4-bitowym za pomocą ATtiny26 i mam z tym dziwny problem. Gdy proc nie jest wsadzony do podstawki - wszystko oczywiście działa tzn. na wyświetlaczu wyświetla się jedna zaczerniona linia. Jednak gdy wepnę ATtiny z programem, który ma obsłużyć wyświetlacz, po inicie zaczerniają się 2 linie i to w dodatku nie w pełni (jakby z połową kontrastu). Nie wyświetlają się znaki, które powinny się wyświetlić. Czemu tak się dzieje? Zasilam go z baterii paluszków 4x1.5V, przechodzi jeszcze przez diodę więc jest na niej spadek do ok. 5V. Czy możliwe, że tak się dzieje bo nie mam w układzie stabilizatora napięcia?Jak powinien wyglądać prawidłowy układ?
    Dodam, że testowałem procedury initu/komunikacji z LCD przez LPT i wszystko śmiga.

    Oto schemat układu, na którym teraz pracuję:

    [ATtiny26][C/AVR Studio] Problem z układem

    A oto kod:

    
    #define F_CPU					12000000L
    
    #include <avr/io.h>
    #include <util/delay.h>
    
    // PORTA PINS
    #define RSPIN				0x02
    #define RWPIN				0x04
    #define EPIN				0x08
    
    #define RS_PIN_ENABLE		PORTA |= RSPIN
    #define RS_PIN_DISABLE		PORTA &= ~RSPIN
    
    #define RW_PIN_ENABLE		PORTA |= RWPIN
    #define RW_PIN_DISABLE		PORTA &= ~RWPIN
    
    #define E_PIN_ENABLE		PORTA |= EPIN
    #define E_PIN_DISABLE		PORTA &= ~EPIN
    
    typedef unsigned char byte;
    
    void SendOrder(byte order)
    {
    	RS_PIN_DISABLE;
    	E_PIN_ENABLE;
    	PORTA &= 0x0F;
    	PORTA |= order&0xF0;
    	E_PIN_DISABLE;
    	_delay_ms(1);
    	E_PIN_ENABLE;
    	PORTA &= 0x0F;
    	PORTA |= (order<<4)&0xF0;
    	E_PIN_DISABLE;
    	_delay_ms(1);
    }
    
    void SendData(byte data)
    {
    	
    	RS_PIN_ENABLE;
    	E_PIN_ENABLE;
    	PORTA &= 0x0F;
    	PORTA |= data&0xF0;
    	E_PIN_DISABLE;
    	_delay_ms(1);
    	E_PIN_ENABLE;
    	PORTA &= 0x0F;
    	PORTA |= (data<<4)&0xF0;
    	E_PIN_DISABLE;
    	_delay_ms(1);
    }
    
    void LCDinit()
    {
    	_delay_ms(50);
    	E_PIN_DISABLE;
    	RS_PIN_DISABLE;
    	for(int i=0; i<3; i++)
    	{
    		E_PIN_ENABLE;
    		//PORTA &= 0x0F;
    		//PORTA |= 0x30;
    		PORTA &= 0x3F;
    		E_PIN_DISABLE;
    		_delay_ms(10);//5
    	}
    	E_PIN_ENABLE;
    	PORTA &= 0x0F;
    	PORTA |= 0x20;
    	E_PIN_DISABLE;
    	_delay_ms(1);
    	SendOrder(0x28); // interfejs 4-bity, 2-linie, znak 5x7
    	SendOrder(0x08); // wyłącz LCD, kursor i miganie
    	SendOrder(0x01); // czyść LCD
    	SendOrder(0x06); // bez przesuwania w prawo
    	SendOrder(0x0C);
    }
    
    int main()
    {
    	DDRA = 0xFF;
    	DDRB = 0xFF;
    
    	PORTA = 0x00;
    	PORTB = 0x00;
    
    	LCDinit();
    	SendData('t');
    	SendData('e');
    	SendData('s');
    	SendData('t');
    
    }
    
    


    Szukałem już wszędzie, ale nic z tego nie wyszło... Proszę o pomoc, długo się z tym męczę i nie widać efektów.
    Jestem początkujący jeżeli chodzi o tego typu układy więc wybaczcie jeżeli nie wiem czegoś co jest dla Was oczywiste ;)

    Pozdrawiam,
    Piotrek.
  • REKLAMA
  • #2 7622196
    OlekM
    Poziom 17  
    Schemat sugeruje błędne podłączenie zasilania do LCD oraz brak regulacji kontrastu...

    Jeśli chodzi o program, to przed procedurą LCDinit(); rejestr PORTA ma wartość 0 (chodzi mi o bity DB), następnie w pętli jego wartość podlega jedynie operacji AND - zatem nie zostanie ustawiony ani jeden jego bit - natomiast do inicjalizacji LCD w trybie czterobitowym konieczne jest wystawienie jedynek na DB5 i DB4 (dokumentacja Hitachi HD44780U, strona 46).

    Może się też przydać dodatkowe opóźnienie przed każdym E_PIN_DISABLE;
  • #3 7622758
    krzema12
    Poziom 12  
    To co na schemacie jest VO, powinno być GND. A potencjometr do regulacji kontrastu jest - zapomniałem wstawić go na schemat.

    Cytat:
    Jeśli chodzi o program, to przed procedurą LCDinit(); rejestr PORTA ma wartość 0 (chodzi mi o bity DB), następnie w pętli jego wartość podlega jedynie operacji AND - zatem nie zostanie ustawiony ani jeden jego bit

    Wiem, ale zrobiłem tak w/g tego http://mikrokontrolery.net/avr_c_08.htm kodu bo myślałem, że jakimś cudem stan na pinach może się zmieniać i trzeba go zerować kilka razy... Ok, wczytam się w dokumentację. Dzięki za zwrócenie uwagi na jedynki na DB5 i DB4 podczas initu.

    Pozdrawiam.

    Dodano po 29 [minuty]:

    Dziaaała!! :D Dzięki bardzo za pomoc OlekM, dokumentacja to klucz to oświecenia :D
    Załączam działający kod, na wszelki wypadek:

    
    #define F_CPU					12000000L
    
    #include <avr/io.h>
    #include <util/delay.h>
    
    // PORTA PINS
    #define RSPIN				0x02
    #define RWPIN				0x04
    #define EPIN				0x08
    
    #define RS_PIN_ENABLE		PORTA |= RSPIN
    #define RS_PIN_DISABLE		PORTA &= ~RSPIN
    
    #define RW_PIN_ENABLE		PORTA |= RWPIN
    #define RW_PIN_DISABLE		PORTA &= ~RWPIN
    
    #define E_PIN_ENABLE		PORTA |= EPIN
    #define E_PIN_DISABLE		PORTA &= ~EPIN
    
    typedef unsigned char byte;
    
    void SendOrder(byte order)
    {
    	RS_PIN_DISABLE;
    	E_PIN_ENABLE;
    	PORTA &= 0x0F;
    	PORTA |= order&0xF0;
    	E_PIN_DISABLE;
    	_delay_ms(5);;
    	E_PIN_ENABLE;
    	PORTA &= 0x0F;
    	PORTA |= (order<<4)&0xF0;
    	E_PIN_DISABLE;
    	_delay_ms(5);
    }
    
    void SendData(byte data)
    {
    	
    	RS_PIN_ENABLE;
    	E_PIN_ENABLE;
    	PORTA &= 0x0F;
    	PORTA |= data&0xF0;
    	E_PIN_DISABLE;
    	_delay_ms(5);
    	E_PIN_ENABLE;
    	PORTA &= 0x0F;
    	PORTA |= (data<<4)&0xF0;
    	E_PIN_DISABLE;
    	_delay_ms(5);
    }
    
    void LCDinit()
    {
    	_delay_ms(60);
    	E_PIN_DISABLE;
    	RS_PIN_DISABLE;
    	for(int i=0; i<3; i++)
    	{
    		E_PIN_ENABLE;
    		PORTA &= 0x0F;
    		PORTA |= 0x30;
    		E_PIN_DISABLE;
    		_delay_ms(10);
    	}
    	E_PIN_ENABLE;
    	PORTA &= 0x0F;
    	PORTA |= 0x20;
    	E_PIN_DISABLE;
    	_delay_ms(5);
    	SendOrder(0x28); // interfejs 4-bity, 2-linie, znak 5x7
    	SendOrder(0x08); // wyłącz LCD, kursor i miganie
    	SendOrder(0x01); // czyść LCD
    	SendOrder(0x06); // bez przesuwania w prawo
    	SendOrder(0x0C);
    }
    
    void print(char *text)
    {
    	while(*text)
    		SendData(*(text++));
    }
    
    int main()
    {
    	DDRA = 0xFF;
    	DDRB = 0xFF;
    
    	PORTA = 0x00;
    	PORTB = 0x00;
    
    	LCDinit();
    	print("Nareszcie dziala! :D");
    
    	while(1)
    	{
    		_delay_ms(20);
    	}
    }
    
    
REKLAMA