Timer0 has prescaler, I can set it on OPTION_REG Because other timers is already used. So you don't have idea ? anyway thank you for replying... On 30/06/2013 12:11 PM, Byron Jeff wrote: > On Sun, Jun 30, 2013 at 11:18:38AM +0800, Electronic Consultation wrote: >> Dear Byron, >> >> The issue is, I need to use timer0 to achieve > Why? > >> Have you seen my code ? > No. After your original code couting in a variable, I took the tack to > discussing how to use a hardware timer. > > Timer 0 isn't going to cut it because it doesn't have the features of Tim= er > 2. Specifically it is only 8 bits, there is no prescaler or postscaler, n= or > can it autorollover. > > Trust me you want to use the right tool to do the job, and TMR0 isn't it. > >> How can I use COUNT variable as a delay, put counter on it ? > Again unless you have TMR2 dedicated to another task (such as PWM or as t= he > bit rate generator for the UART), it is the best tool to implement a time= r > tick on a PIC. > > BAJ > >> Thanks >> On 30/06/2013 9:10 AM, Byron Jeff wrote: >>> On Sun, Jun 30, 2013 at 07:44:05AM +0800, Electronic Consultation wrote= : >>>> I answer the question : >>>> 1. 16F648A >>>> 2. 20Mhz >>>> 3. So far nothing I only need to set the interrupt properly on 1ms, >>>> I set the timer0 to B2, but not sure on the code for the counter for >>>> getting 1ms, 10ms and 100ms... >>>> >>>> Anyone can help ? >>> OK this helps a bit. The 16F648A has a Timer 2. This timer can handle t= he >>> job of creating an autorollover 1ms tick. You can then use this to crea= te the >>> others. >>> >>> Timer 2 counts Fosc/4 (the PIC instruction clock). The first task is to >>> figure out how many counts are required to get 1 ms clock. I do this by >>> figuring about how much time an instruction clock tick takes, then divi= de >>> that into the time length desired. The instruction time is 4/20Mhz whic= h is >>> 200 nS. 1mS/200nS is 5000. So it takes 5000 ticks into Timer 2 to get 1= mS >>> out. >>> >>> Now Timer 2 is a 8 bit timer, On its face it would seem that the max co= unt >>> would be 256. But the Timer has both a prescaler, which predivides the >>> number of counts going into the 8 bit timer by 1,4, or 16, and a postsc= aler, which >>> divides the rollovers of the counter by a value between 1 and 16. >>> >>> So we need to set up the timer in 3 parts so that the 3 factors combine= d is >>> 5000. The prescaler is the easiest to do. Pick the largest divisor that >>> goes evenly into the desired count. We get: >>> >>> 5000/16 =3D 312.5 >>> 5000/4 =3D 1250 >>> 5000/1 =3D 5000 >>> >>> We cannot use the 16 prescale because it does not evenly divide. The di= vide >>> by 4 works. So we set it. Now all we have to do is count the remaining = 1250 >>> with the other two parts. >>> >>> Next we set the rollover value of the 8 bit main counter. Again we pick= the >>> largest value that is less than 256 that goes evenly into 1250. This va= lue >>> is 250 because 1250/250 =3D 5. It should be obvious that the postscaler= is >>> set to the remaining count of 5. >>> >>> The prescaler and postscaler values are set in the T2CON register. The >>> rollover value is placed in the PR2 register. Once these are set and th= e >>> timer is turned on (TMR2ON bit in the T2CON register), the timer will c= ount >>> 5000 instruction clock ticks, raise the TMR2IF in the PIR1 register, an= d >>> automatically reset the timer for the next cycle. >>> >>> At 20 Mhz Timer 2 will not give clean mS values beyond 1 mS. So to get = 10 >>> mS the easiest thing to do is to set up the timer for 1 mS, then count = the >>> number of times it rolls over. Once it has rolled over 10 times >>> (remembering to clear the TMR2IF flag after each count), you know that = 10 >>> mS has elapsed. >>> >>> I hope this helps. >>> >>> BAJ >>> >>>> Thanks in advance >>>> >>>> On 29/06/2013 10:41 PM, Byron Jeff wrote: >>>>> On Sat, Jun 29, 2013 at 06:43:54PM +0800, Electronic Consultation wro= te: >>>>>> Is my counter will give me the right 10ms ? >>>>> I think we may want to step back a bit and examine what it is that yo= u are >>>>> really trying to get done. Some questions: >>>>> >>>>> 1) What chip are you using? >>>>> 2) What speed are you running the chip? >>>>> 3) What other activities need to be done by the chip? Also do any of = those >>>>> other activities need to be done while this delay is going on? >>>>> >>>>> For virtually any modern PIC, this is best done using one of the hard= ware >>>>> timers. It's pretty much set and forget. The timer will independently= track >>>>> elapsed time and raise a flag when it rolls over. You code will only = need >>>>> to track the flag, and reset it when it rolls over. >>>>> >>>>> Just as an aside, this is one of the problems with the absolute tons = of >>>>> material out on the Internet about software timers. Most of this was >>>>> written years ago when the PIC 16F84 was the hot chip. It only had on= e 8 >>>>> bit hardware timer, so it was a precious and not very useful resource= .. >>>>> >>>>> Modern PICs have between 3 and 5 timers. Timers 2,4,6 in many updated= chips >>>>> are designed to autorollover. With this feature not only will they ra= ise a >>>>> flag (or generate an interrupt) at a precise time, but will also >>>>> automatically start the next precise cycle without software intervent= ion. >>>>> These timers are designed for use with PWM and the CCP. However, they= can >>>>> be used standalone in the same manner. >>>>> >>>>> But without answers for the questions above, it's tough to know if yo= u have >>>>> the resources to use the hardware timers, or if the timing is correct= on >>>>> the software timers. >>>>> >>>>> BAJ >>>>> >>>>>> ;*******************************************************************= *** >>>>>> ; 10ms timer function calls >>>>>> ;*******************************************************************= *** >>>>>> ;....... 10ms timer counter here..... >>>>>> timer10ms >>>>>> movf 0x0A >>>>>> btfsc STATUS,Z >>>>>> goto timer10ms >>>>>> >>>>>> >>>>>> ;.................................... >>>>>> >>>>>> incf COUNT1, f >>>>>> movlw .10 ;Compare count to 100 decimal >>>>>> subwf COUNT1, W ;Store the result back in >>>>>> btfss STATUS, C ;Is the result 0, skip if no >>>>>> goto exittimer >>>>>> clrf COUNT1 >>>>>> On 29/06/2013 1:45 PM, eCHIP wrote: >>>>>>> If you need a 100 mS delay with a 4 MHz PICmicro, below is the code= .. >>>>>>> >>>>>>> delay1mS movlw .250 >>>>>>> movwf temp1 >>>>>>> clrwdt >>>>>>> decfsz temp1,f >>>>>>> goto $-2 >>>>>>> retlw 00 >>>>>>> >>>>>>> >>>>>>> delay100ms movlw .100 >>>>>>> movwf temp >>>>>>> call delay1ms >>>>>>> decfsz temp,f >>>>>>> goto $-2 >>>>>>> retlw 00 >>>>>>> >>>>>>> Cheers >>>>>>> >>>>>>> Ravi >>>>>>> >>>>>>> >>>>>>>> Hi, when you post to the Piclist you need to put an appropriate to= pic >>>>>>>> tag in the subject line. This time I have added one to your messag= e. Bob >>>>>>>> >>>>>>>> On Fri, Jun 28, 2013, at 10:04 PM, Electronic Consultation wrote: >>>>>>>>> Guys, >>>>>>>>> >>>>>>>>> Am I creating a right counter for PIC ? >>>>>>>>> >>>>>>>>> timer100ms >>>>>>>>> movlw 0x64 >>>>>>>>> movwf COUNT1 >>>>>>>>> decfsz COUNT1 >>>>>>>>> return >>>>>>>>> >>>>>>>>> thanks >>>>>> -- >>>>>> http://www.piclist.com/techref/piclist PIC/SX FAQ & list archive >>>>>> View/change your membership options at >>>>>> http://mailman.mit.edu/mailman/listinfo/piclist >>>> -- >>>> http://www.piclist.com/techref/piclist PIC/SX FAQ & list archive >>>> View/change your membership options at >>>> http://mailman.mit.edu/mailman/listinfo/piclist >> -- >> http://www.piclist.com/techref/piclist PIC/SX FAQ & list archive >> View/change your membership options at >> http://mailman.mit.edu/mailman/listinfo/piclist -- http://www.piclist.com/techref/piclist PIC/SX FAQ & list archive View/change your membership options at http://mailman.mit.edu/mailman/listinfo/piclist .