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

[ATMega16][C] - Dziwne zachowanie LCD od Nokii 3510i

Myrek1 13 Paź 2009 16:02 2446 8
REKLAMA
  • #1 7123454
    Myrek1
    Poziom 23  
    Witam.
    Bawię się tym LCD i stosuję bibliotekę z tej strony: http://hobbyelektronik.org/Elo/AVR/3510i/index.htm
    Wywaliłem zbędne rzeczy i zacząłem korzystać z funkcji czyszczącej ekran. Ekran niby się czyści, po czym wyświetlam daną z ADC w kilku miejscach tą samą. Funkcje wyświetlenia są w while(1) jedna za drugą. Efektem powinny być te same wartości pod sobą koloru czarnego na białym tle. Jednak tak nie jest. Wartości im są wyżej górnej krawędzi LCD tym bardziej mrugają i nie wiem dlaczego. Wartość na samym dole w ogóle nie mruga. Nie mam pojęcia dlaczego tak się dzieje.

    Tak wygląda wyświetlenie:

    while(1){
    		odczyt = ADCW; //odczyt ADC(10 bit w 16 bit)
    		TZad_buf = (int)odczyt/10; //zapis wartosci od 0-102;
    		ADCSRA |= _BV(ADSC);	
    		
    		LCD_SetColor(15, 15, 15);
    		LCD_Clear(); //wypelnienie ekranu
    		LCD_SetColor(0, 0, 0);
    		LCD_WriteInt(TZad_buf, 3, 10, 10);
    		LCD_WriteInt(TZad_buf, 3, 20, 10);
    		LCD_WriteInt(TZad_buf, 3, 30, 10);
    		LCD_WriteInt(TZad_buf, 3, 45, 10);
    		LCD_WriteInt(TZad_buf, 3, 55, 10);
    		LCD_WriteInt(TZad_buf, 10, 10, 10);
    }


    Czy to ma coś wspólnego z napięciem przetwornicy? Rozumiem, jakby mrugały tak samo wszystkie wartości jednakowo, przecież są wyświetlane zaraz po sobie w jednym obiegu pętli.
    Funkcję LCD_Clear() trochę zmodyfikowałem dodając współrzędne początkowe, bo ich tam nie było:

    void LCD_Clear() {
    	uint16_t cnt;
    	//x-Koordinate setzen
    	LCD_Out(0x2A, 1);
    	LCD_Out(0, 0);
    	LCD_Out(103,0);
    
    	//y-Koordinate setzen
    	LCD_Out(0x2B, 1);
    	LCD_Out(0, 0);
    	LCD_Out(83,0);
    
    	LCD_Out(0x2C, 1);
    	for(cnt = 0; cnt < 3283; cnt++) { // wyslanie kolory w 3 bajtach na 2 pix.
    		LCD_Out(lcd_clr[0], 0);
    		LCD_Out(lcd_clr[1], 0);
    		LCD_Out(lcd_clr[2], 0);
    	}
    }


    Do tego ok 3 linijek od dołu nie ma tła białego, tylko różne piksele, tak jakby obraz nie czyścił się do końca, dlaczego?
  • REKLAMA
  • #2 7123755
    szelus
    Poziom 34  
    Myrek1 napisał:
    Wartości im są wyżej górnej krawędzi LCD tym bardziej mrugają i nie wiem dlaczego.

    Bo czyscisz ekran od góry? Czyszczenie ekranu, to kawałek kodu w tej pętli zajmujący najwiecej czasu. Dodaj jakies opóźnienie.
  • #3 7123769
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #4 7123963
    Myrek1
    Poziom 23  
    szelus napisał:
    Myrek1 napisał:
    Wartości im są wyżej górnej krawędzi LCD tym bardziej mrugają i nie wiem dlaczego.

    Bo czyscisz ekran od góry? Czyszczenie ekranu, to kawałek kodu w tej pętli zajmujący najwiecej czasu. Dodaj jakies opóźnienie.


    Faktycznie, ma to pewien sens. Ale z tym wiąże się chyba coś innego. Taktowane mam 16MHz, SPI programowe. Nawet jak wstawię na końcu opróźnienie o 500ms, to i tak te wartości mrugają. Przecież ten LCD nie jest taki wolny. Przy 16MHz wysłanie ponad trochę ponad 9000 bajtów zajmuje ok 80ms, to powyżej 12 klatek/s. A tej pierwszej wartości nawet nie widać (tylko pod światło), tak szybko się odświerza. Cała pętla główna trwa 85ms.

    Jeśli to o to chodzi to zastanawiam się jak zrealizować wyświetlanie całości ekranu w czasie rzeczywistym. Chciałem zawsze czyścić ekran i wyświetlać poszczególne zmienne na LCD w jednej funkcji wywoływanej co pewien czas (np co 40ms). Wychodzi na to, że trzeba tylko jakoś uaktualniać wartości, ale to wiąże się z kolejnym problemem.
    Funkcja wysyłająca stringa kreśli znak po każdym pikselu, więc zawsze przed wykreśleniem nowego znaku, trzeba wymazać poprzedni kolorem tła. To trochę problematycznie, bo np tło może się w międzyczasie zmienić.
    Czy jest na to jakiś patent?

    Cytat:

    A dlaczego przy czyszczeniu wysyłasz 103 i 83?
    To chyba powinno być 97 i 66.


    To pytanie miałem później zadać :-) Nie wiem dlaczego, ale wszędzie w bibliotekach widziałem tą wartość wpisywaną pod CASET oraz PASET. Też nie wiem dlaczego takie wartości skoro jest 97 i 66 pix.
  • REKLAMA
  • #5 7124503
    Konto nie istnieje
    Poziom 1  
  • #6 7125781
    Myrek1
    Poziom 23  
    Ja chce po prostu np na jakmis tle (np kolor biały) wyświetlać parametry z różnych zmiennych, np w kolorze białym. Chcę, żeby to się odświeżało bez zwłoki, czyli np co 40ms. Do tej pory pisząc kod dla LCD mono po prostu co 40ms wywoływałem procedurę, która wyświetlała wszystko po kolei od nowa, tak było ponieważ LCD miały generatory znaków. Tu jest problem.
    Musie się coś dać bo przecież jest dużo projektów gdzie na bierząco są wyświetlane jakieś tam wartości.

    Cytat:
    Twoim jest to że w pętli czyścisz bufor i potem spowrotem go zamalowujesz!


    Czyli jak to zrobić? Nie zapisywać komendą 0x2C? Tak się coś pisze na LCD w tym sterowniku.
  • #7 7125862
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #8 7271265
    Myrek1
    Poziom 23  
    Po bojach z tym LCD stwierdzam, że jest do bani, ostatni projekt na nim :x
    Żeby podświetlić napis prostokątem na cały ekran trzeba kombinować z odświeżaniem co najmniej 200ms, bo wszystko skacze, dramat.

    @atom1477
    Za chwilkę zajmę się LCD od S65 (L2F50). Czy ten LCD dużo różni się od LS020? Czy tylko inicjalizają, a później zapomina się o różnicach?
    Potrzebuję też jakiegoś małego LCD. Ideałem jest LCD na PCFie z Nokii 6100. Nie wiesz czy on ma podwójny bufor? Lepiej się go steruje?
  • #9 7271791
    tmf
    VIP Zasłużony dla elektroda
    Nie rozni sie duzo, tylko mala uwaga - w bibliotekach dostepnych w necie do tego LCD jest drobny blad w inicjalizacji powodujacy, ze zamiast 64k kolorow masz kilkaset w dodatku ciemnych, taki odpowiednik 3-4-3 zamiast 5-6-5.
    Co do twojego migania - dopoki nie wykorzystasz wyswietlacza majacego linie tearing i tak w jakims stopniu bedzie ci to migac. Lepiej to dziala z double buffer, tyle, ze nie znam LCD komorkowego, ktory ma tyle pamieci, zeby zrobic double buffer. Na pewno bledem jest czyszczenie calego ekranu, jesli odswierzasz tylko mala czesc.
    Z tearingiem jest LCD z nokii 6300, ale to raczej wiekszy LCD i sterowany rownolegle (chociaz gdyby pomieszac na plytce sterownika to kontroler obsluguje takze SPI).
REKLAMA