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



Teraz jest 11 kwi 2026, o 23:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
 Tytuł: Obsługa Timera
PostNapisane: 30 sie 2014, o 17:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lis 2012
Posty: 35
Lokalizacja: Jaworzno
Pomógł: 0

Witam forumowiczów

Mam taki problem.

Mam ATtiny 24 i timer0 8bit. Ustawiłem go w tryb CTC. Chcę aby wystartować timer zew. przerwaniem INT0 i po przyjściu przerwania od TIM0_COMPA włączam wyjście i po pewnym czasie chciałbym je wyłączyć w tym samym przerwaniu więc wpisuje inną wartość w OCR0A. Jednak zachowuje mi sie to totalnie nieprzewidywalnie. Kod poniżej:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dodam, że taktuje 1MHz więc zwiększanie timera (i co za tym idzie porównywanie wartości TCNT0 z OCR0A) powinno być co 64 us przy danym preskalerze.
Czy dobrze kombinuje czy coś pominąłem ?

_________________
Trochę tu, trochę tam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2014, o 19:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

Kurcze ciężko mi zajarzyć co autor ma na myśli :/ No dobra ale powalczmy:

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


2. Skoro faza = 1, to przy następnym przerwaniu na pewno będzie else:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

Generalnie ja bym to dał do funkcji głównej programu a w przerwaniu od int tylko ustawiał flagę.

Tyle co można powiedzieć do tego kodu, jak by była całość to może więcej by się coś doradziło.

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


Jak chcesz więcej wskazówek i rozwiązania problemu daj cały kod, czyli definicję zmiennych i we/wy pinów. A makrodefinicje nie wiem czy nie powinny być ujęte w cudzysłowie, żeby to tak zadziałało jak masz?

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

Bez średnika na końcu.

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2014, o 20:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lis 2012
Posty: 35
Lokalizacja: Jaworzno
Pomógł: 0

Wielkie dzięki. No trochę mi wytłumaczyłeś co miałem na myśli ;-)
Tylko jest taki myk:
- że ja wartość w OCR0A będę wpisywał różną ponieważ chcę mieć różne czasy załączania i wyłączania. - dlatego wpisuję TCNT0 = 0 aby mieć pewność, że timer ruszy liczyć od zera po ponownym wystartowaniu a nie od jakiejś tam wartości

Mój zamysł sekwencji jest mniej więcej taki:
- przerwanie zew INT0
- startuje timer z jakąś tam wart OCR0A
- przerwanie CTC od timera, wystawienie wys. stanu na wyj i wpisanie nowej wartości do OCR0A
- po upływie pewnego czasu od załączenia "drugie niejako" przerwanie od timera i skasowanie wyjścia
i czekamy na kolejne INT0 aby zacząć całą procedurę od nowa

Mam taki błąd, że to "kasowanie" w drugim przerwaniu odbywa się tak jakby co drugi raz.
Tak jakby wartość OCR0A nie była wpisywana za pierwszym przerwaniem od timera.

Nie wiem czy wyjaśniłem czy bardziej zakręciłem, ale mniej więcej tak to ma działać.

_________________
Trochę tu, trochę tam.



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

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

Jak masz przerwanie i licznik dojdzie do wartości porównawczej to zaczyna zliczać od 0, więc nie masz się o co bać ;)

Co do makrodefinicji, spróbuj dać jak podałem, nie wiem jak wygląda ta z triakiem, może tam masz gdzieś błędzik? Tak po macoszowemu to ciężko zgadnąć :/

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sie 2014, o 20:31 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 17 sie 2014
Posty: 8
Pomógł: 0

Jeżeli temat jeszcze aktualny ...
Czy coś takiego autor miał na myśli ??

(przepraszam za jakość ale to mój program "mathpaint" ma małą dokładność)
Obrazek

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sie 2014, o 21:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lis 2012
Posty: 35
Lokalizacja: Jaworzno
Pomógł: 0

Unter
Dokładnie takie coś.

Przeniosłem faza=0 do przerwania INT0 i jest lepiej, ale dlaczego to nie działało w samym przerwaniu CTC, przecież nie jest blokowana zmiana wartości OCR0A podczas przerwania ??

_________________
Trochę tu, trochę tam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 wrz 2014, o 00:39 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 17 sie 2014
Posty: 8
Pomógł: 0

Nie kompilowałem tego więc mogą być błędy ale do głowy przyszło mi coś takiego
Gdy otrzymamy przerwanie zewnętrzne odpalamy funkcję która włącza ustawiony wcześniej Timer0.
w nieskończonej pętli program sprawdza "warunki przerwań" czyli nasze sztuczne flagi przewanie_int i przerwanie_tim
Gdy napotka na przerwanie tim sprawdza "gdzie jest" według zmiennej idx.
Program może wymakać poprawek i strasznie przepraszam jeżeli coś poplątałem ale intencje miałem dobre :)
Pozdrawiam i powodzenia
Przemek


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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Baidu [Spider] 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