Gebruik Timer Functie in PIC16F877A

S

sycluap

Guest
Ik zou willen vragen, hoe de timer-functie gebruiken in de microcontroller op het verschil tussen begin-en eindtijd en dan weer te geven op het LCD-scherm te krijgen.Bv, schakelaar eenmaal wordt ingedrukt om te beginnen met timer, drukt u nogmaals om timer stoppen, dan is het verschil tussen begin-en eindtijd wordt berekend en weergegeven op het LCD.Ik doe de programmering met PicBasic Pro.

Mag ik vragen kan dit worden gedaan?Ik ben een totale newbie in het gebruik van microcontroller, kan hopen helpen.Alvast bedankt aan alle deskundigen.

 
Natuurlijk kan worden gedaan.
Afhankelijk van hoe veel code je moet lopen, kunt u kiezen voor een interrupt aanpak of een polling aanpak.

Voor de verkiezingen, je monitor een input pin en wanneer het staat verandert, start je de timer.Dan volgen de pin weer en stopt de timer wanneer de toestand van de pin wijzigingen terug.De timer inhoud van de tijd die je nodig hebt.
Natuurlijk, met deze aanpak wil je verliest een paar instructie cycli, maar draait op 20MHz uw instructie cyclus is 200ns.Dus als je 5 cycli verliest, verliest u alleen 1uS.

Als dit een probleem is, dan kunt u proberen met behulp van de CCP in de PIC16F877A.
Zet het op te vangen om de stijgende flank.Dus de inhoud van de timer krijgt vergrendeld wanneer de stijgende flank plaatsvindt.Tegelijkertijd krijgt u een interrupt timer vergrendeld en de inhoud te lezen en hen te redden.Op de volgende rand van het nieuwe timer inhoud zal worden vergrendeld, en je krijgt een interrupt.Trek de twee vergrendeld waarden en je krijgt de exacte tijd tussen de gebeurtenissen, want nu allemaal gebeurt in HW, hoef je niet verliest alle cycli.
Het hangt allemaal af van je werkelijke behoeften.

 
Timing precisie is zeer kritisch voor mijn project, dus ik denk dat de beste methode is de methode die niet verliest alle cycli.

Toch zal ik eerst beginnen met de verkiezingen methode om te wennen aan de codes zoals ik ben totaal nieuw.Hoe u de timer functie verklaren om te worden gebruikt en het toezicht op de pin veranderingen?Hoe de timing verschil opgeslagen in een variabele en de weer te geven op de LCD?Kunt u mij verder begeleiden in deze kwestie?Ik codering met behulp van PicBasic Pro.

Heel veel dank!

 
Het meest nauwkeurig is inderdaad de een met behulp van de CCP, maar zelfs dat een aantal beperkingen heeft, in termen van resolutie.Ik denk dat de beste resolutie die u kunt krijgen is 0.2us, wanneer de oscillator draait op 20MHz.

 
Hallo,

Als je goto www.picbasic.uk.co vindt u vele discussies over het gebruik van timers.Zowat alles wat je zou kunnen vragen voor het opnemen van veel voorbeeld code.Probeer ook www.melabs.com.

HTH,

BobK

 
Bedankt voor het antwoord VVV en BobK.Ik heb een voorbeeld van een project (Olympic Timer), die erg lijkt op wat ik nodig heb voor mij project in het forum gevonden voorgesteld.

Ik ben echter geconfronteerd met een probleem dat, moet ik de timer te tellen in het interval van 1ms.Wat ik wel kan krijgen en te leren is 10ms interval.

De deskundige in dat forum stelde me naar de vooraf ingestelde Timer1 register waarde wijziging van de 1ms interval pak.Maar ik weet niet hoe te krijgen, ongeacht welke waarde ik veranderen, de timer wordt nog langzamer te vergelijken met 10ms interval.Kan iemand me leren hoe de berekening van de werkelijke vooraf ingestelde waarde voor Timer1 registreren, zodat ik 1ms timer interval kan krijgen in plaats van 10ms?Ik gebruik 16F877A en 4Mhz klok, en ik ben codering in PicBasic Pro.

Zie hier. Http://www.picbasic.co.uk/forum/showthread.php?t=7729

Of is er een betere oplossing voor 1ms timing interval te krijgen?

1ms interval is heel belangrijk voor mijn project.Please help.

 
Het spijt me, begrijp ik niet aan de eisen meer: Heeft u een resolutie van 1 ms of heb je nodig om tijdsintervallen in de 1ms bereik te meten met de best mogelijke resolutie?

Voor 1ms resolutie die u kunt gewoon stembureaus te gebruiken, zelfs bij 4MHz.
Als u een betere resolutie nodig hebt, dan weer stel ik u gebruik maken van de CCP, die zal u toelaten om te meten met een resolutie van 1uS op 4MHz.

Ik kan het niet helpen met PICBasic, ik ben een assembler vent.

 
Spijt me voor het maken van de eis onduidelijk.Eigenlijk moet ik timer te tellen in 1ms resolutie.Dit betekent dat, zal de timer tellen in 1ms aanwas waarde en weergave in LCD-scherm.Bijvoorbeeld: Als ik druk op de knop Start, zal de timer beginnen te tellen in 1ms verhoging, totdat ik stop-knop drukt, zal de waarde gerekend worden weergegeven op het LCD.

De functie Timer1 ik weet hoe te gebruiken, het probleem is ik weet niet hoe de Timer1 register waarde ingesteld, zodat het kan worden in 1ms resolutie en weer te geven op de LCD.

Misschien codering in vergadering zal helpen?

 
OK, nu begrijp ik.

U kunt TMR1 voor het genereren van interrupts iedere 1ms.
Om dat te doen, preload de timer met een qantity dat maakt het overflow in 1ms.
Bijvoorbeeld: neem de oscillator is 4MHz.Dan is de TMR1 klok is 1MHz.Dat betekent dat je nodig hebt 1000 telt voor 1ms.Dus voorspanning van de timer met 65536-1000 = 64536.

Het zal dan genereren een iterrupt elke 1ms.In de ISR, aanwas een paar registers (of meer), dat wordt uw MS teller.Deze registers komen gewist wanneer de eerste stijgende flank wordt gedetecteerd en gelezen over de tweede stijgende flank.Dat is de tijd in ms tussen de randen, dat is wat je nodig hebt.

Merk op dat u hoeft te doen de debouncing in hardware.Dus de code kan als volgt uitzien:
Code:# define BUTTON PORTB, 0ORG 0x00; reset vectorgoto main;
ORG 0x04; Interrupt vectormovwf W_temp; redden W

swapf STATUS, W; opslaan status reg

movwf STATUS_temp;

clrf STATUS; ervoor zorgen dat we in bank 0, hoewel we niet de banken schakelaar hierBCF PIR1, T1IF; duidelijk onderbreken vlagBCF INTCON, T1ON; u de timer

movlw hoog (,65536 -. 1000); reload timer, de waarde kan nodig zijn om enigszins worden aangepast, om precies te krijgen 1ms

movwf TMR1H;

movlw laag (.65536 -. 1000);

movwf TMR1L;incfsz Counter, F; aanwas de 16-bits MS counter

incf Counter 1, F;swapf STATUS_temp, W; registers herstellen

movwf STATUS;

swapf W_temp, F;

swapf W_temp, W;

retfie return
belangrijkste:; belangrijkste code; al uw initialisaties hierclrf Teller; duidelijk de 16-bit counter

clrf Counter 1;movlw B'10000000 '; staat interrupts in het algemeen

movwf INTCON;Wait_h: btfss KNOP, wacht even totdat ingedrukt

goto Wait_h;movlw hoog (.65536 -. 1000); voorspanning timer; waarde kan veranderd worden, zodat de eerste interrupt gebeurt precies na 1ms

movwf TMR1H;

movlw laag (.65536 -. 1000);

movwf TMR1L;bsf T1CON, TMR1ON; zet TMR1

BCF PIR1, T1IF; duidelijk TMR1 onderbreken vlag, voor het geval

bsf INTCON, PIEI; staat randapparatuur interrupts (TMR1 is een perifere)Wait_l: btfsc knop wachten knop worden vrijgegeven

goto Wait_l;Wait_r: btfss KNOP, wacht hier voor de stijgende flank

goto Wait_r;BCF T1CON; stoppen TMR1

BCF INTCON, PIEI; uitschakelen perifere interruptsoproep display; bellen met de routine die de tijd op het LCD-schermenclrf Teller; duidelijk de 16-bit counter

clrf Counter 1;Wait_f: btfsc KNOP; nu hier wachten op een dalende flank

goto Wait_f;goto Wait_h; opnieuw starten van de cyclus

 
Ik verwijs naar de Vergadering codes die door Mr.VVV, ik beheren om de klok te hebben in zeer dicht bij 1ms interval.Maar, ik de timer lijkt nog niet helemaal van de werkelijke timing zijn als ik vergelijk de timer een horloge.

bijvoorbeeld horloge seconden aangevinkt 1.5x ~ 2x sneller dan de timer geprogrammeerd in de uController.

Ik heb geprobeerd om de waarde te wijzigen om te laden in de Timer1 registers, zelfs tot Highbyte = $ FF, LowByte = $ FF, maar het schijnt dat nog niet in staat om zo nauwkeurig als in de wacht, maar het is heel dicht bij het.

En kan mijn toestel niet uitgevoerd wanneer verander ik naar 20MHz kristal.Maar het werkt prima in 4Mhz, mag ik weten wat er mis?Geprobeerd om de configuratie van bits XT wijziging van GS in MPLAB 8.00, maar toen ik opnieuw compileren, het bit te veranderen terug naar XT.

Ik hecht de codes schreef ik gebruik PicBasic Pro, kan elke deskundigen mijn fouten corrigeren naar de gewenste interval te krijgen?

Hulp wordt zeer gewaardeerd.
Sorry, maar je moet inloggen om deze gehechtheid

 
Hints:
* Gebruik een kristal dat perfect verdeelt met binaire in seconden
* Laat de timers asynchroon (niet duidelijk of ze heeft ze laten vrij lopen)
* Gebruik de CCP module (Vergelijk-modus)

Voor 1ms timing 1/100ste van een seconde een 6.5536MHz kristal zou perfect zijn.

 
PICbasic is waarschijnlijk een stuk moeilijker te bereiken dan assembler.

 
IamnotJunk wrote:

PICbasic is waarschijnlijk een stuk moeilijker te bereiken dan assembler.
 
Bedankt voor de tips, ik zal proberen nu op.Moeten nog onderzoeken hoe de CCP eerste gebruik.

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

Toegevoegd na 4 uur en 14 minuten:Oke.Ik opnieuw het programma om de Timer1 vrije loop timer te maken.Voordat timer start, het is geladen met met 0000h in de Timer1 register.De timer begint wanneer ik druk op START.

Toen ik op Stop drukt, krijg ik de waarde van TMR1H en TMR1L in 2 afzonderlijke variabelen die ik definiëren als byte.Daarna krijg ik de werkelijke resultaat door:

Resultaat = TMR1H * 256 TMR1L

Dus dat gemiddelde, het totale resultaat * 1uS = de totale timing in seconden kreeg ik van het evenement?Niet echt zeker over de berekening van de timer, maar voor zover ik begrijp, met behulp van 4Mhz klok, zal het zijn:

4Mhz / 4 = 1MHz (Fosc / 4 van T1CON.1 = 0, interne klok)
T = 1/1M = 1uS (per instructie cyclus)
dus, Resultaat * 1uS = totale tijd in seconden.

Corrigeer me als ik ongelijk heb, echt niet erg zeker over de Timer1 berekening.

Thanks in advance!

 
Ja, dat is juist.Met een prescaler van 1:1 de timer stappen elke 1uS, zodat het resultaat in microseconden.

 

Welcome to EDABoard.com

Sponsor

Back
Top