ATNEL tech-forum https://forum.atnel.pl/ |
|
multipleksowanie wyswietlacza LED - zapis do FLASH https://forum.atnel.pl/topic23915.html |
Strona 1 z 1 |
Autor: | krawi92 [ 12 wrz 2021, o 11:08 ] |
Tytuł: | multipleksowanie wyswietlacza LED - zapis do FLASH |
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 |
Autor: | tonygryps [ 12 wrz 2021, o 11:25 ] |
Tytuł: | Re: multipleksowanie wyswietlacza LED - zapis do FLASH |
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 |
Autor: | krawi92 [ 12 wrz 2021, o 12:36 ] |
Tytuł: | Re: multipleksowanie wyswietlacza LED - zapis do FLASH |
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? |
Autor: | mirekk36 [ 12 wrz 2021, o 13:13 ] |
Tytuł: | Re: multipleksowanie wyswietlacza LED - zapis do FLASH |
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 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ę 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 |
Autor: | krawi92 [ 12 wrz 2021, o 13:32 ] |
Tytuł: | Re: multipleksowanie wyswietlacza LED - zapis do FLASH |
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. |
Autor: | krawi92 [ 12 wrz 2021, o 14:54 ] |
Tytuł: | Re: multipleksowanie wyswietlacza LED - zapis do FLASH |
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. :/ |
Autor: | mirekk36 [ 12 wrz 2021, o 21:34 ] |
Tytuł: | Re: multipleksowanie wyswietlacza LED - zapis do FLASH |
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. |
Autor: | krawi92 [ 13 wrz 2021, o 11:58 ] |
Tytuł: | Re: multipleksowanie wyswietlacza LED - zapis do FLASH |
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ć? |
Autor: | fofex [ 13 wrz 2021, o 17:21 ] |
Tytuł: | Re: multipleksowanie wyswietlacza LED - zapis do FLASH |
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) |
Strona 1 z 1 | Strefa czasowa: UTC + 1 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |