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



Teraz jest 27 sty 2025, o 15:30


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 15 mar 2014, o 14:39 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Witam

Chciałem przetestować przerwania wewnętrzne od licznika tak jak w książce jest opisane BLuebook 42-45. Najpierw w trybie normal a potem w trybie CTC . Przeglądnołem rozdział o multipleksowaniu , obejrzałem po części filmiki o przerwaniach. Chodzi mi o mruganie diody co 1 s. W Atmedze 8 przy kwarcu zewn. 8 000 000 muszę użyć Timera 1 16 bit. Jak "przywiązać" przerwanie do mrugnięcia diody LED ? Mogę prosić o jakieś przykłady ? Mniej więcej jak to powinno wyglądać resztę sobie już jakoś rozpracuje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 mar 2014, o 14:49 
Offline
Moderator
Avatar użytkownika

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

No przecież w rozdziale o Multipleksowaniu masz przykład ...

tyle że zamiast timera 8-bitowego weź Timer1 16-bitowy a w procedurze obsługi przerwania zamiast robić multipleksowanie wstaw miganie diodą LED

poza tym staraj się sukcesywnie oglądać moje poradniki wideo z bloga (z kanału youtube) to tam to masz już mnóstwo przykładów

_________________
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: 16 mar 2014, o 13:33 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Chodzi mi o najprostszy program beż żadnych dodatkowych plików nagłówkowych itp. Spróbowałem coś takiego sklecić ale nie działa dioda świeci stale zamiast co 1s .Tryb CTC przerwanie od porównania OCR1A


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


Do wstawiania kodu używamy znacznika 'syntax' zamiast znacznika 'code' - poprawiłem - Sonix



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

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Proszę ,oto działający przykład.

Procek Atmega8 ,taktowanie 8MHz.

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

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2014, o 15:02 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Sprawdzę sobie później a mogę prosić jeszcze o przykład z licznikiem w trybie normal ?



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

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Zerknij do noty strona 94, jest tam tabelka i podane są wszystkie tryby i ustawienia bitów.

A no i vector przerwania się zmieni na inny.

Spróbuj sam napisać i wrzuć do wglądu.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2014, o 22:09 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Hmm udało mi się s patrząc na notę PDF i do iom8 (<=- super ściąga ) w WINAVR udało mi się skleić coś takiego tylko niestety dioda mruga co 2 s a nie co 1 s ? Nie wiem czemu. O co chodzi z tym Vectorem ? Jak ustawić timer 1 w tryb normal czy to trzeba jakoś załączać czy po prostu jak wpisze preskaler to się sam załączy ?

Ile trwa 1 s w programie jeśli mam zewnętrzny kwarc 8 000 000 przy użyciu _delay_ms(1000) czy jest to 1/8 000 000 ?

Do czego najczęściej używa się przerwań gdzie są najbardziej używane ?

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: 17 mar 2014, o 23:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Witam
Dioda mruga Ci co 2s prawdopodobnie dlatego że co 1s ją przełączasz
(choć może się mylę) :)

O jaki Vector Tobie chodzi

Timer "chodzi" cały czas Ty tylko musisz go ustawić (wybrać odpowiedni tryb i preskaler wg. PDF-a)
a jeśli chcesz go zmusić do odliczania jakiegoś odcinka czasu (w trybie normal) wpisujesz po
każdym przepełnieniu (przerwaniu od przepełnienia) zadaną wartość od której będzie
on odliczał do następnego przepełnienia.

1 sekunda trwa jedną sekundę nie zależnie jakiego kwarcu użyjesz
nie obraź się ale jest to pytanie mało precyzyjne (a może ja nie rozumiałem) :)

następne pytanie też nie jest precyzyjne
ponieważ przerwania generują różne peryferia (ADC ,Timery, UART , itp.)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2014, o 23:21 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Poprzedni program z trybem CTC zapalał na 1 s i gasił na 1 s a tu wyraźnie działa po 2 s ... o Vectorze wspominał kolega wcześniej dlatego dopytywałem.

Program jest prawidłowy w takim razie ? Zmieniałem wartość TCNT1 i dalej działał na 2s czyli coś jest nie tak bo powinien albo dłużej albo krócej gasić zapalać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 mar 2014, o 10:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Nie wpisuj licz bezpośrednio do licznika ,zresztą zauważ ,że wpisuje się ona tylko raz w inicjalizacji main. Potem w WHILE juz leci bez wpisywania. Daj dodatkową zmienną:

Uwaga program ,pod Attiny2313 ,sprawdź nazwy rejestrów timera w Atmedze 8A ,z tego co pamiętam lekko różnią się nazwą.

Czas migania zmieniasz wartością sekunda w pętli IF. (chyba miga co sek ,nie pamiętam, przelicz).

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



Mam nadzieję ,że pomogłem ? ;)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 mar 2014, o 20:59 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Przełożyłem na Atmege 8 hmm tym razem mruga ale nie wiem jak wyliczyć 1 s próbowałem z wartością sekunda w pętli while ale nic ... proszę o zerknięcie na Kod , z góry dzięki . Dlaczego de tego przerwania potrzebne jest wpisanie jej w pętli w while .

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

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Jeśli moje rozumowanie jest błędne to poprawcie a więc tak
wzór : 1/FCPU*preskaler*zmienna

zegar 8 MHz -> 1/8 000 000 = 0,000 000 125 s
preskaler 256 czyli przepełnienie co 0,000 032 s (32us)
zmienna "sekunda" uint8_t czyli maksymalnie 256
czyli przekręci się przy inkrementacji co 0,008 192 s (około 8 ms)

według moich skromnych obliczeń wielkość zmiennej "sekunda" musiałaby
pomieścić wartość 30 000 aby uzyskać jedną sekundę
np. uint16_t



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 mar 2014, o 09:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Prescaler jest u mnie na 1024 !!! ,więc:

F/prescaler/przepełnienie(OVF)/zmiena

8000000/1024/255/30 = 1sek. (dokładnie 1,0212) sek.

_________________
sig off ;(



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

Dołączył(a): 03 sty 2014
Posty: 29
Lokalizacja: Lubartów
Pomógł: 0

zajrzyj do BB na strony 195-200 tam masz opisane ładnie i przejrzyście jak ustawiać timery i jak obliczać częstotliwość, możesz ustawić licznik aby generował przerwanie co 10 ms następnie w pętli przerwania definiujesz zmienną którą zwiększasz co każde przerwanie np do 100, wtedy zmieniasz stan diody i takim sposobem dioda miga co 1s

a u ciebie co mi się pierwsze rzuciło w oczy
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w samym delayu masz 2s czekania, w dodatku poza pętlą główną while



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 mar 2014, o 14:45 
Offline
Użytkownik
Avatar użytkownika

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

Jeśli chcesz migać diodą co 1s za pomocą Timera1 w trybie Normal to możesz zrobić po prostu tak
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: 19 mar 2014, o 23:31 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Dzięki kolego jacek222 o to mi chodziło ;) Dobrze kombinowałem wcześniej tylko nie wiedziałem że trzeba załadować ponownie wartość TCNT1 na końcu programu. Teraz działa tak jak powinno.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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