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



Teraz jest 13 mar 2025, o 00:22


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 28 gru 2014, o 23:52 
Offline
Nowy

Dołączył(a): 04 sie 2014
Posty: 12
Pomógł: 0

Witam, jest to mój pierwszy post, więc mam nadzieję że nie umieszczam go w złym dziale.

Zaczynając naukę przerwań chciałem zmienić stan diody co sekundę. Początkowo chciałem zrobić to na przykładzie z Bluebooka i próbowałem wykorzystać Timer0 (8 bitowy), moje podejście było takie: dobrać taki preskaler by dzieląc częstotliwość otrzymać liczbę całkowitą. Dodam, że testuję na Atmega16 z wewnętrznym taktowaniem 8 MHz. Zatem: 8 000 000 / 64 = 125 000, porównanie ustawiłem przy 125, zatem w wektorze przerwania dodałem licznik zliczający do 1000. Teoretycznie powinno działać, bo obliczenia chyba się zgadzają, jedyny błąd to dobranie złego preskalera- i to rozumiem, jednak wydawało mi się, że całość działa tak: timer zaczyna zliczać, kiedy dochodzi do wartości z OCR0 mamy przerwanie i później liczymy od nowa, więc teoretycznie(w mojej głowie) wszystko powinno działać pomimo "błędu", jednak w praktyce dioda miga z większą częstotliwością.

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


Z zadanie sobie poradziłem, używając Timer1 (16 bitowy) i dobierając odpowiedni preskaler:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I choć wszystko ładnie działa to mam pytanie- dlaczego pierwszy pomysł nie wypalił? Bo z tego, że nie działa łatwo wywnioskować, że czegoś nie wiem/ nie rozumiem... tylko czego?

Dzięki za cierpliwość, i przepraszam za błędy.



Ostatnio edytowano 29 gru 2014, o 08:12 przez elerbe, łącznie edytowano 1 raz

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

Dołączył(a): 01 sty 2014
Posty: 243
Pomógł: 9

Wg MkAvrCalculatora nie jest możliwe uzyskanie takiego przerwania dla zadanych parametrów na Timerze0
Obrazek

Zainteresuj się tym programikiem - jest naprawdę pomocny.

_________________
http://www.ate-zbaszyn.eu



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

Dołączył(a): 28 sty 2013
Posty: 426
Pomógł: 36

Cytuj:
Timer1 (32 bitowy)

Male sprostowanie. Nie jest to timer 32 bitowy, a 16 bitowy. Zobacz jaka wartosc mozesz zapisac do OCR1 :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 08:29 
Offline
Nowy

Dołączył(a): 04 sie 2014
Posty: 12
Pomógł: 0

Tak tak kaka0204, dzięki za wyłapanie głupiej pomyłki :) Poprawiłem by inni czytający nie zwracali uwagi na błąd.

yaiba83 dzięki za odpowiedź, jednak chciałbym się dowiedzieć dlaczego tak jest :)



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

Dołączył(a): 01 sty 2014
Posty: 243
Pomógł: 9

A duża jest różnica?
Wg MkAvrCalculatora powinno być 124 a nie 125

Kod:
// 8-bit TimerX config
TCCRxn |= (1<<CSxn)|....  // set prescaler = 64 ---> please check proper values in PDF
TCCRxn |= (1<<WGMxn)|.... // set CTC mode ---> please check proper values in PDF
OCRxn  = 124;  // every  [ 1 ms ]
TIMSK  |= (1<<OCIExn);     // enable CompareX interrupt



// TimerX compareX interrupt
ISR( TIMERx_COMPx_vect ) {

    // ... interrupt code

}

_________________
http://www.ate-zbaszyn.eu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 11:08 
Offline
Nowy

Dołączył(a): 04 sie 2014
Posty: 12
Pomógł: 0

124, a nie 125 bo liczymy od zera- miałem świadomość tego błędu, było o tym w Książce, jednak częstotliwość zmiany stanu diody jest o wiele większa, dlatego to tak zostawiłem.

Po prostu przerwania działa inaczej niż myślałem... i chciałem dowiedzieć się jak powinienem myśleć poprawnie :)



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

Dołączył(a): 22 gru 2012
Posty: 256
Lokalizacja: Rumia
Pomógł: 22

No dobra, a nie jest problemem też to że przerwanie masz teraz co 1ms ? Jeżeli dobrze zapamiętałem to w BB Mirek pisał że nie poleca schodzić z timerami do zliczania czasu poniżej 10ms. Próbowałeś inne ustawienia preskalera, takie aby się zmieścić w tych 255 ? Z tego co sprawdzałem u siebie to preskaler 1024 i zliczanie do 77 daje prawie jedną sekundę. Piszę prawie bo nie wychodzi liczba całkowita.

_________________
http://www.marcingibas.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 12:42 
Offline
Nowy

Dołączył(a): 04 sie 2014
Posty: 12
Pomógł: 0

Nie, nie próbowałem... chodziło mi o to dlaczego to nie działa kiedy jest napisane tak a nie inaczej, a nie jak to zrobić :( ale dobra, szukanie wyjaśnienia chyba jest bez sensu. Błąd to błąd. :)



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

Dołączył(a): 22 gru 2012
Posty: 256
Lokalizacja: Rumia
Pomógł: 22

Szukanie wyjaśnienia bez sensu ? No przestań. Nigdy takiego problemu nie miałem, bo jakoś mi zapadło w pamięci to co napisałem wcześniej o tych 10 ms, i tego się trzymam przy zliczaniu czasu.
A zmień licznik == 1000; na licznik >= 1000;

_________________
http://www.marcingibas.pl



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

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
elerbe napisał(a):
...jedyny błąd to dobranie złego preskalera

Nie wiem czy mówisz o znalezionym błędzie czy ja nie łapię o co chodzi, bo rzeczywiście w linii:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

masz błąd: (1<CS00) zamiast (1<<CS00).
Z poprawny zapisem jest niemal dokładna sek.

Pozdr.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 19:11 
Offline
Nowy

Dołączył(a): 04 sie 2014
Posty: 12
Pomógł: 0

Super, jednak głupia pomyłka w pisaniu :)
Dzięki za rozwiązanie mojego problemu, okazuje się, że wszystko działa jak powinno- błąd był w kodzie, a nie w rozumieniu sprawy :)

Dzięki. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 20:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

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


W przerwaniu nigdy static tylko volatile.

_________________
Czekamy na RedBook'a!



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

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

szopler napisał(a):
W przerwaniu nigdy static tylko volatile.


Niestety program nie działa jeśli zmienna w przerwaniu jest volatile zamiast static.
Zmienne statyczne w przerwaniach i funkcjach są tworzone w obszarze zmiennych globalnych i nie tracą swej wartości po wyjściu z przerwania lub funkcji. A oto właśnie w tym programie chodzi. Zmienna ma zliczyć 1000 przerwań dlatego musi "pamiętać" swą wartość po wyjściu z tego przerwania.

No chyba że koledze chodziło o coś innego.



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

Dołączył(a): 28 sty 2013
Posty: 426
Pomógł: 36

Cytuj:
W przerwaniu nigdy static tylko volatile.


Volatile byloby wtedy, gdy zmienna licznik bylaby zmienna globalna.



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

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