[BASCOM][ATmega8L][10MHz]timer problem
-
smichaelxx
- -
- Posty: 2
- Rejestracja: 25 lut 2010, 15:49
- Lokalizacja: polska
[BASCOM][ATmega8L][10MHz]timer problem
Witam
Chciałbym zrobić zapis zmiennej do pamięci EEPROM co 5 minut. Z tego co się dotyczyłem niby najłatwiej zrobić to TIMERAMI niestety nigdy nie miałem z nimi do czynienia. Czy mógłby Ktoś podsunąć przykładowy kod.
Dzięki
Pozdraiwam
Chciałbym zrobić zapis zmiennej do pamięci EEPROM co 5 minut. Z tego co się dotyczyłem niby najłatwiej zrobić to TIMERAMI niestety nigdy nie miałem z nimi do czynienia. Czy mógłby Ktoś podsunąć przykładowy kod.
Dzięki
Pozdraiwam
5 minut z timera tak bez pisania odpowiednich procedur to raczej nie wyciągniesz, chyba że procesor będziesz taktował jakimś Spartańsko małym zegarem np. zegarkowym podzielonym jeszcze dodatkowo przez 128.
Ogólnie knif polega na tym aby ustawić timer tak aby zgłaszał przerwania np. 100 razy na sek. Procedura przerwania zwiększa zmienną set_sek i kiedy ta osiągnie wartość 10 (czyli upłynie 1 sek bo 100x10=1000ms czyli 1sek) zeruje ją i zwiększa np. zmienną czas. Ponieważ 5 minut to 60sek x 5 czyli 300 sek, to jak zmienna czas osiągnie wartość 300, jest zerowana, i następuje zapis do EEPROM.
Zapisać w programie można to akurat na wiele sposobów, albo w całości w procedurze przerwania od Timera, albo rozdzielić na kilka części. Ten drugi sposób dla początkujących jest bardziej zagmatwany, ale bardziej profesjonalny, z punktu widzenia programowania.
Ogólnie knif polega na tym aby ustawić timer tak aby zgłaszał przerwania np. 100 razy na sek. Procedura przerwania zwiększa zmienną set_sek i kiedy ta osiągnie wartość 10 (czyli upłynie 1 sek bo 100x10=1000ms czyli 1sek) zeruje ją i zwiększa np. zmienną czas. Ponieważ 5 minut to 60sek x 5 czyli 300 sek, to jak zmienna czas osiągnie wartość 300, jest zerowana, i następuje zapis do EEPROM.
Zapisać w programie można to akurat na wiele sposobów, albo w całości w procedurze przerwania od Timera, albo rozdzielić na kilka części. Ten drugi sposób dla początkujących jest bardziej zagmatwany, ale bardziej profesjonalny, z punktu widzenia programowania.
Albo ja czegoś nie zrozumiałem, albo coś pomyliłeś. Jeżeli w ciągu sekundy następuje 100 przerwań, to sekunda upływa po zliczeniu w zmiennej do 100, a nie do 10. Sto razy na sekundę, to jest 100Hz, zmienna pracuje jak dzielnik, skoro dzielisz przez 10 to masz 10Hz a nie 1Hz.kayron pisze:Ogólnie knif polega na tym aby ustawić timer tak aby zgłaszał przerwania np. 100 razy na sek. Procedura przerwania zwiększa zmienną set_sek i kiedy ta osiągnie wartość 10 (czyli upłynie 1 sek bo 100x10=1000ms czyli 1sek) zeruje ją i zwiększa np. zmienną czas.
Jeżeli dokładność nie jest krytyczna, możesz to zrobić bez timerów. Wstawiasz do pętli głównej opóźnienie, np 100ms i zliczasz iteracje pętli w zmiennej. Po wystąpieniu (1000ms*60*5)/100ms = 10*60*5=3000 iteracji mija czas 5 sek. Zapisujesz do EEPROM i zliczasz od początku. Całość będzie działać, jeżeli pozostałe instrukcje w pętli nie będą się wykonywać zbyt długo.Chciałbym zrobić zapis zmiennej do pamięci EEPROM co 5 minut.
Względnie możesz wstawić jakieś małe opóźnienie i eksperymentalnie wyznaczyć liczbę iteracji pętli po jakiej mija 5 minut.
Oczywiście sposób oparty o timery będzie dokładniejszy.
-
keruseykaryu
Teoretycznie. O ile zawartość głównego programu pozwoli, to się wtedy nawet kolega nie będzie zastanawiał, tylko od razu wrzuci WAIT 5. Rozrzut czasu będzie nawet mniejszy! niźli skumulowany błąd z wszystkich WAITMS 100. Ale coś tu namieszałeś bo 100ms = 0,1s. Skąd z 3000 wyjdzie Ci 5 sekund?alaris pisze:Jeżeli dokładność nie jest krytyczna, możesz to zrobić bez timerów. Wstawiasz do pętli głównej opóźnienie, np 100ms i zliczasz iteracje pętli w zmiennej. Po wystąpieniu (1000ms*60*5)/100ms = 10*60*5=3000 iteracji mija czas 5 sek.
Ale policzmy tak dla zasady:
Jedno WAITMS 100 generuje 100,065ms czasu po przemnożeniu przez 3000 iteracji daje 300195ms, co daje 5 minut i skumulowany błąd 3,25ms. To samo z WAIT 5 (5003,141ms), po przeliczeniu liczby iteracji, daje 5 minut i skumulowany błąd 3,14ms. C.b.d.u.
-
keruseykaryu
Ja bym tam nie radził Wait-ów stosować i nie chodzi tu o ich dokładność. Nie wchodząc w szczegóły można powiedzieć że nie jest to zgodne z zasadami programowania, dobrego programowania. Ktoś powie no to po co w BASCOM jest ta instrukcja
Aby nie komplikować niepotrzebnie przykładów z Helpa, aby początkujący sie od razu nie pogubił.
Timery ani przerwania nie gryzą, a przy zegarze 10MHz nie trzeba się zbytnio martwić że procesor z czymś się nie wyrobi.
Prędzej czy później kolega i tak będzie musiał się z Timerami zmierzyć, wiec lepiej na początek z prostym odmierzeniem czasu potrenować, niż potem utknąć na czymś bardziej wymagającym.
Instrukcje config Timerx oraz Enable interrupts i Enable T0 nie są jakieś skomplikowane. Bascom pozwala bez większych problemów stosować Timery (oprócz rodziny TINY i bardziej rozbudowanych CPU), wiec trzeba tylko poczytać Helpa.
Timery ani przerwania nie gryzą, a przy zegarze 10MHz nie trzeba się zbytnio martwić że procesor z czymś się nie wyrobi.
Prędzej czy później kolega i tak będzie musiał się z Timerami zmierzyć, wiec lepiej na początek z prostym odmierzeniem czasu potrenować, niż potem utknąć na czymś bardziej wymagającym.
Instrukcje config Timerx oraz Enable interrupts i Enable T0 nie są jakieś skomplikowane. Bascom pozwala bez większych problemów stosować Timery (oprócz rodziny TINY i bardziej rozbudowanych CPU), wiec trzeba tylko poczytać Helpa.