[BASCOM][ATmega8L][10MHz]timer problem

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
smichaelxx
-
Posty: 2
Rejestracja: 25 lut 2010, 15:49
Lokalizacja: polska

[BASCOM][ATmega8L][10MHz]timer problem

Post autor: smichaelxx » 03 cze 2010, 10:42

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

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 03 cze 2010, 15:10

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.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 03 cze 2010, 17:12

Tak na marginesie zapytam czy autor wątku wie że dla Atmegi8L nie jest zalecane podłączanie kwarcu/generatora szybszego niż 8MHz?

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 03 cze 2010, 17:26

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.
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.
Chciałbym zrobić zapis zmiennej do pamięci EEPROM co 5 minut.
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.
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.

Awatar użytkownika
haterkmp
Użytkownik
Posty: 652
Rejestracja: 08 sie 2008, 11:47
Lokalizacja: Wałbrzych

Post autor: haterkmp » 03 cze 2010, 18:10

po co zapisywać coś do eeproma co 5 minut? nie lepiej wyznaczyć sobie jakiś powód/zdarzenie po którym miałby zapisywać? poza tym zastanawia mnie fakt umiejętności korzystania z procedur dot. eeproma a z timerów już nie... podaj jakieś konkrety dot. urządzenia.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 03 cze 2010, 18:28

A faktycznie sie pomyliłem z tymi obliczeniami, 100 miało być a nie tysiąc.

keruseykaryu

Post autor: keruseykaryu » 04 cze 2010, 7:33

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.
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? :shock: Już wiem. Ok.
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.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 04 cze 2010, 9:37

keruseykaryu pisze:tylko od razu wrzuci WAIT 5.
Błąd może i będzie mniejszy, ale jeżeli program ma robić jeszcze coś innego niż zapisywanie do EEPROMu, to takie opóźnienie sprawi, że reakcja oprogramowania na np. naciśnięcie klawisza będzie koszmarnie wolna. Stąd właśnie propozycja tych 100ms :)

keruseykaryu

Post autor: keruseykaryu » 04 cze 2010, 12:45

Na szczęście błędy są na poziomie milisekund, a różnica w setkach mikrosekund. Bez znaczenia, to przecie nie zegarek ato... bascomowy. :cool:

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 04 cze 2010, 19:58

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.

ODPOWIEDZ