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

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

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

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.

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/