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



Teraz jest 29 lis 2025, o 23:33


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 9 maja 2014, o 11:40 
Offline
Nowy

Dołączył(a): 03 paź 2012
Posty: 14
Pomógł: 0

Przeglądając w internecie natknąłem się na parę instrukcji gdzie wynikałoby że przy zapisie i odczycie konieczne jest wyłączenie przerwań np:

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


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


Czy przy korzystaniu z przerwań konieczne jest używanie cli() sei() przy zapisie lub odczycie z eepromu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2014, o 19:55 
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

Wyłączenie ewentualnych przerwań jest konieczne w obu przypadkach. Dla odczytu ponieważ jeśli w przerwaniu byłby również odczyt to zmieni adres, a dla zapisu z tego samego powodu oraz dlatego, że sekwencja zapisu to modyfikacja 2 bitów, ale są to oddzielne rozkazy i ten drugi musi być wykonany w ciągu 4 cykli. Spóźnienie skutkuje brakiem zapisu.

Nie używałbym tutaj sekwencji cli sei, bo po takiej akcji przerwania zostaną one odblokowane, a nie wiadomo jak było. Lepiej umieścić to w bloku:
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łę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 maja 2014, o 12:38 
Offline
Nowy

Dołączył(a): 03 paź 2012
Posty: 14
Pomógł: 0

A jeśli w przerwaniu nie korzystam z eeproma tylko w głównym programie to też trzeba zatrzymywać? Szukałem wszędzie i jednoznacznej odpowiedzi nie mogę znaleźć a nie daje mi to spokoju.



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

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

No właśnie chodzi o to by przerwanie nie wystąpiło w czasie zapisu do eeprom. Operacja to nie trwa jeden cykl, tylko 4 cykle i jeśli przerwanie wystąpi w trakcie to będzie źle. Dlatego na ten czas trzeba wyłączyć przerwania.
Jest to opisane w nocie i podany jest sposób polegający kopiowaniu aktualnej zawartości rejestru SREG do zmiennej a następnie przywróceniu zawartości SREG ze kopii.
Dla uproszczania istnieje makro, którego przykład użycia opisał Krauser.

Jeśli pisałbyś do eeprom w przerwaniu to ten proces nigdy nie zostanie przerwany (chyba że zezwolisz na przerwanie w przerwaniu bo jest taka możliwość).
Ale jakoś nie bardzo może mi przyjść do głowy sytuacja w której wskazane by było pisanie do eeprom w przerwaniu.
Choć oczywiście można to zrobić np. przez cykliczne sprawdzanie jakiejś flagi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 maja 2014, o 13:41 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 10 maja 2014
Posty: 24
Pomógł: 1

cli sei nie powinno sie używać w programie , oprócz tego zeby aby raz włączyc przerwanie na poczatku programu i tyle ,

należy używać
ATOMIC_BLOCK czyli sekcji krytycznych w avr

w twoim przypadku moze sie przydać

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

ATOMIC_RESTORESTATE - powodującą zapamiętanie przed wejściem do sekcji krytycznej globalnej flagi zezwolenia na przerwania, w srodku bloku nastepuje zablokowanie przerwań, następnie wykonuje się kodu i na koniec przywrócenie stanu flagi zezwolenia na przerwanie.

rzadko jaka ksiazka opisuje ta funkcjonalność , mozesz poczytac o nich w
dokumentacji
http://www.nongnu.org/avr-libc/user-man ... tomic.html

_________________
Kawczynski



Ostatnio edytowano 15 maja 2014, o 13:49 przez Kawczynski, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 maja 2014, o 13:45 
Offline
Moderator
Avatar użytkownika

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

Kawczynski napisał(a):
należy używać
ATOMIC_BLOCK czyli sekcji krytycznych w avr


ale warto też wiedzieć, że można wprost w kodzie zrobić to np tak:


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


zresztą ten akurat ATOMIC robi dokładnie to samo


Autor postu otrzymał pochwałę

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

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