niedziela, 24 czerwca 2012

Itm-400160 i LPC1768 - drugie starcie

I nadejszło ostatnie, już finałowe starcie z matrycą Itm-400160 i LPC1768, i w końcu się udało, na reszczcie wszystko bangla i to lepiej niż się spodziewałem, zwracam honor LPC. Ale ostrzegam przed zbytnim zaufaniu bibliotekom do obsługi Standard Peripherals od NXP zawiera ona bardzo dużo bugów. W moim przypadku procesor zawieszał się przy wchodzeniu w przerwanie i nie działał poprawnie. A na koniec parę dowodów na to iż działa ;)



Już niedługo relacja z budowy stacji pogodowej.

Mały smaczek na temat wyświetlacza.



AVE.

17 komentarzy:

  1. Witaj. Masz może stworzoną bibliotekę do tej matrycy? Mam taką i chętnie bym użył, a po co wywarzać otwarte drzwi..

    OdpowiedzUsuń
  2. Skoro masz taką bibliotekę to podeślij na mejla. Ułatwi na pewno
    programowanie. janjasionek@gmail.com Dzięki

    OdpowiedzUsuń
  3. Biblioteka ta niestety nie nadaje się jeszcze do publikacji, myślę że w ciągu miesiąca może dwóch przygotuje ją i udostępnię.

    Michał.

    OdpowiedzUsuń
    Odpowiedzi
    1. Witam.
      Zakupilem rowniez ta matryce i nie mam zielonego pojecia jak ja uruchomic.Pomożecie mi?mariuszlatek@interia.pl, gg8684620

      Usuń
  4. Chciałem podpytać, czy jakieś postępy. Da się już coś udostępnić? Nie musi być publicznie :)

    OdpowiedzUsuń
    Odpowiedzi
    1. Witam, na chwilę obecną szykuję się do zakończenia studiów, jak tylko się z tym uporam, to postaram się coś wrzucić.

      Usuń
  5. Wskrzeszę ten temat otóż próbuję podpiąć tą matrycę to Raspberry PI i znalazłem Twoją bibliotekę niestety trochę się rozbiłem o kilka problemów bo nie do końca ogarniam co dzieje się w tym momencie

    PORT_LCD ->FIOCLR = 0x000f;
    PORT_LCD ->FIOSET = ((ek >> 4) & 0x000f);

    PORT_LCD ->FIOCLR = LCD_CL2;

    PORT_LCD ->FIOCLR = 0x000f;
    PORT_LCD ->FIOSET = LCD_CL2;
    PORT_LCD ->FIOSET = (ek & 0x000f);

    Jest to kawałek głównej funkcji GLCD_RefreshScreen ogólnie łapię o co biega ta funkcja odświeża cyklicznie ekran tym co jest w tablicy ekran[][] ale nie oganiam tego PORT_LCD ->FIOSET = ((ek >> 4) & 0x000f); rozumiem że to jest ustawienie jakiegoś PINa GPIO na HIGH ale jakie go ? Inne są po aliasie a to działa na jakiej zasadzie.

    Nie jestem studentem jestem hobbystą, a zawodowo programistą i strasznie mi się podobała ta matryca to kupiłem. Nie robiłem nic wcześniej w mbed ani na tym procesorze. Czy możesz dać mi jakieś wskazówki co do kodu ? Będę wdzięczny.

    OdpowiedzUsuń
    Odpowiedzi
    1. Cześć,

      Niestety zadałeś źle pytanie. Nie wiem jaki pin będzie w stanie wysokim bo nie wiem co masz w tablicy.

      Inna sprawa jest taka, czy wiesz jak działa ten LCD? Czy jesteś przygotowany od strony sprzętowej do użycia tego LCD? Czy wiesz jak go podłączyć? W jakim języku programujesz? Znasz ANSI C (będzie Ci niezbędne)?

      Usuń
    2. No to tak C znam nie mam problemu ze zrozumieniem koncepcji używałem głownie przy nauce na aurduino. Dd strony technicznej się mam nadzieję dobrze przygotowałem więc tak:
      1. Wyczytałem w kilku miejscach że wyświetlacz potrzebuje -18V oprócz normalnego zasilania poszukałem więcej w temacie po necie i znalazłem to http://ep.com.pl/files/7848.pdf była do samodzielnego montażu. Złożyłem i działa, przyznam się bez bicia, że koncepcja tego dlaczego -18V jest dość ciężka do pojęcia przynajmniej dla mnie.

      2. Z dokumentacji i tego co wyczytałem w necie wiem że ten wyświetlacz ma KS0086 5 steruje w pikselami w pionie 2 w poziomie czytałem tą dokumentację ale ogólnie jest mi się ciężko pokapować wiem że muszę w odpowiedniej kolejności i czasie podawać informacje.

      3. Szukałem po necie jak działają inne wyświetlacze jaka jest logika podawania informacji itd. ale to co znajduję to zwykle ogólniki albo pozostawiają wiele do życzenia tak więc mogłem zapomnieć o podejściu "analogicznym"

      4. Podłączyć coś do kontrolera i nie spalić tego umiem w zasadzie bawię się hobbystycznie elektroniką z dobre 1,5 roku. Póki co były już silniki, serva, kilka małych wyświetlaczy z allegro. Jeden większy oparty o KS0108.

      Jak szukałem matrycy to miała być wielka, a ta cóż no jest wielka i do tego kupiłem ich 3 po 10zł na allegro. W sumie to się ucieszyłem, że to takie porąbane bo od dłuższego czasu miałem wrażenie, że za łatwo idzie z Raspberry PI i Arduino no i teraz wiem czemu. Dziś przykładowo dowiedziałem się o rejestrach przy okazji tego jak chciałem zrozumieć Twój kod. Ogólnie widzę, że trochę błędem było ograniczanie się do co bardziej przyjaznych platform bo o ile wiele można o tyle sporo jest schowana żeby nie robić problemu.

      Usuń
    3. Najważniejsze, nie czekam na gotowca wolę sam to wygmerać, ale czuję że obecnie próbuję przebić głową ścianę bo tak.

      1. Nie wiem czemu tablica ekran jest taka mała w sensie że ma ona tylko ekran[50][160] czyli jakieś 8Kb by wystarczyło do zapisania całego ekranu

      2. Co w ogóle trzyma ekran ? Patrzyłem na metodę GLCD_SetPixel i nie do końca ogarniam co ląduje w tablicy w wyniku jej działania

      3. Co robi ta linijka ? PORT_LCD ->FIOSET = ((ek >> 4) & 0x000f);
      Z dokumentacji wydedukowałem że FIOSET coś włącza ustawia na HIGH ?

      Póki co rozbiłem się też o zrozumienie innej platformy.

      Usuń
    4. Ogólnie ten LCD nie ma pamięci własnej, więc trzeba go odświeżać cały czas. W ekran[][] przechowywany jest zapis "pixelowy" całego LCD.

      Co robi ta linijka ? PORT_LCD ->FIOSET = ((ek >> 4) & 0x000f);
      Ustawia odpowiednie porty w stan wysoki.

      Skoro znasz ANCI C to będziesz musiał napisać daemona w C który będzie Ci odświeżał LCD, gdyż jest wymagana do tego odpowiednia częstotliwość.

      Co do platformy to Arduino odpada - za wolne jest.

      Wieczorem postaram się wrzucić rysunek jak wygląda sterowanie pinami, to może chwycisz metodę.

      Usuń
    5. Dzięki za informacje, czekam na dalsze info, tak myślałem że ekran[][] przechowuje informacje o poszczególnych pikselach tylko czemu tablica ma rozmiar ekran[50][160], a nie ekran[400][160]. Wiem, że arduino jest za wolne mam Raspberry PI jego prędkość wystarczy.
      Czekam więc na schemat, dzięki za chęć pomocy mało co można na necie znaleźć bo jest to dość stara matryca, a do tego bez sterownika.

      Usuń
    6. OK, widziałem schemat czyli tak (dodałem komentarze):

      for (nX = 0; nX < (LCD_X_RES / 2); nX++) {
      ek = ekran[nX][nY];

      PORT_LCD ->FIOSET = LCD_CL2; //włączenie CL2

      PORT_LCD ->FIOCLR = 0x000f; //D1-D4 LOW ?
      PORT_LCD ->FIOSET = ((ek >> 4) & 0x000f); //D1-D4 HIGH ?

      PORT_LCD ->FIOCLR = LCD_CL2; //wyłączenie CL2

      PORT_LCD ->FIOCLR = 0x000f; //D1-D4 LOW
      PORT_LCD ->FIOSET = LCD_CL2; //CL2 HIGH
      PORT_LCD ->FIOSET = (ek & 0x000f); //a tu nie wiem co się dzieje

      PORT_LCD ->FIOCLR = LCD_CL2; //CL2 LOW
      }

      Zastanawiam się nadal na jakiej zasadzie wiesz dlaczego włączyć D1 - D4 czy to odbywa się tutaj: PORT_LCD ->FIOSET = ((ek >> 4) & 0x000f); ? To jest już sterowanie specyficzne dla tego kontrolera prawda ?
      Co może się znajdować w ek w tym momencie ? Ja to rozgryzałem na zasadzie że tablica ekran[][] trzymałaby w sobie albo 0 albo 1 w danej "współrzędnej" i to decydowałoby czy pixel jest zapalony czy zgaszony ale widzę, że raczej nie jest. Mam rację ?

      Usuń
    7. Tablica ekran[][] zawiera reprezentację bitową zawartości LCD w formie elementów 8 bitowych bo:
      - cykl wysyłania składa się z dwóch danych po 4 bity,
      - optymalna ilość operacji,
      - cały cyfrowy świat wciąż jest na 8 bitach.

      A co robi ta pętla, dla każdego elementu tablicy ekran wykonuje operacje bitowe, aby móc reprezentację bitową wyświetlacza wysłać bezpośrednio na piny mikrokontroler.

      PORT_LCD ->FIOSET = ((ek >> 4) & 0x000f); //D1-D4 HIGH ?
      PORT_LCD ->FIOSET = (ek & 0x000f); //a tu nie wiem co się dzieje
      Obie linijki powyżej są tożsame tylko dla różnych wartości.

      "ekran[50][160], a nie ekran[400][160]"
      50 * 8 = 400 bo piksele są zapisywane w postaci zmiennej 8 bitowej.

      Usuń
    8. Dziękuję za info, wrócę jak ogarnę sobie to czego nie wiedziałem, że nie wiem :-D Zaczynam ogarniać co się z tym dzieje.

      Usuń