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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 cze 2025, o 09:45


    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: 1085
    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: 1085
    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: 1085
    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: 1085
    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: 27406
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 1085
    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: 27406
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 1085
    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 4 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