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



Teraz jest 28 mar 2024, o 09:52


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 24 cze 2019, o 23:15 
Offline
Użytkownik

Dołączył(a): 26 kwi 2012
Posty: 67
Lokalizacja: Drawski / Gorzów
Pomógł: 0

Hej,

Zdecydowałem się napisać ten post kiedy pszeszukawszy odpowiedzi w książce nt tablic nie poradziłem sobie z tym. Kiedy wywołam procedurę rozbij_liczbę z jakąś wartością to trzy pierwsze linijki poprawnie rozbiją liczbę na setki, dziesiątki i jednostki (wysyłałem na uarta te dane) ale już pozostała część nie odczyta z tablic już nic (cyfra1,cyfra2,cyfra3=0). Natomiast kiedy odkomentuję trzy linijki z przypisanymi wartościami d1, d2, d3 to z tablic wyciągane są poprawne dane i na wyświetlaczu pokazują się wartości które powinny. Typy danych moim zdaniem się zgadzają. Czego ja nie rozumiem?

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 cze 2019, o 23:57 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

d1, d2, d3 sa zainicjalizowane/zdefiniowane i sa stałymi dosłownymi gdzie kompilator podmienia w miejsce gdzie nazwa wystepuje d1, d2, d3 na to co zdefiniowałeś 1, 2, 3

Zmień w tablicy tab gdzie masz [d1][0]... na tab[1][0]

Efekt ten sam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2019, o 06:08 
Offline
Użytkownik

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

main.c 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.

Nieprawidłowo odczytujesz elementy tablicy. Twoje tablice zapisane są w pamięci FLASH, więc do ich odczytania należy użyć makr:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Oczywiście analogicznie należy zrobić w pozostałych przypadkach, czyli dla d2 i d3.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2019, o 06:22 
Offline
Moderator
Avatar użytkownika

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

Już miałem coś odpisywać ale kolega andrews mnie ubiegł ;)

main.c napisał(a):
Zdecydowałem się napisać ten post kiedy pszeszukawszy odpowiedzi w książce nt tablic nie poradziłem sobie z tym

Nadmienię, że oczywiście w Bluebooku jest o tym mowa i to niejednokrotnie ;)

_________________
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: 25 cze 2019, o 07:52 
Offline
Użytkownik

Dołączył(a): 26 kwi 2012
Posty: 67
Lokalizacja: Drawski / Gorzów
Pomógł: 0

Dziękuję, potwierdzam teraz sam dostrzegłem swój błąd. Szukałem w podstawach w zielonej, do niebieskiej nie dotarłem. Tak to jest jak się ma przerwę w programowaniu i niektóre oczywistości ulatują z głowy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2019, o 08:11 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
Tak to jest jak się ma przerwę w programowaniu i niektóre oczywistości ulatują z głowy.

Spokojnie, ja często i bez żadnej przerwy - zapomnę o pgm_read ... i później siedzę i dumam dlaczego dostaję śmieci ;) ... to się chyba każdemu zdarza

_________________
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: 25 cze 2019, o 08:57 
Offline
Użytkownik

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

A ja stosuję kwalifikator __flash zamiast atrybutu PROGMEM i nie muszę pamiętać o makrach pgm_read_xxx() ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2019, o 09:16 
Offline
Moderator
Avatar użytkownika

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

andrews napisał(a):
A ja stosuję kwalifikator __flash zamiast atrybutu PROGMEM i nie muszę pamiętać o makrach pgm_read_xxx() ;)

Nie wiem próbowałem z tym __flash, ale no nie mogię ;) jakieś obrzydzenie mnie bierze .. i zawsze na końcu działam z pgm_r/w ... lepiej wtedy widać co się dzieje w kodzie, chociaż jak widać częściej można się dziabnąć ...

_________________
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: 25 cze 2019, o 09:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

andrews napisał(a):
A ja stosuję kwalifikator __flash zamiast atrybutu PROGMEM i nie muszę pamiętać o makrach pgm_read_xxx() ;)

No właśnie :)
Myślę, że najwyższa pora by Mirek "zmienił doktrynę" w tej kwestii :)
Ma to dużą zaletę, szczególnie przy przenoszeniu kodu choćby na STM. Wystarczy kasować "__flash"
Z drugiej strony i tak pozostanie ten sam "problem" z eemem, więc może to jeszcze nie czas...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2019, o 10:03 
Offline
Użytkownik

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

mirekk36 napisał(a):
Nie wiem próbowałem z tym __flash, ale no nie mogię jakieś obrzydzenie mnie bierze .. i zawsze na końcu działam z pgm_r/w ... lepiej wtedy widać co się dzieje w kodzie

Podejrzewam, że to bardziej siła przyzwyczajenia.

Dla mnie __flash ma trzy podstawowe zalety:
  • wygoda - nie trzeba pamiętać o konieczności stosowania makr pgm_read_xxx() ani jakiego makra w danej sytuacji użyć pgm_read_byte? *_word? *_dword? (a dodatkowo czasami podczas odczytu za pomocą makr wymagane jest jawne rzutowanie),
  • czytelność kodu - łatwiej jest zanalizować
    day = week[3];
    niż
    day = (uint8_t)pgm_read_byte(&week[3]);
  • zachowanie kontroli typów - pgm_read_word() może czytać zarówno float, uint16_t lub int16_t, w przypadku użycia __flash kompilator dokładnie wie, z jakimi danymi ma do czynienia
No ale każdy robi, jak mu wygodniej, ważne żeby skutecznie ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2019, o 10:39 
Offline
Moderator
Avatar użytkownika

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

tak znam zalety ale też tak jak mówisz - siła przyzwyczajenia

mimo to:
andrews napisał(a):
czytelność kodu - łatwiej jest zanalizować
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

niż
day = (uint8_t)pgm_read_byte(&week[3]);


nie powiesz mi, że na pierwszy rzut oka widać gdzie jest "week[]" po takim zapisie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


czy w RAM czy we FLASH, trzeba sięgać do definicji żeby zobaczyć specyfikator, a jeśli kod jest zarąbiaście pokręcony - to już w ogóle jego analiza robi się ... tzn ok może przesadzam, ale jak widzę nawet taki biedny zapis

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


to czuję się jak w domu ;)

I na koniec - ponieważ ja wolę po 100-kroć ECLIPSA niż Atmel Studio, to "uzdatnianie" Eclipsa żeby łykał specyfikatory typu "__flash" ... i to uzdatnianie dla każdego projektu z osobna to już się robi koszmarek. Nie wspominając już o tym, że jak np napisałbym swojego LIB'sa z użyciem __flash - to z marszu, nie małej - ale ogromnej większości ludzi zacznie się przez to jeszcze większy problem - przez brak "uzdatnienia" eclipsa - nie wspominając o braku przyzwyczajenia i szybszej moim zdaniem analizy kodu ...

... właśnie również z tych powodów wciąż używam PROGMEM ;)

Zealota napisał(a):
Ma to dużą zaletę, szczególnie przy przenoszeniu kodu choćby na STM. Wystarczy kasować "__flash"
Z drugiej strony i tak pozostanie ten sam "problem" z eemem, więc może to jeszcze nie czas...

ileż tego kasowania ;) i jak fajnie odpowiedziałeś sobie sam w drugim zdaniu

Ale oczywiście Panowie - ja nie zapieram się nogami i rękami bo może w końcu jakoś się przemogę ;) złamię - zobaczę

_________________
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: 25 cze 2019, o 12:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

A ja sobie robię w takim przypadku krótkie makro zastępujące ten nieco przydługawy zapis i też mam wygodnie :) Każdy robi jak mu pasuje :)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2019, o 18:19 
Offline
Użytkownik

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

Na wstępie chciałbym prosić wszystkich, aby nie traktowali moich słów jako złośliwą krytykę, czy też wymądrzanie się, bo naprawdę nie o to mi chodzi.

@mirekk36
Myślę, że każdy potrafi znaleźć jakieś argumenty na poparcie swojej tezy, jak i kontrargumenty na obalenie argumentów strony (nazwijmy to) "inaczej myślącej" (aby nie użyć zaraz brzydkiego słowa "przeciwnej", bo to może zostać źle zrozumiane) ;)
mirekk36 napisał(a):
nie powiesz mi, że na pierwszy rzut oka widać gdzie jest "week[]" po takim zapisie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dla mnie profit z użycia __flash polega właśnie na tym, że nie muszę tego wiedzieć, ani się o to martwić. Ani o to, czy odczytać byte, czy word, czy dword. Po prostu stosuję zapis taki sam jak w przypadku odczytu z RAM i kompilator sam generuje odpowiedni kod, aby odczytać dane z właściwej pamięci. Gdyby ktoś usiłował z kolei wpisać tam jakąś wartość (co jest oczywiście niemożliwe, bo to dane tylko do odczytu), to zostanie "naprostowany" przez kompilator. W przypadku tworzenia funkcji z parametrem w postaci wskaźnika do pamięci FLASH, to niezależnie od tego czy użyjemy __flash czy PROGMEM, i tak musimy wiedzieć, gdzie są dane i uwzględnić to w definicji funkcji. Ewentualnie używając kwalifikatora __memx można stworzyć funkcję uniwersalną, która prawidłowo obsłuży wskaźnik zarówno do FLASH, jak i do RAM.

mirekk36 napisał(a):
I na koniec - ponieważ ja wolę po 100-kroć ECLIPSA niż Atmel Studio, to "uzdatnianie" Eclipsa żeby łykał specyfikatory typu "__flash" ... i to uzdatnianie dla każdego projektu z osobna to już się robi koszmarek.

Odpowiem może podobnie jak Ty: ileż tego "uzdatniania"? ;) Nowych projektów nie tworzy się raczej kilkadziesiąt na dobę... ;)

@SylwekK
SylwekK napisał(a):
A ja sobie robię w takim przypadku krótkie makro zastępujące ten nieco przydługawy zapis i też mam wygodnie Każdy robi jak mu pasuje
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Oczywiście, że makrami można sobie ułatwić życie i dobrze, że to potrafisz zrobić. Twoje makro odczytuje jednak tylko element z jakiejś tablicy. Gdybyś teraz chciał np. odczytać element jakiejś struktury zapisanej w pamięci FLASH, musiałbyś utworzyć inne makro. Gdyby ta struktura była elementem tablicy struktur zapisanej we FLASH, trzeba utworzyć kolejne makro itd. Użycie __flash zamiast PROGMEM zupełnie eliminuje konieczność użycia makr pgm_read_xxx(), bez konieczności definiowania kolejnych makr. Używasz po prostu zapisu, jak przy odczycie "zwykłej" zmiennej z RAM i to wszystko. I wcale nie chodzi mi o to, żeby skrytykować Twój pomysł (sposób) ani żebyś na siłę przyjął mój punkt widzenia. Chciałem tylko, żebyś dobrze zrozumiał różnicę.

Właściwie chciałem tylko pokazać, jak ludzie mogą różnie interpretować i postrzegać te same fakty. Przykładowo to, co dla mnie jest bardziej czytelne, dla kogoś innego wcale takie być nie musi (i odwrotnie). Można by tak godzinami się spierać, rozpatrując różne aspekty użycia obu metod, ale to nie ma większego sensu. Nie mówimy tutaj przecież o tym, że jedna z metod jest błędna, a druga prawidłowa. Obie metody są poprawne i dają praktycznie ten sam efekt, więc każdy sobie może wybrać dowolną metodę, która mu lepiej pasuje. Oczywiście pod warunkiem, że nie pracuje w zespole. Praca zespołowa niestety siłą rzeczy wymusza stosowanie się do pewnych reguł.

I tak jak wcześniej już chyba pisałem, nie chcę tutaj agitować za przejściem na __flash. Chcę tylko pokazać ewentualne korzyści z tego płynące i przekonać, że naprawdę "nie taki diabeł straszny". ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2019, o 20:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Akurat moim celem biło pokazanie tylko innego rozwiązania. Póki co nie było mi potrzebne to o czym wspomniałeś (w związku ze strukturami). Bardzo chętnie poznam ta metodę _flash. Mógłbyś naświetlić temat i jak to sobie zdefiniować?

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2019, o 21:14 
Offline
Moderator
Avatar użytkownika

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

andrews napisał(a):
Na wstępie chciałbym prosić wszystkich, aby nie traktowali moich słów jako złośliwą krytykę, czy też wymądrzanie się, bo naprawdę nie o to mi chodzi.

@mirekk36
Myślę, że każdy potrafi znaleźć jakieś argumenty na poparcie swojej tezy, jak i kontrargumenty na obalenie argumentów strony (nazwijmy to) "inaczej myślącej"


Jeszcze raz powtórzę, bo może mnie troszkę źle zrozumiałeś:

- po pierwsze wcale nie jestem przeciwny używaniu __flash
- po drugie sam troszkę wspomniałeś o przyzwyczajeniu i wręcz to poparłem
- po trzecie no może kilka argumentów mi się kręci w głowie przeciwko __flash - jak opisałem ale to tylko moje widzi-misię

uważam, że zdecydowanie warto się zapoznawać z tą metodą i nie patrzeć na moje prywatne przyzwyczajenia

i dlatego uważam za bardzo cenne twoje wskazówki w zakresie __flash ;) a szczególnie jestem za tym aby to propagować - może wtedy i mi się coś w środku zmieni ... tyle, że jeśli pozwolisz, na razie po prostu pozostanę przy swoim zdaniu i to tylko tyle, a nie żebym moimi tekstami miał komuś broń Boże obrzydzać używanie _flash'a

andrews napisał(a):
I tak jak wcześniej już chyba pisałem, nie chcę tutaj agitować za przejściem na __flash.

a ja uważam, że nawet jeśli chcesz agitować - to to jest słuszna droga ;) ... i ja nie mam absolutnie nic przeciwko temu - bo sam wiem, że czasem taki upór przed nowościami nie ma najmniejszego sensu. Sam zwykle przekonuję ludzi do nowszych wersji różnego softu (chociażby windowsa) i innych rzeczy i tym bardziej mi głupio, że się jeszcze na tego __flasha nie przeflancowałem ...

mam nadzieję zatem, że to wyjaśni już do końca moje zdanie ;) ... jak to mawiał klasyk "jestem za a nawet przeciw" ;)

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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