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

[attiny2313][lcd nt7532] sterownik nie działa

marcin026 25 Sie 2009 19:57 2328 7
  • #1 6942706
    marcin026
    Poziom 11  
    Witam próbuje uruchomić graficzny wyświetlacz lcd ze sterownikiem nt7532 i na razie nie chce ze mną gadać :cry: Pisał może ktoś sterownik do podobnego wyświetlacza i chciałby się podzielić kodem :?: Wrzucam kodzik mojego stera może ktoś znajdzie jakieś rażące błędy
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <inttypes.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <avr/eeprom.h>
    #include <avr/wdt.h>
    
    #include "harddef.h"
    #include "makra.h"
    
    //#include <stdio.h>
    
    
    void sendByte (uint8_t byte)
    {
    	for(uint8_t a=0; a<8 ; a++)
    	{
    		if((byte & 0x80)!=0){
    			PORT(LCD_SDA_PORT) |= 1<<LCD_SDA;
    		}else{
    		PORT(LCD_SDA_PORT)&= ~(1<<LCD_SDA);
    		}
    		PORT(LCD_SCK_PORT) |= 1<<LCD_SCK;
    		PORT(LCD_SCK_PORT) &= ~(1<<LCD_SCK);
    		byte = byte*2;
    	}
    	
    }
    
    inline void lcd_on (void)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xAF);
    }
    inline void lcd_off (void)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xAE);
    }
    inline void lcd_setDisplayStartLine (uint8_t line)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0x40|(line & 0x3F));
    }
    inline void lcd_setPageAddress(uint8_t address)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xB0 | (address & 0x0F));
    }
    inline void lcd_setColumnAdderss(uint8_t address)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0x10|((address>>4)&0x0F));
    	sendByte(address&0x0F);
    }
    inline void lcd_writeDisplayData(uint8_t data)
    {
    	PORT(LCD_A0_PORT) |= 1<<LCD_A0;
    	sendByte(data);
    }
    #define RIGHTROT 0
    #define LEFTROT  1
    inline void lcd_ADCselect (uint8_t dir)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xA0 | (dir & 0x01));
    }
    #define DISPLAY_NORMAL 0
    #define DISPLAY_REVERSE 1
    inline void lcd_display(uint8_t dir)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xA6 | (dir & 0x01));
    }
    inline void lcd_entireDisplayOn(uint8_t mode)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xA4 | (mode& 0x01));
    }
    inline void lcd_setLCDbias(uint8_t bias)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xA2|(bias&0x01));
    }
    inline void lcd_readModifityWrite(void)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xE0);
    }
    inline void lcd_end(void)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xEE);
    }
    inline void lcd_reset(void)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xE2);
    }
    #define STATUS_NORMAL 0
    #define STATUS_REVERSE 8
    inline void lcd_outputStatusSelactRegister(uint8_t status)
    {
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	sendByte(0xC0 | (status&0x08));
    }
    void lcd_initIO(void)
    {
    	DDR(LCD_RESET_PORT) |= 1<<LCD_RESET;
    	DDR(LCD_A0_PORT) |= 1<<LCD_A0;
    	DDR(LCD_CS_PORT) |= 1<<LCD_CS;
    	DDR(LCD_SCK_PORT)|= 1<<LCD_SCK;
    	DDR(LCD_SDA_PORT)|= 1<<LCD_SDA;
    	DDR(LCD_LEDK_PORT)|=1<<LCD_LEDK;
    	
    	PORT(LCD_RESET_PORT) &= ~(1<<LCD_RESET);
    	PORT(LCD_A0_PORT) &= ~(1<<LCD_A0);
    	PORT(LCD_CS_PORT) |= 1<<LCD_CS;
    	PORT(LCD_SCK_PORT)&= ~(1<<LCD_SCK);
    	PORT(LCD_SDA_PORT)&= ~(1<<LCD_SDA);
    	PORT(LCD_LEDK_PORT)&= ~(1<<LCD_LEDK);
    }
    inline void lcd_init(void)
    {
    	PORT(LCD_RESET_PORT) &= ~(1<<LCD_RESET);
    	PORT(LCD_RESET_PORT) |= 1<<LCD_RESET;
    }
    
    
    int main (void)
    {
    	lcd_initIO();
    	lcd_init();
    	lcd_on();
    	lcd_reset();
    	lcd_setLCDbias(0x01);
    	lcd_ADCselect(RIGHTROT);
    	lcd_setDisplayStartLine(0);
    	lcd_setPageAddress(0);
    	lcd_setColumnAdderss(0);
    	for(uint8_t licznik=0;licznik <100;licznik++)
    	{
    		lcd_writeDisplayData(licznik);
    	}
    	for(;;){}
    	return 0;
    }
    
  • #2 6944220
    flapo213
    Poziom 21  
    Witaj Kolego.

    Ja się trochę orobiłem tych wyświetlaczy różnych producentów. Na pierwszy rzut oka to chyba jakichś delay-y brakuje albo sprawdzania flag np. podczas inicjalizacji.
  • #3 6946866
    marcin026
    Poziom 11  
    Wyświetlacz nie ma możliwości czytania danych, więc sprawdzanie flag odpada, w nocie katalogowej nic nie pisze o żadnych delayach przy inicjacji, datasheet wyświetlacza w załączniku
    Załączniki:
  • #4 7723414
    Michał_L
    Poziom 11  
    Witam.

    Zauważyłem 2 błędy
    1. Polaryzacja sygnału zegarowego niezgodna z dokumentacją - zgodnie z dokumentacją sygnał zegarowy normalnie jest w stanie wysokim, a jego impulsy mają być w stanie niskim, a stan linii danych jest odczytywany przy rosnącym zboczu sygnału zegarowego czyli na końcu impulsu (zgodnie z dokumentacją, strona 12).

    2. Wysyłanie kolejnych bitów nie może działać, ponieważ zamiast wysyłać kolejne (zgodnie ze zmienną "a"), wysyłasz ośmiokrotnie ten sam bit. Pamiętaj również że kolejność bitów ma być od najstarszego do najmłodszego.

    Również próbuję uruchomić taki wyświetlacz i niestety jak do tej pory bezskutecznie, tyle że korzystam ze sprzętowego SPI, przy odpowiedniej jego konfiguracji zgodnie z interfejsem NT7532. Jedyne co otrzymuję to czasami "szumy" na ekranie podczas programowania ATMEGA8 (programator SPI).
  • #5 7723486
    marcin026
    Poziom 11  
    Udało mi się odpalić wyświetlacz:D Błąd polegał z złej inicjacji trzeba przesłać po resecie 3 komendy ostatnia dwubajtowa:
    
    sendByte(175);
    sendByte(47);
    sendByte(129);
    sendByte(52);
    

    działający kod umieszczam zastrzegając że pisanie stringów nie działa jeszcze tak jak trzeba, są błędy w pliku z moimi literami.
    Cytat:

    2. Wysyłanie kolejnych bitów nie może działać, ponieważ zamiast wysyłać kolejne (zgodnie ze zmienną "a"), wysyłasz ośmiokrotnie ten sam bit. Pamiętaj również że kolejność bitów ma być od najstarszego do najmłodszego.

    działa na końcu funkcji jest:

    czyli przesuwanie logiczne w lewo, wszystko działa elegancko.
  • #6 7724068
    Michał_L
    Poziom 11  
    OK, moje niedopatrzenie :). Ale skoro już jesteśmy w temacie przesuwania to zamiast
    Cytat:
    byte = byte*2
    można napisać: byte <<= 1, chociaż nie wykluczam że przy dobrej optymalizacji ze strony kompilatora wyjdzie na to samo.

    Co do polaryzacji, jednak miałeś to dobrze, ale w inicjalizacji ustawiasz SCL w stan niski - nie ma takiej potrzeby, co więcej, wydaje mi się że przy wysyłaniu pierwszego w programie bajtu może nastąpić błąd, bo tutaj:
    Cytat:
    if((byte & 0x80)!=0){
    PORT(LCD_SDA_PORT) |= 1<<LCD_SDA;
    }else{
    PORT(LCD_SDA_PORT)&= ~(1<<LCD_SDA);
    }
    PORT(LCD_SCK_PORT) |= 1<<LCD_SCK;

    nie nastąpi (za pierwszym razem) wzrost zbocza (tak biorąc to "na logikę").

    W kazdym razie dzięki za odkrycie tego numeru z włączaniem włączaniem opcji zasilania i regulacją napięcia-jasności:
    Cytat:
    sendByte(47);
    sendByte(129);
    sendByte(52);

    zamiast wartości 52 można oczywiście użyć innej tak żeby jasność było możliwie najlepiej dopasowana. Próbowałem ustawiać "w ciemno" wartości tych opcji, ale trudno, szczególnie przy tylu możliwych kombinacjach trafić na właściwe rozwiązanie bazując tylko na dokumentacji do samego sterownika. Po dopisaniu do mojego kodu w każdym razie zadziałało (LCD AG-128064M-YIG YGG-E6).
  • #7 7725098
    marcin026
    Poziom 11  
    używasz jakiegoś scalaka do dopasowywania poziomów czy zasilasz procka z 3V3 :?: Mi prosty konwerter na rezystorach i diodach strasznie śmiecił, praktycznie żadne dane prawidłowo nie dochodziły. :cry:
  • Pomocny post
    #8 7725203
    Michał_L
    Poziom 11  
    Aktualnie wyświetlacz mam podłączony do ATMEGA8L tak więc zasilam całość bezpośrednio z około 3,3V, tylko sygnały z programatora podłączyłem przez konwertery złożone właśnie z rezystorów 120Ω i diod zenera 3.3V bo w programatorze mam ATMEGA8 zasilaną z USB, ale nie mam problemów z ładowaniem programu. Jeśli chodzi o linie sygnałowe to taki konwerter uważam za wystarczający.
REKLAMA