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 w 2025? 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 12 kwi 2025, o 12:14


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
    Autor Wiadomość
    PostNapisane: 12 wrz 2021, o 11:08 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2021
    Posty: 93
    Pomógł: 0

    Witam. Doszedłem to momentu w BB, gdzie pokazane jest, jak zapisać tablice w pamieci FLASH, by nie zajmowała tyle pamięci RAM. Zainkludowałem biblioteke pgmspace, dodalem słówko PROGMEM i do odczytu korzystam z pgm_read_byte. Kompilator wywala błąd jednak:
    error: variable 'cyfry' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

    Więc dodałem specyfikator CONST i teraz działa. W BB nie wspomniano o tym, więc zastanawiam się czy czegoś źle nie zrobiłem i czy to tak powinno być.

    Kod pliku d_led.c

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    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: 12 wrz 2021, o 11:25 
    Offline
    Użytkownik

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

    Zrobiłeś dobrze Bluebook był pisany kiedy zamiast atmelowskiego tulczaina był win avr a tam nie trzeba było dopisywać specyfikatora const dopiero później atmel to uporządkował i wypuścił tulczain w którym trzeba stosować ten specyfikator (const) i słusznie zobacz co on znaczy sam się przekonasz



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 wrz 2021, o 12:36 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2021
    Posty: 93
    Pomógł: 0

    Bluebook o tym wspomina, bo pamiętam to, jednak jeszcze ciężko skojarzyć wszystkie fakty, gdy się stykam z czymś 1x. I może jeszcze jedno pytanie trochę poza tematem. W BB jest zdefiniowana tablica uint8 i w niej cyfry. Gdy jednak do tej tablicy dodam kropkę DP która jest u mnie na pd7 to zapis wtedy jest 1<<7. Ale wtedy mam warning że używam nieodpowiedniego typu, dopiero gdy zrobię uint16 to jest ok. Średnio to rozumiem, przecież nie wychodzę poza 1 bajt,jestem na samym końcu bajtu a typ muszę zwiększyć hmmm. Ktoś rozjaśni czego tu nie kumam?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 wrz 2021, o 13:13 
    Offline
    Moderator
    Avatar użytkownika

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

    krawi92 napisał(a):
    Ktoś rozjaśni czego tu nie kumam?


    Nie rozumiesz tego, że w AVR GCC jest domyślna promocja do typu INT. A to oznacza, że jeśli nie zastosujemy jawnego rzutowania np

    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łaśnie spotkasz się z warningiem.

    Wszystkie stałe zdefiniowane za pomocą #define, albo stałe dosłowne czyli właśnie (1<<7) kompilator rzutuje sobie domyślnie ale niejawnie do typu int (2 bajty) więc jeśli robisz operację

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


    bo zmienna a jest 8-bitowa a obliczone wyrażenie w nawiasach jest 16-bitowe (int) więc kompilator ostrzega cię, że utracisz starszy bajt

    wystarczy że zrobisz jawne rzutowanie

    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: 12 wrz 2021, o 13:32 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2021
    Posty: 93
    Pomógł: 0

    Nie wiem jak to zastosować teraz w kodzie. Mam to zrobić w #define gdzie definiuje co to jest SEG_DP czy w zawartości tablicy?
    No i nie wiem czemu wyrażenie 1<<7 jest 16 bitowe. A przy wyrażeniu 1<<6 nie krzyczy nic.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 wrz 2021, o 14:54 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2021
    Posty: 93
    Pomógł: 0

    Już wiem, w którym miejscu zrobić to rzutowanie
    (uint8_t)~(SEG_DP), // kropka
    Ale nadal nie mogę zrozumieć, dlaczego akurat przy tej operacji bitowej wywala warning. :/



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 wrz 2021, o 21:34 
    Offline
    Moderator
    Avatar użytkownika

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

    krawi92 napisał(a):
    No i nie wiem czemu wyrażenie 1<<7 jest 16 bitowe. A przy wyrażeniu 1<<6 nie krzyczy nic.

    Pisałem tobie, że KAŻDE takie wyrażenie jest 16 bitowe a ty mieszasz sobie sam w głowie pisząc o krzyczeniu.

    Przy ~(1<<7) jest taki efekt, bo ustawiając najstarszy bit zmienia się znak, przez co w zapisie binarnym muszą zmienić się również bity starszego bajtu skoro liczba ma być ujemna w typie int. Przy ~(1<<6) wyrażenie 8-bitowe nie staje się liczbą ujemną a starszy bajt jest = 0.

    _________________
    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: 13 wrz 2021, o 11:58 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2021
    Posty: 93
    Pomógł: 0

    Głupio aż, ale nie rozumiem tego. Rozpisuje sobie na kartce binarnie te liczby, neguje, sumuje te wagi i nie wiem jak to jest ze wychodzę poza zakres 8bit. Co muszę doczytać, żeby to zrozumieć?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 wrz 2021, o 17:21 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 lis 2019
    Posty: 145
    Pomógł: 37

    krawi92 napisał(a):
    Co muszę doczytać, żeby to zrozumieć?

    O reprezentacji liczb ujemnych a więc o tzw. kodzie uzupełnień do dwóch.

    1. Wyrażenie (1<<7) to binarnie 0b0000000010000000, dziesiętnie 128.
    2. Po zaaplikowaniu negacji bitowej 0b1111111101111111 dziesiętnie -129.
    3. Po obcięciu starszego bajta: 01111111 dziesiętnie 127.
    Obcięcie spowodowało utratę bitu znaku - kompilator emituje ostrzeżenie.

    1. Wyrażenie (1<<6) to binarnie 0b0000000001000000 dziesiętnie 64
    2. Po negacji bitowej 1111111110111111 dziesiętnie -65
    3. Po obcięciu starszego bajta 0b10111111, dziesiętnie -65
    Nie nastąpiła utrata znaku - brak ostrzeżenia.

    Domyślnie stałe takie jak 1 są interpretowane jako int a więc jako liczba ze znakiem. Można wymusić by stała była traktowana jako liczba bez znaku, i uniknąć nieprzyjemności związanych z bitem znaku, dopisując do stałej u lub U czyli np. 1U. A więc w Twoim przypadku pozbędziesz się ostrzeżenia definiując segment jako
    #define SEG_DP (1U<<7)

    _________________
    Think for yourself and question authority.



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

    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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO