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



Teraz jest 19 cze 2026, o 17:13


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 25 lip 2014, o 16:33 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Hej od miesiąca próbuję napisać taką funkcję która działałaby na zasadzie regulatora czasu.
Do funkcji jako argument miałaby być wysyłana zmienna uint16_t (w zakresie tylko do 1023), natomiast funkcja miałaby zwracać liczbę int8_t (do 255)
Niby proste, z tym, że ja chciałbym aby funkcja korzystała z Timera1 procesora Atmega8 i zwracała kolejne liczby (od 0-255) ze zwłoką w czasie zależną od argumentu czyli:
Jeśli funkcja będzie wywoływana cyklicznie z argumentem 1 to zmiana kolejnych zwróconych liczb będzie następować tak

0 - (1ms przerwy) 1 - 1ms przerwy) 2- (1ms przerwy) 3 - (1ms przerwy)...................... itd

Jeśli jako argument zostanie przesłana liczba 1023, kolejna zmienna zwracana byłaby co około 1 sek. czyli

0 - (1 sek przerwy) 1 - (1sek przerwy) 2- (1sek przerwy) 3 - (1sek przerwy)...................... itd

Próbowałem eksperymentalnie dobrać preskaler i inne zmienne pomocnicze, jednak wszystko daje w łeb. Nie potrafię uzyskać tak szerokiego jak na moje potrzeby
wachlarza czasów. Dla lepszego zrozumienia, próba mojego rozwiązania Powiedzcie proszę czy dobrze myślę.



Atmega pracuje taktowana rezonatorem 16MHz
prescaler 8 tryb pracy NORMAL wówczas aby uzyskać przerwanie co 1ms zgodnie z poniższym wyliczeniem

Obrazek

muszę załadować do licznika wartość 63537? Nie - skoro licznik timera 1 u mnie liczy tylko do 20831.
Więc jak? Może użyć trybu CTC wóczas na początku (a raczej na końcu każdego z przerwań) zładuję do licznika 1999 i rozumiem że przerwanie
będzie się zgłaszać co 1 ms tak?
no to teraz jak to pogodzić z regulacją.
Na intuicję wydaje się że zliczać te przerwania zwyczajnie czyli :


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 ciele funkcji dać warunek
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Bardzo proszę - Sprawdźcie czy to co napisałem trzyma się kupy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 18:46 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Dzięki za zainteresowanie problemem. Już wyjaśniam. Chcę zrobić sterownik do taśmy RGB (mam nadzieję również opublikować go na forum) i jako jedną z funkcji sterownika chcę zrobić regulowany potencjometrem podłączonym do ADC (dla tego przy pomocy zmiennej 0-1023) efekt ściemniania i rozjaśniania w różnych odstępach czasu (stąd zmienna zwracana 0-255 bo taką rozdzielczość mam PWMa) Czy będzie się ona resetować, czy też dodam jeszcze jedną zmienną kontrolną, aby liczyło do tyłu, to późniejsza sprawa, i nie podejrzewam, żebym miał z nią problem. Również dokładność nie jest krytyczna Po prostu tak wymyśliłem. Może zrobię drugi podprogram, w którym pomnożę wynik przez dwa przez co uzyskam dłuższe czasy Na razie chodzi mi o to żeby w jakiś nawet zgrubny sposób spowodować współpracę Timera1 (bo tylko on mi został niewykorzystany) ze zmienną mówiącą o natężeniu światła. Samo natężenie światła realizowane przy pomocy potencjometru zrobiłem łatwo po prostu wartość ADC podzieliłem przez 4 i na całym zakresie regulacji potencjometru podłączonego pod ADC mam rozłożoną wartość minimalnego natężenia (0) i maksymalnego (255) (oczywiście przy pomocy funkcji niwelującej nieliniowość od Mirka) W kolejnej funkcji chciałbym, aby układ sam niejako falował światłem tj ściemniał je i rozjaśniał w ustawianym potencjometrem interwale czasu. Na razie poległem na samym pomyśle Próbowałem w różny sposób Przypisywałem w przerwaniu i porównywałem wartość ADC (w poprzednim moim poście też kolega mi pomagał) aż w końcu postanowiłem przespać się z pomysłem noc albo dwie i tak zleciało do dzisiaj. Znów się do Was zwracam o pomoc tym razem jednak bardziej fundamentalnie. Może podsunie mi kolega jakiś pomysł Czuję że wpadłem w czarną dziurę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2014, o 20:28 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

powinno byc tak:
timer ustawiony na minimalna wartosc interwalu czyli 1000Hz
w przerwaniu zwiekszasz licznik (nie zapominajac o volatile)
w glownej petli sprawdzasz czy licznik nie osiagnal porzadanej wartosci (czyli nastawionej potencjometrem) jesli osiagnal to zwiekszasz natezenie o 1 oraz ustawiasz licznik z powrotem na 0.
i tyle. podazales dobra droga tylko zabraklo resetowania licznika.

Tak wiec chyba pozostaje Ci poprawnie ustawic Timer1 i nie zapomniec o volatile i resetowaniu licznika po wykonaniu akcji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 18:11 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Heh Jak widać możliwości jest wiele. Spróbuję dziś wieczorem zrealizować tak jak napisaliście. Czyli w przerwaniu odmierzam jedną najkrótszą jednostkę czyli 1ms, a w pętli głównej będę je zliczał i porównywał do wartości nastawionej przez ADC, i dopiero tam zwiększał licznik natężenia światła. To ma największy sens na chwilę obecną. Mam nadzieję że nie będę musiał wracać do tematu. Dam znać w każdym razie. Dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2014, o 20:51 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

I nie zapomnij o kasowaniu licznika jak juz osiagnie wartosc nastawiona przez ADC i wykonasz swoja operacje.;)



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

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