Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 kwi 2025, o 04:18


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
    Autor Wiadomość
    PostNapisane: 22 maja 2020, o 04:53 
    Offline
    Nowy

    Dołączył(a): 10 kwi 2014
    Posty: 24
    Pomógł: 0

    Witam.

    moja platforma testowa to ATtiny85, oled SSD1306 I2C 128x32
    proszę o pomoc w zrozumieniu nie działającego programu.

    używam biblioteki: Tiny4kOLED.h
    funkcja: oled.bitmap(0,0,szerokosc,4,znak_0); wyświetla mi znak który jest zapisany w tablicy. tutaj niema problemu.
    w programie używam takiego wpisu: oled.bitmap(0,0,szerokosc,4,matryca);
    problem pojawia się gdy linia z tym wpisem: //i=2; jest zakomentowana program wyświetla mi śmieci na ekranie.
    przy starcie pętli głównej pętli loop. i=0
    ciekawszy problem pojawia się gdy odkomentuję tą linię. program wyświetla mi normalnie 3 wzory czcionek.
    gdy przypisuje do 'i' wartosci stałe: i=0; i=1; i=2; wtedy bitmapy wyswietlają się ok.

    gdzie jest błąd. gdy jedna tablica przechowuje adresy innych tablic.
    przyznaje że wskaźniki są trudne. no może na tym przykładzie uda mi się to zrozumieć.

    z góry dzięki za pomoc. pozdrawiam.

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język basic4gl
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 maja 2020, o 05:50 
    Offline
    Użytkownik

    Dołączył(a): 07 lut 2015
    Posty: 157
    Pomógł: 2

    A gdyby tak:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 maja 2020, o 06:17 
    Offline
    Nowy

    Dołączył(a): 10 kwi 2014
    Posty: 24
    Pomógł: 0

    taki wpis nic mi nie zmienia --> const unsigned char *const wybierak[] PROGMEM = {znak_0,znak_1,znak_2};

    gdy daje taki wpis:
    oled.bitmap(0,0,szerokosc,wybierak[i]);

    kompilator wyświetla taki błąd:
    no matching function for call to 'SSD1306Device::bitmap(int, int, byte&, const unsigned char* const&)'

    a może być tak że ta funkcja oled.bitmap nie przyjmuje takich wskaźników?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 maja 2020, o 12:41 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    przemo.bundy napisał(a):
    unsigned char *const wybierak[] PROGMEM = {znak_0,znak_1,znak_2};

    Kolega Nef.ID ma rację. Jeśli chcesz zapisać swoją tablicę wskaźników w pamięci FLASH, to powinieneś do swojej definicji dodać const na początku.

    Natomiast przyczyną niedziałania programu jest to, że do odczytu wskaźnika z tablicy we FLASH należy użyć odpowiedniej funkcji (wybierak[i] tu nie zadziała), czyli coś w stylu:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Alternatywnie możesz umieścić tablicę wskaźników wybierak[] w pamięci RAM (wystarczy pominąć PROGMEM w definicji tablicy), i wtedy powinno działać matryca = wybierak[i];


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 maja 2020, o 09:26 
    Offline
    Nowy

    Dołączył(a): 10 kwi 2014
    Posty: 24
    Pomógł: 0

    dzięki "andrews". program działa teraz prawidłowo.
    musiałem tylko zmienić zmiena 'i' z 'byte' na 'unsigned int'
    może wiesz dlaczego tak się dzieje?
    skoro zmienna 'i' wskazuje na element w tablicy. a tych elementów jest 3. to zakres 'byte' wystarczy!

    mam jeszcze jedno pytanie:
    taka forma: const unsigned char *const wybierak[] PROGMEM = {znak_0,znak_1,znak_2};
    skoro tablica 'wybierak' przechowuje adresy innych tablic (adresy początków tych tablic)
    to na pewno te adresy muszą być dwubajtowe. więc dlaczego ta deklaracja 'unsigned char' działa prawidłowo?
    'char' to bajt. ?!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 maja 2020, o 09:45 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    przemo.bundy napisał(a):
    musiałem tylko zmienić zmiena 'i' z 'byte' na 'unsigned int'
    może wiesz dlaczego tak się dzieje?
    skoro zmienna 'i' wskazuje na element w tablicy. a tych elementów jest 3. to zakres 'byte' wystarczy!
    Bajt powinien wystarczyć. A dlaczego musiałeś zmienić, na czym polegał problem?

    przemo.bundy napisał(a):
    skoro tablica 'wybierak' przechowuje adresy innych tablic (adresy początków tych tablic)
    to na pewno te adresy muszą być dwubajtowe. więc dlaczego ta deklaracja 'unsigned char' działa prawidłowo?

    Działa, bo typ elementu tablicy to nie unsigned char tylko unsigned char *, czyli wskaźnik na unsigned char, a wszystkie wskaźniki (na dowolny typ) w 8-bitowych AVR są 16-bitowe.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 maja 2020, o 15:25 
    Offline
    Nowy

    Dołączył(a): 10 kwi 2014
    Posty: 24
    Pomógł: 0

    ok. program działa przy: byte i;
    standardowa pomroczność.
    Pozdrawiam i dzięki za pomoc!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 maja 2020, o 08:43 
    Offline
    Nowy

    Dołączył(a): 10 kwi 2014
    Posty: 24
    Pomógł: 0

    Jak można wydobyć adres tablicy. bo takie coś nie działa:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 maja 2020, o 08:58 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 maja 2020, o 13:39 
    Offline
    Nowy

    Dołączył(a): 10 kwi 2014
    Posty: 24
    Pomógł: 0

    chyba wiem czemu mi nie działa.
    chciałem tablice z ramu. modyfikować tak żeby wyświetlać jej zawartość na SSD1306.
    ale chyba ta funkcja: oled.bitmap(0,0,szerokosc,4,matryca); domyślnie korzysta z pamięci programu.
    dlatego to nie chce działać.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO