käyttäminen ajastustoiminto vuonna PIC16F877A

S

sycluap

Guest
Haluaisin kysyä, miten hyödyntää ajastustoiminto että mikro saada ero alkamisaika ja lopetusajan ja sitten näyttö se LCD.Esim. kytkin painetaan kerran käynnistää ajastimen, paina uudestaan pysäyttää ajastimen, sitten ero alkamisaika ja päättymisaika lasketaan ja näytetään LCD-näytössä.Teen ohjelma käyttäen PicBasic Pro.

Saanko kysyä, tämä voidaan tehdä?Olen yhteensä newbie käyttää mikro, toivoa voi auttaa.Kiitos etukäteen kaikille asiantuntijoille.

 
Tietenkin se voidaan tehdä.
Riippuen siitä, kuinka paljon koodi pyörittämiseen tarvittavat, voit valita keskeyttää lähestymistapa tai äänestyspaikoilla lähestymistapaa.

Saat äänestyspaikoilla, sinulla on vain seurata tulosignaalin nastainen ja kun se muuttaa valtiota, kun käynnistät ajastimen.Sitten seurata nastaiseen uudelleen ja pysäyttää ajastimen, kun tilaa PIN muutokset takaisin.Ajastin sisältö on aikaa tarvitset.
Tietenkin tämän lähestymistavan olet wil menettää muutama ohje jaksoa, mutta käydessä 20MHz teidän opetus sykli 200ns.Joten jos menetät 5 jaksoa, menetät vain 1us.

Jos tämä on ongelma, voit yrittää käyttää CCP että PIC16F877A.
Aseta se jopa talteenotto joka kasvaa reunasta.Niin sisällön ajastin saavat lukollisten kun nouseva reuna tapahtuu.Samalla saat keskeyttää ja lukea lukollisten ajastin sisällön ja tallentaa ne.Valitse seuraavassa reuna uuden ajastimen sisältö on lukollisten ja saat keskeyttää.Vähennä kahden lukollisten arvot ja saat tarkan ajan välillä tapahtumia, koska kaikki on nyt tehnyt HW, et menetä mitään jaksoissa.
Kaikki riippuu todellisia vaatimuksia.

 
Ajoitus toistotarkkuus on erittäin kriittinen projektiini, joten uskon, että paras menetelmä on menetelmä, joka ei menetä jaksoissa.

Olen kuitenkin ensin alkavat äänestyspaikoilla tapa tottua koodiin olen täysin uusi.Miten julistaa ajastustoiminto voidaan käyttää ja valvoa nastainen muutokset?Miten Varastoituihin ajoitus ero muuttuvan ja näyttö sen LCD?Voisitteko opas minua pidemmälle tässä asiassa?Olen koodaus käyttäen PicBasic Pro.

Erittäin paljon kiitoksia!

 
Kaikkein tarkka on todellakin yksi käyttäen CCP, mutta vielä on joitakin rajoituksia,
jotka koskevat päätöslauselmaa.Mielestäni paras resoluutio voit saada on 0.2us, kun oskillaattoria käy 20MHz.

 
Hei,

Jos goto www.picbasic.uk.co löydät monet langat käyttöä koskevat laskurit.Pelkästään jotain voisi pyytää myös paljon esimerkiksi koodi.Kokeile myös www.melabs.com.

HTH,

BobK

 
Kiitos vastauksesta VVV ja BobK.Olen löytänyt esimerkki hankkeen (Olympic Timer), joka on hyvin samankaltainen kuin mitä tarvitsen minulle hankkeen foorumin ehdotti.

Olen kuitenkin edessään ongelma, joka minun on ajastin laskea että väliajoin 1ms.Mitä voin saada ja oppia on 10ms välein.

Asiantuntija että foorumi ehdotti minua vaihtaa esiasetuksen Timer1 rekisterin arvo sopivaksi 1ms välein.En kuitenkaan tiedä, miten se, mitä arvo I muutos, ajastin saa jopa hitaampi verrattuna 10ms välein.Voiko kuka tahansa opettaa minulle miten laskee todelliset Preset-arvo Timer1 rekisteriä, jotta voin saada 1ms ajastin interval sijasta 10ms?I am using 16F877A ja 4Mhz kello, ja olen koodauksen PicBasic Pro.

Katso täältä. Http://www.picbasic.co.uk/forum/showthread.php?t=7729

Vai onko joku parempi ratkaisu saada 1ms ajoitus interval?

1ms väli on erittäin tärkeää, että projektin.Ole hyvä ja auta.

 
Olen pahoillani,
en ymmärrä vaatimuksia enää: Tarvitsetteko päätöslauselman 1ms vai tarpeen mitata aikaa väliajoin on 1ms vaihteluvälille paras mahdollinen päätöslauselma?

Saat 1ms päätöslauselma voit käyttää äänestyspaikoilla jopa 4MHz.
Jos tarvitset paremmin päätöslauselma, sitten taas Ehdotan käytät CCP, jonka avulla voit mitata, joiden resoluutio on 1us klo 4MHz.

En voi auttaa PICBasic, olen kokoonpanijalle kaveri.

 
Olen pahoillani siitä, että vaatimus epäselvä.Oikeastaan minun on ajastin laskea vuonna 1ms päätöslauselmaa.Merkitys, että ajastin laskee vuonna 1ms increment arvo ja näyttö on LCD.Esim. Jos painamalla Käynnistä-painiketta, ajastin alkaa counting in 1ms increment, kunnes painat Lopeta-painiketta, lasketaan arvo näkyy LCD-näytössä.

The TIMER1 toiminto Tiedän, miten käyttää, ongelmana on, en mitään tiedä, miten voit määrittää TIMER1 rekisterin arvoa siten, että se voi olla 1ms päätöslauselman ja näyttää sen LCD-näytössä.

Ehkä koodausstandardien kokoonpanossa auttaa?

 
OK, nyt ymmärrän.

Voit käyttää TMR1 tuottaa katkaisevat joka 1ms.
Siihen, että esikuormituksen ajastimen kanssa qantity, joiden avulla ylivuoto 1ms.
Esimerkiksi: omaksua oskillaattori on 4MHz.Sitten TMR1 kello on 1MHz.Tämä tarkoittaa sitä, että joudut 1000 counts for 1ms.Joten Esilataa ajastimen kanssa 65536-1000 = 64536.

Sen jälkeen tuota iterrupt joka 1ms.Kun ISR, increment pari rekisterit (tai enemmän), joka on teidän ms laskuri.Näiden rekisterien saada tyhjennetään kun ensimmäinen nouseva reuna havaitaan ja lukea toisen kasvaa reunasta.Se on aika millisekunteina välillä reunat, mitä tarvitset.

Huomaa, että sinun täytyy tehdä debouncing laitteistossa.Joten koodi voisi näyttää tältä:
Code:# define PAINIKETTA PORTB, 0Org 0x00; palauttaa vektoringoto tärkein;
Org 0x04; Interrupt vectormovwf W_temp; tallentaa W

swapf ASEMA, W; tallentaa aseman reg

movwf STATUS_temp;

clrf Tila, varmista, että olemme pankki 0, vaikka emme vaihtaa pankkia tästäBCF PIR1, T1IF, selkeät keskeyttää lippuBCF INTCON, T1ON; pysäyttää ajastimen

movlw korkea (,65536 -. 1000); reload ajastimen arvoa voidaan joutua muuttamaan hieman, jotta he saavat juuri 1ms

movwf TMR1H;

movlw alhainen (.65536 -. 1000);

movwf TMR1L;incfsz Counter, F; inkrementti 16 bittinen ms counter

incf Counter 1, F;swapf STATUS_temp, W; palauttaa rekisterit

movwf STATUS;

swapf W_temp, F;

swapf W_temp, W;

retfie; palata
main:; tärkeimmät koodi; esittää kaikki initializations tästäclrf Counter; selväksi 16-bittinen laskuri

clrf Counter 1;movlw B'10000000 "; mahdollistaa katkaisevat yleensä

movwf INTCON;Wait_h: btfss PAINIKETTA ja odota täällä kunnes painiketta painetaan

goto Wait_h;movlw korkea (.65536 -. 1000); esikuormituksen ajastimen arvo voidaan muuttaa, joten ensimmäinen keskeyttää esiintyy täsmälleen jälkeen 1ms

movwf TMR1H;

movlw alhainen (.65536 -. 1000);

movwf TMR1L;BSF T1CON, TMR1ON; päälle TMR1

BCF PIR1, T1IF, selkeät TMR1 keskeyttää lippu, vain siinä tapauksessa,

BSF INTCON, PIEI; mahdollistaa oheislaitteiden katkaisevat (TMR1 on syrjäinen)Wait_l: btfsc PAINIKETTA; odottaa painike vapautetaan

goto Wait_l;Wait_r: btfss PAINIKETTA; odottaa nouseva reuna tästä

goto Wait_r;BCF T1CON; pysäkki TMR1

BCF INTCON, PIEI, poista reuna katkaisevatpuhelun DISPLAY; soittaa rutiini, joka näyttää ajan LCDclrf Counter; selväksi 16-bittinen laskuri

clrf Counter 1;Wait_f: btfsc PAINIKETTA, nyt odottaa tästä kuuluvien reuna

goto Wait_f;goto Wait_h; re-start syklin

 
Viittaan edustajakokouksen Koodit antamien Mr.VVV, Onnistun saada kellon ovat hyvin lähellä 1ms välein.Mutta olen ajastin näyttää olevan hieman pois todellisesta ajankohdasta, jolloin vertaan ajastin on katsella.

esim. katsella sekuntia rasti 1.5x ~ 2x nopeampi kuin ajastin ohjelmoida että uController.

Yritin muuttaa arvoa ladata osaksi TIMER1 rekisterit, jopa Highbyte = $ FF, LowByte = $ FF, mutta näyttää siltä, että vielä voi saada yhtä tarkkoja kuin vahtia, vaikka se on hyvin lähellä sitä.

Ja minun laitetta ei voi käynnistää, kun muutos 20MHz kristallia.Mutta se toimii vain sakko 4Mhz,
haluaisin tietää, mikä on vialla?Yritin muuttaa asetukset bittiä alkaen XT HS vuonna MPLAB 8,00, mutta kun käännöksen jälkeen, että bittinen muuttaa takaisin XT.

Pidän koodit Kirjoitin käyttäen PicBasic Pro, voi asiantuntijoiden oikein minun virheitä saada haluamasi intervalli?

Ohje on erittäin suuressa arvossa.
Anteeksi, mutta sinun on kirjautumistunnuksen nähdäksesi tämän liitäntävaatimuksia

 
Vinkkejä:
* Käytä kidetiheys joka jakaa täysin binary osaksi sekuntia
* Älä suorita ajastimet asynkronisesti (ei saa selvää, tai asettaa ne anna heidän vapaa aikavälillä)
* Käytä CCP moduulin (Vertaa tilassa)

Saat 1ms ajoitus 1/100th joka toinen 6.5536MHz kristall olisi täydellinen.

 
PICbasic luultavasti on paljon vaikeampi saavuttaa kuin kokoonpano kielellä.

 
IamnotJunk wrote:

PICbasic luultavasti on paljon vaikeampi saavuttaa kuin kokoonpano kielellä.
 
Thanks for the hints, yritän nyt.On vielä tutkittava, miten käyttää CCP ensin.

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />

Lisätty jälkeen 4 tuntia 14 minuuttia:Ok.I redo ohjelman tehdä Timer1 vapaa suorittaa ajastin.Ennen ajastin alkaa, se on ladattu kanssa 0000h on timer1 rekisteriin.Ajastin käynnistyy, kun painat START.

Kun painat Lopeta, saan arvo TMR1H ja TMR1L osaksi 2 erillisiä muuttujia, jotka olen määritellä BYTE.Jälkeen, että saan todellinen tulos on:

Tulos = TMR1H * 256 TMR1L

Niinpä tämä tarkoittaa, koko TULOS * 1us = koko ajoitus sekunteina I saatu tapahtumaa?Ei oikeastaan varma laskettaessa ajastin, mutta sikäli kuin ymmärrän, käyttäen 4Mhz kellon, se on:

4Mhz / 4 = 1Mhz (Fosc / 4 alkaen T1CON.1 = 0, sisäinen kello)
T = 1/1M = 1us (per instruction cycle)
Näin ollen tulos * 1us = yhteensä kertaa sekunnissa.

Korjaa, jos olen väärässä, todella ole kovin varma siitä, Timer1 laskentaan.

Kiitos jo etukäteen!

 
Kyllä,
se on oikein.Kanssa prescaler on 1:1 ajastin lisäystä joka 1us, joten tulos on mikrosekunteina.

 

Welcome to EDABoard.com

Sponsor

Back
Top