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



Teraz jest 27 sty 2025, o 15:26


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 9 lut 2016, o 16:13 
Offline
Nowy

Dołączył(a): 20 gru 2015
Posty: 19
Pomógł: 0

Witam, czy za pomocą przerwania od przepełnienia rejestru TCNT1 licznika Timera1 mogę uzyskać w funkcji przerwania taki przykład aby dwie diody D1 i D2 zapalały się na przemian wciągu 0.5 sek.?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2016, o 16:51 
Offline
Moderator
Avatar użytkownika

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

Możesz - możesz nawet za pomocą każdego timera, ba nawet timera programowego. Przy czym timer programowy to najlepsze rozwiązanie do takich celó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: 9 lut 2016, o 17:13 
Offline
Nowy

Dołączył(a): 20 gru 2015
Posty: 19
Pomógł: 0

dla pojedyńczej diody robię coś takiego
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

co powoduje że dioda wpięta pod PC0 miga sobie co 0,5 sek
ten sam efekt migania co 0,5 sek chciałbym uzyskać dla dwóch diód
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

w efekcie otrzymuję że palą się dwie diody światłem ciągłym nie ma przerwy 0,5 sek i zastanawiam się dlaczego mi to nie wychodzi?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2016, o 17:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

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


Aby diody migały na przemian to przed pętlą główną powinno być:
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: 9 lut 2016, o 17:31 
Offline
Użytkownik

Dołączył(a): 20 lip 2015
Posty: 83
Pomógł: 6

Łooo matko, kolego.. Taka pętla w przerwaniu , to oczywiste ze nie zadziała. Przestudiuj w bb operacje na bitach i sam szybko dojdziesz jak łatwo i szybko to zrobić :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2016, o 18:03 
Offline
Nowy

Dołączył(a): 20 gru 2015
Posty: 19
Pomógł: 0

a dlaczego wewnątrz przerwania Timera1 nie mogę sobie umieścić takiej instrukcji?
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: 9 lut 2016, o 20:41 
Offline
Użytkownik
Avatar użytkownika

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

Witam
Nie musisz(to tak łagodnie ;) ) w przerwaniu dawać "while(1)", ale trzeba dać "static" np.:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2016, o 20:43 
Offline
Użytkownik
Avatar użytkownika

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

Ta pętla while w przerwaniu jest pętlą nieskończoną. Program nigdy z niej nie wyjdzie a tym samym nie wyjdzie również z przerwania.

Na dodatek program w tej pętli będzie się kręcił z bardzo dużą prędkością. Tysiące a może setki tysięcy razy na sekundę. I z tą prędkością są przełączane diody. Dlatego wydaje ci się, że świecą światłem ciągłym.

Jak chcesz wykorzystać przesunięcia bitowe to spróbuj 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: 11 lut 2016, o 21:03 
Offline
Nowy

Dołączył(a): 20 gru 2015
Posty: 19
Pomógł: 0

Witam,mam pytanie odnośnie pierwszej części książki pana Mirka dotyczącej obsługi przerwań. Na str.43 jest podany przykład zapalania i gaszenia LED co 1 sek. mam pytanie odnośnie tego zadania. Wybieramy sobie licznik Timera1 (16 bitowy) o rozmiarze 65536 impulsów. Mam rozumieć że tutaj jest to zrealizowane poprzez porównanie z rejestrem OCRx? Dlatego oblicza pan Mirek 8MHz/preskaler 256=31250Hz, tę częstotliwość 31250/ dzieli przez 1 Hz związku z czym otrzymujemy 31250 impulsów i taką wartość ładujemy do rejestru OCRx, tak?
Pytam dlatego ponieważ na str.43 w kroku nr 5. wartość 65356 jest odejmowana od 31250 co daje 34286 i w tym 5 kroku jest napisane że wartość taką należy załadować do rejestru licznika. I tu powstały moje wątpliwości którą wartość powinienem przypisać do OCR (31250 czy 34286)?

Proszę o wyjaśnienie tego zagadnienia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2016, o 21:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Dlaczego dopisujesz swoje pytanie w innym poście nie związanym z tym problemem?
Zakładam, że chodzi o to że zliczane są przepełnienia licznika. A jak wiesz przepełnienie następuje przy przejściu z 65535 na 0. Więc aby zliczyć 31250 taktów timera trzeba zacząć od 34286, bo od tej wartości do 65536 jest właśnie odległość 31250 taktów.
Gdybyś miał licznik liczący w dół (albo od zera do załadowanej wartości) to ładowałbyś 31250, ale masz liczący w górę od danej wartości do przepełnienia więc zaczynasz od 34286 :)

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2016, o 21:56 
Offline
Użytkownik
Avatar użytkownika

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

Witam
Kroki jak to kroki - raz lewa, raz prawa noga.
Pierwsze obliczenie jest dla OCRx, natomiast co do pkt.5 to w nim (9 linijka ;) )masz napisane:
BB napisał(a):
....ładować do rejestru, TCNT (ten rejestr to licznik)...


Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2016, o 16:03 
Offline
Nowy

Dołączył(a): 20 gru 2015
Posty: 19
Pomógł: 0

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2016, o 13:36 
Offline
Nowy

Dołączył(a): 20 gru 2015
Posty: 19
Pomógł: 0

mam jeszcze pytanie czy umieszczenie funkcji _delay_ms() wewnątrz funkcji obsługi przerwania zewnętrznego jest dobrym zwyczajem, czy mogę umieszczać delaya w ISR(INTx_vect)?

np.

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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Majestic-12 [Bot] i 1 gość


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