vremenska tacnost piceva

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
User avatar
Momak
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 304
Joined: 13-03-2011, 01:07

vremenska tacnost piceva

Post by Momak »

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.
User avatar
MHN
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 350
Joined: 11-03-2005, 22:02
Location: Sarajevo

Re: vremenska tacnost piceva

Post by MHN »

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.
kiki11
Penjem se :)
Penjem se :)
Posts: 52
Joined: 04-01-2007, 23:02

Re: vremenska tacnost piceva

Post by kiki11 »

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!
http://sportske-igre.bloger.hr/" onclick="window.open(this.href);return false; Besplatne online igre!
_heX
Napredujem
Napredujem
Posts: 136
Joined: 29-10-2009, 20:09
Location: Republika Zagorje

Re: vremenska tacnost piceva

Post by _heX »

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?
User avatar
Momak
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 304
Joined: 13-03-2011, 01:07

Re: vremenska tacnost piceva

Post by Momak »

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.
kiki11
Penjem se :)
Penjem se :)
Posts: 52
Joined: 04-01-2007, 23:02

Re: vremenska tacnost piceva

Post by kiki11 »

Momak, možeš li staviti kod koji broji vrijeme tu na forum. Zanima me na koji način brojiš.

Hvala
http://sportske-igre.bloger.hr/" onclick="window.open(this.href);return false; Besplatne online igre!
User avatar
Momak
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 304
Joined: 13-03-2011, 01:07

Re: vremenska tacnost piceva

Post by Momak »

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
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.
vukboban
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 212
Joined: 05-12-2008, 17:49
Location: Pancevo

Re: vremenska tacnost piceva

Post by vukboban »

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.
User avatar
Momak
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 304
Joined: 13-03-2011, 01:07

Re: vremenska tacnost piceva

Post by Momak »

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.
vukboban
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 212
Joined: 05-12-2008, 17:49
Location: Pancevo

Re: vremenska tacnost piceva

Post by vukboban »

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).
User avatar
Momak
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 304
Joined: 13-03-2011, 01:07

Re: vremenska tacnost piceva

Post by Momak »

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.
djanib
Posts: 16
Joined: 14-12-2011, 21:41

Re: vremenska tacnost piceva

Post by djanib »

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)
djanib
Posts: 16
Joined: 14-12-2011, 21:41

Re: vremenska tacnost piceva

Post by djanib »

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.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7873
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: vremenska tacnost piceva

Post by pedja089 »

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.
_heX
Napredujem
Napredujem
Posts: 136
Joined: 29-10-2009, 20:09
Location: Republika Zagorje

Re: vremenska tacnost piceva

Post by _heX »

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

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
		
	}
}
kiki11
Penjem se :)
Penjem se :)
Posts: 52
Joined: 04-01-2007, 23:02

Re: vremenska tacnost piceva

Post by kiki11 »

Pa sva trojica smo istu stvar napisali!
http://sportske-igre.bloger.hr/" onclick="window.open(this.href);return false; Besplatne online igre!
User avatar
Momak
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 304
Joined: 13-03-2011, 01:07

Re: vremenska tacnost piceva

Post by Momak »

Hvala svima, sad je jos na meni ostalo da preduzmem nesto! :D
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.
djanib
Posts: 16
Joined: 14-12-2011, 21:41

Re: vremenska tacnost piceva

Post by djanib »

_heX wrote:@djanib
3sec na godinu dana! Kak si to mjerio, stopericom? Jel bar bila Casio? (sala)
Vjerovao ili ne jesam... :D I nije casio nego ericsson. :) Mob i njegova stoperica koju nema potrebe
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. :D

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.
Radjeno u Pascalu,,,, svejedno, C, Pascal ili bilo sta drugo, kako ko voli.
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.
Post Reply