Pytanie o synchronizacje czasu w Atmega...

Witam!

Chcialem sobie zrobic uklad wlaczajacy i wylaczajacy swiatlo w akwarium na uC (Atmega8) i moje pytanie czy można to smialo zrobic za pomoca Timera (jesli tak to czy 8-bitowy starczy) czy lepiej za pomoca gotowego zegara np. pod I2C? Chodzi o to abym np. co jakis czas nie musial go ‘synchronizowac’.

Pozdrawiam Rafal K.

Reply to
ToR
Loading thread data ...
Reply to
Bogdan Gutknecht

Witam ;)!

Dziekuje wszytkim za help'a ;).Sterownik chce zrobic na procku Atmega8,ale czytajac powyzsze posty pojawilo mi sie pytanie. Gdyz ja ten program widzialem tak :

najperw za pomoca Timera T0 odmierze sobie jedna sekuna a potem odpowiednio ja zlicajac dodam minuty i sek...A tu powiedziane zostalo o 2-timerach czy mozna prosic o rozwiniecie tego watku?

(Atmega8,WinAVR,AVR Studio 4.0)

Pozdarwiam, Rafal k.

Reply to
ToR

ToR napisał(a):

Hmm, to jak zamierzasz użyć ATmega8 i WinAVR to może zainteresuje Cię ten wątek:

formatting link
w nim opisane jak na ATmega8 zrobić prosty zegarek, odmierzanie czasu na T2 taktowanym asynchronicznie z kwarca 32 kHz. Zegar został pomyślnie przetestowany przez VSS, ma niedługo wrzucić wszystko na stronę - póki co mogę Ci przesłać kod źródłowy - miałbyś jakiś punkt zaczepienia. Jeśli chodzi o to czy będzie chodził wystarczająco dokładnie to kwarce zegarkowe mają zazwyczaj koło 20 ppm, ew. możesz dostroić konkretny egzemplarz trymerkiem albo dołożyć korekcję programową.

Reply to
Darek R.

Piotr Pitucha napisał(a):

Jak nie ma jak ma... T2 możesz taktować asynchronicznie z kwarca 32kHz.

Reply to
Darek R.

Piotr Pitucha napisał(a):

Tak sobie dla pewności jeszcze raz zajrzałem w pdfy do tych procków czy nic mi nie umknęło, ale nie. Zarówno w ATmega32 jak i ATmega8, na pierwszej stronie pdfa jest wzmianka o RTC (Real Time Counter with Separate Oscillator). W dodatku ten RTC na ATmega32 jest TAKI SAM jak na ATmega8 - napisz dokładnie gdzie Ty widzisz różnicę.

Reply to
Darek R.

Piotr Pitucha napisał(a):

Masz rację.

I tu również masz rację. Tutaj nie ma powodu dla którego procek nie mógłby być taktowany wbudowanym generatorem RC, mimo jego niskiej stabilności, więc spokojnie ATmega8 wystarczy.

Reply to
Darek R.

Bylbym Ci bardzo wdzieczny gdyz jestem poczatkujacy i dopiero zaczynam w pisniau oprogramwoania dla sterownikow.

Moj mail jest taki jak w loginie ale jeszce raz podam ToR snipped-for-privacy@o2.pl

Pozdarwiam, Rafa k.

Reply to
ToR

Do wymagan mojego sterownika nalezy odmierzanie czasu oswietlenia -podanego przez urzytkownka za pomoca wprowadzenia danych poprzez 2 przyciski (1-start,2- ilosc przycisniec rownoznaczna z iloscia godzin i potem znow 1-jako start dzialania)

Moj pomysl na prosty zegarek jest nastepujacy jak w kodzie ponizej mam tylko pytanie jak zrobic aby wprowadzic jeszcze obsluge przyciskow? Bo zapewne nie moze to byc zaimplementowane w fukncji SIGNAL (SIG_OVERFLOW0)??

//---------------------------------------------------

unsigned int Licznik_sekund = 0; unsigned int Licznik_minut = 0; unsigned int Licznik_godzin = 0; unsigned int licznik=4000;

SIGNAL (SIG_OVERFLOW0) { TCNT0=tau0; DDRD=0xFF; if (--licznik==0) { PORTD=Licznik_sekund; licznik=4000; //aby odmierzyc 1 sek Licznik_sekund++;

if (Licznik_sekund==60) { Licznik_sekund = 0; Licznik_minut++; } if (Licznik_minut==60) { Licznik_minut = 0; Licznik_godzin++; } if ((Licznik_godzin==23)&&(Licznik_minut==60)) { Licznik_minut = 0; Licznik_godzin = 0; } //np wlazcanie pzrekanzika u mnie narazie diody... if (Licznik_minut==1) { LED_ON; } } TIFR = (1<<TOV0); }

void main () { TIMSK=1<<TOIE0; //zezwolenie na przerwanie od TC0 TCNT0=tau0; //od kad ma zliczac czyli 250 TCCR0=2; //pleskaler sei(); DDRD=0xFF; PORTD=0XFF; while(1) { } }

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

Co o tym myslicie?

pozdarwiam, Rafal k.

Reply to
ToR

ToR napisał(a):

A czemu nie? Może też być wywoływane np. w przerwaniu od naciśnięcia - zależy gdzie masz te przyciski. Może być też w głównej pętli. Kolejne pytanie jak często wywoływane jest to przerwanie - nie napisałeś z jakim zegarem działasz. Tak na oko z kodu programu wynika że 8 Mhz - tak? Jeśli tak to:

1) Czemu to przerwanie jest tak często wywoływane? Potrzebujesz 4 tys przerwań na 1 sek? Nie prościej zwiększyć preskaler, wywoływać przerwanie i nie zliczać licznika aż do 4 tys? 2) Te 8 MHz to jest z kwarcu czy z wewnętrznego RC? Jeśli to drugie to będzie Ci pływało - a chciałeś stabilnie :/ Może jednak wykorzystasz T2 i taktowanie asynchroniczne z kwarca 32kHz? Będziesz mógł ustawić przerwanie co 1 sek (lub nawet rzadziej).

Potrzebujesz aż inta? Char nie starczy?

Użyj timerka z trybem CTC (Clear Timer on Compare Match) - nie będziesz musiał każdorazowo w przerwaniu ładować zawartości timerka.

A po co Ci to w przerwaniu?

Tego if-a możesz zagnieździć w poprzednim.

A ten się nigdy nie wykona - bo jak będzie 23:60 to poprzedni if to zamieni na 24:00. No i też go możesz zagnieździć.

Zerowanie tej flagi jest robione automatycznie sprzętowo podczas wywołania przerwania - nie musisz tego robić ręcznie.

Pamiętasz o tym że T0 liczy zawsze w górę? Na pewno chcesz zliczać 6 cykli czy 250? Bo coś mi się wydaje że to drugie :/

Jeszcze trzeba trochę doszlifować i parę kwestii przemyśleć, ale na początek nie jest źle.

Reply to
Darek R.

Tak na oko z kodu programu wynika że 8 Mhz -

Tak mam zewnerzny kwarc 8MHz. Jesli chodzi o wywolywanie przerwan to po prostu za pomoca PDF'a od tej atmegi policzylem sobie odpowiednie wspolczyniki i tak mi jakos wyszlo ale widze ze niezbyt szczesliwie je dobralem ;) ,a wiec szybko to poprawie ;)

Slyszalem cos o tym CTC ale na razie nie rozumiem jego ideii..Mozesz cos wiecej na ten temat?

No wlasnie chce zliczac 250 cykli,bo tak wyszlo mi z obliczen...I w T0 ustawiam wartosc 6 aby 250 = 256 - 6;

Pozdrawiam, Rafal k.

Reply to
ToR

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.