Mam pytanie, bo juz szukam i szukam, ale jakos porzadnej odpowiedz nie moge znalesc.. Da sie zrobic na zewnetrzym kwarcu 8MHz porzadny zegar czasu rzeczywistego?? Narazie napisalem sobie taki programi z obsluga przepelnienia (preskaler 32):
SIGNAL (SIG_OVERFLOW2){ TCNT2=6; if(licznik++==1000){ //1000 przepelnien odpowiada 1 s licznik=0; sekundy++; }
}
No ale po 1 h to juz ma jakies 3 sekundy spoznienia... Cos zle napisalem, czy po prostu nie da sie na takim kwarcu tego zrobic dokladnie?? Czytalem ze powodem tego mzoe byc ustawianie wartosci TCNT2 w przerwaniu.. Ale nadal nie wiem czy to wogole jest mozliwe???? I jeszcze jedno pytanie.. Bo tez na to nie znalazlem odpowiedzi :) EEPROM to pamiec nieulotna, tzn ze nawet jak odlacze zasilanie to dane zostaja w niej.. Tak? I nie ma zadnych problemow zeby z programu cos do niej zapisac??
Dnia 18 May 2006 07:09:31 -0700, Pan Samochodzik napisał(a):
To znaczy, że będziesz mógł pominąć tę instrukcję: TCNT2=6; Procesor zrobi to za ciebie automatycznie. Reszta w manualu, bo nawet typu procesora nie podałeś.
No dobra, to powiedzmy ze to nawet bedzie dzialac, ale zapomnialem dodac jednej rzeczy... Bo tak na prawde to chce wlozyc ten zegarek to urzadzenia, ktore odbiera podczerwien itp.. No i uzywam tam przerwan z INT0 i INT1 w momencie odbierania sygnalu podczerwieni ( niezbyt czesto, powiedzmy 20 razy na dobe). Czy przy takich warunkach jest jest taki zegar w stanie normalnie funkcjonowac, czy jednak powinienem dolozyc zewnetrzny kwarc zegarkowy???? Program na tej samej zasadzieby byl, prawda?? A tak wogole to chyba uklad bedzie na ATmega 8, albo 16 jezeli mi zabraknie pinow...
No wiem wiem, juz to zmienilem i sprawdzam.. Jutro sie okaze :) A jak z tymi kwestiami juz nie dotyczacymi samego zegara?? Moze to tak dzialac rownolegle do innych przerwan??
No wiem wiem, juz to zmienilem i sprawdzam.. Jutro sie okaze :) A jak z tymi kwestiami juz nie dotyczacymi samego zegara?? Moze to tak dzialac rownolegle do innych przerwan??
Napisz kod tak, aby wartość wpisywana do licznika była jak najmniejsza gdy licznik liczy w górę, albo jak największa gdy licznik liczy w dół. Zalecałbym też napisanie obsługi przerwania w assemblerze z modyfikatorami funkcji, które spowodują, że kompilator nie utworzy żadnej instrukcji procesora, nawet "reti"; poniżej przykładowy kod który ma wykonać 2 instrukcje TCNT0 = TIMERINITIALVALUE; ++g_byTicks;
Powyżej wykorzystałem r17 do przechowania stanu flag __SREG__, a r16 służy mi do wykonania operacji: wpisania wartości do timera oraz inkrementacji g_byTicks.
A poniżej kod funkcji w C oraz wygenerowany z niej kod assemblerowy
Zobacz że procesor wkłada dodatkową pracę w odkładanie/zdejmowanie rejestrów __zero_reg__ i __tmp_reg__ na stos, co mogłem spokojnie pominąć w moim kodzie assemblerowym.
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.