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



Teraz jest 3 sty 2025, o 06:36


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 7 lut 2014, o 23:05 
Offline
Nowy

Dołączył(a): 07 lut 2014
Posty: 4
Pomógł: 0

Dzień dobry,

to mój pierwszy post na forum, zatem witam, na imię mam Michał i .... właśnie rozpocząłem przygodę z mikrokontrolerami i programowaniem jako takim :)

EDIT: procesor ATMEGA8, dioda do PB1 przez rezystor do GND, świeci przy stanie wysokim.

Pozwoliłem sobie skorzystać z kodu z zagranicznego forum (http://budgetlightforum.com/node/28443) i jego minimalnej modyfikacji, do napisania dimmer'a/ściemniacza do diody LED. Idea jest taka, że generuję sprzętowy PWM a mikroswitchem "skaczę" po tablicy "trybów pracy" od 0/255 poprzez kolejne wartości do max 255/255. 0,4s przytrzymanie przycisku powoduje włączenie/wyłączenie diody (ustawienie 0/255). I tutaj zaczynają się schody - niby wszystko działa ... ale w trybie wyłączonym/po starcie procesora (PWM na 0/255) dioda minimalnie się świeci. Czy mógłby ktoś mi wyjaśnić dlaczego tak się dzieje i co z tym fantem zrobić?

Jestem po kilku filmikach pana Mirka, pewnie sporo nabroiłem, ale starałem się uniknąć najwięcej błędów - zatem zasilanie z programatora USBasp oraz jest filtrowane (vcc i gnd przez ceramik 100nF i 2,xuF elektrolityczny a avcc i gnd przez dławik i kondensator).

Poniżej załączam kod i filmik z moim problemem.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.




Pozdrawiam, Michał :)

kila :
1. Kod umieszczaj proszę w znacznikach synax=c
2. Filmy z YT umieszczaj w znacznikach youtube, gdzie między znacznikiem umieszczasz ciąg znaków w linku, znajdujący się po ?v=



Ostatnio edytowano 8 lut 2014, o 08:52 przez wrogu, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 00:02 
Offline
Użytkownik

Dołączył(a): 22 gru 2012
Posty: 256
Lokalizacja: Rumia
Pomógł: 22

Witam :)
Piszesz że oglądałeś filmy Mirka, ale kod jakiś taki nie "Mirkowy" ;) , jeśli wiesz o czym piszę :)
Co do sprawy żarzenia się diody, wynika to z faktu że na wyjściu PWM pojawia się "szpilka" która przy zerowym wypełnieniu powoduje właśnie żarzenie się diody; jeśli źle wytłumaczyłem niech mnie ktoś poprawi :)
Rozwiązaniem może być odwrócenie sterowania diodą, czyli nie wartość 0 będzie oznaczała że dioda nie świeci, a wartość 255, czyli odwrotnie niż to jak masz teraz.
Drugi sposób jest taki że gdy ustawiasz przyciskiem PWM na 0, to w następnym kroku wyłączasz bit odpowiedzialny za załączanie PWM.
To tyle chyba w ramach teorii ;)

------------------------ [ Dodano po: 1 minucie ]

A tak w ogóle to na jakim procku się bawisz?


Autor postu otrzymał pochwałę

_________________
http://www.marcingibas.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 00:55 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Na przyszłość podaj przynajmniej typ mikrokontrolera bo trzeba strzelać w ciemno. To samo z podłączeniem. Nie napisałeś jak masz podłączoną diodę. Też trzeba się domyślać z filmiku. Ja na nim widzę, że zapalasz diodę stanem wysokim z kontrolera. Masz ustawiony tryb non-inverting mode czyli że wyjście OC1A jest ustawiane w stan wysoki za każdym razem kiedy licznik będzie BOTTOM. Dla OCR1A=0 oczywiście nastąpi Compare Match i wyjście zostanie przełączone w stan niski - dioda zgaśnie. Niemniej jednak w tym trybie co najmniej przez 1 tick wyjście jest w stanie wysokim i dioda świeci. Masz wypełnienie 1/255. Żeby było całkiem ciemno wybierz tryb inverting mode. gdzie Compare match zapala diodę ale dla OCR1A=TOP Compare match jest ignorowane więc wyjście nigdy nie zostanie ustawione w stan wysoki. Tak przynajmniej mi się wydaje :)


Autor postu otrzymał pochwałę

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 08:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 gru 2012
Posty: 530
Lokalizacja: Bydgoszcz
Pomógł: 8

Rzuć okiem na kod w moim podpisie, może Cię zainspiruje.


Autor postu otrzymał pochwałę

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 08:49 
Offline
Nowy

Dołączył(a): 07 lut 2014
Posty: 4
Pomógł: 0

Ah, przepraszam, dodaję zatem niezbędne szczegóły (wrzucę też w post główny) - procesor (uwaga uwaga) atmega 8 :D

Cytuj:
Masz ustawiony tryb non-inverting mode czyli że wyjście OC1A jest ustawiane w stan wysoki za każdym razem kiedy licznik będzie BOTTOM. Dla OCR1A=0 oczywiście nastąpi Compare Match i wyjście zostanie przełączone w stan niski - dioda zgaśnie. Niemniej jednak w tym trybie co najmniej przez 1 tick wyjście jest w stanie wysokim i dioda świeci.


O, to jest odpowiedź która wyjaśnia to moje świecenie, dzięki :!: Faktycznie dioda jest połączona do GND i świeci dla stanu wysokiego portu PB1.

Dodam tylko, że sterownik później (kiedyś, w dalekiej przyszłości, jak się jeszcze paru rzeczy nauczę) będzie sterował sygnałem TTL zrobionym na MC34063 (lub dla większego projektu jakimś chipem na większe moce) - dla którego stan niski 0V będzie oznaczał max świecenia. Niestety po połączeniu dwóch układów większa diodka też mryga w stanie wyłączenia ....

... ale podpowiedź
Cytuj:
Drugi sposób jest taki że gdy ustawiasz przyciskiem PWM na 0, to w następnym kroku wyłączasz bit odpowiedzialny za załączanie PWM.
zastosuję, na chłopski rozum o 8 rano powinno to chyba być najlepszym rozwiązaniem.

Postaram się zmodyfikować kod na "modłę" Mirkową bo jest faktycznie bardzo czytelna. Na szybko miałem rozpisaną tabelkę z rejestrami TCCRxy i jakoś z tymi liczbami binarnymi się dało pracować. Niemniej jednak popracuję nad przejrzystością kodu, zgodnie z poradami.

Zaraz siadam do roboty, dziękuję Panowie za pomoc! Zdam relację z efektów :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 11:45 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

wrogu napisał(a):
Dodam tylko, że sterownik później (kiedyś, w dalekiej przyszłości, jak się jeszcze paru rzeczy nauczę) będzie sterował sygnałem TTL zrobionym na MC34063 (lub dla większego projektu jakimś chipem na większe moce) - dla którego stan niski 0V będzie oznaczał max świecenia. Niestety po połączeniu dwóch układów większa diodka też mryga w stanie wyłączenia ....


No to chyba tak jak miałeś jest dobrze tylko odwróć diodę. Jeżeli dasz anodę do Vcc a katodę do pina kontrolera to uzyskasz to o co ci chodzi czyli dla OCR1=0 masz maksymalne świecenie a dla OCR1A=255 dioda się nie zapali. Trzeba oczywiście odwrócić tablicę mode[]. Osobiście uważam, że jest potrzebne dodatkowe zatrzymywanie PWM żeby uzyskać całkowite wyłączenie diody. Trzeba tylko odpowiednio dobrać tryb pracy.

[Edycja]
Oczywiście w powyższym zdaniu zbrakło słówka NIE :) co wypaczyło jego sens. Oczywiście uważam że NIE jest potrzebne zatrzymywanie PWM'a żeby zgasić diodę całkowicie.

_________________
sig off ;(



Ostatnio edytowano 8 lut 2014, o 12:37 przez perlon, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 12:02 
Offline
Nowy

Dołączył(a): 07 lut 2014
Posty: 4
Pomógł: 0

Hej,

wprowadziłem proponowane zmiany, pokombinowałem, przepisałem i upiększyłem kod, wyszło coś takiego:

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


Wszystko pięknie śmiga. Niemniej jednak mam kilka pytań. Pierwsze z nich to to, że stosując kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

(przy pierwszym włączeniu po resecie procka było ok) do wyłączenia/ponownego włączenia świecenia musiałem wykorzystać dwa kliknięcia. Przy wyłączaniu najpierw procek przechodził w tryb "tego minimalnego świecenia" - tj. OCR1A=0;

Po zamianie średników na przecinki program działa prawidłowo:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wychodziłoby na to, że program wykonuje jakoś po kolei te polecenia a nie wszystkie 3 naraz tj. ustawia COM1A0,1 na 00 lub 01 dopiero po kolejnym długim kliknięciu, przy zastosowania średnika. Wstawienie przecinka rozwiązało sprawę.
(poszukałem odpowiedzi tutaj: http://stackoverflow.com/questions/2087 ... in-c-and-c ale jeszcze średnio łapię)

A drugie pytanie, może nieco na wyrost, tzn. jeszcze nie zagłębiłem się w ten dział wiedzy (książkę planuję dopiero kupić więc posiłkuję się wiedzą z internetu, ale kupię, bo z każdym filmikiem utwierdzam się w przekonaniu, że jest baaardzo przydatna) to zużycie pamięci - tj. czy rejestry są zapisywane w EEPROM i czy takie cykliczne męczenie TCCR1A może nam rozwalić procka? niby te 10k-100k cykli to sporo, ale .... ;)

A druga sprawa to taktowanie procka. Teraz pracuję na 1MHz. Docelowo maksymalne świecenie układu będzie dla stanu niskiego na wyjściu PB1 (w sumie mogę już teraz odwrócić na inverting mode i podpiąć diodę do VCC i PB1, czyli dla OCR1A=255 non stop stan niski, dioda świeci maksymalnie) czyli procek dla maksymalnego świecenia będzie pobierał mniej mocy. Żeby jeszcze obniżyć pobór energii przez procka chciałbym obniżyć jego taktowanie, rozumiem, że do tego trzeba zastosować już zewnętrzny oscylator i przez fusbity nie da się obniżyć taktowania poniżej 1MHz. Zdaję sobie również sprawę, że muszę brać pod uwagę częstotliwość PWM na wyjściu by nie było efektu strobo :D

Dzięki za dotychczasową pomoc :)

EDIT:

Cytuj:
Żeby było całkiem ciemno wybierz tryb inverting mode. gdzie Compare match zapala diodę ale dla OCR1A=TOP Compare match jest ignorowane więc wyjście nigdy nie zostanie ustawione w stan wysoki. Tak przynajmniej mi się wydaje


Jeszcze sprawdzę to rozwiązanie, rozumiem, że dla 255 nie będzie świecenia, a dla 0 będzie max.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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