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



Teraz jest 19 kwi 2024, o 20:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 2 kwi 2013, o 19:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Witam, zrobiłem sobie timer programowy w oparciu o timer sprzętowy w trybie CTC od timera2 (ATmega32A)
Zastanawiam się, ile kodu może znaleźć się w procedurze obsługi przerwania, z tego co kojarzę to nie może tam być za dużo kodu.
Czy mogą być tam wywołania funkcji (powiedzmy jakiś średnio rozbudowanych)?

Przerwanie zaskakuje z częstotliwością 100Hz.
I wygląda póki co tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 kwi 2013, o 19:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Jeśli projektujesz timer programowy to zostaw tam tylko i wyłącznie ustawianie liczników a całą resztę przenieś do programu głównego. Mirek pięknie opisał istotę tworzenia timerów programowych.

------------------------ [ Dodano po: 6 minutach ]

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


Nie musisz przekręcać licznika, on się sam przekręci.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 kwi 2013, o 19:51 
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

Funkcje obsługi przerwania powinny być krótkie czasowo, aby nie blokować innych przerwań jak również pętli głównej programu. Nie chodzi tu raczej o ilość linii, bo _delay_ms(10); to jedna linia, a zajmuje dużo czasu. Przy taktowaniu 1MHz jeden (typowy) rozkaz trwa 1us, a 1000 rozkazów - 1ms.
Z wywołaniem funkcji wewnątrz przerwania nie ma problemu, ale trzeba wiedzieć ile czasu zajmuje taka funkcja. Może nawet nie być jawnie podane ile, bo funkcje obsługi wyświetlacza LCD z odczytem flagi zajętości czekają, aż wyświetlacz będzie gotowy do przyjmowania kolejnych rozkazów.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 09:39 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Jak policzyć poszczególne rozkazy? Ile zajmuje "jakaś tam" procedura? Jak to można sobie policzyć? Skąd wiadomo, że dany rozkaz wykonuje się w tylu, a tylu cyklach?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 09:56 

Pomógł: 0

Patrzysz w kod przetłumaczony na asembler, a potem sprawdzasz sobie ile dana instrukcja zajmuje cykli procesora http://proton.ucting.udg.mx/tutorial/AVR/

Pewnie można jakoś prościej, za pomocą debuggera.

PS. Można użyć też "Myku" z zmianą stanu portu na początku procedury. Zmieniasz stan wybranego portu na początku procedury, potem zmieniasz stan na końcu procedury, mierzysz oscyloskopem, lub czym tam masz pod ręką i siup już wiesz ile czasu ona zajmuje :D.



Ostatnio edytowano 3 kwi 2013, o 09:59 przez rezasurmar, łącznie edytowano 1 raz

Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 09:59 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Wybaczcie może laickie pytanie, ale jak przetłumaczony na asembler? W jaki sposób to się robi np. w Eclipsie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 10:02 
Offline
Użytkownik

Dołączył(a): 27 gru 2012
Posty: 159
Pomógł: 3

Tak naprawdę to musiałbyś zajrzeć do kodu w Asemblerze i zobaczyć na jakie instrukcje zostały rozpisane Twoje rozkazy. A potem zobaczyć ile cykli zegarowych się wykonuje dana instrukcja np stąd: http://www.atmel.com/Images/doc1022.pdf

------------------------ [ Dodano po: kilkunastu sekundach ]

rezasurmar mnie uprzedził :)

taj to jest odejść na 3 minutki od kompa :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 10:08 

Pomógł: 0

Trochę to na piechotę......chyba że jest jakiś prostszy myk z użyciem debuggera, SunRiver opisywał na forum użycie Debuggera w eclipsie, poszukaj jego postów.

Mnie się bardziej podoba myk z zmianą stanu na porcie, bo dzięki temu masz rzeczywisty czas działania funkcji czy procedury.......no i szybciej bo to tylko raptem dwie linijki kodu. Sama zmiana wpłynie w nieznaczny sposób na długość wykonywania kodu......no chyba, że potrzebujesz faktycznie walczyć z każdym cyklem, no to tylko debugger, albo najlepiej przejście na czysty asembler ;). Przynajmniej w procedurach (funkcjach) w których liczy się każda mikro sekunda.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 10:08 
Offline
Użytkownik

Dołączył(a): 27 gru 2012
Posty: 159
Pomógł: 3

Tom277 napisał(a):
Wybaczcie może laickie pytanie


Tu nie ma takich pytań :)

