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



Teraz jest 19 kwi 2024, o 19:53


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 10 gru 2012, o 18:37 
Offline
Nowy

Dołączył(a): 07 gru 2012
Posty: 6
Pomógł: 0

Witam.
Chce wygenerować dwa sygnały PWM o różnym współczynniku wypełnienia. Kod jest przedstawiony poniżej. W zamyśle chciałem użyć trybu fast PWM, gdzie górną granicą do której zlicza licznik jest ICR1(granica ta wyznacza częstotliwość sygnału). Wartości OCR1A i OCR1B służą do regulacji współczynnika wypełniania (duty_cycle) w zakresie od 0 do 99%. Istnieje jakiś sposób albo sztuczka umożliwiająca generowanie na timerze1 sygnału o dwóch różnych częstotliwościach(częstotliwość pierwszego powinna być dwa razy większa od drugiego)? Poniższy kod jest prawidłowy?
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: 10 gru 2012, o 18:57 
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

Zamiast tego zapisywania SREG i cli() lepiej te operacje na 16-bitowych rejestrach zamknij w:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

wtedy łatwiej zapanować nad kodem. A w swoich przykładach zapomniałeś o sei();. Trzeba dołączyć util/atomic.h

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2012, o 19:08 
Offline
Nowy

Dołączył(a): 07 gru 2012
Posty: 6
Pomógł: 0

Cytuj:
Tyle razy się mówiło na tym forum, żeby nie umieszczać częstotliwości taktowania w define w pliku, ale w ustawieniach projektu.

Tego dowiedziałem się po moim pierwszym poście. Ta częstotliwość służy jedynie do obliczania okresu itp bo projekt będzie testowany na różnych częstotliwościach.
Cytuj:
Programowy PWM to nic trudnego, a będziesz mógł na nim wygenerować nawet z 10 różnych sygnałów

Taki program już sobie napisałem kiedyś. Bałem się wystąpienia przerwania w przerwaniu.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Chodzi mi o to czy kod który napisałem w pierwszym poście tego tematu jest poprawny.

Cytuj:
A w swoich przykładach zapomniałeś o sei();. Trzeba dołączyć util/atomic.h

Hmm chodzi Ci o wpisanie sei() bo wczesniej wpisałem cli? Zapewnia to kopia rejestru SREG bo z tego co wyczytałem to tam jest flaga sei.
Cytuj:
Zamiast tego zapisywania SREG i cli() lepiej te operacje na 16-bitowych rejestrach zamknij w:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ten zapis znalazłem w nocie katalogowej, ale spróbuje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2012, o 19:28 
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

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

W 2 funkcji podobnie.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2012, o 19:36 
Offline
Nowy

Dołączył(a): 07 gru 2012
Posty: 6
Pomógł: 0

Cytuj:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a powinno być a < 100 && a > 0 i jedno i drugie

Racja. Wcześniej warunek był inny i zapomniałem tego zmienić.
Cytuj:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Faktycznie o to mi chodziło. Co oznacza zapis 100UL ? U pewnie unsigned a L to mi się kojarzy z Long.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2012, o 19:53 
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

Chodzi o to, że kompilator mnożąc liczbę 16-bitową razy inna liczbę może przekroczyć pojemność 16-bitowej liczby choć sam wynik na pewno jest mniejszy niż 65535. Jak jeden z czynników jest usigned long int (32-bitowy) to obliczenia zostaną na pewno poprawnie wykonane.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2012, o 20:09 
Offline
Moderator
Avatar użytkownika

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

Krauser napisał(a):
Chodzi o to, że kompilator mnożąc liczbę 16-bitową razy inna liczbę może przekroczyć pojemność 16-bitowej liczby choć sam wynik na pewno jest mniejszy niż 65535. Jak jeden z czynników jest usigned long int (32-bitowy) to obliczenia zostaną na pewno poprawnie wykonane.


dlatego polecam autorowi przeczytać dokładnie np to:

http://atnel.pl/domyslna-promocja-do-typu-int.html


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: 11 gru 2012, o 14:32 
Offline
Nowy

Dołączył(a): 07 gru 2012
Posty: 6
Pomógł: 0

Cytuj:
dlatego polecam autorowi przeczytać dokładnie np to: htttp://atnel.pl/domyslna-promocja-do-typu-int.html

Z tego w sumie wynika, że takiego zapisu nie muszę stosować, ponieważ jedna z liczb 16 bitowa i nastąpi nie jawne rzutowanie na tryb 16 bitowy. Ale warto wiedzieć.
Natomiast chciał bym się dowiedzieć czy to co ja zrozumiałem z datasheetu jest prawdą. Chodzi mi o ustawienie granicy do której ma zliczać licznik 1 za pomocą ICR1, a za pomocą OCR1A i OCR1B, chcę ustawiać dwa różne współczynniki wypełnienia. Jest to możliwe? Na stronie 98 widnieje coś takiego:
Gdy flagi WGM13, WGM12 i WGM11 są ustawione(tryb 14) wtedy wartość max wyznacza ICR1, następnie w rejestrze TCCR1A ustawiam COM1A1 i COM1B1 co wg strony 96 dla trybu fast PWM powinno dawać stan wysoki dla piniu OC1A gdy stan licznika jest mniejszy niż OCR1A i stan wysoki na OC1B gdy stan licznika jest mniejszy niż OCR1B.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Sprawdzałem to dzisiaj i nie chciało działać. Próbowałem na atmedze 32, sprawdzałem czy te rejestry są inne i tylko piny OC1A i OC1B były w innym miejscu co poprawiłem w kodzie. Źle interpretuje datasheet czy po prostu robię gdzieś błąd?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2012, o 14:43 
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

Musisz jeszcze uruchomić timer ustawiając dodatkowo wybrane bity CS12, CS11, CS10 w rejestrze TCCR1B. Np.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę

_________________
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: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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