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

Nowe mikrokontrolery AVR ATTINY414 i wyświetlacz OLED

bipolunipol 05 Kwi 2021 12:51 834 12
  • #1 19361231
    bipolunipol
    Poziom 19  
    Witam.

    Tworzę projekt oparty na mikrokontrolerze ATTINY414. Powstaje on w środowisku Microchip (Atmel) Studio.

    Program ma wyświetlać aktualną temperaturę z czujnika oraz średnią kroczącą temperatury z ostatnich 24 godzin. Dane chciałbym wyświetlić na małym wyświetlaczu OLED, 128 x 32, sterownik SSD1306 (komunikacja przy pomocy I2C).
    Mikrokontroler ma 4kB FLASH i 256B SRAM, więc muszę zrezygnować ze stosowania wewnętrznego bufora w pamięci SRAM mikrokontrolera. Wystarczy mi też samo wyświetlanie tekstu (i ewentualnie prostych linii oddzielających tekst / symbolu baterii lub termometru).

    Większość kodów znalezionych w Internecie do obsługi SSD1306 jest niestety na Arduino. Ale znalazłem też coś w C, po czym to przerobiłem, aby pasowało pod nową rodzinę uC ATTINY (dodałem swoją obsługę I2C na bazie wygenerowanego w https://start.atmel.com/ kodu). Niestety program nie działa i nie wiem, dlaczego...

    A tak to wszystko wygląda:

    Kod obsługi wyświetlacza:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Definicje:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Obsługa I2C:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod nie działa - wyświetlacz pozostaje czarny. Co może być nie tak?
    Stosowany wyświetlacz to dokładnie ten model: https://botland.com.pl/wyswietlacze-raspberry...-nakladka-dla-raspberry-pi-adafruit-3527.html
  • #2 19361279
    BlueDraco
    Specjalista - Mikrokontrolery
    Obejrzyj komunikaty kompilacji - zajętość pamięci RAM. Potem dodaj do tego jakieś 50 bajtów stosu, którym dość rozrzutnie gospodarujesz i policz, ile razy przekroczyłeś dostępną pamięć RAM.
    Weźmy chociażby to:
    static uint8_t displayBuffer[DISPLAY_HEIGHT/8][DISPLAY_WIDTH];
    - to już 512 bajtów.

    A tak na przyszłość: Najpierw określ zapotrzebowanie na zasoby (porty, interfejsy, pamięć), potem wybieraj mikrokontroler.
    Taki np. HK32F030M kosztuje 40 centów, ma 16 KiB Flash i 4 KiB RAM, sprzętowy SPI, I2C, UART i ADC.
  • #3 19361334
    bipolunipol
    Poziom 19  
    BlueDraco napisał:
    Obejrzyj komunikaty kompilacji - zajętość pamięci RAM. Potem dodaj do tego jakieś 50 bajtów stosu, którym dość rozrzutnie gospodarujesz i policz, ile razy przekroczyłeś dostępną pamięć RAM.
    Weźmy chociażby to:
    static uint8_t displayBuffer[DISPLAY_HEIGHT/8][DISPLAY_WIDTH];
    - to już 512 bajtów.


    Zajętość RAM według kompilatora to 86%. Ten fragment kodu:

    static uint8_t displayBuffer[DISPLAY_HEIGHT/8][DISPLAY_WIDTH];

    jest aktywny tylko w przypadku graficznego trybu:

    #if defined GRAPHICMODE

    Ja używam wyłącznie tekstowego, czyli jest #define TEXTMODE
  • #4 19361398
    kamyczek
    Poziom 38  
    Sprawdzałeś czy wyświetlacz działa na arduino , zdarzały się serie które trzeba było poprawiać ważna jest poprawna inicjalizacja . Całość zasilasz z 3v3 . Dałeś rezystory podciągające sda i scl . Warto podłączyć analizator i podsłuchać czy coś tam się dzieje na I2C .
  • #5 19361464
    bipolunipol
    Poziom 19  
    kamyczek napisał:
    Sprawdzałeś czy wyświetlacz działa na arduino


    Tak, wszystko jest ok na Arduino

    kamyczek napisał:
    Dałeś rezystory podciągające sda i scl


    Tak, 4k7
  • #6 19362541
    kamyczek
    Poziom 38  
    Masz jakiś analizator np saleae to w wielu przyoadkach bardzo szybko rozwiewa wątpliwości . Najlepsze jest to że zdarza się że w dokumentacji piszą jedno w przykładach jest zupełnie co innego ....dlatego może warto podpiąć analizator pod arduino i po prostu zweryfikować to z dokumentacją . I2C jest moim zdaniem wolne szczególnie do jakiś animacji tu albo spi albo 8080 tyle że te małe cacka rzadko maja wyprowadzone wszystkie dostępne opcje .
  • #7 19362574
    BlueDraco
    Specjalista - Mikrokontrolery
    bipolunipol napisał:
    Zajętość RAM według kompilatora to 86%.


    ... czyli jakieś 220 B, a na stosie kilkudziesięciobajtowe wektory, który zapewne nie są uwzględnione w tym raporcie. Razem sporo ponad 256 B.
  • #8 19362634
    kamyczek
    Poziom 38  
    Odnoszę wrażenie że wybrałeś za małe " pudełko " na swoje zabawki . Jeśli chcesz taki mały mikrokontroler ja bym do tego wolał użyć asemblera , albo zmienił projekt i włożył tam większy mikrokontroler nawet starą poczciwą atmegę 8 , 48 czy 88
  • #9 19362635
    excray
    Poziom 41  
    Attiny414 to ma już On-Chip Debugger. Może warto z niego skorzystać?
  • #10 19362958
    kamyczek
    Poziom 38  
    excray napisał:
    Attiny414 to ma już On-Chip Debugger. Może warto z niego skorzystać?


    Na pewno warto . tylko pytanie jakie narzędzia ma nasz autor , jeśli ma coś co robi robotę to super , ale sporo wyjaśnić może również symulator w którym widać to samo tylko procek jest virtualny i można prześledzić krok po kroku co gdzie i dlaczego .
  • #11 19362972
    excray
    Poziom 41  
    kamyczek napisał:
    Na pewno warto . tylko pytanie jakie narzędzia ma nasz autor

    Szczerze mówiąc to sam jestem ciekaw czy jest na rynku jakikolwiek programator, który posiada opcję programowanie poprzez UPDI a nie wspiera debuggingu. To byłby niezły wybryk natury.
  • #12 19362989
    kamyczek
    Poziom 38  
    A taki wspiera ;)
    [url=]https://npk-stn.ru/2019/07/19/simple_programming_attiny414_via_updi/?lang=en[/url]
  • #13 19362995
    excray
    Poziom 41  
    To musisz autora tego cuda pytać a nie mnie :)

Podsumowanie tematu

Użytkownik pracuje nad projektem opartym na mikrokontrolerze ATTINY414 w środowisku Microchip Studio, który ma wyświetlać temperaturę z czujnika oraz średnią kroczącą na wyświetlaczu OLED 128x32 z kontrolerem SSD1306, komunikując się przez I2C. Problemy z działaniem programu mogą wynikać z ograniczonej pamięci RAM (256B) oraz zbyt dużego zapotrzebowania na zasoby, co potwierdzają wskazania kompilatora. Użytkownik potwierdził, że wyświetlacz działa poprawnie na Arduino, a także zastosował rezystory podciągające. Wskazówki dotyczące debugowania obejmują użycie analizatora I2C oraz rozważenie większego mikrokontrolera, takiego jak ATmega, dla lepszej wydajności. Zasugerowano również wykorzystanie On-Chip Debuggera ATTINY414 oraz symulatora do analizy działania kodu.
Podsumowanie wygenerowane przez model językowy.
REKLAMA