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



Teraz jest 14 lis 2024, o 16:50


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 27 lut 2017, o 18:55 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

Witam,
przeglądam funkcje do obsługi LCD w BB i nie mogę znaleźć odpowiedzi na następujące pytanie.

na str. 230 i 231 (nowe wydanie w twardej oprawie) są omówione funkcje:

a) void lcd_str_P(char * str)
b) void lcd_str_E(char * str)

wewnątrz funkcji z podpunktu "a" mamy odczyt z FLASH -> pgm_read_byte( str++)
wewnątrz funkcji z podpunktu "b" mamy odczyt z EEPROM -> eeprom_read_bytre( (uint8_t *)str++)

Nazwy funkcji pgm_read_byte oraz eeprom_read_bytre sugerują że i tu i tu odczytujemy byte dlatego nie rozumiem, dlaczego w funkcji z podpunktu "b" jest zrobione rzutowanie na wskaźnik na uint8_t a w funkcji z podpunktu "a" go nie ma?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2017, o 19:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 08 lut 2017
Posty: 48
Pomógł: 4

W kwestii działania, to nie zmienia to niczego.Nie musisz wcale dokonywać rzutowania żeby działało.
A dlaczego tak Mirek napisał to pewności nie mam, ale na stronie
http://www.nongnu.org/avr-libc/user-manual
są opisy obu funkcji(makr) pgm_read_byte i eeprom_read_byte i zgodnie co napisali to budowa ich jest następująca:

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


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


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2017, o 19:12 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

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


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


Jakoś nie do końca są dla mnie jasne parametry tych funkcji :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2017, o 19:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 08 lut 2017
Posty: 48
Pomógł: 4

Powiem jak mi się wydaje.
Makro powinno wyglądać tak(źle wkleiłem poprzednio)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Makro ..._near odwołuje się do funkcji _LPM(ang. Load Program Memory)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zatem w obu przypadkach(pgm i eeprom) przekazujemy do funkcji adres bajtu, z tym ,że do EEPROM przez wskaźnik a do FLASH przez referencję.
Może się mylę to niech ktoś mnie poprawi :D

Jesteśmy przecież tu po to żeby się uczyć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2017, o 19:45 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

michaeleagle napisał(a):

Zatem w obu przypadkach(pgm i eeprom) przekazujemy do funkcji adres bajtu, z tym ,że do EEPROM przez wskaźnik a do FLASH przez referencję.


A gdzie jest informacja że przez referencje? :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2017, o 19:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 08 lut 2017
Posty: 48
Pomógł: 4

Tak z dedukcji :P
Bo w przypadku EEPROM jest jak byk, że wskaźnik, a w FLASH napisali tylko address, więc skoro nie wartość, nie wskaźnik to pozostaje referencja



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2017, o 20:27 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

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


address_short jest typu uint16_t więc nie powinno być rzutowania?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2017, o 21:45 
Offline
Moderator
Avatar użytkownika

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

Jarecki napisał(a):
na str. 230 i 231 (nowe wydanie w twardej oprawie) są omówione funkcje:

czy kolega zagląda do kodów na dołączonym nośniku do książki ? DVD albo Pendrive ? wydaje mi się, że nie za bardzo ... w najnowszej wersji książki musiałem bowiem przeportować kod ze staruszka WinAVR na nowy Atmel Toolchain - jest sporo zmian - szczególnie związanych z dostępem do danych pamięci FLASH - i opisałem to nawet na blogu - na którego kolega też chyba nie zagląda

http://mirekk36.blogspot.com/2012/08/ec ... zytaj.html

dlatego bardzo uprzejmie proszę:

1. zajrzyj do tego artykułu na blogu
2. ale przede wszystkim zajrzyj do kodu na nośniku dołączonym do KSIĄŻKI bo tam MUSI to działać bez warningów - tymczasem 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.


tzn wywołanie tej funkcji z podaniem wskaźnika do pamięci Flash gdzie jest tekst do wyświetlenia od razu dałoby ci warninga - zrób że próbę, sprawdź to sobie na żywym organiźmie czyli na procku i LCD - przecież to NAJLEPSZA szkoła

a później jak zajrzysz do kodu na nośniku dołączonym do książki to zobaczysz, że nagłówek tej funkcji 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.


czyli masz widoczną różnicę ...

zaś co się tyczy pytania:

Jarecki napisał(a):
Nazwy funkcji pgm_read_byte oraz eeprom_read_bytre sugerują że i tu i tu odczytujemy byte

a zaglądałeś do ŚRODKA tych funkcji ? znowu wydaje mi się, że nie - jeśli zaś tak to powiedz mi czego nie rozumiesz ze środka takiej funkcji zamiast myśleć co sugeruje pgm_read_byte .... w środku masz tak:

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


