RTC i avr



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Pan Samochodzik" <megamail_at_nospam_tlen.pl>
Subject: RTC i avr
Date: 18 May 2006 04:24:26 -0700


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??


Poprzedni Następny
Wiadomość
Spis treści
From: "Bogdan Gutknecht" <usunto_b_gutknecht_itotez_at_nospam_interia.pl>
Subject: Re: RTC i avr
Date: Thu, 18 May 2006 14:55:09 +0200


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):


Da się. Porządność zegara zależy tylko od kwarcu (i prawidłowego programu).


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..

Dobrze czytałeś - to jest ta przyczyna. Wybierz sobie jakiś tryb z
automatycznym przeładowywaniem. Twoje przeładowanie nie jest pierwszą
instrukcją w przerwaniu!!!! Jest tam przed nią pewna (jaka? - należałoby to
sprawdzić w listingu) ilość instrukcji.

Ale nadal nie wiem czy to wogole jest mozliwe????

Jeśli chcesz bardzo dokładnie to możesz jeszcze dorzucić co jakiś czas
korekcję.

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??

Tak można zapisać, ale ten zapis trwa parę milisekund i należy o tym
pamiętać.


Poprzedni Następny
Wiadomość
Spis treści
From: "Zibias" <qwaterka_at_nospam_poczta.onet.pl>
Subject: Re: RTC i avr
Date: Thu, 18 May 2006 15:50:57 +0200



Użytkownik "Pan Samochodzik" <megamail_at_nospam_tlen.pl> napisał w wiadomości
news:1147951466.296132.207370_at_nospam_g10g2000cwb.googlegroups.com...
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):

Jest jeszcze taka możliwość że kwarc i owszem jest, ale fuse-bit ustawione
są tak że chodzi wewnętrzny generator 8MHz. On nie jest specjalnie
dokładny i tu może leżeć problem.



Poprzedni Następny
Wiadomość
Spis treści
From: "Pan Samochodzik" <megamail_at_nospam_tlen.pl>
Subject: Re: RTC i avr
Date: 18 May 2006 07:09:31 -0700


8Mhz zewnetrze jest ustawione, to wewnetrzne to "prawie nie dziala" :)

Dobrze czytales - to jest ta przyczyna. Wybierz sobie jakis tryb z
automatycznym przeladowywaniem. Twoje przeladowanie nie jest pierwsza
instrukcja w przerwaniu!!!! Jest tam przed nia pewna (jaka? - nalezaloby to
sprawdzic w listingu) ilosc instrukcji.

Co to znaczy automatyczne przeladowywanie?? Mozesz troche prosciej??


Poprzedni Następny
Wiadomość
Spis treści
From: Marcin Stanisz <mstanisz_at_nospam_poczta.bzdury.onet.pl>
Subject: Re: RTC i avr
Date: Thu, 18 May 2006 18:13:35 +0200


Dnia 18 May 2006 07:09:31 -0700, Pan Samochodzik napisał(a):

Co to znaczy automatyczne przeladowywanie?? Mozesz troche prosciej??

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ś.

Pozdrawiam
Marcin Stanisz
--

"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl>
Subject: Re: RTC i avr
Date: Thu, 18 May 2006 19:44:48 +0000 (UTC)


Pan Samochodzik <megamail_at_nospam_tlen.pl> napisał(a):

Co to znaczy automatyczne przeladowywanie?? Mozesz troche prosciej??

Uruchom timer w trybie CTC , jeśli takowy tryb posiada ;)

Piotrek


--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Poprzedni Następny
Wiadomość
Spis treści
From: =?iso-8859-2?Q?Piotr_Ga=B3ka?= <piotr.galka_at_nospam_CUTTHISmicromade.pl>
Subject: Re: RTC i avr
Date: Thu, 18 May 2006 16:12:51 +0200



Użytkownik "Pan Samochodzik" <megamail_at_nospam_tlen.pl> napisał w wiadomości
news:1147951466.296132.207370_at_nospam_g10g2000cwb.googlegroups.com...
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...

Zmierz dokładniej - sądzę, że powinno wyjść 3,6s opóźnienia.
P.G.


Poprzedni Następny
Wiadomość
Spis treści
From: "Pan Samochodzik" <megamail_at_nospam_tlen.pl>
Subject: Re: RTC i avr
Date: 18 May 2006 07:56:19 -0700


Wybacz, ale nie dam rady tego , jedyne co to moge na oko.. Tak sadzilem
ze cos kolo 3-4 s, wiec napisz jak zmienic, zeby bylo ok...


Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Galka" <piotr.galka_at_nospam_CUTTHISmicromade.pl>
Subject: Re: RTC i avr
Date: Fri, 19 May 2006 10:21:37 +0200



Uzytkownik "Pan Samochodzik" <megamail_at_nospam_tlen.pl> napisal w wiadomosci
news:1147964179.647062.170280_at_nospam_y43g2000cwc.googlegroups.com...
Wybacz, ale nie dam rady tego , jedyne co to moge na oko.. Tak sadzilem
ze cos kolo 3-4 s, wiec napisz jak zmienic, zeby bylo ok...

Wedlug mnie w ciagu kazdej sekundy masz opóznienie 1ms - poszukaj.
P.G.


Poprzedni Następny
Wiadomość
Spis treści
From: "Pan Samochodzik" <megamail_at_nospam_tlen.pl>
Subject: Re: RTC i avr
Date: 19 May 2006 08:31:24 -0700


Ok, przerobilem na tryb CTC, teraz funkcja wlaczajaca i przerwanie
wygladaja tak:

void timer2_init (void)
{
//wlaczamy timer2

TCCR2 |= (1 << CS21); //preskaler 32 dla timer2
TCCR2 |= (1 << CS20);
TCCR2 |= (1 << WGM21); //Clear Timer on Compare (z OCR2)
OCR2 = 250; //zerowanie kiedy osiagnie 250 a nie 255

licznik=0;
sekundy=0;
minuty=0;
godziny=0;

TIMSK |= (1 << OCIE2); //wlaczamy przerwanie dla CTC
TIMSK |= (1 << TOIE2); //wlaczamy przerwanie dla timera2

}


I przerwanie:

SIGNAL (SIG_OUTPUT_COMPARE2){

if(licznik++==1000){ //1000 przepelnien odpowiada 1 s
licznik=0;
sekundy++;
zmien++;
}

}

Biore sie za testowanie.. Ale jezeli widzicie jakis blad to krzyczcie :)


Poprzedni Następny
Wiadomość
Spis treści
From: "Pan Samochodzik" <megamail_at_nospam_tlen.pl>
Subject: Re: RTC i avr
Date: 19 May 2006 08:41:56 -0700


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...


Poprzedni Następny
Wiadomość
Spis treści
From: "Pan Samochodzik" <megamail_at_nospam_tlen.pl>
Subject: Re: RTC i avr
Date: 19 May 2006 09:46:24 -0700


No i nie dziala.. po godzinie to juz jakies 10 sekund roznicy jest....
/


Poprzedni Następny
Wiadomość
Spis treści
From: "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl>
Subject: Re: RTC i avr
Date: Fri, 19 May 2006 18:33:40 +0000 (UTC)


Pan Samochodzik <megamail_at_nospam_tlen.pl> napisał(a):

No i nie dziala.. po godzinie to juz jakies 10 sekund roznicy jest....
/

Bo nie chce Ci sie pomyśleć(policzyc) :)
void timer2_init (void)
{
//wlaczamy timer2

TCCR2 |= (1 << CS21); //preskaler 32 dla timer2
TCCR2 |= (1 << CS20);
TCCR2 |= (1 << WGM21); //Clear Timer on Compare (z OCR2)
OCR2 = 249; //zerowanie też "trwa" ;)
asm("sei");
licznik=0;
sekundy=0;
minuty=0;
godziny=0;

TIMSK |= (1 << OCIE2); //wlaczamy przerwanie dla CTC
TIMSK |= (1 << TOIE2); //wlaczamy przerwanie dla timera2

}



SIGNAL (SIG_OUTPUT_COMPARE2){

if(++licznik==1000){ //na to zwrócił uwagę któryś z kolegów
licznik=0;
sekundy++;
zmien++;
}

}

Piotrek



--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Poprzedni Następny
Wiadomość
Spis treści
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: RTC i avr
Date: Fri, 19 May 2006 19:22:29 +0200


Piotr Galka przemówił ludzkim głosem:

Wedlug mnie w ciagu kazdej sekundy masz opóznienie 1ms - poszukaj.

Taka różnica może być spowodowana przez tą linię:

if(licznik++==1000){ //1000 przepelnien odpowiada 1 s

zmienna licznik jest inkrementowana po zakończeniu porównania, a powinna
być przed.

if(++licznik==1000){ //1000 przepelnien odpowiada 1 s

Poprzedni Następny
Wiadomość
Spis treści
From: "Pan Samochodzik" <megamail_at_nospam_tlen.pl>
Subject: Re: RTC i avr
Date: 19 May 2006 13:54:50 -0700


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??


Poprzedni Następny
Wiadomość
Spis treści
From: =?iso-8859-2?Q?Piotr_Ga=B3ka?= <piotr.galka_at_nospam_CUTTHISmicromade.pl>
Subject: Re: RTC i avr
Date: Sat, 20 May 2006 09:20:19 +0200



Użytkownik "Zbych" <abuse_at_nospam_onet.pl> napisał w wiadomości
news:e4kv07$3g1$1_at_nospam_nemesis.news.tpi.pl...

Wedlug mnie w ciagu kazdej sekundy masz opóznienie 1ms - poszukaj.

Taka różnica może być spowodowana przez tą linię:

if(licznik++==1000){ //1000 przepelnien odpowiada 1 s

Już pisząc że opóźnienie powinno być 3,6s/h (czyli, że wynika z programu a
nie z kwarca) kombinowałem aby sam to znalazł.
P.G.


Poprzedni Następny
Wiadomość
Spis treści
From: "Pan Samochodzik" <megamail_at_nospam_tlen.pl>
Subject: Re: RTC i avr
Date: 20 May 2006 15:22:36 -0700


jak juz napisalem:

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??

Odpowie mi ktos ??


Poprzedni Następny
Wiadomość
Spis treści
From: "Michal Lankosz" <nie_at_nospam_lubie.spamu>
Subject: Re: RTC i avr
Date: Sun, 21 May 2006 11:38:29 +0200


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??

Jesli juz twój zegar bedzie dzialal tak jak poradzili poprzednicy (tryb CTC)
to spokojnie mozna uzywac i innych przerwan. W przypadku, gdy obslugujesz
np. wspomniany odbiornik podczerwieni i w tym czasie przyjdzie przerwanie
zegara, to trudno - spóznisz sie z jego obsluga, ale za to nastepnym razem
zapewne wejdziesz do niej szybciej. Srednia wartosc czestotliwosci obslugi
przerwan zegarowych bedzie stala (taka, jaka sobie zadales), tylko pojawi
sie jitter - niewielkie odstepstwa od chwili, w której miala by sie ona
zaczac. Jak duze? - zalezy od szybkosci procedur pozostalych przerwan.
Oczywiscie obsluga kazdego przerwania musi byc krótsza od czestotliwosci ich
generowania. Zatem odbiór podczerwieni nie moze blokowac przerwan (np.
umieszczajac w nim petle opózniajace) bo zgubisz sygnaly zglaszajace
przerwania od timera!

Pozdrawiam,
Michal Lankosz



Poprzedni Następny
Wiadomość
Spis treści
From: MariuszC <marcukr_at_nospam_.op.toskasuj.pl>
Subject: Re: RTC i avr
Date: Mon, 22 May 2006 20:33:53 +0200


Pan Samochodzik wrote:
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++;
}

}

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;

_attribute_ ((naked)) SIGNAL( SIG_OVERFLOW0 )
{
asm volatile(
"push r17" "\n\t" // store r17 register
"in r17, _SREG_" "\n\t" // store Flags in r17
"push r16" "\n\t" // store r16 register
"ldi r16, %1" "\n\t"
"out %0, r16" "\n\t" // TCNT0 = TIMERINITIALVALUE;
"lds r16, g_byTicks" "\n\t"
"inc r16" "\n\t"
"sts g_byTicks, r16" "\n\t" // ++g_byTicks
"pop r16" "\n\t" // restore r16 register
"out _SREG_, r17" "\n\t" // restore Flags from r17
"pop r17" "\n\t" // restore r17 register
"reti" "\n\t"
:
: "I" ( _SFR_IO_ADDR( TCNT0 ) ), "M" ( TIMERINITIALVALUE )
);
}

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

SIGNAL( SIG_OVERFLOW0 )
{
TCNT0 = TIMERINITIALVALUE;
++g_byTicks;
}

1397 /* prologue: frame size=0 */
1398 0616 1F92 push _zero_reg_
1399 0618 0F92 push _tmp_reg_
1400 061a 0FB6 in _tmp_reg_, _SREG_
1401 061c 0F92 push _tmp_reg_
1402 061e 1124 clr _zero_reg_
1403 0620 8F93 push r24
1404 /* prologue end (size=6) */
1405 .LM161:
1406 0622 84E5 ldi r24,lo8(84)
1407 0624 82BF out 82-0x20,r24
1408 .LM162:
1409 0626 8091 0000 lds r24,g_byTicks
1410 062a 8F5F subi r24,lo8(-(1))
1411 062c 8093 0000 sts g_byTicks,r24
1412 /* epilogue: frame size=0 */
1413 0630 8F91 pop r24
1414 0632 0F90 pop _tmp_reg_
1415 0634 0FBE out _SREG_, _tmp_reg_
1416 0636 0F90 pop _tmp_reg_
1417 0638 1F90 pop _zero_reg_
1418 063a 1895 reti

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.


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??