ATNEL tech-forum
https://forum.atnel.pl/

zrozumienie nie działania tego programu...
https://forum.atnel.pl/topic23148.html
Strona 1 z 1

Autor:  przemo.bundy [ 22 maja 2020, o 04:53 ]
Tytuł:  zrozumienie nie działania tego programu...

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 ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  Nef.ID [ 22 maja 2020, o 05:50 ]
Tytuł:  Re: zrozumienie nie działania tego programu...

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.

Autor:  przemo.bundy [ 22 maja 2020, o 06:17 ]
Tytuł:  Re: zrozumienie nie działania tego programu...

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?

Autor:  andrews [ 22 maja 2020, o 12:41 ]
Tytuł:  Re: zrozumienie nie działania tego programu...

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:  przemo.bundy [ 23 maja 2020, o 09:26 ]
Tytuł:  Re: zrozumienie nie działania tego programu...

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. ?!

Autor:  andrews [ 23 maja 2020, o 09:45 ]
Tytuł:  Re: zrozumienie nie działania tego programu...

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.

Autor:  przemo.bundy [ 23 maja 2020, o 15:25 ]
Tytuł:  Re: zrozumienie nie działania tego programu...

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

Autor:  przemo.bundy [ 24 maja 2020, o 08:43 ]
Tytuł:  Re: zrozumienie nie działania tego programu...

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.

Autor:  andrews [ 24 maja 2020, o 08:58 ]
Tytuł:  Re: zrozumienie nie działania tego programu...

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

Autor:  przemo.bundy [ 24 maja 2020, o 13:39 ]
Tytuł:  Re: zrozumienie nie działania tego programu...

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ć.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/