zmienna znak jest typu char, zapisywana jest do niej zmienna typu uint8_t - w czym widzisz problem? Jedna i druga jest jednobajtowa, jedna i druga mówi i liczbie bez znaku - więc w takim przypadku kompilator nie będzie ci krzyczał warningiem ponieważ może to załatwić niejawnym rzutowaniem i już.

Oczywiście jeśli ty zrobisz również to rzutowanie to kompilator wcale się nie obrazi ;)

Podsumowując - w książce WYJAŚNIAM jak działa ogólnie mechanizm - zaś w kodach pokazuję już jak to wygląda w szczegółach i tak żeby działało bez warningów


Autor postu otrzymał pochwałę

_________________
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: 27 lut 2017, o 22:10 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

mirekk36 napisał(a):
a zaglądałeś do ŚRODKA tych funkcji ? znowu wydaje mi się, że nie - jeśli zaś tak to powiedz mi czego nie rozumiesz ze środka takiej funkcji zamiast myśleć co sugeruje pgm_read_byte .... w środku masz tak:

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


zmienna znak jest typu char, zapisywana jest do niej zmienna typu uint8_t - w czym widzisz problem?


Wydaje mi się, że pgm_read_byte(str++) jako argument spodziewa się wskaźnika na uint16_t a dostaje na uint8_t, zgadza się? Pewnie kompilator zrobi niejawne rzutowanie ale pytam bo chciałbym wiedzieć na 100% jak jest :)
Bardzo dziękuję za odpowiedź Panie Mirku, na bloga zaglądam często ale gdzieś mi to umknęło :)

Mam kody z jeszcze cieplutkich pedrive-ów, i w tych fragmentach:

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


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


nie jasne jest dla mnie to rzutowanie w funkcji eeprom_read_byte....
Może nie rozumiem dlatego, że nie ma jasno napisanego czego spodziewają się te funkcje. Zresztą to:

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


Wygląda jak makro a nie funkcja :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2017, o 22:26 
Offline
Moderator
Avatar użytkownika

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

Jarecki napisał(a):
Wydaje mi się, że pgm_read_byte(str++) jako argument spodziewa się wskaźnika na uint16_t a dostaje na uint8_t, zgadza się?

pgm_read_byte() nie spodziewa się ŻADNEGO wskaźnika uint16_t, tu kolega coś bardzo mocno myli tzn nie rozumie do końca co oznaczają TYPY wskaźników a czym są same wskaźniki (bo rzeczywiście wskaźnik jest zawsze adresem 16-bitowym, co nie ma NIC wspólnego z samym typem wskaźnika)

pgm_read_byte() zwraca wartość short int, a jako argumentu oczekuje wskaźnika do pamięci FLASH

------------------------ [ Dodano po: 4 minutach ]

Jarecki napisał(a):
nie jasne jest dla mnie to rzutowanie w funkcji eeprom_read_byte....
Może nie rozumiem dlatego, że nie ma jasno napisanego czego spodziewają się te funkcje. Zresztą to:

No to powiedz mi jak to można sprawdzić - jeśli nie wiesz czego się spodziewa taka funkcja czy inna?

no co za problem spróbować skompilować tę linię BEZ jawnego rzutowania ? - jeśli wywali ci warninga to zaraz się zorientujesz - no a po drugie - pomyśl - WYSTARCZY w googla wpisać nazwę tej funkcji

eeprom_read_byte

nie piszę tego żeby odsyłać cię do googla z problemem - tylko żebyś zrozumiał - że WARTO zaglądać do DOKUMENTACJI AVR GCC w takich wypadkach zamiast się dręczyć i zastanawiać czego się spodziewa taka funkcja - skoro gdy zajrzysz do dokumentacji no to masz jak byk napisane ;)

a pierwszy link w googlu od razu wskaże ci na opis tych komend bo one są akurat specyficzne TYLKO dla AVR GCC a nie innych odmian GDD

no więc weź zajrzyj do pierwszego linka

http://www.nongnu.org/avr-libc/user-man ... eprom.html

i powiedz mi - po co tyle się zastanawiać skoro masz to podane WPROST ;) i to w jednej z pierwszych linijek


Autor postu otrzymał pochwałę

_________________
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: 27 lut 2017, o 22:50 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

Teraz się wszystko wyjaśniło, bardzo dziękuję Panie Mirku :) błędnie szukałem odpowiedzi na moje pytanie w plikach nagłówkowych pgmspace.h
Teraz mogę spokojnie czytać dalej :)
Pozdrawiam :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO