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 27 lip 2025, o 06:35


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
    Autor Wiadomość
    PostNapisane: 1 wrz 2019, o 22:18 
    Offline
    Użytkownik

    Dołączył(a): 27 sty 2016
    Posty: 30
    Pomógł: 0

    Witam.
    Atmega324 (20MHz), do niej podpięte kilka rzeczy jak np. czujki, przyciski, ekspandery, diody oraz oled ssd1306 na I2C.

    Problem:
    jeśli nie za komentuję inicjalizacji Timera2 to OLED potrafi się "przyciąć" -> cały procek się wiesza bo kontrolna dioda migająca w pętli głównej przestaje świecić. Np. mkMenu działa sobie super ale niestety jak połączymy to z repeat i np. ustawiam zmienną w menu od 0 do 7, to robiąc to powoli działa wszystko ok, ale jak przytrzymam przycisk to wystarczy 3 obiegi w koło (około 4sekundy to trwa) i procek zawiśnie.
    Również wcześniej miałem kłopoty z funkcją mk_ssd1306_refresh_pages gdyż czasem powodowała że układ stron (pages na oled) się zmieniał i po restarcie np. page0 zaczynało się od page6. Przykład z animacją pojawiającą się z prawej i znikającą z lewej przy użyciu mk_ssd1306_refresh_pages, też nie działał (animacja potrafiła stanąć w pewnym miejscu). Zaznaczę że po wyłączeniu Timera2 problem nie występował.

    Timer0 używam do programowych zwalniaczy (dioda, przyciski itp), Timer2 do wysterowania PWM dla 0-16 taśm led poprzez ekspandera (obecnie podpięte zwykłe diody przez tranzystory). Udało mi się uzyskać 50Hz dla 128PWM'a, metodą "diodową" zmierzyłem że taki PWM zabiera mi około 35% czasu programu.

    kilka fragmentów kodów

    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: 2 wrz 2019, o 19:14 
    Offline
    Użytkownik

    Dołączył(a): 18 sie 2019
    Posty: 69
    Zbananowany użytkownik

    Pomógł: 2

    Nie sądzę aby ktokolwiek potrafił pomóc widząc te dwa fragmenty kodów dotyczące tylko inicjalizacji peryferiów.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 wrz 2019, o 19:16 
    Offline
    Moderator
    Avatar użytkownika

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

    Semi napisał(a):
    Nie sądzę aby ktokolwiek potrafił pomóc widząc te dwa fragmenty kodów dotyczące tylko inicjalizacji peryferiów.


    Trudno się z tym nie zgodzić, więc panie autorze - pokaż pan swój plik main.c albo jego istotne fragmenty - i co najważniejsze swoją procedurę obsługi przerwania tegoż timera

    _________________
    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 wrz 2019, o 21:14 
    Offline
    Użytkownik

    Dołączył(a): 27 sty 2016
    Posty: 30
    Pomógł: 0

    main.c
    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.


    pwm.c
    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.


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


    Obecnie w Init_Oled (uint8_t vcc, uint8_t refresh) dodałem
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    aby I2C zwolniło do około 100KHz -> testując program, zacina się już tylko naprawdę "czasem".



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2019, o 06:59 
    Offline
    Użytkownik

    Dołączył(a): 18 sie 2019
    Posty: 69
    Zbananowany użytkownik

    Pomógł: 2

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

    zmień ">=" na "==". Przerwanie będzie zajmować mniej czasu CPU. Czekanie w pętli na przerwaniu to zły pomysł
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Wysyłaj na przerwaniach albo po jednym bajcie co drugie przerwanie.

    Niepokojące jest
    stanleygoldi napisał(a):
    zmierzyłem że taki PWM zabiera mi około 35% czasu programu.

    Dla jakiś hyper rozbudowanego program ok ale dla tak banalnego? Ile się da powinno być zrobione sprzętowo. Mega2560 ma 12 PWM. W praktyce pewnie będa konflikty i nie wszystkie da się wykorzystać ale jak nawet 8 PWM będzie sprzętowo to tylko drugie 8 będa znacznie obciążały CPU. Inna opcja zewnętrzny PWM np PCA9685 albo WS2811. Komunikacja do WS2911 obciąża znacznie AVR ale dane wysyłasz tylko gdy coś się zmienia.

    ------------------------ [ Dodano po: 2 minutach ]

    Przerwanie od timera 1 nie pokazałeś. Tajemnica firmy?

    ------------------------ [ Dodano po: 8 minutach ]

    Co do wyświetlacza, to używany jest bufor i przerwania? Obstawiam, że nie więc użyj tego mechanizmu. Przy 128x64 potrzebny 1kB RAM, jak to dużo to zmień mikrokontroler na taki co ma więcej RAM.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2019, o 10:28 
    Offline
    Użytkownik

    Dołączył(a): 27 sty 2016
    Posty: 30
    Pomógł: 0

    Dzięki za uwagi, faktycznie można zrobić warunek == zamiast >=. Timer1 jest wyłączony, ewentualnie użyje go do wysterowania taśmy RGB lub też jak sugerowałeś, ten SendSpi16 może by przerzucił właśnie do tego timer'a1 - tylko najlepiej co jaki czas aby te bajty dwa się wysyłały?
    Co do projektu to 2 lata temu robiłem podobny i to na zewnętrznych scalakach do PWM'a, ale to jest projekt na studia więc chce pokazać że i na małych prockach da radę w miarę sensownie obsługiwać programowo PWM'a.

    Co do wyświetlacza to właśnie zmieniłem atmege 16 an 324 ponieważ tego ramu mi brakowało do buforowania. Wyświetlanie jest robione normalnie, nie w przerwaniu, pod menu podpięta jest funkcja:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Dla menu tworzyłem sobie np. nowe funkcje dla np. kasowania i wyświetlana kursora dawałem inną funkcję -> ssd1306_refresh_pages, (chodziło poprawnie). Kolejny pomysł to aby np. przy ustawianiu pewnego parametru przy autorepeat, odświeżał się tylko dany page a nie cały wyświetlacz -> wtedy już nie będzie zacinać.



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

    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