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



Teraz jest 30 mar 2026, o 12:43


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 2 maja 2016, o 15:06 
Offline
Nowy

Dołączył(a): 29 maja 2014
Posty: 5
Pomógł: 0

Witam, mam problem z Timerem0 w Atmega128. Wydaje się jakby procesor w ogóle nie wchodził w przerwanie. Cel jest taki aby co sekunde cały PORTC zmieniał swój stan (program napisany w celu przetestowania timera). Inicjalizuje Timer0 w trybie CTC. Zgodnie z notą Atmegi 128 ustawiłem preskaler, rejestr przepełnienia oraz włączyłem timer. Przerwanie powinno nastąpić co ok. 1/30s. W pętli while zliczam przerwania i po 30 zmieniam stan portu aby otrzymać mruganie co 1s. Niestety nie działa, dziwi mnie to bo wydaje się wszystko w porządku (na innych avr-ach nigdy nie miałem problemów z timerami). Pewnie to jakiś głupi błąd.

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


Pozdrawiam serdecznie i proszę o poradę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2016, o 15:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 mar 2016
Posty: 85
Pomógł: 5

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

_________________
I'M



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2016, o 15:54 
Offline
Nowy

Dołączył(a): 29 maja 2014
Posty: 5
Pomógł: 0

Odwołując się do noty TOIE0 to włącznie przerwania przy przepełnieniu natomiast mnie interesuje przerwanie dla układu porównującego dlatego użyłem OCIE0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2016, o 16:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

A spróbuj zrobić to tak:

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


Trochę rozdzieliłem konfigurację timera - lepiej się czyta

Usunąłem ustawienie bitu COM01 bo z tego co wyczytałem to on powoduje że pin zewnętrzny zmienia swój stan, a Ty chcesz programowo zmieniać i to jeszcze cały port a nie tylko pin (OC0 czyli PB4)

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2016, o 16:47 
Offline
Nowy

Dołączył(a): 29 maja 2014
Posty: 5
Pomógł: 0

Masz racje co do COM01, doczytałem rzeczywiście jest on niepotrzebny w tym zastosowaniu. Niestety po jego wyzerowaniu przerwanie nadal nie następuje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2016, o 16:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

A daj bezpośrednio do obsługi przerwania diodę debugera i sprawdź czy tam się dioda zapali. Jeżeli tak to znaczy że co najmniej 1 raz wchodzi w przerwanie. Następnie daj funkcję toggle dla tej diody i sprawdź czy miga poprzez zmianę częstotliwości. Jeżeli tak to obsługa działa.

U mnie był taki przypadek raz, że jak najpierw ustawiłem preskaler a potem tryb CTC to też nie działało. To był tylko jeden taki przypadek nie wiem dlaczego tak się u mnie działo. Sprawdź ustawienie timera wg tego co Ci wcześniej podałem. Spróbuj też dać wcześniej obsługę przerwanie (przed main)- może też mieć znaczenie.

A daj też Clean dla projektu.

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2016, o 17:57 
Offline
Nowy

Dołączył(a): 29 maja 2014
Posty: 5
Pomógł: 0

Dziękuje za odpowiedzi. Ustawiłem inicjalizacje zgodnie z twoją radą oraz obsługę przerwania przed main. Clean również był. Dodałem diodę debugera. Na początku wygasiłem diodę, następnie przerwanie miało ją zapalić. Okazało się, że procek nie wchodzi w przerwanie (dioda nie zaświeciła). Podczas różnych kombinacji doszedłem do następującego wniosku. Po umieszczeniu debugera:

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


za sei() dioda się nie zapalała. Po umieszczeniu przed sei() dioda zaczęła mrugać tak jakby znajdowała się w pętli nieskończonej. Być może zezwolenie na przerwania nie powiodło się i procesor cały czas się resetuje. Po wyłączeniu przerwania (0<<OCIE0), działa już normalnie. Niestety dalej nie mam pomysłu jak to rozwiązać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2016, o 18:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

Jaki masz kwarc 8MHz? Zewnętrzny czy wewnętrzny?

Spróbuj zmienić ustawienia timera, na np.:

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


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


Tylko wcześniej pin PE0 ustaw jako wyjście.
I to co jest w pętli głównej daj w komentarz, czyli cały program to tylko konfigurację wyjścia, konfiguracja timera i aktywacja przerwań. No i obsługa przerwania.

A jaką masz dokładnie wersję tej Atmegii. Co dokładnie na obudowie pisze?

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2016, o 18:37 
Offline
Moderator
Avatar użytkownika

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

ATmega128 - odwieczny temat fusebit M103 (wyłączyć)


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: 2 maja 2016, o 19:54 
Offline
Nowy

Dołączył(a): 29 maja 2014
Posty: 5
Pomógł: 0

Dziękuje za pomoc, procesor Atmega128-16AU, zegar wewnętrzny 8MHz ustawienie fusebitu M103 rozwiązało problem. Nie spodziewałem się, ale zgłębiając temat rzeczywiście nie tylko u mnie sprawiał problemy w różnych aplikacjach. Jeszcze raz dziękuje i pozdrawiam.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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