Qqqqq Sent on the Sprint=AE Now Network from my BlackBerry=AE -----Original Message----- From: Byron Jeff Sender: piclist-bounces@mit.edu Date: Sun, 30 Jun 2013 13:12:26 To: Microcontroller discussion list - Public. Reply-To: "Microcontroller discussion list - Public." Subject: Re: [PIC]Counter in PIC On Sun, Jun 30, 2013 at 12:19:52PM +0800, Electronic Consultation wrote: > Timer0 has prescaler, I can set it on OPTION_REG I see. I don't use Timer0 a lot since Timer2 has so much more flexibility. > > Because other timers is already used. > > So you don't have idea ? Timer 0 won't get you all the way to 1 mS because it's not a flexible as Timer 2. Also since it doesn't have autorollover there will be some jitter. But the principle analysis is still the same. You can set the prescaler to 4 and the main timer to -250 ( because it counts up, and unlike Timer 2 it will only raise the flag when rolling over from FF to 00) So you get 250 counts to rollover you set the counter to -250, which for 8 bits is a value of 6. This gets you a Timer 0 flag for every 1000 ticks, which at 20 Mhz is 200 uS. So counting 5 flags gives you 1 mS. Note that you have to reset the Timer 0 counter back to 6 on each flag unlike Timer 2 which automatically clears the timer when the flag is raised. Also note that writing to a timer clears the prescaler, so it you delay too long after the flag is raised, you'll get more jitter. It's not the best solution, but it is possible to use Timer 0 for the task. > anyway thank you for replying... Happy to help. BTW are you stuck using assembly for your project? If you just want to get your project done, you may want to consider using the JAL compiler. JAL is a high level language with significant library support that compiles to a large number of PICs on a raft of different platforms. It's open source and free. You can find the compiler here: http://www.casadeyork.com/jalv2/ A tutorial book for the language can be found here: http://justanotherlanguage.org/content/tutorial_book The blink the LED example in the tutorial book shows a sample delay call. The full code and description of the delay library can be found here: http://code.google.com/p/jallib/source/browse/trunk/casualties/bugreport_20= 100920/delay.jal?r=3D2760 JAL will get your job done efficiently and quickly. It may be worth the investment to investigate. BAJ > > > 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 T= imer > > 2. Specifically it is only 8 bits, there is no prescaler or postscaler,= nor > > can it autorollover. > > > > Trust me you want to use the right tool to do the job, and TMR0 isn't i= t. > > > >> 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= the > > bit rate generator for the UART), it is the best tool to implement a ti= mer > > 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 wro= te: > >>>> 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= the > >>> job of creating an autorollover 1ms tick. You can then use this to cr= eate 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 di= vide > >>> that into the time length desired. The instruction time is 4/20Mhz wh= ich is > >>> 200 nS. 1mS/200nS is 5000. So it takes 5000 ticks into Timer 2 to get= 1mS > >>> out. > >>> > >>> Now Timer 2 is a 8 bit timer, On its face it would seem that the max = count > >>> would be 256. But the Timer has both a prescaler, which predivides th= e > >>> number of counts going into the 8 bit timer by 1,4, or 16, and a post= scaler, 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 combi= ned is > >>> 5000. The prescaler is the easiest to do. Pick the largest divisor th= at > >>> 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 = divide > >>> by 4 works. So we set it. Now all we have to do is count the remainin= g 1250 > >>> with the other two parts. > >>> > >>> Next we set the rollover value of the 8 bit main counter. Again we pi= ck the > >>> largest value that is less than 256 that goes evenly into 1250. This = value > >>> is 250 because 1250/250 =3D 5. It should be obvious that the postscal= er is > >>> set to the remaining count of 5. > >>> > >>> The prescaler and postscaler values are set in the T2CON register. Th= e > >>> rollover value is placed in the PR2 register. Once these are set and = the > >>> timer is turned on (TMR2ON bit in the T2CON register), the timer will= count > >>> 5000 instruction clock ticks, raise the TMR2IF in the PIR1 register, = and > >>> automatically reset the timer for the next cycle. > >>> > >>> At 20 Mhz Timer 2 will not give clean mS values beyond 1 mS. So to ge= t 10 > >>> mS the easiest thing to do is to set up the timer for 1 mS, then coun= t 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 tha= t 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 w= rote: > >>>>>> 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 = you 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 o= f 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 ha= rdware > >>>>> timers. It's pretty much set and forget. The timer will independent= ly track > >>>>> elapsed time and raise a flag when it rolls over. You code will onl= y 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 ton= s of > >>>>> material out on the Internet about software timers. Most of this wa= s > >>>>> written years ago when the PIC 16F84 was the hot chip. It only had = one 8 > >>>>> bit hardware timer, so it was a precious and not very useful resour= ce. > >>>>> > >>>>> Modern PICs have between 3 and 5 timers. Timers 2,4,6 in many updat= ed chips > >>>>> are designed to autorollover. With this feature not only will they = raise a > >>>>> flag (or generate an interrupt) at a precise time, but will also > >>>>> automatically start the next precise cycle without software interve= ntion. > >>>>> These timers are designed for use with PWM and the CCP. However, th= ey can > >>>>> be used standalone in the same manner. > >>>>> > >>>>> But without answers for the questions above, it's tough to know if = you have > >>>>> the resources to use the hardware timers, or if the timing is corre= ct 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 co= de. > >>>>>>> > >>>>>>> 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 = topic > >>>>>>>> tag in the subject line. This time I have added one to your mess= age. 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 -- Byron A. Jeff Chair: Department of Computer Science and Information Technology College of Information and Mathematical Sciences Clayton State University http://faculty.clayton.edu/bjeff -- 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 .