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



Teraz jest 12 sty 2026, o 16:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 28 ] 
Autor Wiadomość
PostNapisane: 18 sie 2013, o 20:50 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

Witam,
Chciałbym w sterowniku RGB pozbyć się delay_ms. Gdzies szanowny kolega Mirek opisywal, ze mozna to zrobic na timerze oraz na zmiennych.

W ponizszym kodzie timer jest 8 bitowy wiec mozliwe jest z niego wyciagniecie tylko 25 ms. Mysle, aby wykorzystac do tego timer 16 bitowy, przerwanie generowac co 1 ms a w niej incrementowac zmienne a w kodize sprawdac jaka wartosc maja te incrementowane wartosci.
Czy rozwiazanie ponizej jeszcze z timerem 8 bitowym ma prawo zadzialac (zamiast for dekrementowanie w petli)?


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: 18 sie 2013, o 20:55 
Offline
Moderator
Avatar użytkownika

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

gomes napisał(a):
Gdzies szanowny kolega Mirek opisywal, ze mozna to zrobic na timerze oraz na zmiennych


czy kolega posiada Bluebooka ??? ;)

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

bo przecież w nim opisuję DOKŁADNIE jak to zrobić - i to na "timerach programowych". Uwierz mi, że wystarczy jeden timer sprzętowy 8-bitowy i można sobie dzięki niemu tworzyć dziesiątki najrozmaitszych ala-delayów ;) i wcale nie do max 25 ms

no ale trzeba zaczytać właśnie o "timerach programowych"

_________________
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: 18 sie 2013, o 21:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

gomes napisał(a):
przerwanie generowac co 1 ms a w niej incrementowac zmienne a w kodize sprawdac jaka wartosc maja te incrementowane wartosci.

Ten sposób jest OK. Ja ostatnio na jednym timerze 8 bitowym zrobiłem sobie jednocześnie PWM sprzętowy, PWM programowy (tylko jeden ale nie było by problemów żeby zrobić więcej) i coś ala "zegar systemowy" który zastępował _delay_'e - czyli to o co pytasz.
Nie musisz koniecznie tak dobierać preskalera timera żeby odpowiadał potrzebnej ci rozdzielczości "zegara systemowego". Może być szybciej i wtedy wewnątrz przerwania dajesz jakąś inkrementującą się zmienną opóźniającą. Bylo to uzasadnione np. w moim przypadku kiedy chciałem jeszcze użyć tego samego timera do pwm programowego.

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2013, o 08:39 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

Dzieki za szybkie odopowiedzi :)
Co do niebieskiej ksiazki oczywiscie posiadam i ciagle z niej korzystam. Wszystkie do tej pory omawiane dzialy w moim odczuciu sa bardzo dobrze opisane i mam nadzieje dobrze zrozumialem lecz caly czas mam problem z tymi timerami programowymi. Co do sprzetowych to wszystko jasne lecz nie moge ich uzyc bo program docelowy caly czas ewouluje i piny od tych timerow sa juz zajete.

Co do rozwiazania na timerze 8 bitowym to przerobilem kod Mirka jak ponizej
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W tym przykladzie przestawilem timer na przerwanie co 1 sek ( jak dobrze zrozumialem to 8000000 / 64 /124 daje nam 1008 czyli ~ 1 ms). Calosc kodu wczesniej pracowala na przerwaniu co 25 ms dlatego w if sprawdzam, czy timer do tylu zliczyl i wtedy zeruje cnt1 oraz realizuje kod ktory wczesniej dzialal poprawnie na tych 25 ms.
Efektem tej zmiany jest zapalanie sie kolejno kolorow ale bardziej na zasadzie wlacz/wylacz niz sciemnianie przez pewien czas kolejnych kolorow.
Mikrokontroler nie wyrabia przy tych paru operacjach w przerwaniu (wiem, ze powinno ich tam byc mniej) czy co innego robie zle ? :(



Ostatnio edytowano 19 sie 2013, o 08:53 przez gomes, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2013, o 08:48 

Pomógł: 0

Rzuć okiem na mój temat termopara na atmedze8, tam masz przykład kodu z wykorzystaniem timerów softwerowych.
Delay, to używamy tylko i wyłącznie na początku przed pętlą główną programu, by np. czekać na "ustabilizowanie" napięć, inicjację sprzętową itd.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2013, o 08:52 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 344
Lokalizacja: Bydgoszcz
Pomógł: 11

Słuchaj mnie się wydaje że ty chcesz timer programowy zrobić na timerze 2 który pracuje u ciebie jako programowy PWM.
Na twoim miejscu do timera programowego wykorzystał Timer0. W przykładzie z 1-wire masz przykład timera programowego właśnie wykonanego na timer0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2013, o 09:00 
Offline
Moderator
Avatar użytkownika

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

gomes zajrzyj wiec prosze do rozdzialu

Wstep do systemow czasu rzeczywistego

i podejrzyj w kodzie jak jest realizowane tylko miganie dioda LED ok? to duzo ci sie wyjasnj bo chyba ci to umknelo i caly czas na delajach jedziesz

_________________
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: 19 sie 2013, o 09:03 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

rezasurmar napisał(a):
Rzuć okiem na mój temat termopara na atmedze8, tam masz przykład kodu z wykorzystaniem timerów softwerowych.
Delay, to używamy tylko i wyłącznie na początku przed pętlą główną programu, by np. czekać na "ustabilizowanie" napięć, inicjację sprzętową itd.

Kolego, ja to doskonale rozumiem i datego chce wszystkie mozliwe delaye zlikwidowac w glownej petli programu (pokazuje to zamieszczony przezemnie 1 kod gdzie zmiast for dekrementuje zmienna).

MichalXY napisał(a):
Słuchaj mnie się wydaje że ty chcesz timer programowy zrobić na timerze 2 który pracuje u ciebie jako programowy PWM.
Na twoim miejscu do timera programowego wykorzystał Timer0. W przykładzie z 1-wire masz przykład timera programowego właśnie wykonanego na timer0.

Co za roznica czy korzystam z 8 bitowego timera 0 czy 2 ?(timer 0 w docelowym ukladzie wlansie bedzie wykorzystywany do odczytu temperatury).
Co do kodu to wydaje mi sie, ze dokladnie tak samo kombinuje i przedstawiam w zamieszczonym drugim kodzie. W nim jedynie co zmieniam to przestawienie timera na przerwanie co 1 ms i w obsludze tego przerwania sprawdzam czy minelo juz 25 jego tykniec i wtedy realizuje kod ktory wczesniej ladnie sciemnial diody a to sie rozjechalo. Tylko pytanie dlaczego ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2013, o 22:03 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

mirekk36 napisał(a):
gomes zajrzyj wiec prosze do rozdzialu

Wstep do systemow czasu rzeczywistego

i podejrzyj w kodzie jak jest realizowane tylko miganie dioda LED ok? to duzo ci sie wyjasnj bo chyba ci to umknelo i caly czas na delajach jedziesz


Mirku, ponownie przeczytalem ten rozdzial i dalej nie moge poradzic sobie z tym swieceniem diody.
Zastosowalem sie do rad jaki sa opisane na forum i przestawilem timer na przerwania co 4 ms poniewaz przy 1 ms przy testach z sama dioda procesor nie wyrabial i pojawialy sie losowe swiecenie dioda. Tak jak zostalo to pokazane w ksiazce przedstawia przyklad ponizej - przy odkomentowaniu tego dioda tak jak powinna co sek gasnie po czym zaczyna swiecic wiec timer ustawiony jak zalozylem.

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


Lecac dalej reszta kodu nie dziala juz jak powinna. Jak obliczyc zalezności czasowe aby mozna bylo plynnie regulowac jasnosc swiecenia diody majac w przerwaniu np. flage 4 ms i jego wilelokrotnosc?

ponizej caly kod bez ani jednego deleya lecz obecnie dioda zapala sie na ~ 3 sek po czym gasnie na 1 sek zamiast plynnie sie rozjasniac
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Poprawcie mnie prosze, jezeli zle rozumiem jak powinno obliczyc sie swiecenie diody. Aby nie bylo widac 'migotania' dioda powinna migac conajmniej 24 razy na sek. Jezeli mamy przerwanie co 4 ms to 24/4 = 6 wiec timer1 powinien byc inicjalizowany ta wartoscia. Teraz wartosc cnt odpowiada za wypelnienie czyli jak mocno bedzie swiecila nasza dioda. Im pwm1 bedzie mialo wieksza wartosc tym dioda bedzie swiecila slabiej. Pomimo tego calosc nie chce dzialac jak powinna i nie mozna plynnie regulowac czasem swiecenia i jasnoscia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2013, o 22:26 
Offline
Moderator
Avatar użytkownika

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

Zapomnij w C o ustawianiu rozdzielczości czasowej timera programowego na 1ms - bo to tak jakbyś sam strzelił sobie w kolano i dziwił się dlaczego cię ono boli. W książce dosyć wyraźnie piszę o tym itp

A tym bardziej, że ty w tym samym czasie kręcisz programowym PWM'em który zjada mnóstwo czasu procka :(

po co ci rozdzielczość 1ms dla diody - co ty chcesz nią migać co 1ms ??? zobaczysz to ? ;)

ustaw sobie rozdzielczość przy twoim projekcie na 50ms a nawet i na 100ms

i wtedy się baw ....

_________________
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: 19 sie 2013, o 22:48 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

Czegos w tym miganiu diodami jednak nie rozumiem.
Przy wykorzystaniu kodu przedstawionego poprzednio dla kodu

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

Cos mi sie nie zgadza:
przerwanie mam co 4 ms (dziala poprawnie jak pisalem wczesniej) wiec przy ustawieniu Timer3=4 port zmienia swoja wartosc co 16 ms a ja dalej widze migotanie diody (wczesniej zakladalem, ze bedzie to 24 ms). Dopiero przy ustawieniu Timer3=3 migotania nie widze ( 3 * 4 = 12 ms).
Jak ustawie timer jak sugerujesz na 50 czy 100 ms to jak mam to zrealizowac aby nie bylo migotania?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2013, o 23:08 
Offline
Moderator
Avatar użytkownika

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

ale o jakim ty migotaniu piszesz ? ... coś czuję że pokręciło ci się wszystko dokumentnie :(

posłuchaj ty pewnie chcesz go użyć do jakiegoś rodzaju PWM'a ???? dobrze myślę ? jeśli tak to jakieś KOSZMARNE nieporozumienie :(

timery programowe nie są do ŻADNYCH PWM'ów - zapomnij

one są do ot jakichś tam wolnozmiennych procesów - np właśnie (przykład) jedna dioda miga sobie co 50ms a druga co 180ms. A obydwie migają w tym samym czasie w programie i nie używamy ŻADNYCH delajów

i dlatego jeszcze raz ci powtarzam że jak timer programowy to MINMILANA rozdzielczość czasowa to 10ms ale lepiej 20ms albo i więcej

a ty widzę próbujesz schodzić w dół bo ci się zachciało na nim PWM'a zrobić co ? ;)

PWM'a programowego zostawiasz sobie na timerze sprzętowym. A timery programowe działają sobie oddzielnie swoim własnym i mniej dokładnym życiem.

No ale tak to jest - jak ktoś nie chce zrobić i zobaczyć ćwiczenia z książki ;) ... jeszcze raz mówię - zrób to ćwiczenie - zobacz jak działa i o co w tym chodzi i że to nie ma nic wspólnego z żadnymi PWM'ami .... timery programowe do CAŁKIEM innych celów służą, ok? ;)


Autor postu otrzymał pochwałę

_________________
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: 19 sie 2013, o 23:34 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

Hm,
teraz to juz naprawde nic nie rozumiem ;) Ja chce przy uzyciu jednego timera sprzetowego (tutaj timer2) sterowac jasnoscia oraz dlugoscia swiecenia diody RGB.
Na stronie 229 opisujesz jak mozna nawet przy 9 bitowym programowym PWM oszukac wzrok(o ile o tym cwiczeniu pisales) i regulowac jasnoscia diody wiec sadzilem, ze mozna zrobic trzy takie programowe timery i tym regulowac dioda RGB na dowolnym porcie mikrokontrolera. Z ostatniego postu by wynikalo, ze do tego naduje sie tylko timer sprzetowy czyli wykorzystanie portow z oznaczeniami OC0, OC1A i OC1B lub OC2 ? :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2013, o 23:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

mirekk36 napisał(a):
Zapomnij w C o ustawianiu rozdzielczości czasowej timera programowego na 1ms - bo to tak jakbyś sam strzelił sobie w kolano i dziwił się dlaczego cię ono boli. W książce dosyć wyraźnie piszę o tym itp

Przerwanie co 1ms (1kHz) to strzał w stopę? Przecież to aż 8k cykli zegarowych (dla wewnętrznego generatora 8Mhz). Przy normalnym, nieblokującym kodzie to przecież jest wieczność...

Sam w stacji pogodowej poganiam procek na 20Mhz i mam przerwania co 250ns (4kHz / 5k cykli). W przerwaniu mam jednocześnie multipleksowanie klawiatury matrycowej + multipleksowanie wyświetlacza IW18 + obsługę timerów programowych. Nic się nie blokuje, wszystko się wyrabia, żadnych hard-codowych cudów robić nie musiałem...

mirekk36 napisał(a):
po co ci rozdzielczość 1ms dla diody - co ty chcesz nią migać co 1ms ??? zobaczysz to ? ;)

Jeżeli chcemy płynnie regulować jasność diody to 500Hz to jest absolutne minimum dla oświetlenia stacjonarnego (żeby oczy i nerwy nie wysiadły). Jest to jednak bardzo niska częstotliwość i np. wentylator będzie nam pięknie migotał/przerywał przed oczami. Przy oświetleniu rowerowym ~3kHz to jest granica dla lubiących swoje zęby...

gomes napisał(a):
jak mam to zrealizowac aby nie bylo migotania?

Jeżeli jasność oświetlenia chcemy regulować za pomocą PWM to podstawą jest wysoka częstotliwość, potrzebna do "oszukania" oczu. Drugą ważną sprawą jest rozdzielczość, która definiuje ile różnych poziomów jasności możemy uzyskać. Zauważ, że sprzętowy PWM na timerze 8bit oferuje 256 różnych poziomów jasności dzieląc częstotliwość taktowania przez 256*prescaler. Gdyby był 6 bitowy to miałbyś tylko 64 poziomy jasności, ale częstotliwość byłaby już 256/64=4 razy większa.

A tak w skrócie to częstotliwość przerwań (Fisr) to iloczyn częstotliwość PWM (Fpwm) oraz ilości stopni jasności (S).
Fisr = Fpwm*S
Powinieneś dążyć do jak najwyższego Fpwm, aby światło tak modulowane jak najmniej męczyło oczy. Możesz to uzyskać ustawiając większą częstotliwość przerwań (Fisr) oraz zmniejszając ilość dostępnych poziomów jasności (s). W praktyce musisz ustawić częstotliwość przerwań (Fisr) do oporu oraz wybrać ilość stopni zapewniających wystarczającą ilość poziomów jasności (oczywiście należy tutaj dostosować kwadratowe prawo ściemniania do PWMa, który jest liniowym sposobem regulacji).
Najprościej będzie po prostu znaleźć potrzebne sprzętowe PWM, albo wyrzucić to na zewnętrzny osprzęt (jak będzie trzeba to nawet małe przystawki w postaci T13/T25).

------------------------ [ Dodano po: 18 minutach ]

Tak patrzę i jeden T25 (albo T45/T85 - jedna cholera, jedynie więcej FLASHa, RAMu i EEPROMu) + soft TWI to będzie to czego potrzebujesz ;)

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2013, o 00:14 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

barney napisał(a):
Jeżeli chcemy płynnie regulować jasność diody to 500Hz to jest absolutne minimum dla oświetlenia stacjonarnego

czyli 1 / 500 daje nam 2 ms. Z dalszego wywodu rozumiem, ze ta wartosc jeszcze trzeba podzielic przez 256 krokow co daje nam 8ns.
Upierajac sie przy wykonaniu tego na programowym pwm jestem w stanie to osiagnac ? Mam juz gotowa plytke i wyprowadzenia z tranzystorami na diode nie sa przypisane do portow timerow sprzetowych dlatego chcialbym to zrealizowac jak jak wyzej.
Przy projektowaniu plytki bralem pod uwage kod z niebieskiej ksiazki (05_PWM) gdzie korzystajac z delay_ms moglem pod dowolny pord uc podlaczyc diody i wszystko smigalo tak, jak powinno bez korzystania ze sprzetowych timerow.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2013, o 00:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

8ns to nie jest jeszcze tak źle. Jak pogonisz procka na co najmniej 16MHz to będziesz miał przerwanie co 8*16=128 cykli - bardzo na styk, zamulisz cały procesor. Dodatkowo zejdź z rozdzielczością do 64 kroków - uzyskasz przerwanie co 512 cykli (PWM zajmie z ~20% czasu procesora), albo do 128 kroków (40%). Jeszcze lepiej jak pogonisz na 20MHz (20% szybciej to od razu lepiej).

Według mnie optymalnym rozwiązaniem będzie procek na 20MHz, ISR co 200 cykli (50-70%), 64 kroki.
Fisr=Fcpu/200=20 000 000 / 200 = 100 000 Hz
Fpwm=Fisr/S= 100 000 Hz / 64 = 1562,5 Hz (jeszcze nie taka tragedia)
Praktyczne jasności PWMa strzelisz sobie na 64-16-4-1-0 (dla oczu 100-50-25-~10-0%).

Wszystkie pozostałe przerwania muszą mieć atrybut ISR_NOBLOCK, np:
ISR (TIMER1_COMPA_vect, ISR_NOBLOCK) {}
aby wykonywanie innych przerwań nie zatrzymywało wykonywania regulacji PWM (nie było szarpań/przebłysków). "Dowali" to oczywiście to pieca i wymusi kolejne 10-20B na stos, no ale jak już masz board to cóż zrobić...


Autor postu otrzymał pochwałę

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2013, o 06:04 
Offline
Moderator
Avatar użytkownika

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

barney napisał(a):
Przerwanie co 1ms (1kHz) to strzał w stopę?


Kłopot w tym, że w ogóle nie wiesz o co chodzi :( .... tzn nie zrozum mnie mnie źle - nie wiesz o co mi chodzi i o czym mówię

a na pewno nie chodzi o przerwanie co 1ms ....

więc cały twój wywód odnośnie moich wypowiedzi wyżej .... szkoda mówić - no ale ok .... spróbuj dalej poprowadzić kolegę gomes'a

barney napisał(a):
Wszystkie pozostałe przerwania muszą mieć atrybut ISR_NOBLOCK, np:


No a ta porada dla początkującego to już jest masakra :( przykro mi .....

Jak dobrze spojrzeć na to co piszesz - to wg ciebie aby rozwiązać jakikolwiek błahy problem to najlepiej: wziąć kwarc 20MHz albo i więcej jak jeszcze źle działa, wszystkie przerwania typu ISR_NOBLOCK - czyli dowalić do pieca. Fajnie fajnie ;) oby tak dalej.

------------------------ [ Dodano po: 4 minutach ]

barney napisał(a):
Sam w stacji pogodowej poganiam procek na 20Mhz i mam przerwania co 250ns (4kHz / 5k cykli). W przerwaniu mam jednocześnie multipleksowanie klawiatury matrycowej + multipleksowanie wyświetlacza IW18 + obsługę timerów programowych. Nic się nie blokuje, wszystko się wyrabia, żadnych hard-codowych cudów robić nie musiałem...


Wiesz jak ja bym tak zaczął opowiadać co ja mam ;) ... ooo boże ;) to byśmy się pewnie ścigali kto bardziej do pieca dowala, wpadłby jeszcze ktoś inny i zacząłby opowiadać, że to nic co my we dwóch robimy, że on to dopiero dowala do pieca .... ;)

Tylko początkujący popatrzyłby na te gadki i sobie poszedł .... tak w skrócie mówiąc

_________________
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: 20 sie 2013, o 07:55 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

barney napisał(a):
Dodatkowo zejdź z rozdzielczością do 64 kroków - uzyskasz przerwanie co 512 cykli (PWM zajmie z ~20% czasu procesora), albo do 128 kroków (40%). Jeszcze lepiej jak pogonisz na 20MHz (20% szybciej to od razu lepiej).

Nie bylem wczesniej swiadomy tego zamulenia i nie jestem przekonany, czy docelowy uklad moze sobie na to pozwolic.

Dlatego ewentualnie na plytce moge wykonac druciarstwo i dolutowac dwa przewody.

Mirku, nawet jak korzystam ze sprzetowego pwm to i tak potrzebuje jakiegos dodatowego timera do zastapienia tych delay_ms

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


Dodatkowo przy kodzie jak ponizej nawet na sztywno ustawione OCR0 = 0; i pozniej _delay_ms(1000); nie wygaszaja diody do konca ( gdzies w innym watku czytalem, ze potrzebny jest na to pewien czas a tutaj daje az 1 sek i dalej widac, ze lekko swieci).

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


Jak optymalnie to wykonac zakladajac, ze skorzystam z 3 x sprzetowy pwm ?
Potrzebuje 3 wyjsc oraz jednego timera do zastapienia delayow wiec moze OC0 oraz OC1A i OC1B jako wyjscia dla rgb a OC2 jako precyzyjny odmierzacz czasu ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2013, o 08:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

gomes napisał(a):
Jak optymalnie to wykonac zakladajac, ze skorzystam z 3 x sprzetowy pwm ?
Potrzebuje 3 wyjsc a w uc mam OC0 I OC2 8 bitowe oraz OC1A i OC1B 16 bitowe. Potrzebuje 3 wyjsc oraz jednego timera do zastapienia delayow wiec moze OC0 oraz OC1A i OC1B jako wyjscia dla rgb a OC2 jako precyzyjny odmierzacz czasu ?
Brzmi ok. Ustaw sobie Timer 16-bitowy w trybie 8-bitowym (TOP na 0x00FF) to odpadnie Ci różnica częstotliwości taktowania i różne wartości dla kwadratowego prawa ściemniania ;)

gomes napisał(a):
Dodatkowo przy kodzie jak ponizej nawet na sztywno ustawione OCR0 = 0; i pozniej _delay_ms(1000); nie wygaszaja diody do konca ( gdzies w innym watku czytalem, ze potrzebny jest na to pewien czas a tutaj daje az 1 sek i dalej widac, ze lekko swieci).
Tryb Fast PWM ma to do siebie, że nie idzie ustawić 0% oraz 100% (albo jedną z tych wartości idzie, a drugiej nie, doczytaj w PDFie). Najwięcej co uzyskasz to 1/rozdzielczość jako 0% i rozdzielczość-1/rozdzielczość jako 100%. Jeżeli chcesz mieć prawdziwe 0% i 100% to zobacz tryb Phase Correct. Możesz też w sytuacjach granicznych wyłączać Timer i ustawiać 0/1 jak zwykły pin I/O ;)

@mirekk36: Gomes miał gotowy obwód oraz problem z uruchomieniem PWM dla diod. Ty nie przedstawiłeś żadnego rozwiązania problemu nie wymagającego znaczącej ingerencji w obwód, a ja pokazałem, że się da, ale łatwo nie będzie, a i procek będzie musiał działać na ile pójdzie.
A 20MHz dla AVR jest jak najbardziej OK częstotliwością, jeżeli nie robimy jakiegoś układu profesjonalnie/do ludzi.
mirekk36 napisał(a):
Kłopot w tym, że w ogóle nie wiesz o co chodzi :( .... tzn nie zrozum mnie mnie źle - nie wiesz o co mi chodzi i o czym mówię

a na pewno nie chodzi o przerwanie co 1ms ....
No może i nie wiem... ale powiedz mi jak mam interpretować to zdanie:
mirekk36 napisał(a):
Zapomnij w C o ustawianiu rozdzielczości czasowej timera programowego na 1ms - bo to tak jakbyś sam strzelił sobie w kolano i dziwił się dlaczego cię ono boli. W książce dosyć wyraźnie piszę o tym itp

dla mnie rozdzielczość to najmniejsza jednostka jaką można zmienić/uzyskać w danej sytuacji.
Jeżeli ktoś mi powie, że AVR ma ADCka o rozdzielczości 10 bitów to zrozumiem, że wartość napięcia jest przedstawiania za pomocą 10 wartości, z których każda z nich mogłaby funkcjonować samodzielnie i nie możliwe jest podzielenie każdej z osobna na mniejszą jednostkę w danej aplikacji (czyli po prostu bitów - 0/1). No ale jak już powiedziałem, nie do końca byłem pewien czy o to Ci chodzi - jeżeli nie to wyjaśnij, bo nie wiem co o tym sądzić. Nie rozumiem po co od razu "strzelać focha" i rezygnować z udzielania się w temacie.
mirekk36 napisał(a):
więc cały twój wywód odnośnie moich wypowiedzi wyżej .... szkoda mówić - no ale ok .... spróbuj dalej poprowadzić kolegę gomes'a
Zwłaszcza, że to gomes ucierpi, a nie ja, bo to gomes będzie miał przedstawioną mniejszą ilość opcji/pomysłów...

mirekk36 napisał(a):
barney napisał(a):
Sam w stacji pogodowej poganiam procek na 20Mhz i mam przerwania co 250ns (4kHz / 5k cykli). W przerwaniu mam jednocześnie multipleksowanie klawiatury matrycowej + multipleksowanie wyświetlacza IW18 + obsługę timerów programowych. Nic się nie blokuje, wszystko się wyrabia, żadnych hard-codowych cudów robić nie musiałem...

Wiesz jak ja bym tak zaczął opowiadać co ja mam ;) ... ooo boże ;) to byśmy się pewnie ścigali kto bardziej do pieca dowala, wpadłby jeszcze ktoś inny i zacząłby opowiadać, że to nic co my we dwóch robimy, że on to dopiero dowala do pieca .... ;)
A ten komentarz to już odebrałem jako personalny atak na mnie. Nie wolno podzielić się doświadczeniami z użyciem częstych przerwań z dużą ilością kodu? Osobiście nie rozumiem tego strachu przed dużą ilością kodu w przerwaniach albo w przerwaniach kaskadowych/zachodzących. Jakiś straszny z tego jest temat tabu (tak sam jak z GOTO). Jeżeli wie się co się robi i jakie są tego konsekwencje (w danym układzie) to nie widzę żadnych przeciwwskazań do stosowania takich konstrukcji...

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2013, o 09:21 
Offline
Moderator
Avatar użytkownika

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

barney napisał(a):
A ten komentarz to już odebrałem jako personalny atak na mnie.


Jeśli tak odebrałeś - to przepraszam ciebie uprzejmie (bez żadnej ironii) ... na pewno nie miałem tego na celu ...

i nie strzelam focha ...

za to można dopytać co ktoś ma na myśli a nie pisać, że źle coś tłumaczę ok?

poza tym - to miało znaczyć tylko to - że takie przykłady nic nikomu nie dadzą - że opiszesz sobie co ty tam nie zrobiłeś bo ja też mógłbym tak opisywać i inni - i za chwilę byłaby tu elektroda - wszyscy spece coś robią tylko ci, którzy proszą o pomoc nie wiedzą co i jak.

Każdy z nas ma inne podejście do tego jak pomagać - i ja wcale nie mówię, że mam najlepsze - ale gdy ktoś pomaga komuś w temacie to nie dziw się reakcji jak wchodzisz i piszesz:

barney napisał(a):
Przerwanie co 1ms (1kHz) to strzał w stopę? Przecież to aż 8k cykli zegarowych (dla wewnętrznego generatora 8Mhz). Przy normalnym, nieblokującym kodzie to przecież jest wieczność...


co można wprost odebrać tak jakbyś powiedział że ja jakieś głupoty gadam ...

na to chciałem ci zwrócić uwagę a nie jakieś personalne ataki tu stosować ....

więc jeszcze raz ... jeśli coś źle odebrałeś z mojej wypowiedzi to bardzo przepraszam

a dalej poprowadź gomesa - bo może jemu chodzi o coś innego i może to ja nie mam racji

------------------------ [ Dodano po: 27 minutach ]

barney napisał(a):
Osobiście nie rozumiem tego strachu przed dużą ilością kodu w przerwaniach albo w przerwaniach kaskadowych/zachodzących. Jakiś straszny z tego jest temat tabu (tak sam jak z GOTO). Jeżeli wie się co się robi i jakie są tego konsekwencje (w danym układzie) to nie widzę żadnych przeciwwskazań do stosowania takich konstrukcji...


widzisz to jest tak - ja wiem, ba! nawet jestem przekonany, że wiesz dużo więcej ode mnie .... (żadnej nie ma w tym ironii) ...

ale niestety nie zgodzę się z tobą, że masz dobry sposób na przekazywanie swojej wiedzy .... szczególnie jak chodzi o te zdania cytowane wyżej....

zresztą wystarczy przeczytać to co masz w stopce:

Cytuj:
Nie pisz komentarzy - dobry kod komentuje się sam.


I nie obraź się proszę, że ja rozszerzyłbym go jeszcze o takie punkty:

- nie używaj symboli bitów w rejestrach tylko zapisuj wartości HEX ?
- nie stosuj wcięć w kodzie bo po co ?
- używaj goto ile wlezie
- zawsze stosu ISR_NOBLOCK

-------------------------------------------

sorry - ale prezentujesz CAŁKOWICIE odmienne podejście niż to którego ja się sam uczę od innych , od lepszych od siebie i to które staram się przekazywać w książce początkującym.

Jeśli więc będziesz starał się na siłę stanąć na przekór tego to nie dziw się, że będę reagował i to stanowczo.

Bo już chociażby brak komentarzy w kodzie - nie przeze mnie, ale przez wszystkich jest uważany wręcz za błąd - i to poważny jeśli chodzi o dobry styl programowania. Powiem więcej w niektórych firmach - tacy freelancerzy uparci, którzy robią po swojemu a nie potrafią dostosować się do zespołu tracą pracę .... to nie jest mój wymysł.

Reasumując tym bardziej będę się sprzeciwiał takiemu przekazywaniu wiedzy na tym forum i koniec.

_________________
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: 20 sie 2013, o 12:56 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

barney napisał(a):
Brzmi ok. Ustaw sobie Timer 16-bitowy w trybie 8-bitowym (TOP na 0x00FF) to odpadnie Ci różnica częstotliwości taktowania i różne wartości dla kwadratowego prawa ściemniania

Timer1 domentacja jest troche zawila wiec prosze o potwierdzenie, czy dobrze go ustawiam aby dzialal tak samo jak Timer0.

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


Czy to wystarczy aby w glownej petli manewrowac wpisem do OCR1A oraz OCR1B w zakresie od 0 do 255 i tym regulowac jasnosc swiecenia diod na tych portach ?

Co do prawa sciemniania to znalazlem rozwiazanie z wykorzystaniem stalych wartosci w tablicy a konkretnie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

i teraz inkrementujac zmienna licznik np za pomoca przerwania od timera co powiedzmy 10 - 100 ms jestem w stanie regulowac jak szybko bedzie zmienial sie dany kolor oraz w 31 ktokach jego jasnosc.
Czy idę dobra sciezka czy widzicie jakas lepsza metode na regulacje RGB ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2013, o 19:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

Konfiguracja timera wygląda ok. Jako, że pracuje w trybie 8-bitowym to możesz zapisywać wartości do rejestrów OCR1xL (niższych połówek). Użycie wcześniej wyliczonych wartości to dobry pomysł, ale najprawdopodobniej będziesz musiał je dostosować do konfiguracji sprzętowej (u mnie z powodu pojemności układu 0% było już od ~15/256 dla 31kHz). Wrzuć tylko te wartości jako stałe do FLASHa - raczej nie będziesz ich zmieniać, a nie ma sensu marnować RAMu.

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2013, o 23:02 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

Na forum znalazlem informacje, ze dla amegi przy fast PWM dla ustawienia pojawiaja sie szpilki i dlatego widac lekkie 'jazenie' diod.
Rozwiazaniem ma byc wylczanie timerow. Dla koloru czerwonego i niebieskiego dziala jak powinno ale przy zielonym jest cos nie tak. Czy ponizsze zatrzymywanie timerow jest poprawne ?
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: 20 sie 2013, o 23:22 
Offline
Moderator
Avatar użytkownika

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

pomyśl sobie - przez te if'y nigdy w efekcie do końca nie wygasisz diod LED.

Piszesz że masz Bluebooka - więc masz tam opisane jak sobie prosto można poradzić z tymi glitch'ami ale sprzętowo a nie programowo.

1. albo podłącz diody LED odwrotnie (katodą i anodą) ... dzięki czemu glitch w trakcie pełnego zapalenia NIGDY nie będzie zauważony przez oko ludzkie

2. odwróć fazę za pomocą bitów COMxA i uzyskasz ten sam efekt, chociaż dla pełnego wypełnienia będziesz musiał wpisywać odwrotną wartość - no ale można sobie to nadrzędnym makrem załatwić

a te IF'y są po prostu zupełnym wtedy nieporozumieniem i niepotrzebne jak zobaczysz to w praktyce

_________________
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: 21 sie 2013, o 07:13 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

mirekk36 napisał(a):
1. albo podłącz diody LED odwrotnie (katodą i anodą) ... dzięki czemu glitch w trakcie pełnego zapalenia NIGDY nie będzie zauważony przez oko ludzkie

Tego nie moge zrobic bo plytke z wyprowadzeniami juz mam oraz korzystam z diod rgb ze wspolna anoda wiec zgodnie z tym co pisales w ksiazce podlaczenie rezystorow bedzie bledne.

mirekk36 napisał(a):
2. odwróć fazę za pomocą bitów COMxA i uzyskasz ten sam efekt, chociaż dla pełnego wypełnienia będziesz musiał wpisywać odwrotną wartość - no ale można sobie to nadrzędnym makrem załatwić

Przerobilem jak pisales i teraz po wpisaniu 255 diody sie nie swieca ale teraz pojawil sie problem z petla for - jak zrobie warunek for (i = 0; i <= 255; i++ to caly czas petla sie zapetla i nie przechodzi dalej a dla kodu ponizej po wyskoczeniu z petli w OCR0 znajduje sie 1

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


i musze po tej petli wpisywac do rejestru OCR0 = 255; aby dioda calkowicie zgasla. Czy to jakis bug czy ja zle kojarze jak to powinno dzialac tzn 255 daje nam 11111111 a po kolejnym przeladowaniu wartosc osiaga 0 i for jest konczony ?



Dalej mecze sie z timerami sprzetowymi. Dziala metoda pokazana w ksiazce(Timer2_1) ale ja chcialbym zrobic dodatkowo flage przerwania np co 50ms (Timer2_50ms) i w petli glownej sprawdzam
if (!Timer2_50ms) nie chce to dzialac poprawnie tylko dlaczego ?

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

Timer2_50ms to zmienna globalna zadeklarowana tak: volatile uint8_t Timer2_50ms;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2013, o 22:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

Bo zapewne wykonuje się wiele razy, a nie raz. Ja timery obsługuję w taki sposób (dosyć uniwersalny):

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

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.


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


W ten sposób zapewniasz sobie "przyjazne" nazwy timerów/flag (można je wykorzystywać i tak i tak) oraz łatwość dodania następnej: zwiększasz ILE_TIMER_MS o 1 i dopisujesz kolejne makro tworzące przyjazną nazwę (dzięki której od razu wiesz, do czego timer służy).

gomes napisał(a):
Przerobilem jak pisales i teraz po wpisaniu 255 diody sie nie swieca ale teraz pojawil sie problem z petla for - jak zrobie warunek for (i = 0; i <= 255; i++ to caly czas petla sie zapetla i nie przechodzi dalej a dla kodu ponizej po wyskoczeniu z petli w OCR0 znajduje sie 1

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


i musze po tej petli wpisywac do rejestru OCR0 = 255; aby dioda calkowicie zgasla. Czy to jakis bug czy ja zle kojarze jak to powinno dzialac tzn 255 daje nam 11111111 a po kolejnym przeladowaniu wartosc osiaga 0 i for jest konczony ?

Zauważ, że z samego warunku pętli ( i < 255 ) wynika, że dla tych 255 (0xFF) jest niespełniony. Pętla więc się nie wykona i nie będzie przypisania OCR0 = i;
Spróbuj tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

I tutaj dla 255 będzie już warunek spełniony. Zauważ, że ręcznie wychodzę z pętli, bo inaczej licznik by się "przekręcił" na 0 i pętla okazała by się nieskończoną ;)

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2013, o 17:27 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 68
Pomógł: 0

barney napisał(a):
W ten sposób zapewniasz sobie "przyjazne" nazwy timerów/flag (można je wykorzystywać i tak i tak) oraz łatwość dodania następnej: zwiększasz ILE_TIMER_MS o 1 i dopisujesz kolejne makro tworzące przyjazną nazwę (dzięki której od razu wiesz, do czego timer służy).

Podejscie ciekawe, w sumie robi dokladnie to samo tylko jest przejrzyściej zapisane.
barney napisał(a):
I tutaj dla 255 będzie już warunek spełniony. Zauważ, że ręcznie wychodzę z pętli, bo inaczej licznik by się "przekręcił" na 0 i pętla okazała by się nieskończoną

rozwiazanie dziala ale chac przerobic program aby w zadnym miejscu nie bylo 'blokad' i kod wykonywal sie jak najszybciej chyba korzystanie z for jest srednio fajne.
Dlatego z wszystkie for chce zastapic if'ami. Ponizej kod ktory to robi. W roznym czasie kolejno tylko jedna diode rozjasniam: czerwona, zielona i niebieska. Kolory rozswietlaja sie poprawnie lecz czy da sie to jakos napisac oszczedniej/lepiej np bez wykorzystania kolejnej zmiennej, u mnie 'n' ?

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: 22 sie 2013, o 21:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

gomes napisał(a):
rozwiazanie dziala ale chac przerobic program aby w zadnym miejscu nie bylo 'blokad' i kod wykonywal sie jak najszybciej chyba korzystanie z for jest srednio fajne.
Dlatego z wszystkie for chce zastapic if'ami.
Całego opisu urządzenia nie podałeś, ale zrób coś takiego:
Zwiększaj jakąś zmienną z każdym przejściem pętli głównej programu, a co sekundę (timerek sobie do tego dodaj). Wyświetlaj uzyskaną wartość i zeruj tą zmienną. Może to Ci uzmysłowi ile taki procek ma mocy przerobowych i czy naprawdę potrzebujesz walki o każdy cykl zegara. Zwłaszcza, że jeżeli nie piszesz w Asemblerze to liczenie cykli zegarowych jest bez sensu.
gomes napisał(a):
Kolory rozswietlaja sie poprawnie lecz czy da sie to jakos napisac oszczedniej/lepiej np bez wykorzystania kolejnej zmiennej, u mnie 'n' ?
Nie znając kontekstu tego kodu, nie jestem w stanie tego ocenić. Jeżeli jednak nie jesteś na styk z zasobami, albo czasem to nie ma sensu dążyć do "idealnej" formy. Jeżeli działa i nie blokuje to nie ruszaj.

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



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

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