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



Teraz jest 9 gru 2024, o 12:49


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 23 sie 2015, o 17:44 
Offline
Nowy

Dołączył(a): 10 mar 2015
Posty: 9
Pomógł: 0

Witam.
W swoim kodzie staram się wykorzystać wewnętrzne przerwania generowane przez TIMER1 atmegi32. Timer działa w trybie 3 (PWM z korekcją fazy). Chcę wykorzystać przerwania po ustawieniu flag TOV1 (do dokonywania pomiaru adc) i OCR1A (do obliczeń nowej wartości PWM'a). Najpierw zapomniałem ustawić flag TOIE1 i OCIE1A w rejestrze TIMSK - program działał, poza pomiarem i obliczeniami nowej wartości PWM (czyli działała komunikacja z PC i ręczne ustawianie PWM). Po dodaniu w main() linijki: TIMSK |= (0<<TOIE1) | (0<< OCIE1A); przestała działać komunikacja. Co robię źle?

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


Kod troszkę długi i może niefachowo poukładany, więc jeśli przy okazji macie pomysł jak go ulepszyć to nie krępujcie się wytykać mi błędów - oczywiście konstruktywnie.



Ostatnio edytowano 23 sie 2015, o 21:19 przez lorddran, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 18:49 
Offline
Użytkownik
Avatar użytkownika

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

Po pierwsze piszesz w języku C, a nie w "język actionscript", popraw to proszę (wybieraz listing kodu: C, zamiast actionscript).

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

robimy to w ustawieniach projektu. Zobacz tutaj.

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

nie ma sensu, zobacz w data sheet str.112 bity TOIE1 I OCIE1A domyślnie są ustawione na 0, poza tym tak się nie zeruje przecież bitów, prawda?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 19:20 
Offline
Nowy

Dołączył(a): 10 mar 2015
Posty: 9
Pomógł: 0

Poprawiłem błędy, bardzo za nie przepraszam ;)
Ok, bezsensowna linijka to mój błąd podczas pisania - nie pytajcie jak ta pomyłka powstała. Naturalnie chciałem napisać
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Niestety to właśnie ustawienie zakłóca mi działanie programu.


Wydaje mi się, że przyczyną jest umieszczenie w przerwaniu ISR(TIMER1_OVF_vect) pętli while. Dobrze myślę?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2015, o 20:07 
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

Pod koniec rozdziału o ADC jest opisany rejestr SFIOR. Są tam bity ADTSx. Należy je ustawić tak, aby przepełnienie timera 1 wyzwalało pomiar. Będzie się to działo automatycznie. Przerwanie TIMER1_OVF_vect i (1<<TOIE1) nie są potrzebne. Należy dodatkowo ustawić bit ADATE w rejestrze ADCSRA oraz przerwanie ADC_vect i w nim pobierać pomiar i wysyłać na port szeregowy tak jak to robisz teraz w funkcji obsługi przerwania od przepełnienia timera 1.

_________________
Dragonus Cracovus: Biomagia



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

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