vremenska tacnost piceva
Moderators: pedja089, stojke369, [eDo], trax
vremenska tacnost piceva
Poz, napravio sam digitalni sat sa pic16f84a i problem mi je sto je prilicno neprecizan. Na svakih 12 sekundi, zakasni jednu. Zanima me da li su tacniji picevi koji koriste kristal od 20MHz i ako jesu koliko? Ili je mozda najbolje napraviti neki tacan oscilator, pa ga povezati za pic. Hvala unapred!
Kad pijemo, mi se i napijemo.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Re: vremenska tacnost piceva
Sto se tice tacnosti PIC-eva oni su veoma tacni kada je sve oko njega uradjeno kako treba. Provjeri program jer da ti toliko kasni u tako kratkom vremenu ne vjerujem da je do hardwera, naravno ako je oscilator uradjen kako treba, a da nije prije pic nebi radio nikako nego tako kasnio.
Re: vremenska tacnost piceva
Na koji način brojiš sekunde?
Evo mi smo jučer na faksu imali zadatak napraviti sa 8051(NXP 8031) procesorom sat 0 - 99 sekundi i prikazati na 7-segmentnom pokazniku. Sekunde smo brojali pomoću prekidnog potprograma(brojilo generira prekid). Pošto imamo brojilo koje je 16-bitno i može izbrojati samo 2^16 impulsa potrebno je bilo brojati broj ulazaka u potporgram da se dobije 1 sekunda i onda povećati vrijednost 7-segmentnog displaya . Frekvencija kristala je bila 11.0592MHz. Pošto u jednoj sekundi ima 921600 impulsa mi smo jednostavno podjelili 921600/2^16 i dobili broj ulazaka(14,0625). Eh ali na taj način se unosi nepreciznost, zato što treba biti cijeli broj ulazaka. To je vjerojatno tvoj problem!
Stoga treba broj impulsa(u ovom slučaju 921600) podijeliti sa nekim cijelim brojem da se dobije neki broj koji je manji od 2^16. Npr. ako broj impulsa podijelimo sa 20 dobijemo 46080. Stoga nam brojilo treba u svakom ulazu prebrojiti 46080 impulsa i nakon 20 ulaska u prekid povećati broj sekundi za jedan. Neznam kakvo brojilo ima tvoj pic, ali ovaj ima upcounter brojilo koe broji od neke vrijednosti do 65536(2^16). Stoga je potrebno oduzeti od 65536-46080 da se dobije konstanta od koje brojilo broji. U svakom pozivu potprograma treba napuniti brojilo da opet broji.
Oprosti ako sam fulao tvoj problem!
Evo mi smo jučer na faksu imali zadatak napraviti sa 8051(NXP 8031) procesorom sat 0 - 99 sekundi i prikazati na 7-segmentnom pokazniku. Sekunde smo brojali pomoću prekidnog potprograma(brojilo generira prekid). Pošto imamo brojilo koje je 16-bitno i može izbrojati samo 2^16 impulsa potrebno je bilo brojati broj ulazaka u potporgram da se dobije 1 sekunda i onda povećati vrijednost 7-segmentnog displaya . Frekvencija kristala je bila 11.0592MHz. Pošto u jednoj sekundi ima 921600 impulsa mi smo jednostavno podjelili 921600/2^16 i dobili broj ulazaka(14,0625). Eh ali na taj način se unosi nepreciznost, zato što treba biti cijeli broj ulazaka. To je vjerojatno tvoj problem!
Stoga treba broj impulsa(u ovom slučaju 921600) podijeliti sa nekim cijelim brojem da se dobije neki broj koji je manji od 2^16. Npr. ako broj impulsa podijelimo sa 20 dobijemo 46080. Stoga nam brojilo treba u svakom ulazu prebrojiti 46080 impulsa i nakon 20 ulaska u prekid povećati broj sekundi za jedan. Neznam kakvo brojilo ima tvoj pic, ali ovaj ima upcounter brojilo koe broji od neke vrijednosti do 65536(2^16). Stoga je potrebno oduzeti od 65536-46080 da se dobije konstanta od koje brojilo broji. U svakom pozivu potprograma treba napuniti brojilo da opet broji.
Oprosti ako sam fulao tvoj problem!
http://sportske-igre.bloger.hr/" onclick="window.open(this.href);return false; Besplatne online igre!
Re: vremenska tacnost piceva
PIC16F84A nema interni oscilator, sto znaci da preciznost nikako ne ovisi o PIC-u. Kada kazes kristal nadam se da i mislis na njega, a ne na resonator (puno neprecizniji). Preciznost (tolerancija) kristala se izrazava u ppm (parts per million) i uobicajne vrijednosti se krecu +/-20 - 50ppm.
Slucaj od 50ppm za kristal od 1MHz znaci da ce njegova frekvencija biti 1MHz +-50Hz. Sve ovo daje da nema ni priblizne sanse da ti PIC s takvim kristalom na 12 sekundi fula jednu. Inace stabilinost kristala ovisi i o kondenzatorima koji idu uz njega (proizvodjac kristala navodi vrijednosti). Tako za "watch" kristal 32768Hz idu obicno 12,5pF, dok za ove brze 4MHz - 20MHz obicno 18 - 22pF.
Mislim da problem lezi negdje drugdje;
Jesi li odabrao pravilne postavke za oscilator u PIC-u (XT do 4MHz, HS na dalje)?
Jel ti softverski sve ok?
Slucaj od 50ppm za kristal od 1MHz znaci da ce njegova frekvencija biti 1MHz +-50Hz. Sve ovo daje da nema ni priblizne sanse da ti PIC s takvim kristalom na 12 sekundi fula jednu. Inace stabilinost kristala ovisi i o kondenzatorima koji idu uz njega (proizvodjac kristala navodi vrijednosti). Tako za "watch" kristal 32768Hz idu obicno 12,5pF, dok za ove brze 4MHz - 20MHz obicno 18 - 22pF.
Mislim da problem lezi negdje drugdje;
Jesi li odabrao pravilne postavke za oscilator u PIC-u (XT do 4MHz, HS na dalje)?
Jel ti softverski sve ok?
Re: vremenska tacnost piceva
koristim kristal od 4 MHz i kondenzatore od 22pf, hardvadski je ok sve na plocici. Koristim jedan pic za 4 segmentna dspleja i program je dosta dugacak, a skontao sam da duzina programa utice na tacnost. Sto je duzi program to vise kasni, pa mi mozda to pravi problem..
Kad pijemo, mi se i napijemo.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Re: vremenska tacnost piceva
Momak, možeš li staviti kod koji broji vrijeme tu na forum. Zanima me na koji način brojiš.
Hvala
Hvala
http://sportske-igre.bloger.hr/" onclick="window.open(this.href);return false; Besplatne online igre!
Re: vremenska tacnost piceva
output portb
output porta
a var byte 'prvi broj
b var byte 'drugi broj
c var byte
d var byte
s var byte 'sekunde
m var byte 'minute
i var byte
pocetak:
s=s+1 ' broji sekunde
if s=60 then m=m+1 and s=0
if m=60 then m=0
a=s dig 0
b=s dig 1
c=m dig 0
c=m dig 1
i=0
for i=1 to 50
Lookup a, [192,249,164,176,153,146,130,248,128,152], portb
high porta.3
pause 5
low porta.3
Lookup b, [192,249,164,176,153,146,130,248,128,152], portb
high porta.2
pause 5
low porta.2
Lookup c, [192,249,164,176,153,146,130,248,128,152], portb
high porta.1
pause 5
low porta.1
Lookup d, [192,249,164,176,153,146,130,248,128,152], portb
high porta.0
pause 5
low porta.0
next i
goto pocetak
ovo sam pravio primer za sekunde i minute
output porta
a var byte 'prvi broj
b var byte 'drugi broj
c var byte
d var byte
s var byte 'sekunde
m var byte 'minute
i var byte
pocetak:
s=s+1 ' broji sekunde
if s=60 then m=m+1 and s=0
if m=60 then m=0
a=s dig 0
b=s dig 1
c=m dig 0
c=m dig 1
i=0
for i=1 to 50
Lookup a, [192,249,164,176,153,146,130,248,128,152], portb
high porta.3
pause 5
low porta.3
Lookup b, [192,249,164,176,153,146,130,248,128,152], portb
high porta.2
pause 5
low porta.2
Lookup c, [192,249,164,176,153,146,130,248,128,152], portb
high porta.1
pause 5
low porta.1
Lookup d, [192,249,164,176,153,146,130,248,128,152], portb
high porta.0
pause 5
low porta.0
next i
goto pocetak
ovo sam pravio primer za sekunde i minute
Kad pijemo, mi se i napijemo.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Re: vremenska tacnost piceva
Auh,pa ovo nista ne valja!
Taj program se vrti u petlji,i sama petlja povecava sekunde za po jedan.
Sto je petlja duza,naravno da ce vise vremena da prodje dok ponovo skoci na uvecavanje sekundi.
Ovo se ne radi ovako,vec moras da imas nekakav prekid u kome ce da se povecava vrednost sekundi,i u koji ce sigurno da se ulazi ,bez obzira gde se program nalazi u tom trenutku.
Znaci ili TIMER prekid,ili neki spoljni prekid izazvan nekim RTC-om ili spoljnim oscilatorom.
Taj program se vrti u petlji,i sama petlja povecava sekunde za po jedan.
Sto je petlja duza,naravno da ce vise vremena da prodje dok ponovo skoci na uvecavanje sekundi.
Ovo se ne radi ovako,vec moras da imas nekakav prekid u kome ce da se povecava vrednost sekundi,i u koji ce sigurno da se ulazi ,bez obzira gde se program nalazi u tom trenutku.
Znaci ili TIMER prekid,ili neki spoljni prekid izazvan nekim RTC-om ili spoljnim oscilatorom.
Re: vremenska tacnost piceva
pocetnik sam, tako da mi i ne bas najbolje... Da uzmem naprimer oscilator iz sata? Hvala na odgovorima!
Kad pijemo, mi se i napijemo.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Re: vremenska tacnost piceva
Uzmi datasheet od tog pica i vidi kako se podesava tajmer,i kako se podesava da taj tajmer pri prekoracenju izazove prekid.Onda lepo olovku,papir i digitron u ruke,i izracunaj koliko ti "otkucaja" tajmera treba da bi dobio jednu sekundu.
Broj nece biti okrugao,tako da ces morati da u tajmer uvek upisijes neku odredjenu(izracunatu) vrednost uvek kada ti se povecaju sekunde.
Sad nesto po secanju:ako je timer 8mobitni,i preskaler je 1:8,kristal 4Mhz,onda tajmer treba da "prebaci"
488 puta,a prvi put ne broji od 0,nego od broja koji mu ti uvek iznova upisujes u registar(mislim da je oko 70,80).
Evo racunica :
1000000us/(256*8)=488,28125 .....488*(256*8)=999424us pa ti ostaje jos 576 us
576/8=72,sto znaci da u timer registar upisujes 256-72=184 svaki put kad ti se sekunde uvecaju za 1.
Dakle prvi put u tajmer upises ovu vrednost,kad god tajmer prebaci,on izazove prekid,u prekidu uvecavas neku promenljivu,kad ta promenljiva dostigne 488(to isto proveravas u prekidu) onda uvecavas sekunde,opet u registar tajmera ubacis 184 ,resetujes promenljivu i startujes ponovo tajmer.
Sad ovde se na sve ovo izgubi jos po koja mikrosekunda,ali i to moze precizno da se izracuna,tj da se i to vreme oduzme(npr ne upisujes 184,nego 185).
Broj nece biti okrugao,tako da ces morati da u tajmer uvek upisijes neku odredjenu(izracunatu) vrednost uvek kada ti se povecaju sekunde.
Sad nesto po secanju:ako je timer 8mobitni,i preskaler je 1:8,kristal 4Mhz,onda tajmer treba da "prebaci"
488 puta,a prvi put ne broji od 0,nego od broja koji mu ti uvek iznova upisujes u registar(mislim da je oko 70,80).
Evo racunica :
1000000us/(256*8)=488,28125 .....488*(256*8)=999424us pa ti ostaje jos 576 us
576/8=72,sto znaci da u timer registar upisujes 256-72=184 svaki put kad ti se sekunde uvecaju za 1.
Dakle prvi put u tajmer upises ovu vrednost,kad god tajmer prebaci,on izazove prekid,u prekidu uvecavas neku promenljivu,kad ta promenljiva dostigne 488(to isto proveravas u prekidu) onda uvecavas sekunde,opet u registar tajmera ubacis 184 ,resetujes promenljivu i startujes ponovo tajmer.
Sad ovde se na sve ovo izgubi jos po koja mikrosekunda,ali i to moze precizno da se izracuna,tj da se i to vreme oduzme(npr ne upisujes 184,nego 185).
Re: vremenska tacnost piceva
ok pogledacu, hvala!
Kad pijemo, mi se i napijemo.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Re: vremenska tacnost piceva
Koliko vidim ovi mozgovi, su ti malo iskomplikovali zivot...
Neka,,, tako se treniraju mozdane vijuge. Pametno je znati sve u detalj kako tacno nesto radi.
S obzirom da postoji odstupanje rezonator/oscilator/quartz mozda nikad neces dobiti atomsku preciznost, al definitivno se moze relativno tacno izracunati situacija. Ja sam ga napravio da na oko godinu dana ima odstupanje 3-4 sec sto je dobro i dovoljno precizno kad se rade tajmeri za neke procese. Za bolju preciznost nije tesko dodati ni jedan i2c RTC na PIC, pa cak i ako ti ne treba sat/datum uvijek imas na RTC-u SQW koji moze biti sekunda ili podjeljen /2 /10 /x kako koji RTC.
Kako god,,, Ono sto sam htio reci je da sekundu koristeci INTERUPT i TMRx mozes postici proracunom kako su vec kolege navele, ALI !!!!! i da to mozes takodjer korigovati pocetnom vrijednoscu TMR-a do momenta Overflow. Overflow kod 8-bit timera se desava na 255 i pri koristenju 10MHz oscilatora to je oko 304 puta overflow za pribliznu vrijednost sekunde.. "PRIBLIZNU" ne odgovara ???? Naravno da ne odgovara, e u tom momentu vodeci se, vec u gornjim postovima, pomenutom matematikom, mozes pomijerati startnu vrijednost TMR-a. Ko je rekao da TMR mora poceti sa 0 ????
E kako to izgleda...
Za pocetnu vrijednost TMR-a 0..255 i 304xOverflow navedena racunica ispada 77824 za priblizan period 1 sec.
Ako TMR resetujes sa pocetnom vrijednoscu 19 da Overflow ide od 19..255 imamo rezultat 236 i pri 330xOverflow imamo rezultat 77880 sto je najpribliznije 77824 pri zadatim parametrima. Na ovaj nacin mozes precizno iskonfigurisati timer za toleranciju koju imas na rezonatoru.
Vec oprobano, vec primjenjeno na uredjajima koji nemaju zahtjev za vise funkcija sem vremenskog odbrojavanja za aktiviranje ili deaktiviranje perifernih sklopova. Za pokretanje/zaustavljanje sklopova u zeljeno vrijeme, ipak je RTC najefikasnije rjesenje.
Sve navedene cifre u racunici su proizvoljni (ne tacni !) brojevi, kako bih prikazao mogucnost podesavanja broja ciklusa koristeci TMR Interupt i pomjeranje ucestalosti Overflow desavanja pri istom oscilatoru.
Koristenje PIC-eva sa 16bit timer-ima (TMRxL i TMRxH) bi takodjer uveliko povecalo mogucnost tacnosti pri odredjivanju jedinicne vrijednosti, u ovom slucaju 1sec.
Kako god, sa malo maste i nerava moze se dobiti preciznost atomskog sata. (mala sala)
Neka,,, tako se treniraju mozdane vijuge. Pametno je znati sve u detalj kako tacno nesto radi.
S obzirom da postoji odstupanje rezonator/oscilator/quartz mozda nikad neces dobiti atomsku preciznost, al definitivno se moze relativno tacno izracunati situacija. Ja sam ga napravio da na oko godinu dana ima odstupanje 3-4 sec sto je dobro i dovoljno precizno kad se rade tajmeri za neke procese. Za bolju preciznost nije tesko dodati ni jedan i2c RTC na PIC, pa cak i ako ti ne treba sat/datum uvijek imas na RTC-u SQW koji moze biti sekunda ili podjeljen /2 /10 /x kako koji RTC.
Kako god,,, Ono sto sam htio reci je da sekundu koristeci INTERUPT i TMRx mozes postici proracunom kako su vec kolege navele, ALI !!!!! i da to mozes takodjer korigovati pocetnom vrijednoscu TMR-a do momenta Overflow. Overflow kod 8-bit timera se desava na 255 i pri koristenju 10MHz oscilatora to je oko 304 puta overflow za pribliznu vrijednost sekunde.. "PRIBLIZNU" ne odgovara ???? Naravno da ne odgovara, e u tom momentu vodeci se, vec u gornjim postovima, pomenutom matematikom, mozes pomijerati startnu vrijednost TMR-a. Ko je rekao da TMR mora poceti sa 0 ????
E kako to izgleda...
Za pocetnu vrijednost TMR-a 0..255 i 304xOverflow navedena racunica ispada 77824 za priblizan period 1 sec.
Ako TMR resetujes sa pocetnom vrijednoscu 19 da Overflow ide od 19..255 imamo rezultat 236 i pri 330xOverflow imamo rezultat 77880 sto je najpribliznije 77824 pri zadatim parametrima. Na ovaj nacin mozes precizno iskonfigurisati timer za toleranciju koju imas na rezonatoru.
Vec oprobano, vec primjenjeno na uredjajima koji nemaju zahtjev za vise funkcija sem vremenskog odbrojavanja za aktiviranje ili deaktiviranje perifernih sklopova. Za pokretanje/zaustavljanje sklopova u zeljeno vrijeme, ipak je RTC najefikasnije rjesenje.
Sve navedene cifre u racunici su proizvoljni (ne tacni !) brojevi, kako bih prikazao mogucnost podesavanja broja ciklusa koristeci TMR Interupt i pomjeranje ucestalosti Overflow desavanja pri istom oscilatoru.
Koristenje PIC-eva sa 16bit timer-ima (TMRxL i TMRxH) bi takodjer uveliko povecalo mogucnost tacnosti pri odredjivanju jedinicne vrijednosti, u ovom slucaju 1sec.
Kako god, sa malo maste i nerava moze se dobiti preciznost atomskog sata. (mala sala)
Re: vremenska tacnost piceva
Tek sad vidim da je kolega @vukboban napisao istu stvar,,,, to ti je kad ne citam sve postove vec samo problem...
Kako god, mislim da cete ova dva zadnja (vukboban/moj) objasnjenja dovesti do preciznosti koju zelis postici.
Kako god, mislim da cete ova dva zadnja (vukboban/moj) objasnjenja dovesti do preciznosti koju zelis postici.
Re: vremenska tacnost piceva
Najbolja solucija je 32768Hz oscilator na pinovima nekog tajmera. I onda kad izdelis sve dobijes tacnu vrednost sekunde, moze da se izvede i bez ubacivanja neke vrednosti u tajmer, tako da tu ne gubis apsolutno nitsa. I tacan si koliko ti je i kristal tacan.
Re: vremenska tacnost piceva
@pedja
Upravo tak, nabavi bilo koji PIC koji ima Timer1 (Timer1 ima opciju za gonjenje vanjskog kristala), zakaci na pripadne pinove navedeni oscilator i nemas brige.
@djanib
3sec na godinu dana! Kak si to mjerio, stopericom? Jel bar bila Casio? (sala)
@Momak
Nisam bas upoznat s basic-om, pa evo u C-u. Mislim da ne bi trebalo biti pretesko konvertirati (nemam volje, oprosti, lijen sam).
Imas dvije funkcije main() i isr(). main() je stalno aktivna i u nju PIC ulazi po resetu, isr() je aktivna samo kada se dogodi prekid.
S ovakvim vrijednostima ONE_SECOND_VALUE i START_VALUE i prevedeno s mojim kompajlerom vrijeme kasni 1us na 1s (mjereno s StopWatch-om u MPLAB-u), sto je dosta manje od tolerancije kristala pa je zanemarivo.
Upravo tak, nabavi bilo koji PIC koji ima Timer1 (Timer1 ima opciju za gonjenje vanjskog kristala), zakaci na pripadne pinove navedeni oscilator i nemas brige.
@djanib
3sec na godinu dana! Kak si to mjerio, stopericom? Jel bar bila Casio? (sala)
@Momak
Nisam bas upoznat s basic-om, pa evo u C-u. Mislim da ne bi trebalo biti pretesko konvertirati (nemam volje, oprosti, lijen sam).
Imas dvije funkcije main() i isr(). main() je stalno aktivna i u nju PIC ulazi po resetu, isr() je aktivna samo kada se dogodi prekid.
S ovakvim vrijednostima ONE_SECOND_VALUE i START_VALUE i prevedeno s mojim kompajlerom vrijeme kasni 1us na 1s (mjereno s StopWatch-om u MPLAB-u), sto je dosta manje od tolerancije kristala pa je zanemarivo.
Code: Select all
#include <htc.h>
__CONFIG(XT & WDTDIS & PWRTEN & UNPROTECT);
#define ONE_SECOND_VALUE 999
#define START_VALUE 7
struct {
unsigned char second;
unsigned char minute;
unsigned char hour;
} time = {0,0,0};
unsigned short counter;
void interrupt isr(void)
{
if(T0IF)
{
TMR0 = TMR0 + START_VALUE;
counter++;
if(counter == ONE_SECOND_VALUE)
{
counter = 0;
time.second++;
if(time.second > 59)
{
time.second = 0;
time.minute++;
if(time.minute > 59)
{
time.minute = 0;
time.hour++;
if(time.hour > 23)
time.hour = 0;
}
}
}
T0IF = 0;
}
}
void main(void)
{
OPTION = 0b10000001; // TMR0 se inkrementira za jedan svake 4us s 4MHz kristalom
INTCON = 0b00100000;
TMR0 = 0;
GIE = 1;
while(1)
{
// Radi nesto s vremenom ovdje
}
}
Re: vremenska tacnost piceva
Pa sva trojica smo istu stvar napisali!
http://sportske-igre.bloger.hr/" onclick="window.open(this.href);return false; Besplatne online igre!
Re: vremenska tacnost piceva
Hvala svima, sad je jos na meni ostalo da preduzmem nesto!
Kad pijemo, mi se i napijemo.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Kad se napijemo, mi i zaspemo.
Kad spavamo, mi ne činimo grehe.
Ako ne činimo grehe, onda idemo u raj.
Zato i pijemo da bi otišli u raj.
Re: vremenska tacnost piceva
Vjerovao ili ne jesam... I nije casio nego ericsson. Mob i njegova stoperica koju nema potrebe_heX wrote:@djanib
3sec na godinu dana! Kak si to mjerio, stopericom? Jel bar bila Casio? (sala)
da pratis, nego ukljucis i posjetis onda kad ti je cilj da vidis mjereno vrijeme. Sem toga povremeno
mozes napraviti privremeni stop i nastavak brojanja u pozadini bez poremecaja.
Vec nakon dvadesetak dana lako je bilo izracunati godisnje odstupanje. Vjerovatno puta 18 i to je to.
Sat sam napravio da bude bas kao ukras, PIC16F877A baziran na TMR0 tako da je svakako radio
neprekidno, nije bilo naporno prekontrolisati ga kad mi padne na pamet sobzirom da je na UPS-u
od racunara. Danas, nakon par (2-3) godina od tada, jos pokazuje minutu koju treba da prikaze , ali
stvarno vise nisam siguran za sekunde.
Interesantna stvar je da sam napravio potpuno isti hardware i imao je vece odstupanje ito ne bas
malo. Bio sam prinudjen na ponovno ugadjanje.
hahaha... Upravo sam ustanovio kad sam to radio... 28.01.2009.
Ovako sam poceo da bih naucio kako sve to ide, a glavni cilj tada mi je bio ustanoviti kako se postavljaju
ciste i citaju interrupt bitovi u INTCON registru. U tom periodu je bio interesantan TMR0IF. Sad smjesno,
al negdje se uvijek pocne. Najgore je sjedi i cekaj da ti neko drugi nesto uradi.
Code: Select all
program Sat_tmr0;
var
ttx1 : string[5] ;
dhr,dmin,dsec : byte;
cnt : word;
Procedure shclock;
begin
wordtostrWithZeros(dsec,ttx1);
lcd_out(2,16,ttx1);
lcd_out(2,18,':');
wordtostrWithZeros(dmin,ttx1);
lcd_out(2,13,ttx1);
lcd_out(2,15,':');
wordtostr(dhr,ttx1);
lcd_out(2,10,ttx1);
end;
Procedure PrintBit;
begin
bytetostr(INTCON.RBIF, ttx1);
lcd_out(4,17,ttx1);
bytetostr(INTCON.INTF, ttx1);
lcd_out(4,16,ttx1);
bytetostr(INTCON.TMR0IF, ttx1);
lcd_out(4,15,ttx1);
bytetostr(INTCON.RBIE, ttx1);
lcd_out(4,14,ttx1);
bytetostr(INTCON.INTE, ttx1);
lcd_out(4,13,ttx1);
bytetostr(INTCON.TMR0IE, ttx1);
lcd_out(4,12,ttx1);
bytetostr(INTCON.PEIE, ttx1);
lcd_out(4,11,ttx1);
bytetostr(INTCON.GIE, ttx1);
lcd_out(4,10,ttx1);
end;
procedure interrupt;
begin
if INTCON.TMR0IF = 1 then // ako je TMR0IF 1 (TMR0 overflow)
begin
Inc(cnt); // povecaj vrijednost cnt na svaki interrupt
TMR0 := 0; // postavi pocetnu vrijednost TMR0 0..255
clearbit(INTCON,TMR0IF); // ocisti TMR0IF bit
end;
end;
begin
OPTION_REG := $84;
TRISB := 0; // PORTB kao izlaz za LCD
Lcd_Init(PORTB); // init LDC-a
lcd_cmd(LCD_CURSOR_OFF);
TMR0:=0; // TMR0 pocetna vrijednost 0..255
INTCON := $A0; // $A0 Postavi GIE i TMR0IE
cnt:=0;
dhr:=0;
dmin:=0;
dsec:=0;
lcd_out(3,1,'TMR0 overflow 304/s');
lcd_out(4,1,'INTCON:');
lcd_out(1,1,'**INTERRUPT Status**');
lcd_out(2,1,'Time:');
shclock;
PrintBit;
while true do
begin
if (cnt = 304) then // odprilike 1sec na 10MHz quartz sa TMR0 x 304
begin // Kasnjenje u 15 min -> 1 sec
cnt:=0;
inc(dsec);
if dsec = 60 then
begin
dsec:=0;
inc(dmin);
if dmin = 60 then
begin
dmin:=0;
inc(dhr);
if dhr = 24 then
begin
dhr:=0;
end;
end;
end;
shclock;
end;
end;
end.
LCD 4x20 na Portu B kao sto se vidi iz programskih linija i to je sve sto treba.
Na ekranu prikazuje vrijeme od momenta ukljucenja (promjeni pocetnu vrijednost varijabli ako hoces sat)
i prikazuje stanje svih bitova INTCON registra i kad se desi Overflow i kad se ocisti.
Rekompajliraj, uvali u PIC i deri !
Eto primjeri od kolege @_heX i ovaj dobro ce doci nekome za ucenje i igranje.