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



Teraz jest 29 gru 2024, o 02:47


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 ]
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: 27320
Lokalizacja: Szczecin
Pomógł: 1041

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