W katalogu projektu dajesz REALSE i plik nazwa_projektu.lss i tak masz rozpisane w asm

------------------------ [ Dodano po: 5 minutach ]

rezasurmar napisał(a):
Mnie się bardziej podoba myk z zmianą stanu na porcie


Mi też ten myk się najbardziej podaoba tylko trzeba niestety mieć oscyloskop a najlepiej analizator stanów logicznych i jakieś wolne wyprowadzenie :)

------------------------ [ Dodano po: 8 minutach ]

Tylko że to też nie da idealnie czasu trwania przerwania bo ustawienie stanu wysokiego/niskiego też "zajmuje" ale to są grosze

instrukcja ASM SBI i CBI zajmują po 2 cykle więc od wyniku będziesz musiał odjąć 4 cykle zegarowe

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 10:19 

Pomógł: 0

staneq napisał(a):
Tylko że to też nie da idealnie czasu trwania przerwania bo ustawienie stanu wysokiego/niskiego też "zajmuje" ale to są grosze


No ale to w zasadzie zawsze zajmuje tyle samo czasu, więc sobie można odjąć od wyniku, ale fakt bez oscyloskopu ani rusz ;), ale zawsze można sobie strzelić jakiś DYI analizator w stylu seale 8, koszt samej płytki z scalaczkiem to ok 65zł ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 10:21 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

aaaa.... to już trochę jaśniej.

------------------------ [ Dodano po: kilkunastu sekundach ]

A czy w AVRStudio nie można? Jest gdzieś jakiś opis jak zrobić to za pomocą symulatora w AVRStudio? Coś kiedyś słyszałem/widziałem, ale nie znam AS więc nie wiem czy to jest to.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 10:52 
Offline
Moderator
Avatar użytkownika

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

Tom277 --> tak na prawdę gdy programujesz w C to de'facto odcinasz się od asemblera i liczenie cykli zegara w przerwaniu to totalna strata czasu..... Bo po co ? spróbuj to sam sobie uzasadnić - to zobaczysz że nie dojdziesz do porządnych wniosków :(

A gdybyś chciał powiedzieć, że robisz coś gdzie STRASZNIE zależy ci na każdym cyklu zegara w przerwaniu - to wtedy gdy taka ostateczność przychodzi - choć rzadko - to robisz wstawkę asemblerową i sam piszesz - wtedy dopiero uzyskasz STAŁĄ dla ciebie liczbę cykli zegara - bo kompilator po każdej kompilacji gdy wprowadzisz delikatne zmiany w programie może na nowo i całkiem inaczej tłumaczyć na asembler fragmenty swojego kodu.

Zatem sięganie z tego powodu do debugera - to wg mnie oczywiście ale to jest moje subiektywne zdanie, mija się już TOTALNIE z celem a szczególnie wykorzystaniem debugera.

1. Napisz sobie proste przerwanie
2. zajrzyj do pliku *.lss
3. zobacz jak wygląda sam prolog i epilog
4. łatwo znajdziesz ciało przerwania - np zapis jakiejś liczby do portu - będzie to jeden rozkaz asemblerowy pewnie

i wtedy jak wyżej kolega pisał - zajrzyj nawet do noty PDF gdzie masz podane liczby cykli na każdy rozkaz asm ;) ... gdy częściej to będziesz robił to zaczniesz później nawet na pamięć - tak na szybko zliczać ... tak mniej więcej ....

ale im dłużej będziesz programował w C tym mniej będziesz to robił w 99% przypadków bo to nie ma sensu

gdy rozumiesz zasady pisania procedur obsługi przerwań które sprowadzają się do prostej rzeczy

- przerwanie powinno trwać jak najkrócej (co nie oznacza że musi być w nim mało kodu bo to dwie różne rzeczy)

oczywiście dla wielu początkujących to jest wręcz ZASADNICZE pytanie - co to znaczy "jak najkrócej" i np zaczynają się pytania typu:

1. a czy mogę użyć np _delay_us() w przerwaniu bo wiem że _delay_ms() jest za długie
2. a czy mogę użyć obsługi LCD w przerwaniu ?
3. a czy mogę użyć obsługi XXX w przerwaniu ???

dla początkującego podpowiedź jest prosta - ŻADNYCH _dleay, żadnych pętli które mogą się nie skończyć, żadnej obsługi LCD, bo ta obsługa albo zawiera sporo _delayów albo zawiera oczekiwanie na BusyFlag - żadnych takich ;)

i wystarczy się tego na początek trzymać i dużo próbować pisać kombinować i sprawdzać w praktyce na żywym organiźmie procka a nie na symulatorach i debugerach - wtedy szybciej załapiesz praktykę i zobaczysz że także dla ciebie stanie się proste co można w przerwaniu a czego nie ;)

_________________
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: 3 kwi 2013, o 11:19 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Wielokrotnie mówiłeś Mirku, żadnych delay-ów, LCD-ków i takich tam w przerwaniu i jest to dla mnie oczywiste i logiczne, tyle że chciałbym wiedzieć co robię i chciałby robić coś świadomie nie na zasadzie bo tak ma być. Jeśli to tylko możliwe staram się w przerwaniu umieszczać flagę, a w funkcji głównej resztę. Choć analizując twoje programy i kolegów tu na forum widzę, że w przerwaniach np. timera pojawiają się więcej niż tylko flaga. Dlatego pytam żeby nie postępować bezmyślnie a świadomie. Być może można coś napisać dużo prościej pisząc coś w przerwaniu niż wyciągać to na zewnątrz. Byłoby fajnie wiedzieć ile dana procedura zajmuje czasu i jak obciąża procesor bo może się okazać że do końca jeszcze bardzo dużo czasu i nie muszę się martwić. Rozumiem też że wiele przychodzi z czasem ale od czegoś trzeba zacząć. Tak w ogóle to fajnie jest wiedzieć co się pisze. Dzięki za wnikliwą odpowiedź.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 11:48 
Offline
Moderator
Avatar użytkownika

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

Tom277 ---> oczywiście masz rację - no ale widzisz więcej urodzi się z konkretnych pytań ... bo niestety OGÓLNIE nie da się tego opowiedzieć w 2-3 zdaniach, ale też prawdą jest to co napisałem wyżej że liczenie każdego taktu mija się z celem programując w C.

A zatem - skoro jak piszesz znasz już jakby te podstawy (fajnie) .... to powiem znowu coś co może zaburzy tok twoich myśli ale postaram się doprecyzować. Otóż w niebieskiej książce mówię o flagach i nawet podaję taki jaskrawy przykład z przerwaniem INTx przy obsłudze PCF8583 gdzie zdaje się jedyna rzecz jaką robię w przerwaniu to ustawienie flagi i później sprawdzanie jej w pętli głónej. Ale to też tylko powstało do celów dydaktcznych i może się zdziwisz ale tak wręcz NIE NALEŻY robić jeśli w przerwaniu miałbyś TYLKO ustawiać flagę - bo po co? tworzyć flagę programową przerwania ?? tracić na nią cenną komórkę RAM ?? skoro przecież masz rejestr sprzętowy ze SPRZĘTOWYMI FLAGAMI przerwań i równie dobrze można je wykorzystać w pętli głównej ... pomyśl jaka oszczędność czasu , pamięci i kodu ;)

zaglądamy szybko do noty PDF np procka ATmega8 , spójrz na rejestr GIFR - widzisz? masz tam dwie sprzętowe flagi INTF0 oraz INTF1

można je w pętli głównej wykorzystać wprost zamiast tej programowej którą pokazałem w książce

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

widzisz ? Mógłbyś zapytać - no dobra to po co pan panie kardaś wprowadzasz ludzi w błąd ? ;) .... nie - nie wprowadzam - ponieważ o wiele łatwiej wg mnie dotrzeć mi do początkującego i opowiedzieć mu o znaczeniu flag na takim przykładzie jak ja to opisałem bo tutaj jakbym podał z tym rejestrem - to początkująca osoba - popatrzy na to często i pomyśli - O! jakieś czary-mary pokazał i mądry - a ja nadal nie czaję o co chodzi z tymi kocimi flagami.

No ale też zdarza się że później ktoś np nie poczyta dalej albo całej książki i na podstawie tej informacji np zaczyna pisać sobie obsługę przerwania UART i zdarzało się , że nadsyła mi czytelnik kod w którym w przerwaniu UART'a wkleja też TYLKO TAKĄ flagę programową jak w tym przykładzie z PCF a później w pętli głównej chce odczytywać np UDR itp itd ... a ja pytam - a czytałeś pan dalej ? ;) przecież czym dalej w las tym pokazuję że więcej drzew i coraz bardziej różne podejście ....

REASUMUJĄC - w 10000% warto sobie zdać sprawę co to są flagi i jak się nimi posługiwać - nawet jeśli początkujący miałby tylko taką programową flagę majstrować zamiast używać tej sprzętowej - a dlaczego ? Ano dlatego że przygotowuję go do WAŻNEJ RZECZY w dalszej części książki jaką są np TIMERY PROGRAMOWE ! ..... to jest TO - na czym mi głównie zależy - do czego prowadzę ..... choć często początkująca osoba nie chce iść dalej w książce obawiając się że tam na końcu to coś gryzie i jest za trudno - zatrzymując się na jej początku bo też już coś zaczyna wychodzić i brnie czasem błądząc mocno dalej

Tymczasem jeszcze raz - flagę programową wprowadzaj wtedy jeśli w przerwaniu jeszcze inne rzeczy użyjesz np wyobraź sobie timer sprzętowy do obsługi multipleksowania.... działa sobie taki z częstotliwością np 200-300Hz .... no i coś tam robi - obraca tymi segmentami prawda? długo to nie trwa ale zawsze coś robi. No i wtedy - po co powoływać do życia nowy timer sprzętowy który miałby wyznaczać jakąś podstawę czasu żeby np migać sobie jakąś diodą LED co sekundę - jeśli mogę dodać kilka linijek do obsługi przerwania multipleksowania i zliczać te każde np 5ms (przy 200Hz) ... i gdy zliczę ich tyle że minie 1s to wtedy ustawię sobie flagę ;) i w pętli głównej przy okazji niejako będę miał poza fajnym multipleksowaniem to jeszcze flagę co 1s ;) ... czyt tylko co 1s ? nie jak chcę to wprowadzę drugą np co 500ms albo i trzecią co 100ms .... tyle że zliczanie impulsów 5-cio milisekundowych będę realizował nadal w przerwaniu.

Dlatego też w takim wypadku nie ma co korzystać ze sprzętowej flagi przerwania ponieważ zostaje ono w sposób wypasiony użyte i to do wielu celów naraz ;)

a zatem czytaj dalej książkę ale co najważniejsze - staraj się ćwiczyć każdy przykład na 100 różnych sposobów i nie opuszczaj ostatnich rozdziałów a szczególnie

"Wstępu do systemów czasu rzeczywistego" bo to jest CEL do którego Cię i każdego czytelnika staram się doprowadzić.

_________________
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: 3 kwi 2013, o 11:58 
Offline
Użytkownik

Dołączył(a): 27 gru 2012
Posty: 159
Pomógł: 3

rezasurmar napisał(a):
No ale to w zasadzie zawsze zajmuje tyle samo czasu, więc sobie można odjąć od wyniku,


No i to napisałem :)

A gotowy klon można na allegro kupić za ok 100zł w ładnej obudowie i kabelkami, sam sobie taki kupiłem i nie narzekam


Tom277 napisał(a):
Choć analizując twoje programy i kolegów tu na forum widzę, że w przerwaniach np. timera pojawiają się więcej niż tylko flaga


No i tak jest że czasami dając samą flagę w przerwaniu nie uzyskamy efektu na jakim nam zależy czyli np podczas multipleksowania wyświetlacza 7seg. Jeżeli ustawimy częstotliwość po 50Hz/cyfre mając 4 cyfry to przerwanie powinno się wykonywać ok 200Hz czyli 0,005s czyli 5ms
a w pętli głównej będziemy mieli (w najgorszym razie) funkcje któa będzie się wykonywać np 10ms no i w związku z tym np jedna cyfra może nie świecić bo nim nieskończona pętla przejdzie do sprawdzania flagi to flaga zmieni się 2 razy i jakaś cyfra zostanie pominięta.

Mam nadzieję że zrozumiale :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2013, o 21:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

Co do LCD to można to zrobić na obkrętkę,robisz sobie bufor 16 char, w przerwaniu cos sobie do niego zapisujesz i ustawiasz jakaś zmienną na 1 a w pętli głównej sprawdzasz warunek i jak jest 1 to zapisujesz bufor do wyświetlacza. Wiem ze to może być oczywiste ale nie dla każdego. :smile:

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 kwi 2013, o 09:17 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

świetnie, Panowie bardzo dziękuje za wyjaśnienia. Każdy taki szczegółowy opis poszerza horyzonty nawet jeśli coś się niby już wie.
Cytuj:
Wiem ze to może być oczywiste ale nie dla każdego.
może i oczywiste ale ja o tym w ten sposób nie myślałem. dzięki.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 14 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO