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



Teraz jest 15 kwi 2026, o 15:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 40 ]  Przejdź na stronę Poprzednia strona  1, 2
Autor Wiadomość
PostNapisane: 26 maja 2014, o 20:16 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Koledze rajmund96 nie działa, ale wie już, że to dlatego, że w linii: while( Tx_Head == Tx_Tail); ma zwiększoną już zmienną Tx_Head i funkcja obsługi przerwania ISR( USART0_UDRE_vect) działa inaczej. Można to tak napisać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2014, o 21:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

No nie wierze :). Ja się czuje jakbyśmy rozmawiali zupełnie innymi językami
mirekk36 napisał(a):
a ty wyjmujesz zmienną lokalną, która właśnie zabezpiecza przed takimi przypadkami .... robisz sobie globalną i to volatile (z tego co zrozumiałem to nawet jej w przerwaniu nie używasz) więc po co volatile ???? .....
Oczywiści że jej UŻYWAM w przerwani :) Mirku musiałeś mnię zle zrozumieć
mirekk36 napisał(a):
skoro ci nie działa wg twojej metody - no to znaczy że gdzieś popełniasz poważny błąd. Ja rozumiem że ty rozumiesz sens działania bufora cyklicznego - no ale z implementacją masz kłopot - to jedno ...
NO właśnie wcale nie mam problemu z implementacją po prostu chciałem skrócić kod, ale NIE ZAUWAŻYŁEM, że jesli zrobię to w ten sposób który przedstawiłem w pierwszym poście to właśnie mogą się dziać dziwne rzeczy co opisałem z kolei w innym poście.

Czy wam nigdy nie zdarzają się pomyłki ? Ja jestem tylko początkującym więc mam chyba prawo się pomylić... ale to nie znaczy że nie rozumiem jak działa bufor cykliczny
mirekk36 napisał(a):
a jest sens żebyś i to zrozumiał zamiast dawać to sobie "ot tak na wszelki wypadek w programie" .... bo taką drogą to będziesz jeszcze DŁUUUUGO chodził zanim zrozumiesz i zaimplementujesz bufor cykliczny

No i znowu się nie zrozumieliśmy, ja wcale tej dodatkowej zmiennej lokalnej nie dodaje na wszelki wypadek i uważam że na przykład w przerwaniu odbiorczym mogłoby się obejść bez niej....

O a kolega Krauser to mnie troszkę zdziwił tym kodem i to podwójnie

Po pierwsze jak na moje oko to nic to nie zmienia bo przerwanie i tak może wstąpić między zwiększeniem zmiennej Tx_Head a przypisaniem danych do bufora mam racje ?

Po drugie co mnie jeszcze bardziej zdziwiło to przecież zmienna Tx_Head zostaje w funkcji zwiększona aż o 2 ?? po co ??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2014, o 20:13 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

rajmund96 napisał(a):
Po pierwsze jak na moje oko to nic to nie zmienia bo przerwanie i tak może wstąpić między zwiększeniem zmiennej Tx_Head a przypisaniem danych do bufora mam racje ?

Jest tam taka pętla wstrzymująca program gdy bufor jest pełny:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

właśnie w tym czasie bufor zostaje opróżniony przez funkcję obsługi przerwania nadawczego i funkcja może iść dalej.

rajmund96 napisał(a):
Po drugie co mnie jeszcze bardziej zdziwiło to przecież zmienna Tx_Head zostaje w funkcji zwiększona aż o 2 ?? po co ??

Wcale nie zostaje zwiększona o 2. W pierwszym przypadku tylko porównywana jest wartość o 1 większa (Tx_Head zostaje takie jakie było). Dopiero w drugim przypadku gdzie jest znak "=" zmienna ta zostaje zmieniona.

W analizie swojego kodu musisz patrzeć i na funkcję send_data i na ISR( USART_UDRE_vect ). Jak w twojej funkcji send_data program zatrzymał się na:
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 jaki sposób przerwanie może wykonać kod w warunku:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i pobrać znak z bufora do rejestru UDR i zwiększyć Tx_Tail, aby warunek w pętli while stał się fałszywy ?


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2014, o 21:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

O i wszystko zrozumiałe :) Krauser dzięki za wytłumaczenie .

------------------------ [ Dodano po: 18 minutach ]

Krauser, ale przecież może się wydarzyć skrajny przypadek kiedy to powiedzmy zostanie przekazany pierwszy znak, następnie zostanie włączone przerwani, ale przerwanie zanim się wykona (uruchomi się jego obsługa) to jeszcze wcześniej funkcja wysyłająca kolejny znak dotrze o do tego momentu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
czyli nie zostanie przypisana żadna dana buforowi, a mimo to indeks głowy się zwiększy. Następnie zostaje uruchomione przerwanie i klops bo przecież indeks jest zwiększony o 2 po funkcja wykonała się raz w całości a raz do momętu do którego napisałem że się może wykonać i wtedy przerwanie nie z zeruje flagi przerwania po wysłaniu pierwszego znaku, a zrobi to dopiero po wysłaniu kolejnego, a nasz kolejny znak nie jest przypisany czyli jest to 0 dobrze rozumuje :) ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2014, o 07:35 
Offline
Użytkownik

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

Pomógł: 101

Istnieje takie niebezpieczeństwo. Ale powinno wystarczyć przestawienie instrukcji: najpierw przypisanie potem inkrementacja głowy. Ale znów w przypisaniu trzeba by wyliczać nową wartość głowy - i tu się przydaje zmienna tymczasowa.
Z drugiej strony, podobnież kompilator w toku optymalizacji może sobie instrukcje poprzestawiać. Może trzeba by te dwie instrukcje zamknąć w ATOMIC BLOCK? Trochę mało elegancko ale za to ze 100% pewnością.


Autor postu otrzymał pochwałę

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2014, o 17:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

xor wiem że najlepszym wyjściem jest zmienna lokalna :) tak tylko chcviałem się upewnić czy mam racje z tym tokiem mojego myślenia :D, a tak przy okazji co to jest ATOMIC BLOCK bo nie słyszałem o czymś takim ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2014, o 17:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

Zbiór makr wyłączających przerwania na czas wykonania kodu, który jest wewnątrz nich ;)

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2014, o 18:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

chodzi o coś takiego :
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: 28 maja 2014, o 18:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

Tak (tzn. do mniej-więcej czegoś takiego rozwija się ATOMIC_BLOCK), jeżeli nie lubisz się powtarzać to opakuj to w makro ;)

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


Autor postu otrzymał pochwałę

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 09:41 
Offline
Użytkownik

Dołączył(a): 27 lis 2012
Posty: 291
Pomógł: 6

Kiedyś napisałem na forum coś takiego topic2294.html



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: 40 ]  Przejdź na stronę Poprzednia strona  1, 2

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