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



Teraz jest 21 maja 2026, o 01:20


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 25 ] 
Autor Wiadomość
PostNapisane: 6 gru 2014, o 21:31 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Hej Koledzy i Koleżanki :)

Piszę sobie z nudów sterownik obrotów wentylatorka od CPU i chciałem sobie skonfigurować timer0 by mi tykał co jedną mikosekundę. Potrzebne mi to będzie do całkowania bo chcę regulator PID tam zaimplementować. Napisałem taką inicjalizację, no banał po prostu:

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


No i niestety nie wchodzi mi w to przerwanie... Używam jeszcze TIMER1 do tego by tykał co 10us, on służy mi do pomiaru prędkości i przerwania od INT0 też używam. Oba przerwania się wykonują. Tak wyglądają obsługi przerwań.

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



Co może być nie tak bo zgłupiałem już..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2014, o 22:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

Z tego co pokazałeś w kodzie inicjalizacja oraz samo przerwanie wygląda ok. Poza tym ciężko powiedzieć co może być nie tak :(

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2014, o 22:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Inicjalizacja Timera 0 wydaje się być okay, adres jego przerwania również. Przydałaby się informacja na temat taktowania uC :P Zakładając wewnętrzne 8 MHz, Timer0 wykonuje przerwanie z częstotliwością 8 000 000 / 2 / (15+1) = 250 000 Hz. Z obecnym preskalerem musiałbyś taktować uC z częstotliwością 1000 Hz * 2 * (15+1) = 32 000 Hz. Możliwe, że przerwanie Timera 0 wywołuję się za szybko :P



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

Dołączył(a): 22 mar 2014
Posty: 38
Lokalizacja: Bydgoszcz
Pomógł: 4

Siemka.
sei() masz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2014, o 22:54 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Przerwanie ustawiłem tak by tykało co 1us (uzywałem mkavrcalculatora i narzędzia AVR TIMER KALKULATOR, ustawiając pożądane us na 1) Procek taktuje z kwarca 16MHz. Czy ustawienie przerwania by wykonywało się co 1us to za szybko? Chodzi o to że wstawiłem w obsługę przerwania zapalenie LED'a na PC7 i LED nie chce zaświecić tak jakby to przerwanie się nie wykonywało w ogóle. Timer1 ustawiłem by tykał co 10us i działa normalnie. TIMER0 dla testów przestawiłem na 15us i też lipa... Nie wiem co jest grane.

------------------------ [ Dodano po: 3 minutach ]

Cytuj:
sei() masz?


Pewnie, napisałem że inne przerwania się normalnie wykonują. Używam timera2 do PWM, timera1 by tykał co 10us, używam przerwania od INT0 i wszystko gra, tylko to jedno nieszczęsne przerwanie się nie chce wykonać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2014, o 23:13 
Offline
Użytkownik

Dołączył(a): 19 cze 2014
Posty: 247
Pomógł: 15

Cześć, w książce którą posiadam "Mikrokontrolery dla początkujących" Piotra Góreckiego ( o Bascomie ;() piszę, że wykonanie typowego rozkazu w asemblerze trwa około 0,25 us dla kwarcu 4Mhz więc dla 16Mhz 0,25/4=0,0625us więc w 1us/0,0625us = 16 rozkazów zakładając, że są one w asemblerze, więc wydaję mi się, że co 1us to trochę za szybko, chociaż led powinien się zapalić :roll: .

_________________
http://elektropanel.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2014, o 23:24 
Offline
Użytkownik

Dołączył(a): 22 mar 2014
Posty: 38
Lokalizacja: Bydgoszcz
Pomógł: 4

Kolega Gelten ma rację.



Ostatnio edytowano 6 gru 2014, o 23:28 przez no atnel no fun, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2014, o 23:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Przepraszam za wyżej, przeczytałem milisekundy, a mają być mikrosekundy. Przepraszam też za wzór, jest dla częstotliwości pinu przy Toogle :P W takim wypadku masz poprawne obliczenia. Jednakże zauważ, że wchodzisz w to przerwanie co 16 taktów zegara.

Dodano:
Kolego no atnel no fun, dobrze jest ustawiony bit w TIMSK i adres przerwania. Przerwanie jest od OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable, czyli TIMER0_COMP_vect - Timer/Counter0 Compare Match.

Dodano2:
Takie może głupie pytanie: wywołujesz funkcje inicjalizacja_timer0_1us() w kodzie?:P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2014, o 23:59 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

No wywołuje ta funkcje zaraz na początku int main(void), później inicjaluzuje jeszcze kilka rzeczy daje 10 milisekundowego delaya i wchodzę w pętle główną. narazie w tym przerwaniu mam tylko zapalenie leda. Działam na zestawie ATB. Ten led jest wygaszony też w main. No nic, musze pomyśleć co może być nie tak... Jakis konflikt przerwań czy co?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 00:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Mógłbyś udostępnić troszkę więcej kodu? Inicjalizacja jest dobra, przerwanie również. Bez reszty kodu ciężko będzie coś doradzić:P I takie pytanie, jaki zakres wartości ma zmienna mikrosekundy? Wykonujesz instrukcję kiedy jest ona równa 0?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 00:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

Tak tylko pytam, stosujesz volatile dla tych zmiennych w przerwaniach?

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 00:16 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Gelten napisał(a):
Mógłbyś udostępnić troszkę więcej kodu? Inicjalizacja jest dobra, przerwanie również. Bez reszty kodu ciężko będzie coś doradzić:P I takie pytanie, jaki zakres wartości ma zmienna mikrosekundy? Wykonujesz instrukcję kiedy jest ona równa 0?

To jest uint64_t, myślałem juz ze moze to to ze jest zbyt wielka ale po usunięciu jej z przerwania i zostawieniu samego leda nic się nie zmieniło.

Co do volatile, to nie zastosowałem. Wszystko działa bez tego bo w pętli głównej tylko odczytuje te zmienne z przerwań.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 00:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

Nefarious19 napisał(a):
Co do volatile, to nie zastosowałem. Wszystko działa bez tego bo w pętli głównej tylko odczytuje te zmienne z przerwań.


Może warto spróbować zastosować?

Tu masz coś na temat volatile

[ moderowano - mirekk36 ]
http://mirekk36.blogspot.com/2011/08/test.html

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 12:20 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

kurnachatka napisał(a):
oże warto spróbować zastosować?

Tu masz coś na temat volatile

[ moderowano - mirekk36 ]
http://mirekk36.blogspot.com/2011/08/test.html


pewnie, dzięki za link :) ale niestety to nie pomogło... Nie mam pojęcia co może być nie tak z tym TIMER'em...

------------------------ [ Dodano po: 10 minutach ]

Usunąłem inicjalizacje TIMER'a 1 w trybie CTC i przerwanie od TIMER'a 0 w trybie CTC się odpala... Czy to znaczy że w trybie CTC może być tylko jeden timer?



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

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Pokaż tą inicjalizację Timera 1. Wywołujesz ją przed inicjalizacją Timera 0 czy po?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 13:38 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Wrzucam cały kod, narazie jest w trakcie budowy ale myślę że jest w miarę czytelny:

main.c

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


funkcje.h

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



i funkcje.c

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: 7 gru 2014, o 14:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Myślałem, że po ujrzeniu całego kodu coś rzuci mi się w oczy. Niestety myliłem się ;/ Mam nadzieję, że ktoś Ci jednak pomoże :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 14:37 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Widocznie dwa timery w trybie CTC się jakoś konfliktują czy coś... Nie mam pojęcia o co chodzi.

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

Próbowałem zmienić preskaler dla timera0 na 8 ale to też nie pomogło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 14:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2013
Posty: 119
Lokalizacja: Cinisi
Pomógł: 12

hmm zajrzyj na strone 82 noty katalogowej od atmegi 32. chodzi mi o rejestr SFIOR. poczytaj, testuj może coś się wyklaruje :)

------------------------ [ Dodano po: 7 minutach ]

ja dojrzałem tyle, że preskaler timera0 oraz timera1 jest współdzielony. moze tutaj tkwi problem ?

_________________
sig off :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 16:35 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Nondzu napisał(a):
ja dojrzałem tyle, że preskaler timera0 oraz timera1 jest współdzielony. moze tutaj tkwi problem ?


No zauważyłem, dlatego dla obu ustawiłem taki sam tj. 1...

Miałbym prośbę dla kogoś z forum żeby przetestował u siebie na swojej ATmedze32 czy to mu zadziała? Bo fakt, mogę sobie i bez tego timer'a poradzić w sumie albo spróbowac go dać w tryb normal ale nie na tym rzecz polega..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 17:35 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Zauważyłem że gdy w TIMSK odblokowane są oba przerwania to wykonuje się to od TIMER1, gdy jest włączone tylko od TIMER0 to włazi mi w przerwanie... Cóż. Spróbuje dać go w tryb normal.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 17:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Przetestowałem program i u mnie też nie działało przerwanie od timera0.

Ale wystarczyło że z przerwania od Timera1 wywaliłem to
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

albo zmniejszyłem częstotliwość występowania tego przerwania (poprzez zwiększenie preskalera) i już przerwanie od Timera0 zaczęło działać.

Wydaje mi się że to przerwanie wykonuje się zbyt długo z powodu działania na liczbach uint32_t i uint64_t.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 17:51 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

jacekk232 napisał(a):
Przetestowałem program i u mnie też nie działało przerwanie od timera0.

Ale wystarczyło że z przerwania od Timera1 wywaliłem to
Składnia: [ Pobierz ] [ Ukryj ]
język c
if(ilosc_tykniec > 0xFFFFFFFFFFFFFFFE) ilosc_tykniec = 0;
GeSHi

albo zmniejszyłem częstotliwość występowania tego przerwania (poprzez zwiększenie preskalera) i już przerwanie od Timera0 zaczęło działać.

Wydaje mi się że to przerwanie wykonuje się zbyt długo z powodu działania na liczbach uint32_t i uint64_t.


Dzięki, wszystko teraz działa... swoją drogą nie pomyślałbym że to może być przyczyną.. Cóż, przecież uczymy się najlepiej na własnych błędach :) dzięki Ci bardzo :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 18:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

W tego typu problemach warto zajrzeć do pliku *.lss by zobaczyć jak wygląda obsługa przerwania w asemblerze i jak długo trwa. Przy odrobinie chęci można policzyć ile cykli będzie trwało przerwanie. I wcale nie trzeba być ekspertem asemblera.

Aby łatwiej było się odnaleźć w pliku lss warto włączyć opcję Standard debugging info albo Extra debugging info w Project Properties -> C\C++ Build -> Settings ->zakładka Tool Settings -> Avr Compiler -> Debugging.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2014, o 18:49 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

jacekk232 napisał(a):
W tego typu problemach warto zajrzeć do pliku *.lss by zobaczyć jak wygląda obsługa przerwania w asemblerze i jak długo trwa. Przy odrobinie chęci można policzyć ile cykli będzie trwało przerwanie. I wcale nie trzeba być ekspertem asemblera.

Aby łatwiej było się odnaleźć w pliku lss warto włączyć opcję Standard debugging info albo Extra debugging info w Project Properties -> C\C++ Build -> Settings ->zakładka Tool Settings -> Avr Compiler -> Debugging.


Zaglądałem do tego pliku, ale tak jak mówisz, nie za bardzo się tam mogłem odnaleźć. Teraz zoptymalizowałem trochę kod i jest o wiele lepiej. Nie pracowałem jeszcze na tak dużych zmiennych ale teraz będę miał nauczkę żeby ich nie pchać do przerwań.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 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