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



Teraz jest 26 mar 2026, o 13:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 
Autor Wiadomość
 Tytuł: Problem z PWM
PostNapisane: 3 cze 2016, o 15:43 
Offline
Nowy

Dołączył(a): 03 cze 2016
Posty: 8
Pomógł: 0

Witam.
Mam następujący problem. Zmultipleksowalem dwa 7-segmentowe wyświetlacze led , którymi steruje za pomocą tranzystorów i wyswietlam dwie inne cyfry. Dotychczas sterowałem wypełnieniem pwm na bazę trzeciego tranzystora za pomocą portu OC2 , który dawał napięcie dwóm pozostałym .
Chciał bym sterować jasnością tak aby korzystać tylko z 2 tranzystorów, a nie jak w moim przypadku z 3.
Korzystam z Atmega32.

Poniżej znajduje się mój aktualny listing programu.
Bardzo bym prosił o przerobienie kodu, zgodnie z tym co chciał bym osiągnąć

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


Piszę tutaj po raz pierwszy, więc proszę o wyrozumiałość.
Z góry dziękuje !!!



Ostatnio edytowano 3 cze 2016, o 17:50 przez jokerpik, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 cze 2016, o 16:13 
Offline
Moderator
Avatar użytkownika

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

kilka uwag:

1. paskudnie definiujesz pracę timerów, wszystko w jednej linii - nie wiadomo co robisz , brak komentarzy (napisz ładnie dla każdego timera oddzielnie konfigurację i każdą linię opisz kometarzem

2. spróbuj wyjaśnić co to jest?

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


nie dość że warunek ZAWSZE spełniony to po co on ? to jeszcze dzielisz liczbę całkowitą przez ? ... przez zmiennoprzecinkową stałą dosłowną 4.02 ??? i czego się spodziewasz po tym obliczeniu ?

3. po jaki gwincik korzystasz z typów unsigned int zamiast jak należy się w AVR GCC uint16_t ?

wszystko to razem wzięte powoduje , że program nie tylko przestaje być czytelny dla innych ale ciężko w ogóle szukać w nim błędu albo domyślać się o co chodziło autorowi

_________________
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: 3 cze 2016, o 16:41 
Offline
Nowy

Dołączył(a): 03 cze 2016
Posty: 8
Pomógł: 0

No dobrze to do poprawy mam ten warunek i dzielenie przez wartość zmiennoprzecinkową . Ale czy jest ktos w stanie dopisać to co trzeba aby program zadziałał tak jak o to prosiłem, na pewno dla specjalistów to zaden problem , a ja borykam się od dawna.

Z góry bardzo dziękuje!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 cze 2016, o 19:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

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

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

no i przyśpiesz przerwanie x255 ( a może nie trzeba ).
Nie udzielam gwarancji - masz czas to przetestuj :)

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2016, o 08:38 
Offline
Nowy

Dołączył(a): 03 cze 2016
Posty: 8
Pomógł: 0

Dziękuje bardzo za odpowiedź . Niestety program nie działa. Wyświetla się tylko liczba 2 na drugim wyświetlaczu, której zakres świecenia nie da się zmienić (oczywiście wpisywałem różne zakresy regulacji) ;/Nie zrozumiałem tylko jak mam przyspieszyć przerwanie x255. Ustawiłem OCR0 =255 i tez nic nie zmieniło. Bardzo proszę o dalszą pomoc !!

Pozdrawiam !



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2016, o 09:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
jokerpik napisał(a):
Niestety program nie działa.

To zdanie powinno kończyć Twój ( nieistniejący ) początek wpisu:
"Poprawiłem kod, który teraz wygląda tak:
...
... '' ;)
Niestety ...itd.
Kol.Mirek dał Ci wskazówkę, ja coś tam bąknąłem i tylko wszechmocny elektron wie co z tego wyprodukowałeś.
A zwiększając OCRx spowalniasz przerwanie - skokowo robi się to preskalerem, a płynnie OCRx'em ale w drugą stronę; sam masz w kodzie podane jak sobie obliczyłeś częstotliwość.
Fakt, błędnie napisałem 255 co mogło Cię zmylić - odpowiedniej było napisać 256.
Wyrżnąłem to co ja nie używałem, wyświetlacz sterowany przez TIMER1 bo grzebnąłem na AT8 a tam TIMER0 "inaczej" działa, segmenty pod PORTD - pozmieniaj sobie na swoje i sprawdź.
Nawiasem mówiąc masz skopany "TIMSK"
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdr.



Ostatnio edytowano 4 cze 2016, o 10:17 przez kicajek, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2016, o 09:29 
Offline
Nowy

Dołączył(a): 03 cze 2016
Posty: 8
Pomógł: 0

Fakt, nie zauważyłem. Teraz jesli zmienie pw_zadane to jasnosc sie nie zmienia , ale w pewnym momencie na 2 wyswietlaczach pojawiaja sie sumowane cyfry . Odwrócone 6 z kropką .


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



Dalej zmienia sie tylko czestotliwość miedzy tranzystorami(która powina byc stala) ,a nie wypelnienie ich sygnalu.

W takim razie proszę o dalszą pomoc , i dziękuje z góry !!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2016, o 10:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

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

na coś normalnego, a "A" musi być volatile bo dłubiesz nią w przerwaniu.
OCR0 i preskaler daj taki jak w moim przykładzie.
jokerpik napisał(a):
ale w pewnym momencie na 2 wyswietlaczach
:)
- jakaś zależność tego "pewnego momentu"?
jokerpik napisał(a):
Dalej zmienia sie tylko czestotliwość miedzy tranzystorami

Za pomocą OCRx jest tak jak piszesz, bo PWM załatwiany jest programowo dlatego sugerowałem przyśpieszenie przerwania ponieważ musi obsłużyć załączanie w inny sposób - poczytaj o programowym PWM'ie.

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2016, o 12:17 
Offline
Nowy

Dołączył(a): 03 cze 2016
Posty: 8
Pomógł: 0

Nie za bardzo rozumiem o co Ci chodzi. Analizując kod który od Ciebie dostałem , timer0 jest mi nie potrzebny , wiec ustawianie 0CR0 oraz preskelera jest nie potrzebne . Czy mogł byś mi to jakoś wyjaśnić. I jeszcze jedno pytanie . Jesli ustawie pwm_zadane =1 to swieci sie tylko i wylacznie jeden wyswietlacz i nie zmienia on swojej jasnosci. Po za tym chce moc sterowac jasnoscią wiec gdzie mam przypisac zmienna A/4 (wartosc od 0-255) aby sterowac ?

Schemat https://obrazkiforum.atnel.pl/14139/17e2 ... 5c8614.png


Aktualny kod w ktorym swieci sie tylko cyfra 2

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: 4 cze 2016, o 14:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Już śpieszę z odpowiedzią:
kicajek napisał(a):
wyświetlacz sterowany przez TIMER1 bo grzebnąłem na AT8 a tam TIMER0 "inaczej" działa

inaczej mówiąc sprawdzałem to na ATmega8, a ponieważ Ty masz kod na ATmega32 i tam TIMER0 można wykorzystać w trybie CTC więc uznałem że zapoznasz się z zasadą pwm_programowym, rejestry sobie znajdziesz i skonfigurujesz.
jokerpik napisał(a):
gdzie mam przypisac zmienna A/4

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

tamto pwm_zadane++ z przerwania oczywiście usuwasz.

Jeśli świeci Ci wyświetlacz 2 a jedynka milczy(?) to znaczy że brak Ci połączenia na linii uC-baza PNP - anody wyświetlacza. Testowo zamiast wyświetlacza podłącz do tranzystora jakiegoś LED'a z rezystorem 330R do GND i sprawdź.
Wyjaśnić kod - nie wiem jak Ci to zrobić - no jest to programowy PWM z tym że zamiast poj.
odbiornika mamy wyświetlacz.
A wiesz, że AT32 na PORTC fabrycznie ma włączony JTAG?
Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2016, o 15:27 
Offline
Nowy

Dołączył(a): 03 cze 2016
Posty: 8
Pomógł: 0

Dzięki za odpowiedź oraz pomoc. Napiecie jest na pewno. Po skompilowaniu i wgrania programu , wyświetlacze wariują i nie przestają mrugać(przełączają się na zmianę) , i wyświetla się znowu suma czyli odwrócone 6 . , na obu wyświetlaczach .Jeśli zmienie OCR0 np na 100 to przeskakuja na zmiane 2 na 1 , na wyswietlaczu i tak w kółko. Zmiana położenia potencjometru nic nie daje. Ale potencjometr działa , bo sprawdzałem na nóżce OC0 i diode ładnie rozjasnia i ściemnia.

Usunąłęm tak jak pisałeś to pwm_zadane++ z przerwania,
Aktualny kod
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Mam nadzieje, że w końcu uda się dojść to tego aby to zadziałało :D
I oczywiście proszę o dalszą pomoc !!!!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2016, o 15:44 
Offline
Moderator
Avatar użytkownika

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

Próba zrobienia programowego PWM gdzie licznik PWM ma działać w przerwaniu multipleksowania to kompletne i absolutne nieporozumienie. Wyświetlacze będą mrugać i wariować i to jest normalne jak amen w pacierzu ...

Po pierwsze częstotliwość dla programowego PWM jest za mała w procedurze obsługi przerwania multipleksowania
Po drugie nawet jakby ustawić częstotliwość multipleksowania na jakiś mega max (zupełnie niepotrzebnie bo zabierze się KUPĘ czasu pracy procesora dla pętli głównej) to z kolei i tak jeśli będzie ta sama częstotliwość PWM i multipleksowania to będą się nakładać na siebie obie częstotliwości i będą się działy podobne cyrki - raz jeden może świecić po chwili inny albo będą mrugać na zmianę itp itd

Do tego trzeba zrobić oddzielny i to sprzętowy PWM, tym bardziej że masz taki duży procek i wolne piny i timery na sprzętowy PWM. Najlepiej to jeszcze z dzielnikiem = 1 żeby częstotliwość PWM była DUUUUŻO większa niż częstotliwość multipleksowania żeby nie było interferencji pomiędzy nimi. Chociaż i tak może być nawet wtedy lekkie pływanie. Ale żeby to wyeliminować wystarczy zróżniczkować już sprzętowo wyjście PWM sprzętowego z procka na bazę tranzystora obwodem RC czyli - za rezystorem TUŻ przy bazie tranzystora dać np kondek 1uF do gnd ... być może punkt rozjaśniania nie będzie już od ZERA pwm. Co z tego od ok 10% wartości zacznie już ładnie działać - ważne że będzie działać ;)

Podsumowując pomysł kiepski na programowy pwm w procedurze obsługi multipleksowania jakkolwiek by na to nie patrzeć

_________________
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: 4 cze 2016, o 16:16 
Offline
Nowy

Dołączył(a): 03 cze 2016
Posty: 8
Pomógł: 0

Wow , dzięki wielkie za wyjaśnienie. To dużo mi ułatwi. Wiec wracam do stanu początkowego . Teraz portami sterującymi będą nużki OC0 oraz OC2. Napisałem kod , sugerując się tym aby zostawic sprzetowy PWM , ale niestety nie swiecą sie wyswietlacze.

Proszę o pomoc i pozdrawiam !

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


Pozdrawiam !



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2016, o 18:05 
Offline
Moderator
Avatar użytkownika

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

użyj sprzętowego PWM'a to co teraz zrobiłeś to nie za bardzo wiadomo co to jest ? Po co przerwania włączasz dla sprzętowego PWM ?

_________________
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: 4 cze 2016, o 18:20 
Offline
Nowy

Dołączył(a): 03 cze 2016
Posty: 8
Pomógł: 0

W takim razie jak powinien wygladać listing programu ?

Bardzo prosze o poprawienie i wstawienie bo nie mam juz pojecia.

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2016, o 22:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Tak dla zabawy napisałem kod z wykorzystaniem programowego pwm'a dla dwóch wyświetlaczy 7 segmentowych.
Tak jak pisał wcześniej p. Mirek jest to bez sensu, ale o dziwo działa. Testuję na Atmega32 z rezonatorem kwarcowym 11 059 200Hz.
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: 5 cze 2016, o 22:33 
Offline
Moderator
Avatar użytkownika

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

No z oddzielnym timerem programowym na PWM będzie to śmigać jakoś ale ... warto zobaczyć ile to zasobów czasu zabiera dla programu głównego nie wspominając już o cennych timerach gdy sprzętowe PWM'y leżą odłogiem ;)

_________________
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: 5 cze 2016, o 22:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

mirekk36 napisał(a):
warto zobaczyć ile to zasobów czasu zabiera dla programu głównego

A no zabiera i to sporo! ;)
Tak jak pisałem wcześniej, chciałem się pobawić, no i coś tam z tej zabawy wyszło.
Wniosek:
mirekk36 napisał(a):
sprzętowe PWM'y leżą odłogiem
:D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2016, o 22:56 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
chciałem się pobawić, no i coś tam z tej zabawy wyszło.

Tzn może inaczej - jeśli akurat np już procek i nasz program główny nie ma nic więcej do roboty a działa - no to co stoi na przeszkodzie żeby działało ;)

_________________
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: 5 cze 2016, o 23:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
mirekk36 napisał(a):
Tzn może inaczej - jeśli akurat np już procek i nasz program główny nie ma nic więcej do roboty a działa - no to co stoi na przeszkodzie żeby działało

Odezwałem się w temacie, bo sam w ten sposób przyciemniam wyświetlacze ale:
PWM robię 32 taktowy i dziesięciostopniową skalę jasności (gamma =2) - Termostat na ATmega8 więc roboty nie za wiele.

Pozdr.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


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