 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
eddie Član

Pridružen-a: Sre 10 Dec 2003 21:02 Prispevkov: 723 Aktiv.: 3.05 Kraj: Severna primorska
|
Objavljeno: Sob Sep 15, 2012 9:01 pm Naslov sporočila: Atmega48 in timer1 |
|
|
Pozdravljeni!
Imam sledečo konfiguracijo:
Atmega48, ki teče na notranjem 8Mhz oscilatorju.
Časovnik 1 bi rad uporabil za enostavno časovno bazo.
Časovnik inicializiram takole:
Koda: |
void timer1_init()
{
// set up timer with no prescaling
TCCR1B |= (1 << CS10)|(0 << CS11)|(0 << CS12);
// initialize counter
TCNT1H = 0;
TCNT1L = 0;
// enable overflow interrupt
TIMSK1 |= (1 << TOIE1);
// enable global interrupts
sei();
// initialize overflow counter variable
tot_overflow = 0;
}
|
V Timer overflow rutini pa je samo tole:
Koda: |
ISR(TIMER1_OVF_vect)
{
// keep a track of number of overflows
tot_overflow++;
} |
Če pravilno računam potem gre stvar takole:
8000000 / 16535 = 122 prekinitev vsako sekundo?
Torej če bi hotel šteti sekunde, minute in ure bi šlo nekako takole:
Koda: |
//ura
if (tot_overflow>=122){
tot_overflow=0;
LED0_Toggle;//toggle led
Sekunde++;
if (Sekunde>=60){
Sekunde=0;
Minute++;
if (Minute>=60){Minute=0; Ure++;}
}
} |
To se izvaja v glavni zanki.
Rezultat je, da ura prehiteva.
Ali je to samo posledica netočnosti internega oscilatorja ali je še kaj drugega?
Sem ga še kje pobiksal?  |
|
Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Sob Sep 15, 2012 9:26 pm Naslov sporočila: |
|
|
Na ta način ne boš imel točne ure - metoda je napačna.
Izračun, ki ga podajaš, je napačen: 8000000 / 16535 = 483,82219...
Nameto 16535 bi verjetno moral uporabit 16536.
Ker ima rezultat za decimalko še neko vrednost, ti to predstavlja napako v meritvi časa, če vrednost zaokrožiš.
Koliko ti pa odstopa? _________________ LP, Matjaž |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Sob Sep 15, 2012 9:26 pm Naslov sporočila: |
|
|
Če imaš osciloskop, lahko pripelješ notranji oscilator na izhodni pin in pomeriš kakšen je clock. Dejstvo je, da interni clock ni najbolj natančen vir (to tudi Atmel v datasheetu navaja), tako da ja, možno je, da ti clock ne teče tako kot bi moral. Nisi pa napisal, za koliko ti zadeva prehiteva. Lahko se poigraš z OSCCAL registrom, vendar bo napaka še vedno znašala nekaj sekund na uro. Če rabiš to za kako uro napravit, potem si raje omisli kak RTC čip. Ali pa kak DCF77 modul.
LP G _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Sob Sep 15, 2012 9:28 pm Naslov sporočila: |
|
|
matjazkariz je napisal/a: |
Nameto 16535 bi verjetno moral uporabit 16536.
|
Po moje je imel tukaj v mislih 65536(2^16), Timer1 je 16 bitni zato se overflow zgodi vsake 2^16 ciklov, to pa je malenkost več kot 122 x na sekundo.
LP G _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Sob Sep 15, 2012 9:31 pm Naslov sporočila: |
|
|
Nastopajoče številke so nenavadne.
Naprimer 16535 namesto 16384, pa 122 namesto 122,0703125 .
Malo pomnoži stvari in dodaj korekcijo. Vsakih 14 sekund dodaj 1 prekinitev (123), vsakih 56 sekund eno odštej, vsakih 108 sekund eno dodaj ... _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
protoncek Član

Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 42.79 Kraj: Mengeš
|
Objavljeno: Sob Sep 15, 2012 9:40 pm Naslov sporočila: |
|
|
Mislim da je prva stvar, ki jo je treba narediti vsaj to, da uporabiš zunanji kristal. Brez tega bo ura danes točna, jutri bo lahko zaostajala, pojutrišnjem pa prehitevala. Za še več pa, kot so ti svetovali - RTC čip ali DCF sistem. |
|
Nazaj na vrh |
|
 |
eddie Član

Pridružen-a: Sre 10 Dec 2003 21:02 Prispevkov: 723 Aktiv.: 3.05 Kraj: Severna primorska
|
Objavljeno: Sob Sep 15, 2012 10:03 pm Naslov sporočila: |
|
|
Uff, ja malo prehitro sem tipkal.
Mišljeno je bilo 8000000 (kar je frekvenca oscilatorja) / 65535(=16 bitni števec=>tu je že prva napaka - prekinitev se res zgodi na vsaki 65536 takt ure!). Naslednja napaka je rezultat 122. Kalkulator v win7 mi nikoli ni bil všeč... V "programmer" načinu, ki je OK za nekatere stvari so rezultat samo cela števila. Saj čudno se mi je zdelo da se tako lepo izide na okroglo 122.
OK s temi popravki bi že moralo biti bolj točno. Bomo videli.
Kako je s kalibracijo oscilatorja, ki naj bi se izvedla ob vsakem štartu mikrokontrolerja? Ali samo vzame kalibrirano vrednost iz spomina ali dejansko ob zagonu kalibrira oscilator glede na trenutne razmere?
Ne gre se za veliko točnost, samo za vklapljanje na intervale. Če bo stvar malo "lezla" nebo hujšega. Koliko bolje bi bilo z zunanjim kristalom?
Hvala za pomoč! |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Ned Sep 16, 2012 11:00 am Naslov sporočila: |
|
|
Z zunanim kristalom bo zdeva bistveno boljša, ne bo pa idealna. Tudi kristali imajo svoja odstopanja (najpogosteje 50ppm - kar pomeni cca 50ciklov na MHz). Dobiš tudi take z 10ppm. Če ti hitrost ni bogve kako kritična, predlagam uporabo kristala 11059200 Hz,ki je zelo pogost, njegova prednost pa je v tem, da če ga deliš z 2^8, 2^9 , 2^10,2^11,2^12 itd... dobiš vedno okroglo cifro. Sicer pa ima vsak timer tudi prescaler (delilnik) s katerim lahko vhodni clock deliš (2,8,16,64,256,512 in 1024). Lahko uporabiš tudi Reload in s tem se izogneš tistim decimalkam. Vsekakor boš z zunanjim kristalom dosegel boljše rezultate kot z notranjim.
LP G
pri vrednosti kristala sem namesto 5 udarl 6 (11059200 je prava vrednost) _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazadnje urejal/a RGorazd Ned Sep 16, 2012 1:39 pm; skupaj popravljeno 2 krat |
|
Nazaj na vrh |
|
 |
eddie Član

Pridružen-a: Sre 10 Dec 2003 21:02 Prispevkov: 723 Aktiv.: 3.05 Kraj: Severna primorska
|
Objavljeno: Ned Sep 16, 2012 12:02 pm Naslov sporočila: |
|
|
Hvala za vse odgovore. Po teh popravkih je bila ura dokaj točna. Se je pa poznalo pomojem zaradi razlike temperature zvečer in danes zjutraj. Kar velika razlika v točnosti - temperaturna razlika cca.6 °C. Bom najprej poizkušal z zunanjim kristalom - imam 10Mhz, pa še nekaj recikliranih, katerih vrednosti moram še ugotoviti. Morda bo kakšen bolj primeren. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|