www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Timer0 kot števec

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Ned Jan 06, 2013 3:04 pm    Naslov sporočila:  Timer0 kot števec Odgovori s citatom

Pozdravljeni!

Dobil sem podan ta program iz katerega naj se učim, pa ga ne razumem povsem.
S TMR0 naj bi štel spremembe (če se ne motim na RB0) iz 1 v 0.
Ni mi jasno zakaj točno se tukaj uporablja WDT, ter ob delilniku frekvence TMR0. Poleg tega pa ni jasno niti kako pride do razmerja 1:2, če je nastavitev v option_reg 0:0:0. Kaj se zgodi s Tosc/4?

Upam da mi bo lahko kdo pomagal. LP!
Citiram:
void timer0_ini0(){
asm{
bsf STATUS,RP0

bsf OPTION_REG,T0CS
bsf OPTION_REG,T0SE ; iz 1 v 0
bsf OPTION_REG,PSA

bcf STATUS,RP0
clrf TMR0
}
}

// vkljuci se delilnik frekvence
void timer0_ini2(){

asm{
bsf STATUS,RP0

bsf OPTION_REG,T0CS
bcf OPTION_REG,T0SE
bcf OPTION_REG,PSA
bcf OPTION_REG,PS0 ; vsi so 0 -> deli frekvenco z 2
bcf OPTION_REG,PS1
bcf OPTION_REG,PS2


bcf STATUS,RP0

clrf TMR0
}

}

void main(){
TRISD=0;
PORTD=0;
timer0_ini0();
while(1){
PORTD=TMR0;
Delay_us(2);
}

}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.33

PrispevekObjavljeno: Ned Jan 06, 2013 4:07 pm    Naslov sporočila:   Odgovori s citatom

Zakaj pa ne pogledaš v datasheet mikrokontrolerja? Saj je tam vse razloženo.
WDT s programom nima veze. Glede na to, da v kodi nikjer ciklično ne kličeš clrwdt, verjetno WDT v fuse bitih niti ni omogočen. Verjetno te je zmedlo to, da v inicializaciji z
Koda:
bsf OPTION_REG,PSA
dodeliš preddelilnik WDTju, ampak to nima veze. S tem poveš samo, da ga T0 ne uporablja.
Se pravi z
Koda:
bsf OPTION_REG,T0CS
bsf OPTION_REG,T0SE ; iz 1 v 0
bsf OPTION_REG,PSA

najprej določiš izvor inkrementiranja timerja 0 na zunanji vir (tranzicija na pinu T0CKI, ko gre stanje iz 1 na 0) in pa poveš, da ne uporabljaš preddelilnika.

_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Ned Jan 06, 2013 6:51 pm    Naslov sporočila:   Odgovori s citatom

super najlepša hvala!

ne znajdem se prav dobro okoli programiranja

tukaj mi prav tako ni jasno kako se beleži število prehodov iz 0 v 1
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Ned Jan 06, 2013 7:39 pm    Naslov sporočila:   Odgovori s citatom

Vsaka sprememba vhoda iz 0 v 1 poveča Timer0 za 1.
V While zanki se potem vrednost Timer0 prenaša na PORTD. Gor daš upore in ledice in bo binarno prikazovalo.

Kupi si knjigo Programirajmo PIC mikrokontrolerje, ali si dolpovleci primere programov, ki so predstavljeni v njej.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.33

PrispevekObjavljeno: Ned Jan 06, 2013 7:47 pm    Naslov sporočila:   Odgovori s citatom

Kako to misliš kako se beleži? Timer0 je 8 bitni timer, ki se inkrementira ob vsakem prehodu stanja na RA4 (T0CKI) iz 1 na 0. To je TMR0 register.

To bi lahko v praksi uporabil na primer za merjenje frekvence.
Z enim drugim timerjem bi določil časovno bazo, s T0 pa štel impulze na vhodu. Ob vsakem interruptu drugega timerja bi prebral vrednost v TMR0 ter ga nato pobrisal. Potem še izračunaš št. impulzov / časovna baza in to je to.

_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Ned Jan 06, 2013 11:11 pm    Naslov sporočila:   Odgovori s citatom

Aha, se pravi s tem ko izberemo zunanjo uro se odločimo da tmr0 ne uporabljamo kot časovnik? Kako pa potem na to vpliva delilnik frekvence?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Ned Jan 06, 2013 11:28 pm    Naslov sporočila:   Odgovori s citatom

Timer0 je čisto navaden 8-bitni števec, ki za delovanje MCU-ja ni potreben. Ga pa lahko koristno uporabi programer, če je zahtevano delovanje programa takšno, da se ga lažje doseže s pomočjo števca nekih dogodkov.

Kakšni so ti dogodki, je odvisno od nastavitev bitov v ustreznih registrih. Brez preddelilnika lahko šteje spremembe stanj na določenem pinu. S preddelilnikom pa lahko šteje, kolikokrat je število korakov programa preseglo število v delitelju (deljenec/delitelj=količnik).

Kaj se bo počelo z vrednostjo količnika oziroma Timerja, je spet stvar programerja. Lahko uporabi zastavico, ki se je postavila ob prehodu iz 255 v 000, ali pa v Timer na silo vpiše neko vrednost, ali ga celo pobriše na 0.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Pon Jan 07, 2013 12:00 am    Naslov sporočila:   Odgovori s citatom

Najlepša hvala, imam pa vseeno še ogromno vprašanj..

Citiram:
void interrupt(){
asm{
bcf INTCON,T0IF
incf PORTD,1
}

}
void timer0_ini(){
asm{
bsf STATUS,RP0
bcf OPTION_REG,T0CS
bsf OPTION_REG,PSA
bcf STATUS,RP0
}
}
void interr_ini(){
asm{
bsf INTCON,T0IE
bsf INTCON,GIE
}
}
void main(){
asm{
bsf STATUS,RP0
clrf TRISD
bcf STATUS,RP0
}
timer0_ini();
interr_ini();
}


V tem programčku naj bi tmr0 prožil prekinitve vsakih 5 urinih ciklov. Fosc=4Mhz, se pravi če prav razumem traja en urin cikel 1mikrosekundo? Kako do tega pride?

Program je bil podan kot primer
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Sre Jan 09, 2013 8:01 pm    Naslov sporočila:   Odgovori s citatom

Prosim če mi lahko kdo pomaga, ne razumem kako se lahko prekinitev proži vsakih 5us
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MvE
Član
Član



Pridružen-a: Ned 04 Jan 2009 12:24
Prispevkov: 146
Aktiv.: 0.73
Kraj: MB

PrispevekObjavljeno: Sre Jan 09, 2013 9:02 pm    Naslov sporočila:   Odgovori s citatom

V 8bitnih PICih (gledam datasheet od PIC18F14K50 str.: 102) se frekvenca inkrementiranja timerja 0 dobi tako, da frekvenco oscilatorja delimo z 4 (to prikazuje slika na prej omenjeni strani. Napisano je Fosc/4).

V tvojem primeru je frekvenca oscilatorja 4MHz, torej:

4000000Hz/4 = 1000000Hz oz 1MHz,

iz tega sledi, da se vrednost TMR0 poveča za 1 vsakih:

1/1MHz = 1us,

Ker je register TMR0 8bitni ima maksimalno vrednost 255. Prekinitev se sproži vedno, kadar preide vrednost iz 255 na 0. Ker bi za to potreboval 256us moraš za svoj primer v TMR0 vpisati 251:

TMR0 = 251;

Se pravi ko vpišeš 251 in preteče 1us dobiš 252,
252+1us=253,
253+1us=254,
254+1us=255,
255+1us=0 <- Tukaj se sproži prekinitev

Ko se sproži prekinitev zbrišeš zastavico oz. še prej TMR0 takoj postaviš na 251, da dobiš prekinitev čez naslednjih 5us.

Zgoraj opisano velja če nimamo preddelilnika (prescaler). Kaj program dela in če opisuje to kar sem razložil, ne vem, to ti naj razloži nekdo, ki se spozna na assembler.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Čet Jan 10, 2013 12:23 am    Naslov sporočila:   Odgovori s citatom

hvala za odgovor, tako približno sem si predstavljal, a kot primer sem dobil program braz nastavitve vrednost v tmr0
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Čet Jan 10, 2013 1:21 am    Naslov sporočila:   Odgovori s citatom

d'oh! Shame on you
V gornjem programčku se prekinitev NE proži na 5us !!! Kvečjemu se na 256us, če je preddelilnik na 1:1 in ne vpisujemo vrednosti v TMR0 na silo.

Sama prekinitev traja najmanj 10-12 ciklov, da se lepo spakira in odpakira registre ter pobriše kakšno zastavico. Potem pa je dobro v prekinitvi še kaj postoriti, kar nanese dodatne cikle. Pri 4MHz cikel traja 1us, torej je celo pri 20MHz težko doseči prekinitev na 5us, saj je program ves čas v prekinitvi.

To pišem za .asm , kajti v C-ju je tako kratke čase dejansko nemogoče doseči z zlaganjem funkcij iz knjižnic, temveč je treba vzeti .asm vsebino iz funkcij in jih do skrajnosti oklestiti. S tem pa C izgubi prednost, ki jo nudi z možnostjo vnašanja celih sklopov kode z enim samim ukazom za klic funkcije.

Vsak klic funkcije v C-ju skriva v ozadju cel sklop .asm kode. Prevajalnik poskrbi, da nastopajoče parametre funkcije spravi na ustrezna mesta znotraj sklopa, da si lahko potem iste spremenljivke podajaš med funkcijami.

Če ne veš, kaj se dogaja v ozadju, začni z Zbirnikom! Boš kasneje nadaljeval s C-jem, ali čim podobnim.

Sem ti že zgoraj napisal. Če bi rad pekel pice, si kupi Biblijo!
(beri: Če bi rad zapekel kak uporaben program v PIC MCU, si kupi zgoraj omenjeno knjigo.)
Še par programčkov iz omenjene knjige: http://www.svet-el.si/download/PICprogrami.zip
Jasno, da je celotna razlaga v knjigi.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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: 491 dni


Powered by phpBB © 2001, 2005 phpBB Group