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



Teraz jest 26 gru 2024, o 22:59


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
 Tytuł: Enkoder Event
PostNapisane: 28 kwi 2013, o 20:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 maja 2012
Posty: 296
Lokalizacja: Chebzie Dolne
Zbananowany użytkownik

Pomógł: 6

Witam!
Mam problem ze zrozumieniem tego eventa. Prosił bym o łopatologiczne wytłumaczenie co w każdej linijce jest robione.
Co to za rejestr SREG, co do niego jest zapisywane?

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


Aha czytając coś o tym rejestrze znalazłem taki link ze wszystkimi rejestrami opisanymi dla Atmegi16 - myśle że się to przyda wielu urzytkownikom:
http://impuls.elektroda.eu/joomla/index.php?option=com_content&view=article&id=58&Itemid=135

_________________
Inspekcja TV kanalizacji
Programowanie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 kwi 2013, o 20:58 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27319
Lokalizacja: Szczecin
Pomógł: 1041

Ok w takim razie podam ci prościej tylko w narzeczu AVR GCC ;) - zobacz:

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


innymi słowy - pomyśl sobie, jeśli robisz jakieś obliczenia, które wykonywane są w co najmniej kilku cyklach zegarowych, a w tym czasie może dojść do przerwania, które operuje na jednej ze zmiennych, to mogłoby dojść do katastrofy. Tu masz taką zmienną ed, która jest zmieniana w przerwaniu, więc można byłoby to najprościej zapisać tak:

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


no ale tu jesteśmy ZAWSZE akurat pewni że w trakcie działają przerwania, co by jednak było gdyby te przerwania w różnych miejscach programu były włączane/wyłączane itp .....

to mogłoby się okazać, że dobra - wyłączyłeś je na czas obliczeń

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


ale jak teraz dasz sei() to na SIŁĘ włączasz znowu globalne - a może w tym czasie one nie były włączone ? i nie mają być bo tak wynika z kontekstu programu ? to co ? to będzie BUM!

i dlatego ja skorzystałem ze sprzętowego rejestru SREG, który przechowuje sprzętową flagę globalnego zezwolenia na przerwania, a zatem, najpierw sobie zapamiętuję wartość tego rejestru SREG w zmiennej sreg

sreg = SREG;

następnie zatrzymuję przerwania (nie ważne czy były włączone czy nie)

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


robię obliczenia

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


i teraz nie daję sei() tylko przywracam wartość sprzętowego rejestru SREG sprzed operacji

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


dzięki temu jeśli wcześniej była ustawiona flaga zezwolenia na globalne przerwania to znowu zostanie przywrócona - to samo zresztą robi rozkaz sei() ;) ale jeśli jej (tej flagi) nie było ustawionej - to nic się nie stanie a ja nie wymuszę niechcący takiego zezwolenia.

i DOKŁADNIE to samo robi konstrukcja:

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


mechanizm tego jest identyczny jak ja napisałem z tą zmienną sreg i rejestrem SREG

co jest w rejestrze SREG ? ;) no nie przesadzaj wystarczy spojrzeć do noty PDF - przecież jest opisany bit po bicie

_________________
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: 28 kwi 2013, o 21:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 maja 2012
Posty: 296
Lokalizacja: Chebzie Dolne
Zbananowany użytkownik

Pomógł: 6

Dzięki za rozjaśnienie sytuacji. Właśnie testuje program na enkoderze magnetycznym i działa rewelacyjnie. Na pierwotnym kodzie zdarzały się przeskoki a tutaj rewelacja.

_________________
Inspekcja TV kanalizacji
Programowanie



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ł: Brak zidentyfikowanych użytkowników i 3 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO