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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 10 lip 2025, o 06:02


    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 ] [ Zaznacz wszystko ]
    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO