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



Teraz jest 4 kwi 2026, o 12:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 29 ] 
Autor Wiadomość
PostNapisane: 13 paź 2014, o 16:59 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Witam.

Napisałem dziś program na Atmege8 + kawrc 8MHZ + wyświetlacz LCD + czujnik ds18b20 + dioda RGB + 3 x switch. Problem polega na tym, że gdy włączę diodę RGB i ustawie jej przykładowo R=10, G=10, B=10, następnie przejdę do odczytu temperatury to widać, jak dioda co jakiś czas delikatnie mruga. Gdy wyjdę z odczytu temperatury dioda świeci normalnie. Gdy zwiększę wartości R, G i B to efekt ten jest coraz mniej zauważalny... Używam dwóch Timerów, jeden do odczytu temperatury z ds18b20, drugi do sterownia diodą. Czy te dwa Timery mogą mieć jakiś wpływ na siebie? Jak dla mnie wygląda to tak, że dioda zaczyna delikatnie migać jak dokonywany jest odczyt z czujnika ds18b20... Czy ktoś ma jakiś pomysł jak to rozwiązać?

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.

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2014, o 17:04 
Offline
Moderator
Avatar użytkownika

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

obsługa 1wire zwykle musi wyłączać przerwania na jakiś czas, ale jeśli stosujesz sprzętowy PWM nie powinno być problemów jeśli zaś programowy to będzie oczywisty problem

_________________
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 paź 2014, o 17:08 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Stosuje PWM programowy jak widać z tego co wrzuciłem powyżej... Czyli jeśli zastosuje PWM sprzętowy to problem zniknie? Nie da się tego jakoś przeskoczyć, aby nadal używać sprzętowego PWM'a i pozbyć się migania diody? Podobny problem mam z obsługą mikroswitchy. Gdy zacznie się odczyt z czujnika nie za każdym razem działa mikroswitch i nie chce wrócić do poprzedniego menu...

Teraz zacząłem się bawić ustawieniami TIMERA1 i zastanawiam się dlaczego jeśli zmienię wartość OCR1A = 200; na przykładowo OCR1A = 50; to ma to wpływ na działanie mikrowitchy? Przy OCR1A = 50; mirkowitche trzeba dłużej przytrzymać, żeby zmieniły wartość, a przecież TIMER1 uzywam do PWM'a dla portów PC0, PC1, PC2... Ma to coś ze sobą wspólnego...

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2014, o 18:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

Kolega ja bym wpakował odliczanie czasu dla DS18B20 i tryb PWM w jeden Timer.
Niestety nie wiem jakie masz czasy poustawianie przerwań - brak jakichkolwiek komentarzy w kodzie.

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2014, o 19:26 
Offline
Moderator
Avatar użytkownika

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

mateusz_dan napisał(a):
Podobny problem mam z obsługą mikroswitchy. Gdy zacznie się odczyt z czujnika nie za każdym razem działa mikroswitch i nie chce wrócić do poprzedniego menu...


No tak to się nazywa pociągnięcie kota za ogon - sorki za porównanie ale idąc tym tropem to zaraz ktoś gotów napisać, że przez tą obsługę 1wire to nawet mu woda nie chce się zagotować w czajniku ....

Na prawdę pomysł z kapelusza ...

To że ci klawisze nie chciały działać to WYNIK tego że zbaboliłeś gdzieś paskudnie kod ... a gdzie ? a skąd możemy wiedzieć skoro go nie pokazałeś i nie pytałeś -

za to jak usłyszałeś że odczyt 1wire może przeszkadzać gdy masz programowy PWM to bez minium zastanowienia poleciałeś z wyobraźnią - rozumiesz ?

Co zresztą potwierdza dalsza część wypowiedzi o Timerze i jego wartości OCR1A w stosunku do klawiszy

mateusz_dan napisał(a):
Ma to coś ze sobą wspólnego...


Oczywiście, że ma - źle napisałeś program - i tyle można odpowiedzieć na takie pytania i stwierdzenia .... więc na przyszłość proponuję rzetelniej podejść do zadawania pytań bo inaczej to rozsiewamy jakieś dziwne plotki ... później jakiś inny początkujący gdzieś to przeczyta jednym uchem a za chwilę na innym forum napisze

"tak tak - ja też gdzieś słyszałem że Timer1 albo 1wire mają zły wpływ na działanie klawiszy" .....

Proponuję zacząć od podstaw - jeśli masz Bluebooka a jeśli jeszcze nie masz to poczytaj o jednym ze sposobów na obsługę i to nieblokującą klawiszy - tutaj:

http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html

_________________
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 paź 2014, o 13:25 
Offline
Nowy

Dołączył(a): 19 mar 2013
Posty: 19
Pomógł: 1

ja bym zrobił to tak:
- sprawdź jak długo trwa odczyt z 1-Wire (sam już nie pamiętam, więc oscyloskop lub liczenie cykli lub internet ;-))
- jak będziesz to wiedział, to policz czy przerwanie potrzebne do obsługi 1-Wire wystarczy Ci na generowanie PWM.
- zejdź z częstotliwością PWM i ilością poziomów jasności (wątpię abyś potrzebował ich aż 255...)
- wszystko rób w jednym przerwaniu Timera:
1) najpierw ustawiasz porty połączone z PWM
2) sprawdzasz czy licznik "tyknięć" jest odpowiedni dla odczytu klawiszy (nie częściej niż co 10ms, może być 15) i je odczytujesz
3) sprawdzasz czy licznik "tyknięć" jest odpowiedni dla odczytu 1-Wire (najczęściej raz na sek) oczywiście wysyłasz na zmianę albo polecenie konwersji temp, albo jej odczyt.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 paź 2014, o 18:17 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Racja, trochę mnie poniosła fantazja :D ale im bardziej rozbudowuje swój kod tym więcej jakiś problemów i niejasności się pojawia i chyba na siłę szukam miedzy nimi powiązania... Co do obsługi klawiszy to trochę za daleko zabrnąłem. Doczytam w książce oraz artykuł z bloga, jak będę miał jakieś pytania to wrócę do tego.

Wracając do diody RGB i czujnika ds18b20. Używam dwóch timerów, Timer2 jest raczej dobrze skonstruowany, Timera1 nie jestem pewny, ale nikt nie napisał, że coś jest nie tak... Wydaje mi się, że nie uda mi się użyć tylko Timera2 dla czujnika ds18b20 i diody RGB. Próbowałem, różnych preskalerów i różnych wartości OCR2 ale chyba nie uda mi się znaleźć czegoś pośrodku, ja przynajmniej nie umiem...

Poniżej zamieszam kod który napisałem. Może ktoś znajdzie jakiś błąd... Coś doradzi... Na początku na wyświetlaczu pokazuje temperaturę wewnątrz i na zewnątrz, po naciśnięciu mikroswitcha KEY1 przechodzi do ustawienia diody RGB gdzie można ustawić osobno R, G i B wartości od 0 do 255. Przechodzenie między R, G i B realizuję za pomocą KEY3. Po wciśnięciu KEY2 wraca do odczytu temperatury. Mam nadzieję, że wytłumaczyłem to w miarę jasno...

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


Jak widać na filmiku odczyt temperatury przebiega poprawnie, jedyne co mnie zastanawia to dlaczego po powrocie z Sterownika RGB do odczyty temperatury trzeba poczekać powiedzmy ~2 sekundy na pojawienie się wartości temperatur. Choć nie za każdym razem ma to miejsce... To pierwszy z problemów. Potem gdy ustawie jakieś wartości w Sterowniku RGB i wracam do odczytu temperatury diody zaczynają delikatnie pulsować...??? Przyglądając się im bliżej to pulsują bardzo delikatnie gdy jestem w Sterowniku RGB i ustawia ich wartości, a gdy przejdę do odczytu temperatury pulsowanie jest mocniejsze...
Gdybym wywalił z programu odczyt temperatury z ds18b20 to problem pulsujące diody znika całkowicie.

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 paź 2014, o 18:43 
Offline
Moderator
Avatar użytkownika

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

mateusz_dan napisał(a):
jedyne co mnie zastanawia to dlaczego po powrocie z Sterownika RGB do odczyty temperatury trzeba poczekać powiedzmy ~2 sekundy na pojawienie się wartości temperatur


a rozumiesz jak to działa? tzn tego typu kod ?

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


coś mi się wydaje - że nie do końca

_________________
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 paź 2014, o 22:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

mateusz_dan napisał(a):
Jak widać na filmiku odczyt temperatury przebiega poprawnie, jedyne co mnie zastanawia to dlaczego po powrocie z Sterownika RGB do odczyty temperatury trzeba poczekać powiedzmy ~2 sekundy na pojawienie się wartości temperatur. Choć nie za każdym razem ma to miejsce... T


Kolega, to wrzucaj odczyty do bufora danych, a na wyświetlacz dane z tegoż bufora. W ten sposób unikniesz oczekiwana, bo w buforze zawsze będziesz miał ostatni odczyt.

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2014, o 17:26 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Rozumiem jak działa, ale myślałem, że temperatura będzie wyświetlana cały czas i tylko aktualizowana co 3 sekundy... Tylko na razie nie wiem jak tam to zrobić, żeby wrzucał odczyt do bufora danych...
Nadal pozostaje nie rozwiązany problem pulsującej diody? Czy ktoś widzi jakiś ewidentny błąd?

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2014, o 17:39 
Offline
Moderator
Avatar użytkownika

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

mateusz_dan napisał(a):
Rozumiem jak działa, ale myślałem, że temperatura będzie wyświetlana cały czas i tylko aktualizowana co 3 sekundy...

No ale zobacz - piszesz, że rozumiesz jak działa - ale myślałeś .... że co ?

przecież nie ma NAJMNIEJSZEGO problemu żeby ją wyświetlać cały czas - co za problem? wystarczy inaczej podejść do programu. Zapamiętać sobie wartość temperatury w jakiejś zmiennej i częściej odświeżać ją na ekranie, szczególnie po wyjściu z jakiejś tam opcji MENU. To nie jest tak - że w kodzie samo coś się jakoś robi - toż wszystko zależy TYLKO i wyłącznie od ciebie jak to napiszesz ;) ok?

mateusz_dan napisał(a):
Nadal pozostaje nie rozwiązany problem pulsującej diody? Czy ktoś widzi jakiś ewidentny błąd?

Już mówiłem - praca biblioteki 1wire (a chyba nie zajrzałeś do niej do środka) powoduje że MUSZĄ być na krótkie chwile wyłączane przerwania - wszystkie przerwania. A ty nadal się dziwisz dlaczego dioda ci pulsuje - skoro przerywane jest przerwanie odpowiadające za programowy PWM. Wydaje mi się jednak - że musisz starać się zwracać więcej uwagi na to jak działają składniki programu, którym próbujesz się posługiwać - bo na razie - to widzę tylko próbę tak na chybił trafił sklejania kilku rzeczy naraz - bez zrozumienia podstaw ich działania i to cię gubi, nie tędy droga

Trzeba DOKŁADNIE zrozumieć co to są przerwania i jak działają, na początek porobić sobie odrębne testy, próby itp ....

_________________
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: 23 lis 2014, o 14:08 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Wracając do tematu, chce spróbować zrobić sterowanie diodą LED RGB za pomocą sprzętowego PWM'u. Programowy PWM niestety nie działa tak jak powinien, jak już pisałem wcześniej. Zastanawiam się teraz nad podłączeniem i inicjalizacją Timerów z których będę korzystał.

Mam już podłączony czujnik DS18B20, do jego obsługi wykorzystuje TIMER2.

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


Do sterowania diodą RGB chciałbym wykorzystać PB1, PB2, PB3.
Obrazek

PB1 i PB2 to Timer1, PB3 to Timer2. Teraz zastanawiam się czy uda mi się to zrealizować? Timer2 wykorzystuje już do 1wire... Uda mi się wykorzystać go jeszcze do PWM? Może ktoś już pisał coś podobnego?

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lis 2014, o 19:45 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Ten obrazek to chyba nie z atmegi8

Jak najbardziej możesz mieć PWM i przerwanie co określony czas, ale wówczas przerwanie ustawiasz na przepełnienie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Przerwania ISR(TIMER2_COMP_vect) już nie używasz, a to dlatego, że byłoby generowane z różnym okresem w zależności od wartości w OCR2, która teraz dla sterowania pwm będzie się zmieniać celem regulacji wypełnienia.

Częstotliwość generowania przerwania TIMER2_OVF wynosi 8 MHz / preskaler / TCNT2_max = 8 M / 64 / 256 = 488 Hz. To oznacza, że zmienna cnt jest inkrementowana co około 2ms, a chcesz mieć 10ms. Wystarczy dodać kolejny licznik:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 11:06 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Krauser napisał(a):
Ten obrazek to chyba nie z atmegi8

No rzeczywiście to nie jest ATmega8, pomyliłem się. Zły obrazek zamieściłem. Bawię się własnie z ustawieniem tych timerów, i coś nie tak... Timer1 dla PB1 i PB2 zrobiłem, działa. Problem tylko z Timer2. Jak działa mi PWM, to nie chce czytać czujnika, lub na odwrót.

Tutaj chyba miałeś błąd: TCCR2 |= (1<<COM22); // Clear OC2 on Compare Match, set OC2 at BOTTOM, (non-inverting mode), ma być COM21.
Preskaler 64 to CS22, a nie CS21.

Tak mam to ustawione:
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.


Ostatecznie wygląda to tak, że czujnik działa, ale dioda nie ściemnia się do zera. Gdy ustawie wartość 255 świeci na full, natomiast dla 0 lekko świeci. Czym to może być spowodowane? Ma ktoś jakiś pomysł?

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 11:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2012
Posty: 193
Pomógł: 6

Jeśli dobrze pamiętam, problem z PWM jest opisany w BB, po prostu nie da sie uzyskać 0% wypełnienia i stąd "świecenie" diody...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 11:30 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Na programowym PWM działało, na sprzętowym PWM działa dla Timera1, a dla Timera2 już nie...

------------------------ [ Dodano po: 55 minutach ]

Gdy mam ustawione TCCR2 |= (1<<COM21); // Clear OC2 on Compare Match, set OC2 at BOTTOM, (non-inverting mode) to tak jak już pisałem dioda przy wartości 0 cały czas się delikatnie świeci.
Gdy zmienię na TCCR2 |= (1<<COM21)|(1<<COM20); //Set OC2 on Compare Match, clear OC2 at BOTTOM, (inverting mode) to działa to poprawnie tylko dla wartości 0 dioda świeci na maxa, a dla 255 jest zgaszona.

Nie wiem gdzie szukać przyczyny?

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 12:48 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Nie wiem co o tym sądzić, ale wyczytałem na elektrodzie odnośnie ATmegi16 że: "Przy wartości 0 w rejestrze OCR0 odpowiedzialnym za wypełnienie sygnału PWM na wyjściu pojawia się szpilka -już nie pamiętam ile trwa w stosunku do wartości 1 w tymże rejestrze (ale dużo krócej-chyba około 1/5 czasu dla wartości 1 w OCR0). Problem jest opisany i udokumentowany i nic wprost nie da się z tym zrobić- szpilka jest i koniec."

Nie wiem czy mogę to powiązać, ze swoim przykładem? Może ten sam problem pojawia się w ATmedze8 w rejestrze OCR2?
Czy mógłbym wyłączyć PB3 jesli OCR2=0? Jak napisać taki warunek?

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 15:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2012
Posty: 193
Pomógł: 6

Tak, to jest ten problem z tą szpilką, jak będę w domu to sprawdzę rozwiązania problemu bo sam kiedyś przez to przechodziłem

http://forum.atnel.pl/topic1084.html -tutaj post z problemem i jego rozwiązaniami


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 15:38 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Dzięki za podpowiedz. Z tych rozwiązań to chyba najbardziej interesowałoby mnie "Musiałbyś wyłączać pwma na okres gdy dioda ma nie świecić. Wtedy nie będzie tych szpilek." Tylko jak wyłączyć PWM'a gdy wartość PWM'a jest równa 0?

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 16:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

W trybie Fast Pwm przy "non-inverting mode" zawsze występuje krótka szpilka na wyjściu przy zerowej wartości rejestru OCR.

Możesz skorzystać z trybu "inverting mode". Ale żeby dioda nie świeciła przy zerowej wartości OCR to:
- będzie trzeba ją podłączyć odwrotnie,
- albo wykorzystać np. dodatkową zmienną uint8_t temp_ocr.
I potem proste działanie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dzięki temu przy zerowej wartości temp_ocr do rejestru OCR trafi wartość 255 i dioda nie będzie świecić, a przy wartości 255 w temp_ocr do rejestru OCR trafi wartość zero i dioda będzie świecić.

Możesz też skorzystać z trybu Phase Correct Pwm. W tym trybie nie występuje szpilka na wyjściu przy zerowej wartości OCR.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 16:40 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

jacekk232 napisał(a):
Możesz też skorzystać z trybu Phase Correct Pwm. W tym trybie nie występuje szpilka na wyjściu przy zerowej wartości OCR.


Mogę skorzystać z tego trybu tylko czy nie będzie to miało jakiegoś wpływu na czujnik? Cały czas muszę pamiętać, że oprócz sterowania diodami mam jeszcze czujnik. Jeśli chodzi o tą zmienną to mam jej przypisać jakaś wartość? Trochę na razie nie rozumiem jak ona ma działać. Sprawdzę to jutro i się odezwę.

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 17:46 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

W trybie Phase Correct Pwm timer liczy od 0 do 255 i potem od 255 do 0. Faga przerwania jest ustawiana dla 0. Oznacza to tyle, że zamiast przerwanie jest 2 razy rzadziej. Najprościej to zmienić preskaler z 64 na 32.

PS.
W przerwaniu ISR(TIMER2_OVF_vect) linie odpowiedzialene za timery programowe powinny być w warunku if(++cnt2 > 4)

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

Cytuj:
Tutaj chyba miałeś błąd: TCCR2 |= (1<<COM22); // Clear OC2 on Compare Match, set OC2 at BOTTOM, (non-inverting mode), ma być COM21.
Preskaler 64 to CS22, a nie CS21.

Racja. Miałem wstawić 2 i wpadła nie tam gdzie powinna.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 10:25 
Offline
Nowy

Dołączył(a): 01 paź 2014
Posty: 15
Pomógł: 8

Czy mi się wydaje czy w kodzie jest naparzanie po lcd przy każdym obiektu pętli głównej?
Jeśli tak, to tutaj zacząłbym od szukania przyczyny mrygania diody.

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 12:01 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

maxter napisał(a):
Czy mi się wydaje czy w kodzie jest naparzanie po lcd przy każdym obiektu pętli głównej?


Co rozumiesz przez słowo "naparzanie"? Rozwiń myśl bo nie rozumiem. Po czym tak w ogóle stwierdziłeś?

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 12:17 
Offline
Nowy

Dołączył(a): 01 paź 2014
Posty: 15
Pomógł: 8

Chodzi mi o to, że chyba w kodzie w każdym obiegu pętli głównej programu piszesz po wyświetlaczu, a wyświetlacze do demonów prędkości to nie należą...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 12:24 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Kod do programu jest zawarty w tym temacie to możesz zerknąć jak to jest napisane. W sumie chyba masz racje. W pętli while mam zrobionego switch'a i dwa razy case dzięki czemu zmieniam parametry wyświetlane na wyświetlaczu. W case 0 mam wyświetlane temperatury, a w case 1 jest sterownik RBG. Wszystkie rzeczy związane z wyświetlaniem na LCD są w pętli while. To, że wyświetlacz nie należy do demonów prędkości to wiem, ale nie mam innego pomysłu jak to inaczej napisać.

Jeśli masz jakieś propozycje, lub możesz coś doradzić jak to inaczej rozwiązać to chętnie skorzystam z każdej porady.

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 12:56 
Offline
Nowy

Dołączył(a): 01 paź 2014
Posty: 15
Pomógł: 8

Zrobić bufor wielkości wystarczającej do wpisania wymaganych danych na wyświetlacz (bądź nawet dwa jeśli nie ma dużego nacisku na oszczędność ramu) i to co teraz wpisujesz bezpośrednio na wyświetlacz, to pisz do bufora (np. temperatury do jednego, menu do drugiego). W przerwaniu co kilkadziesiąt milisekund (np. 20) wrzuć na lcd odpowiedni bufor.

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 13:32 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 52
Pomógł: 0

Pytanie trochę z innej beczki. Może powinienem założyć nowy temat, a może ktoś mi pomoże. Jak mogę podzielić na jakieś sensowne części swój program. Na razie nie jest on nie wiadomo jak rozbudowany ale gdybym go rozbudował to trochę bez sensu analizować kod przesuwając tak długi main.c. Jak podzielić main.c na części?

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

_________________
www.electrobot.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 19:48 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

maxter napisał(a):
Czy mi się wydaje czy w kodzie jest naparzanie po lcd przy każdym obiektu pętli głównej?
Jeśli tak, to tutaj zacząłbym od szukania przyczyny mrygania diody.

Nie zgodzę się z kolegą. Problem migania diody był podany (wyłączanie przerwań na czas transmisji 1-Wire) i rozwiązany (sprzętowe PWM).
mateusz_dan napisał(a):
Jak mogę podzielić na jakieś sensowne części swój program.

Całego switcha zamknij w funkcji wyświetl_menu. Zrobiłbym jeszcze takie usprawnienie, że oddzieliłbym wyświetlanie od pomiarów:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i gdzieś tam w menu będzie tylko:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



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

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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO