Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Podpięcie wyświetlacza na KS0108 z STM32.

27 Lut 2012 10:47 2213 12
  • Poziom 27  
    Witam.

    Wyświetlacz zasilany 5V, procesor 3.3. Oczywiście poziomy niezgodne, ale może da się podłączyć bez problemów? 95% czasu procesor wysyła dane do wyświetlacza, tu nie powinno byc problemów, poziomy powyżej 3V powinny być rozpoznane jako 1, 5% czasu to dane z wyświetlacza, i wtedy leci prawie 5V po liniach do procesora. A może wystarczy np. na liniach dac diody zenera 3.3V do masy i oporniki szeregowo np. 1k od strony wyświetlacza?
  • Użytkownik obserwowany
    Zastanów się czy wysyłasz czy odbierasz dane z wyświetlacza.
  • Pomocny post
    Poziom 21  
    Jeżeli piny mikrokontrolera do których podłączasz wyświetlacz są 5V tolerant a jest duża szansa że takie są, to możesz to połączyć bezpośrednio i powinno śmigać bez zająknięcia. Musisz tylko zajrzeć do DS od Twojego mikrokontrolera, czy są 5V tolerant. Jeżeli nie są, to musisz zastosować translację poziomów.
  • Poziom 27  
    Ok, dzieki, to STM32F100RB. Jest w dokumentacji "almost all 5 V-tolerant", tylko nie mogę znaleźć które ewentualnie nie. W dokumentacji która posiadam nie ma np. konkretnego opisu pinów PORTA, PORTB. Jakoś w dokumentacji Atmela łatwiej było mi się połapać, tu wchodzę na stronę producenta, wybieram procesor STM32F100RB, klikam Datasheet i mam jakieś okrojone informacje.

    Dodano po 8 [minuty]:

    Ok, mam.
  • Pomocny post
    Specjalista - Mikrokontrolery
    Tylko weź pod uwagę, że wejścia są 5V tolerant. Jeśli pin ustawisz jako wyjście i w tym momencie podasz 5V np z pullupa to będzie problem. I tak samo problem może być w sytuacji kiedy masz linie dwukierunkowe.
  • Poziom 27  
    No są to linie danych dwukierunkowe. LCD powinien widziec stany 1 z procesora prawdiłowo, w drugą stronę jeżeli we. procesora tolerują 5V, tez nie powinno byc problemów.
  • Poziom 28  
    Teraz już nie szuka się datasheet'ów tylko user manual'e. Jakoś tak ostatnio wszystkie firmy zaczynają robić niestety.
  • Poziom 27  
    Podpięte, ale oczywiście nie działa:) Tzn. prawdopodobnie nie chodzi o problemy elektryczne, ale programowe. Staram sie przerobić procedury KS0108 z AVR na STM32. Tam były np. porty 8bit, tu 16 itd... Mam takie pytania. jeżeli mam.

    char commandTW = 55;
    uint16_t command;

    command = commandTW;
    command <<= 8;

    to będę miał w 8 starszych bitach command (8 - 15) to co było w commandTW?

    Bo musze wystawić na te 8 starszych bitów portu ARM32 to co było wystawiane na AVR na porcie ośmiobitowym.

    Dokładniej:
    na portach GPIOA 8-16 wystawiam dane (lub je odbieram) do LCD. Na młodszych mam sygnały sterujące (E, RW, RS, CS1, CS2...). żeby nie zmieniac stanu sygnałów sterujacych, najpierw wczytuję stan wyjść portu A. Wszystko wygląda tak:

    Code:

    void GLCD_WriteData(unsigned char dataToWrite)
    {
    uint16_t valu = 0;     //tu będę pobierał aktualną wartość wyjść GPIOA
    uint16_t dataTW = dataToWrite;   //tu przepisuje wartość danej typu char
    dataTW <<= 8;  //przesuwam na 8 starszych bitow
    while(GLCD_ReadStatus(screen_x / 64)&DISPLAY_STATUS_BUSY);

    DATAWY();
    KS0108_CTRL_PORT->BRR = KS0108_RW;
    KS0108_CTRL_PORT->BSRR = KS0108_RS;

    valu = GPIO_ReadOutputData(KS0108_DATA_PIN); //pobieram stan wyjść

    valu &= 0x00FF;    //kasuję 8 starszych bitów
    dataTW &= 0xFF00;     //w danej kasuję 8 młodszych
    dataTW |= valu;     // łączę dane ze stanem wyjść steujących

    GPIO_Write(KS0108_DATA_PORT,dataTW);    //wystawiam to na port

    GLCD_EnableController(screen_x / 64);
    KS0108_CTRL_PORT->BSRR = KS0108_EN;
    GLCD_Delay();
    KS0108_CTRL_PORT->BRR = KS0108_EN;

    GLCD_DisableController(screen_x / 64);
    screen_x++;
    }


    Na razie nie zmieniam oryginalnych nazw, więc tylko zdefiniowałem
    #define KS0108_DATA_PIN GPIOA
    #define KS0108_DATA_PORT GPIOA itd.
  • Pomocny post
    Poziom 21  
    Ja to bym zapisał ewentualnie tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Może i się czepiam, ale skoro stosujesz już konwencję nazw typów z C99 (stdint.h) to stosuj je wszędzie. Wtedy program który piszesz będzie bardziej czytelny. Natomiast co do Twojego pytania: tak, zmienna commandTW w wyniku wyżej opisanych operacji, zostanie promowana z typu uint8_t do uint16_t i przesunięta do starszej części zmiennej command.
  • Poziom 27  
    Ok, dzięki. To ja nawet nie wiedziałem że stosuję konwersję typów z C99:) Boże, jaki ja jestem mądry;) Na razie staram się pisać tak, zeby mi w kompilatorze nie wyskakiwały errory. Przez wiele lat pisałem w asm, z C, jakby tak policzyć, to zebrałoby sie może z tydzień.
    Udało mi sie uruchomić ten wyświetlacz, śmiga jak na AVR;) Prawdę powiedziawszy trudno o dobry kurs C - przeglądałem różne książki, różne kursy... ale trzeba ciągnąć dalej.
  • Poziom 21  
    Wystąpiła pewna nieścisłość w Twoim sformułowaniu.:
    Cytat:
    To ja nawet nie wiedziałem że stosuję konwersję typów z C99:)


    Czym innym jest konwersja typów, a czym innym są same typy danych. W poście wyżej przyczepiłem się, że stosowałeś char i uint16_t zamiast uint8_t i uint16_t albo char i unsigned short int. Chodziło mi bardziej o styl, bo stosowanie tych typów łącznie nie jest zabronione. C99 w pliku nagłówkowym stdint.h deklaruje typy o określonej długości np.: uint16_t uściśla 16 bitową zmienną całkowitą bez znaku. Wprowadzono to dla ułatwienia, ponieważ typy wbudowane jak np.: unsigned int na jednostkach o różnej długości słowa, mają różne rozmiary.

    Procesory w swojej konstrukcji, są takimi maszynami cyfrowymi, które nie potrafią wykonywać operacji na liczbach o różnym rozmiarze. Zatem, jeżeli ALU procesora ma dodać dwie zmienne do siebie, muszą one być tego samego typu. Język C z kolei, dopuszcza różnorodność typów zmiennych pomiędzy którymi wykonywane są jakieś operacje. I żeby operacje zapisane w C, mogły być zrealizowane przez sprzęt, następuje wspomniana wyżej konwersja typów. Są dwa rodzaje tej konwersji.
    Niejawna, czyli taka której dokonuje kompilator i tu przykładem jest kod z postu wyżej:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jawna, czyli taka której dokonuje programista np poprzez operację rzutowania:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    A jeżeli chodzi o książki do C to polecam "Język C nowoczesne programowanie" K. N. King oraz "Język C Szkoła programowania" S. Prata. Obie wydane przez Helion. Są świetne :)
  • Poziom 27  
    Poszukam polecanych książek. Domyśliłem sie o co chodzi, chociaż często spotykałem takie pomieszanie w jednym programie, np. w obliczeniach głównego programu zmienne typu char, int etc... a w częściach zwiazanych za sprzetem (sterowanie wyświetlaczami itp.) zmienne typu uint16_t. Dzięki za wyjaśnienie, trochę mnie to dziwiło, teraz wiem o co chodzi.