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



Teraz jest 25 maja 2020, o 14:32


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: 23
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 ]
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: 67
Pomógł: 1

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: 23
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: 535
Pomógł: 135

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łę

_________________
Miksowanie kodu C i ASM przy użyciu GCC



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

Dołączył(a): 10 kwi 2014
Posty: 23
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: 535
Pomógł: 135

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.

_________________
Miksowanie kodu C i ASM przy użyciu GCC



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

Dołączył(a): 10 kwi 2014
Posty: 23
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: wczoraj, o 08:43 
Offline
Nowy

Dołączył(a): 10 kwi 2014
Posty: 23
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: wczoraj, o 08:58 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 535
Pomógł: 135

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

_________________
Miksowanie kodu C i ASM przy użyciu GCC



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

Dołączył(a): 10 kwi 2014
Posty: 23
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 1 gość


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