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 12 cze 2025, o 12:35


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
    Autor Wiadomość
    PostNapisane: 13 kwi 2012, o 21:47 
    Offline
    Użytkownik

    Dołączył(a): 18 lut 2012
    Posty: 50
    Pomógł: 0

    Witam
    Koncepcja PWM z 16 bitowym timer'em 1 nie dała mi spokoju i postanowiłem do niej wrócić. Jednak tym razem postanowiłem rozpocząć zabawę od wyświetlenia zmiennej uint16_t (od 0 do 64 535) i okazało się, że ujawniła mi się dosyć nie ciekawa sprawa. Aczkolwiek ostatnią zmienną, która jest generowana przez procesor to int16_t (od -32 768 do 32 767) i nie wiem dla czego każda zmienna powyżej int16_t jest degradowana do niej. Oczywiście nie jest ona wkomponowana jak narazie w żadną skomplikowaną procedurę bo wpisałem ją w "czysty" program.
    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.

    Możecie mi powiedzieć w czym tkwi problem?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 kwi 2012, o 22:00 
    Offline
    Moderator
    Avatar użytkownika

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

    Problem w niczym nie tkwi .... niestety co najwyżej kolega nie doczytał w książce na temat tworzenia funkcji lcd_int() :(

    Przecież tam wyraźnie masz napisane że posłużyłem się funkcją ITOA() (jak nazwa nadrzędnej funkcji lcd_int) bo chciałem mieć i pokazać jak można zrobić konwersję liczb właśnie int (Integer z zakresu -32768 do 32767) ....

    Więc nic nie jest degradowane jak piszesz ;) .... taki był zamiar i warto czytać jak się tworzy takie biblioteki w szczegółach a nie tylko z nich korzystać w ciemno .....

    Bo gdyby kolega zajrzał dalej do pliku PDF na własnym dysku z dokumentacją tych funkcji wbudowanych w C to szybko by znalazł odpowiedniki konwertujące do innych zakresów, np:

    LTOA() - tym razem Long Int To Ascii

    albo

    UTOA() - czy np Unsigned To Ascii

    wtedy można sobie albo przerobić lcd_ind() albo może lepiej dorobić np:

    lcd_lint()

    albo

    lcd_uint()

    co za problem hmmmm? ;)

    _________________
    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: 13 kwi 2012, o 22:19 
    Offline
    Użytkownik

    Dołączył(a): 18 lut 2012
    Posty: 50
    Pomógł: 0

    Dzięki za odpowiedź. Zmodyfikowałem konwersje na utoa i poszło teraz mogę kontynuować zabawę z PWM'em



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 kwi 2012, o 22:23 
    Offline
    Moderator
    Avatar użytkownika

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

    Proponuję też zajrzeć na DVD do kodów z lekcji o ADC - tam jest z kolei przykład własnej procedurki konwertującej liczby na ASCII z jakimś prostym formatowaniem - warto popatrzeć jak to można robić we własnym zakresie bo też czasem może się przydać.

    _________________
    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: 13 kwi 2012, o 22:59 
    Offline
    Użytkownik

    Dołączył(a): 18 lut 2012
    Posty: 50
    Pomógł: 0

    Jak już pisałem potrzebuję tego typu do PWM i wykonałem je na TIMER1 o dziwo działa jednak jak już pisałeś w książce PWM jeszcze bardziej dzieli Hz dlatego postanowiłem nie preskalować procesora. Rezultat jest taki, że owszem gdy wzrasta "i" długość impulsu jest dłuższa ale wartość odświeżania jest zbyt mała aby oszukać oko, a dodatkowe wyświetlanie tej zmiennej jeszcze bardziej zajmuje procesor. Pytanie więc brzmi: Jak temu zaradzić? Próbowałem zwiększać i zmniejszać rejestr OCR ale chociaż przyśpieszyło się wykonanie zadania to jednak nadal bez oszustwa.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 kwi 2012, o 23:00 
    Offline
    Użytkownik

    Dołączył(a): 18 lut 2012
    Posty: 50
    Pomógł: 0

    Oczywiście mam pod PWM podpięte dwie diody



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 kwi 2012, o 23:10 
    Offline
    Moderator
    Avatar użytkownika

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

    Ale ja nie za bardzo widzę o co chodzi - musiałbym przynajmniej twój kod zobaczyć - inaczej nie umiem nic podpowiedzieć :(

    _________________
    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: 14 kwi 2012, o 11:50 
    Offline
    Użytkownik

    Dołączył(a): 18 lut 2012
    Posty: 50
    Pomógł: 0

    Jeżeli dobrze rozumuję działanie timera to jest to taki licznik, który każdy nowy Hz uderzenia procesora inkremenduje jego wartość po czym jeżeli dojdzie do swojej maksymalnej wartości, w tym przypadku 65 536 rozpoczyna liczenie od nowa?
    Czyli jeżeli mam taktowanie 20MHz bez preskalacji 20MHz/65 536 = ok. 305Hz? Tyle razy jest zliczane uint16_t przez procesor.

    W ostatnim akapicie ze strony 228 jest napisane:
    Cytuj:
    "Jeżeli nasz licznik zlicza z częstotliwością 40kHz, to jeśli utworzymy PWM 8-bitowy, częstotliwość tę trzeba podzielić przez 256[...]"


    Czyli w teorii mam odświeżanie ok 305Hz czyli oko powinno się poddać a reszta programu (wyświetlanie zmiennej na LCD) nie powinno spowalniać działania procesora a dzieje się odwrotnie: inkremendowanie zmiennej jest bardzo spowolnione(bez polecenia delay zachowuje się jakby to polecenie było z wartością ms(100) ) a o "mruganiu" diody nie wspomnę.

    Pomyślałem sobie, że jeżeli nie preskaluje automatycznie wykorzystuję 100% procesora to dodałem preskaler przez 8 (305/8=38Hz) niby 25Hz wystarczy ale preskalacja w ogóle nie zmieniła działania diody, owszem inkremendacja zmiennej przyspieszyła się ale to nie jest rozwiązaniem bo program ma działać w 100% a nie w 50%.

    Oto kod który wyskrobałem bazując na przykładzie z płyty
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    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: 14 kwi 2012, o 13:25 
    Offline
    Moderator
    Avatar użytkownika

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

    Po pierwsze to nie zrozumiałeś może do końca - a przecież przytoczyłeś prawidłowy cytat z książki, przeanalizuj sobie jak to jest z tym 8-bitowym PWM'em bo popełniasz duży błąd w rozważaniach i w ogóle niepotrzebnie sięgasz po ten timer 16-bitowy.

    pomyśl sobie co ci da to że przy F_CPU = 20MHz użyjesz timera1 i po przepełnieniu będziesz miał 305Hz ???

    z tą częstotliwością 305Hz to ty dopiero będziesz miał przerwanie w którym masz zamiar inkrementować liczniki programowych PWM'ów .... to jak sobie to wyobrażasz - przecież nawet jak byś chciał zrobić 8-bitowy to:

    305/8 = 38 !!!! i to jest dopiero odświeżanie !!!

    a ty przecież chcesz zrobić 16-bitowy więc:

    305/65536 = 0.0046Hz ;) co to jest ? coś tam będzie sobie pomigiwać

    zacznij może od tyłu to będzie ci łatwiej - np ustalasz sobie że odświeżanie chcesz mieć powiedzmy 100Hz

    więc 100 * 65536 = 6553600Hz (6,5MHz !!!!!!) taka musi być częstotliwość timera !!! ale i przerwania - a to już tak mało czasu na wykonanie przerwania będzie, że samo przerwanie będzie absolutnie spowalniać ci działanie nie tylko programu głównego ale będziesz wręcz gubił przerwania jeśli w tej procedurze będziesz nawet proste i niewiele operacji wykonywał. Efektem tego będzie jedno wielkie nieporozumienie niestety

    zrób sobie 9- albo nawet 10-bitowy PWM programowy to ci jeszcze się uda żeby procek wydolił

    dla 9-bitowego:

    100 * 512 = 51200Hz (to i tak już bardzo krótki czas na przerwnia - policz sobie przerwanie musi się wykonać co ok 19us !!! no ale jeśli założyć że weźmiesz taktowanie 20MHz to jeden cykl/rozkaz wykona się w czasie 50ns - teraz zależy ile tych rozkazów będzie w przerwaniu - jeśli podzielisz:

    19us / 50ns - to wyjdzie ci że masz 380 cykli pomiędzy przerwaniami. Jeśli zużyjesz kodu na połowę tego to jeszcze będzie jakoś całość działać

    przy 10-bitowym będzie jeszcze gorzej ;)

    100 * 1024 = 102400Hz ....

    czyli przerwanie co ok 9,7us !!!!!!!!!!!!!!

    _________________
    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: 14 kwi 2012, o 13:44 
    Offline
    Użytkownik

    Dołączył(a): 18 lut 2012
    Posty: 50
    Pomógł: 0

    Czyli jeżeli dobrze rozumiem to bardziej się opłaci użyć timera 8-bitowego bo można uzyskać większe odświeżanie a większa rozdzielczość PWM uzyskać za pomocą dania większego typu zmiennej licznik w przerwaniu?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 kwi 2012, o 14:08 
    Offline
    Moderator
    Avatar użytkownika

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

    Tzn inaczej - timera to można użyć dowolnego ale jak pisałem w książce:

    - jeśli daną operację można wykonać za pomocą timera 8-bitowego i 16-bitowego : to zawsze wybierz 8-bitowy bo 16-bitowy jest cenniejszy z punktu widzenia programistycznego i zostaw go sobie na później ;)

    o to z tym chodzi

    natomiast w przypadku liczenia podziałów dla programowego PWM to właśnie zapominasz o ostatnim podziale przez rozdzielczość swojego PWM'a

    czyli przypominam:

    np F_CPU = 8MHz a odświeżanie ma być powiedzmy 150Hz i PWM 8-bitowy:

    F_CPU / preskaler / rozdzielczość_PWM / odswieżanie = OCR

    8MHz / 1 / 256 / 150 = 208 do rejestru OCR gdy timer odpalisz w trybie CTC

    a teraz np:


    F_CPU = 20MHz a odświeżanie ma być powiedzmy 100Hz i PWM 9-bitowy:

    20MHz / 1 / 51200 / 100 = 3,9 ale można zaokrąglić do 4 to odświeżanie wyjdzie ( 20MHz/1/51200/4 = ok 97Hz)

    teraz jaśniej ?

    _________________
    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: 14 kwi 2012, o 14:23 
    Offline
    Użytkownik

    Dołączył(a): 18 lut 2012
    Posty: 50
    Pomógł: 0

    Czyli nieważne jakiego timera użyję ale ważne jest z jaką rozdzielczością chcę go użyć.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 kwi 2012, o 14:51 
    Offline
    Moderator
    Avatar użytkownika

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

    infa08 napisał(a):
    Czyli nieważne jakiego timera użyję ale ważne jest z jaką rozdzielczością chcę go użyć.


    tak tylko że chodzi o rozdzielczość PWM'a a nie timera w tym wypadku - taka tylko już drobna uwaga.

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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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