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



Teraz jest 13 lis 2024, o 23:55


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 ]
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: 546
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: 27308
Lokalizacja: Szczecin
Pomógł: 1041

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: 27308
Lokalizacja: Szczecin
Pomógł: 1041

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 0 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