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



Teraz jest 5 sie 2026, o 22:02


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 26 sie 2014, o 00:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

Mam pytanie do kodu z książki, chodzi mi o miejsce gdzie po raz pierwszy opisywany jest bufor cykliczny.
W definicji preprocesora Mirek pozwala ustawić wielkość bufora (akurat jest tam 32 ale rozumiem że równie wygodnie powinno dać się wpisać co innego?[także różnego od 2^n])

Niepokoją mnie liniki oznaczone jako 11 i 6. Jest tam nałożone modulo na wartość wpisywaną do head lub tail aby stworzyć cykliczność bufora.

problem w tym że zamiast takiego zapisu (wydaje mi się że tak spełniało by oczekiwania , może coś pokręciłem?):
(...)=(...) % UART_RX_BUF_SIZE

jest taki z maską:
(...)=(...)&UART_RX_BUF_MASK

z definicji preprocesora: UART_RX_BUF_MASK = UART_RX_BUF_SIZE - 1 = 31 = 0b11111
0b11111 akurat w tym wypadku będzie działał prawidłowo ale dla innej wielkości bufora np 9, UART_RX_BUF_MASK zostanie obliczone jako 0b1000 i przy próbie wpisania 9 otrzymamy 8 a nie zero.

Gdzie jest mój błąd w rozumowaniu?
EDIT: teraz widze że Mirek zaznaczył że musi być to potęga dwójki, ale po co to tak ograniczać?

Drugie pytanie: Co trzeba jeszcze zrobić aby odblokować przerwanie USART_RXC oprócz dodania makra sei();?

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sie 2014, o 09:57 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Wojtek001 napisał(a):
musi być to potęga dwójki, ale po co to tak ograniczać?

Jak już zauważyłeś, dla potęg dwójki maskowanie ma taki sam efekt jak dzielenie modulo. Jednak dzielenie jest znacznie kosztowniejsze pod względem zajętości mocy obliczeniowej i pamięci niż maskowanie. Tak więc ten prosty trik pozwala na przyspieszenie i zmniejszenie programu

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sie 2014, o 14:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Odniosę się jedynie do drugiego pytania (pierwsze zostało już wyjaśnione).
Do pełnego odblokowania przerwania od odbioru USART trzeba dodatkowo ustawić odpowiedni bit w rejestrze UCSRB oraz włączyć układ odbiorczy jako samo źródło przerwania:

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

W przypadku bardziej rozbudowanych uC posiadających dwa układy USART symboliczne nazwy mogą się różnić.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO