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



Teraz jest 10 mar 2025, o 09:34


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 17 lis 2016, o 20:12 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 547
Pomógł: 27

witam
Otóż próbowałem optymalizować kod Mirka z poradnika o ds3231 w sensie wyświetlać z pamięci flash zamiast ram i mam problem z jedną funkcją
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w tej linii mam warminga
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
który dotyczy tego że powinienem użyć funkcji lcd_int
tyle że ja nie chcę wyświetlać liczby tylko string .
jak to zrobić żeby wyświetlać zawartość bufora chat w pamięci flash.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2016, o 20:34 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

eeeeh a masz Bluebooka i zajrzeć to co ? ;)

przede wszystkim to chyba masz tam opisane do czego są funkcje z suffixem _P ? czy nie masz ? a więc

lcd_str_P() a nie lcd_str()

w takim przypadku.

A po drugie to ja nie wiem i pewnie ty chyba też sam nie wiesz - z tego co piszesz - co ty chcesz wyświetlić ... więc sam się zastanów i napisz.

1. czy chcesz wyświetlić string ?
2. czy chcesz wyświetlić liczbę ?

a jeśli chcesz wyświetlić string - no to pokaż jego źródło

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2016, o 20:55 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 547
Pomógł: 27

Próbowałem tak lcd_str_P() i tak lcd_str_P(PSTR()) ale wtedy wywala błąd
co do źródła nie wklejałem bo to Mirku z twojego bloga ale już wklejam.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to po zmianie do pamięci flash
a to orginalny kod
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

wyświetla kod ascii pierwszej litry dnia .


Próbuje wyświetlić string tyle że z pomięci flash.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2016, o 21:01 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

tonygryps napisał(a):
Próbowałem tak lcd_str_P() i tak lcd_str_P(PSTR()) ale wtedy wywala błąd

No bo widać, że zamiast postarać się dojść jak to działa to robisz próby jak saper ;) albo przeciąć ten kabelek albo inny ;) i BUM....

tonygryps napisał(a):
co do źródła nie wklejałem bo to Mirku z twojego bloga ale już wklejam.

ale mi chodzi właśnie o źródło stringa a nie o całe kody ;)

ok spróbuj pan tak ;)

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


funkcja lcd_str_P() wymaga wskaźnika na string w pamięci Flash - więc dodawanie tu pgm_read_ .... jest kiepskim pomysłem

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2016, o 21:15 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 547
Pomógł: 27

coś tam z wojska zostało (jakieś nawyki sapera ) a tak na poważnie próbuje to zrozumieć i najpierw staram się sam ile wiem i umiem podziałać ale nie zawsze wychodzi.
próbowałem tak jak Mirku piszesz i też jest warming
./DS3231/ds3231.c: In function 'show_date':
../DS3231/ds3231.c:75:2: warning: passing argument 1 of 'lcd_str_P' from incompatible pointer type [enabled by default]
lcd_str_P(&days[dt->dayofwek -1]);
wkleiłem warming z consoli.

działa ale jest warming,
a co do funkcji lcd_str_P to jak rozumie to wyświetla String z pamięci flash a jako argument trzeba jaj przekazać adres tej komórki to makro PSTR jest makrem pozyskiwania tego adresu czy się mylę ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2016, o 21:45 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

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


bo pewnie trzeba jeszcze jawne rzutowanie zrobić do typu wskaźnikowego o który chodzi ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2016, o 22:02 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 547
Pomógł: 27

Dziękuję tak działa tylko czemu tak, przecież jak jest w pamięci ram to nie trzeba rzutowania robić.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2016, o 22:55 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

a to jest tekst w pamięci RAM ???
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

No chyba żartujesz ? ;)

Poza tym co ma wspólnego rzutowanie z tym czy coś jest w pamięci RAM czy nie ? ;) .... podpowiedź - nie ma to NIC wspólnego. Rzutowanie służy do uzgodnień typów danych jeśli się różnią pomiędzy typem np argumentu funkcji a przekazywanej zmiennej.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2016, o 00:19 
Offline
Użytkownik

Dołączył(a): 20 kwi 2014
Posty: 51
Zbananowany użytkownik

Pomógł: 3

Dla niniejszego przykładu warto się zastanowić nad nieco innym sposobem rozwiązania, które sam z powodzeniem stosuję.
Chodzi o sposób przedstawiony w tym poradniku:
http://mirekk36.blogspot.com/2013/11/ta ... ogmem.html

Można zatem zrobić takie rozwiązanie:

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


Mając tak zdefiniowane napisy można zmodyfikować funkcję wyświetlającą do postaci:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Uwaga! w moim przykładzie zastosowałem inną bibliotekę do LCD, zatem są nieco inne funkcje do wyświetlania, ale całkiem podobne.
Taki sposób wydaje mi się nieco bardziej elegancki i zarazem jest to dobre ćwiczenie na wskaźniki i odczyt z pamięci FLASH.
Dodatkowo łatwo modyfikować same napisy, np w jednym miejscu wpisując "poniedzialek" zamiast "pon", a nie martwiąc się o resztę kodu.

Polecam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2016, o 09:07 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 547
Pomógł: 27

Dziękuje wszystkim wydaje mi się że zrozumiałem o co chodzi .
Męczy mnie tylko jedna rzecz.

Cytuj:
Poza tym co ma wspólnego rzutowanie z tym czy coś jest w pamięci RAM czy nie ? ;) .... podpowiedź - nie ma to NIC wspólnego. Rzutowanie służy do uzgodnień typów danych jeśli się różnią pomiędzy typem np argumentu funkcji a przekazywanej zmiennej.



Otóż chodzi mi o to że jeśli bufor był w pamięci ram
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to nie trzeba było robić rzutowania a jak jest w pamięci flash to trzeba je robić
przecież zapisanie tego tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

nie zmienia typu zmiennej tylko rodzaj pamięci wykorzystywanej
a funkcja lcd_str_P() jako argumentu oczekuje adresu komórki pamięci flash o typie char.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

więc skoro bufor we flashu jest typu char i funkcja oczekuje takiego typu to dlaczego trzeba to rzutować?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2016, o 09:45 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

jeszcze raz ci powtarzam - bo już pisałem wcześniej, że jeśli chodzi o rzutowanie to nie ma to NIC a NIC wspólnego czy jakaś zmienna jest w RAM czy we Flash - zrozum to proszę.

więc niestety coś kręcisz bo nie ważne czy masz zapis taki

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


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


to w każdym wypadku MUSISZ robić rzutowanie (char*)

gdybyś chciał uniknąć rzutowania to MUSIAŁBYŚ podawać jawnie indeks drugiego wymiaru tablicy bo dopiero wtedy kompilator ma pewność że chodzi ci o string, np
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


albo

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2016, o 11:48 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 547
Pomógł: 27

Dziękuje za wyłożenie mi tego ja tylko się zastanawiałem czemu tak jest bo w orginalnym kodzie nie było rzutowania
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i nie było warminga chociaż pewnie rzutowanie by nie przeszkodziło w niczym .

Cytuj:
więc niestety coś kręcisz bo nie ważne czy masz zapis taki

Składnia: [ Pobierz ] [ Ukryj ]
język c

lcd_str_P( (char*)&days[ dt->dayofwek -1 ] ); // days we FLASH

GeSHi


czy taki
Składnia: [ Pobierz ] [ Ukryj ]
język c

lcd_str( (char*)&days[ dt->dayofwek -1 ] ); // days w RAM

GeSHi


to w każdym wypadku MUSISZ robić rzutowanie (char*)

gdybyś chciał uniknąć rzutowania to MUSIAŁBYŚ podawać jawnie indeks drugiego wymiaru tablicy bo dopiero wtedy kompilator ma pewność że chodzi ci o string, np
Składnia: [ Pobierz ] [ Ukryj ]
język c

lcd_str_P( &days[ dt->dayofwek -1 ][0] ); // days we FLASH

wiec należy to rozumieć tak że w orginalnym kodzie kompilator "się domyślił o co chodziło " a po przeróbce już nie .
a tak naprawdę poprawnie to powinno w orginalnym kodzie to wyglądać 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: 18 lis 2016, o 12:05 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

tonygryps napisał(a):
wiec należy to rozumieć tak że w orginalnym kodzie kompilator "się domyślił o co chodziło " a po przeróbce już nie .

Nie, warning zawsze wystąpi - nie ma tak że kompilator "raz" się domyśla a "innym razem" się nie domyśla.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2016, o 14:21 
Offline
Użytkownik

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

mirekk36 napisał(a):
gdybyś chciał uniknąć rzutowania to MUSIAŁBYŚ podawać jawnie indeks drugiego wymiaru tablicy bo dopiero wtedy kompilator ma pewność że chodzi ci o string, np

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


albo

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


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

Wtedy też nie będzie warninga ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2016, o 15:23 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

andrews napisał(a):
A nie prościej byłoby zrobić tak:

Zauważ, że sam autor wątku napisał na początku że w moim oryginalnym kodzie było właśnie tak ;)

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


w jakimś poradniku i nie widział tam w poradniku warninga, natomiast u niego się pokazywał ;) stąd zaproponowałem "na szybko" rzutowanie ;) albo pokazałem jak zrobić to bez rzutowania .... w ostateczności ... czyli

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


a nie po to żeby mówić, że tak warto ;)


A na zakończenie powiem, że rzeczywiście dla zapisu

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


pojawia się warning, proszę bardzo:

Obrazek

i dlatego rzutowanie powoduje że możemy się go pozbyć:

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


podobnie jak ten zapis

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2016, o 15:53 
Offline
Użytkownik

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

mirekk36 napisał(a):
Zauważ, że sam autor wątku napisał na początku że w moim oryginalnym kodzie było właśnie tak ;)

lcd_str_P( days[ dt->dayofwek -1 ] ); // days we FLASH

Przepraszam, tego nie zauważyłem.

Odniosłem się tylko do tych dwóch cytatów:
mirekk36 napisał(a):
ok spróbuj pan tak ;)

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

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


bo pewnie trzeba jeszcze jawne rzutowanie zrobić do typu wskaźnikowego o który chodzi

Dlatego pomyślałem "po co tak komplikować?" i zaproponowałem prostszy sposób.

Ja rozumiem, że to wszystko z pośpiechu. Ja też nie doczytałem dokładnie pierwszego posta ;)



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: 16 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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