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

PIC12F1840 - Sterowanie wyświetlaczem OLED SSD1306 używając hardware I2C

mariomario 07 Wrz 2017 07:58 1404 10
  • #1 07 Wrz 2017 07:58
    mariomario
    Poziom 18  

    Chcę uruchomić wyświetlacz OLED SSD1306 (wyświetlacz sprawny) o adresie 0x3C za pomocą hardware I2C, używając mikrokontrolera PIC12F1840 oraz środowiska MikroC Pro for PIC. Przerobiłem nieco kod widoczny na stronie: http://microcontrolandos.blogspot.com/2014/12/pic-ssd1306.html

    Aktualnie kod prezentuje się następująco:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Efekt powyższego kodu jest taki, że: dioda LED, którą sprawdzam czy uC gdzieś się nie "wiesza/zapętla" miga poprawnie. Funkcja SSD1306_Fill( 0 ); nie działa poprawnie dlatego ją // . Na ekranie OLED kompletnie nic się nie wyświetla. I2C pomiędzy uC a wyświetlaczem jest podciągnięte do VCC +5V za pomocą dwóch rezystorów 4K7. Podłączone linie SDA <-> SDA zaś SCK <-> SCK. Samo hardware I2C zaś działą poprawnie co widać przy pomocy analizatora logicznego poniżej:
    PIC12F1840 - Sterowanie wyświetlaczem OLED SSD1306 używając hardware I2C
    PIC12F1840 - Sterowanie wyświetlaczem OLED SSD1306 używając hardware I2C
    PIC12F1840 - Sterowanie wyświetlaczem OLED SSD1306 używając hardware I2C


    Pytanie - co muszę poprawić, poproszę o wskazówki lub o pomoc w poprawie kodu aby wysterować wyświetlacz OLED SSD1306 za pomocą hardware I2C.


    Załączam dodatkowo cały projekt w .zip

    0 10
  • Pomocny post
    #2 07 Wrz 2017 08:27
    Marek_Skalski
    Moderator Projektowanie

    Na pewno musisz zmienić adres wyświetlacza, ponieważ analizator wyraźnie pokazuje NACK. Czyli układ nie odpowiada na tym adresem. Spróbuj przesunąć adres o 1 bit w lewo. Zazwyczaj OLEDy odpowiadają na adresy 0x7A, 0x7C, 0x7E.

    0
  • #3 07 Wrz 2017 08:41
    zby

    Poziom 14  

    To którego przykładu używasz? Bo ze skanu analizatorem wynika że stosujesz bajt adresu 0x3C i tak samo jest w załączonym spakowanym projekcie, a w listingu powyżej stosujesz bajt adresu 0x78.
    Adres 0x3C musi być przesunięty o 1 w lewo co daje 0x78.

    0
  • #4 07 Wrz 2017 09:08
    Marek_Skalski
    Moderator Projektowanie
  • #5 07 Wrz 2017 10:28
    zby

    Poziom 14  

    Choćby tutaj

    Code:

    /* Preeche o display com o byte */
    void SSD1306_Fill( char color )
    {
    char x, y;
       for( y = 0; y < 8; y++ )
       {
          SSD1306_Set_Cursor( y, 0 );
          I2C1_Start();
          I2C1_Wr( 0x78 );
          I2C1_Wr( 0b1100000 );
          for( x = 0; x < 128; x++ )
             I2C1_Wr( color );
          I2C1_Stop();
       }
    }

    0
  • Pomocny post
    #6 07 Wrz 2017 13:27
    Marek_Skalski
    Moderator Projektowanie

    Dobry przykład jak nie należy pisać programu. Zamiast wpisywać adres na sztywno do funkcji, lepiej użyć definicji, ponieważ daje gwarancję jednakowej i prawidłowej wartości w przypadku zmian. Można też użyć dodatkowego parametru, ale dla wyświetlacza to mało sensowne.
    @zby
    Funkcja SSD1306_Fill nie jest wywoływana w żadnym miejscu programu.
    Funkcja SSD1306_Image nie jest wywoływana w żadnym miejscu programu.
    Są tylko możliwe wywołania zasłonięte komentarzem. Zrzuty analizatora pokazują wyraźnie adres urządzenia 0x3C i NACK. Jaki sens miało Twoje pytanie?

    0
  • #7 07 Wrz 2017 14:10
    373522
    Użytkownik usunął konto  
  • #8 07 Wrz 2017 14:53
    tronics
    Poziom 36  

    Prosty i przyjemny "skaner" to raspberry/orange/banana pi i i2cdetect z pakietu i2c tools.

    0
  • #9 07 Wrz 2017 18:44
    mariomario
    Poziom 18  

    Dziękuję za wszystkie odpowiedzi, lecz dalej wyświetlacz nic nie wyświetla.


    Co poprawiłem:

    + adres 0x78 zamiast 0x3C (tak, wyświetlacz ma dokładnie adres 0x3C gdyż sprawdziłem to i2c scannerem pod arduino, oraz z tym adresem działał z arduino)


    Co zostało bez zmian:

    + zasilanie 5V DC zarówno uC jak i wyświetlacza OLED
    + pullup'y z rezystorów na szynie I2C o wartościach 2x 4K7


    Zastanawiam się czy aby napewno poprawnie wygląda sama transmisja danych po I2C, szczególnie te długie przerwy pomiędzy każdym bajtem danych po I2C (za spraw ciągłego Start/Stop transmisji jak widać poniżej w kodzie) ?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Poniżej zamieszczam widok z analizatora logicznego oraz aktualny projekt (.zip)
    PIC12F1840 - Sterowanie wyświetlaczem OLED SSD1306 używając hardware I2C

    Oraz przybliżenie przebiegów:
    PIC12F1840 - Sterowanie wyświetlaczem OLED SSD1306 używając hardware I2C

    0
  • Pomocny post
    #10 07 Wrz 2017 20:39
    Marek_Skalski
    Moderator Projektowanie

    Funkcja wysyłająca komendy i dane jest nieprawidłowa. Wyślij Start, Adres, Kontrolny, Komendę/Dane i na końcu Stop. To co teraz robisz jest bez sensu. Za każdym razem po wystawieniu Startu, układ podłączony do magistrali czeka na swój adres. Jeżeli się zgadza, to układ odpowie poprzez ACK, jeżeli nie, to układ milczy (NACK).
    Widać to również na zrzutach ekranu. Pierwszy bajt to prawidłowo zaadresowany układ odpowiadający ACK'iem. Ponieważ wystawiasz Stop, układ powraca do stanu nieaktywnego. Po kolejnym Start nie rozpoznaje swojego adresu i dlatego jest NACK.

    0
  • #11 08 Wrz 2017 07:10
    mariomario
    Poziom 18  

    Marek_Skalski napisał:
    Funkcja wysyłająca komendy i dane jest nieprawidłowa. Wyślij Start, Adres, Kontrolny, Komendę/Dane i na końcu Stop. To co teraz robisz jest bez sensu. Za każdym razem po wystawieniu Startu, układ podłączony do magistrali czeka na swój adres. Jeżeli się zgadza, to układ odpowie poprzez ACK, jeżeli nie, to układ milczy (NACK).
    Widać to również na zrzutach ekranu. Pierwszy bajt to prawidłowo zaadresowany układ odpowiadający ACK'iem. Ponieważ wystawiasz Stop, układ powraca do stanu nieaktywnego. Po kolejnym Start nie rozpoznaje swojego adresu i dlatego jest NACK.


    Jeszcze raz dziękuję za porady, tym razem wyświetlacz zaczął wyświetlać tekst :) , poprawiłem obie funkcje:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Program działa, wyświetla obraz za pomocą hardware I2C na wyświetlaczu OLED, choć teraz czekają mnie optymalizacje i poprawienie kodu pod kątem jego przejrzystości.

    Aktualnie tak to działa (widać napis 'TEST'):
    PIC12F1840 - Sterowanie wyświetlaczem OLED SSD1306 używając hardware I2C

    zaś po I2C widać:
    PIC12F1840 - Sterowanie wyświetlaczem OLED SSD1306 używając hardware I2C


    Zamieszczam poniżej spakowany i gotowy przykład (.zip , MikroC PRO for PIC)

    0