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



Teraz jest 13 sty 2026, o 02:27


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 21 sie 2013, o 13:57 
Offline
Użytkownik

Dołączył(a): 10 lip 2013
Posty: 93
Lokalizacja: Puławy
Pomógł: 0

Cześć mam pytania dot. timerów.
1. Czy dobrze inicjuję timer?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

2. Czy do przerwania co sekundę muszę ostatecznie wpisać do rej. OCR0 = 31250 ? (w książce jest to opisane ale nie mogę tego zrozumieć)
3. Czy dobrze rozumiem że w trakcie przerwania zostanie wykonana metoda ISR() czyli np.z każdym przerwaniem powinno mi wyświetlić literkę?
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: 21 sie 2013, o 15:36 
Offline
Użytkownik

Dołączył(a): 10 lip 2013
Posty: 93
Lokalizacja: Puławy
Pomógł: 0

Procesor ATmega32, taktowanie 8MHz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2013, o 16:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 lut 2012
Posty: 243
Lokalizacja: wlkp
Pomógł: 2

8 000 000 Hz / 1024 = 7812,5 Hz ≈ 7813 Hz Sygnał o takiej częstotliwości podawany jest na wejście Timera.

O czym mówi taka częstotliwość sygnału? A mówi o tym, że w ciągu 1 sekundy pojawia się 7813 cykli, innymi słowy możemy zliczyć w zaokrągleniu 7813 impulsów w ciągu 1 sekundy, czyli żeby procesor mógł odliczyć "dokładnie" sekundę, to licznik musi zliczyć 7813 impulsów sygnału o częstotliwości równej 7813 Hz (na osi czasu 7813 impulsów zajmuje dokładnie sekundę). Zatem w tym przypadku do rejestru trzeba byłoby wpisać liczbę 7813 - zatem najprościej zastosować Timer 16-bitowy, co nie oznacza, że na 8-bitowym liczniku jest to nieosiągalne. :)

Do rejestru możesz wpisać wartość 31250, ale wówczas Twój preskaler wynosi 256 dla częstotliwości 8MHz, bo:

8 000 000Hz / 256 = 31250 Hz, czyli analogicznie, na wejściu licznika pojawia się sygnał o częstotliwości 31250Hz, czyli odmierzenie czasu 1 sekundy zajmuje zliczenie dokładnie 31250 impulsów takiego sygnału.
Ale to przypadek dla Timera1, a nie Timera0. Do rejestru Timera0 możesz wpisać maksymalnie liczbę 255, bo jest to licznik 8 bitowy czyli zlicza do 2^8-1=255.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2013, o 18:26 
Offline
Użytkownik

Dołączył(a): 10 lip 2013
Posty: 93
Lokalizacja: Puławy
Pomógł: 0

Ok a jak mam się odwoływać do funkcji ISR() z funkcji main kiedy jest ona w innym pliku? Czy wystarczy zainicjować Timer? Jak się do niej odwołać oraz do tych zmiennych volatile?
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: 21 sie 2013, o 19:23 
Offline
Moderator
Avatar użytkownika

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

ZgłebiaczTajników napisał(a):
Ok a jak mam się odwoływać do funkcji ISR()


wprawdzie ISR() to pewien rodzaj funkcji ale do niej się nie odwołujesz , jej nie wywołujesz - więc tu coś może ci się pokręciło

poza tym - nie wysyłaj danych na UART'a z wewnątrz przerwania - no chyba że to tylko takie jakieś tam dziwne testy albo debugowanie

_________________
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: 22 sie 2013, o 18:25 
Offline
Użytkownik

Dołączył(a): 10 lip 2013
Posty: 93
Lokalizacja: Puławy
Pomógł: 0

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


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


Ale metoda licznik() wyświetla mi się tylko 1 raz - dlaczego i jak to naprawić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2013, o 19:24 
Offline
Moderator
Avatar użytkownika

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

ZgłebiaczTajników napisał(a):
Ale metoda licznik()


to nie metoda tylko funkcja i skąd możemy wiedzieć o co chodzi skoro nie pokazujesz całego kodu a szczególnie tej funkcji ? :(

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

aha - poza tym stosuj:

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


i:

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

_________________
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: 22 sie 2013, o 19:50 
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

ZgłebiaczTajników napisał(a):
wyświetla mi się tylko 1 raz - dlaczego

Tryb CTC to taki tryb, gdzie timer zlicza od 0 do góry i jak dojdzie do OCR1A to nie zlicza dalej tylko zaczyna zliczać zonwu od 0. W OCR1A po resecie masz 0 i wychodzi na to, że za pierwszym razem timer zliczał od 0 do maksimum (wygenerował przerwanie TIMER1_COMPB), przekręcił się na 0 i później już non stop zliczał od 0 do 0 co jest mniejsze niż wartość w OCR1B.

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

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


Jak to opanujesz to możesz się też pobawić TIMER1_COMPB_vect, ale wtedy OCR1B powinno być mniejsze lub równe OCR1A, bo w innym przypadku timer nie zdąży doliczyć do wartości w OCR1B, bo wcześniej zostanie zresetowany jak tylko doliczy do OCR1A.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2013, o 21:59 
Offline
Użytkownik

Dołączył(a): 10 lip 2013
Posty: 93
Lokalizacja: Puławy
Pomógł: 0

Dzięki chłopaki za podpowiedzi.
Z tego wynika, że w ogóle lepiej skorzystać z rejestru TCCR1A w tym wypadku?

Cytuj:
to nie metoda tylko funkcja

To fakt - metody są dla obiektów w językach obiektowych.

Ok już daję tą funkcyjkę licznik - to taka zrobiona na szybko dla "badań" :)
Dodam też że ta funkcja działa dla timer0.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dziś nie będę sprawdzał waszych rad bo nie mam czasu ale jutro się odezwę.



Ostatnio edytowano 22 sie 2013, o 22:29 przez ZgłebiaczTajników, łącznie edytowano 1 raz

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

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

Cytuj:
Z tego wynika, że w ogóle lepiej skorzystać z rejestru TCCR1A w tym wypadku?


No i za chwilę popełnisz typowego babola jak setki początkujących ;)

a co wydaje ci się że rejestr TCCRA jest do kanału A natomiast TCCRB do kanału B ??? ;) to nie wymyślaj - tylko koniecznie zajrzyj do noty PDF ;)

szybko zobaczysz, że nie ma podziału na TCCRA i TCCRB jeśli chodzi o kanały A i B, obydwa służą do konfiguracji całego timera


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  
PostNapisane: 22 sie 2013, o 22:18 
Offline
Użytkownik

Dołączył(a): 10 lip 2013
Posty: 93
Lokalizacja: Puławy
Pomógł: 0

Właśnie tak myślałem! :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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