| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| freesat 
 
 
 Joined: 08 Feb 2011
 Posts: 32
 
 
 
			    
 
 | 
			
				| Help needed on timer1, 32ns interrrupt |  
				|  Posted: Wed Dec 28, 2011 3:33 pm |   |  
				| 
 |  
				| Hi guys, 
 I found it difficult to set Timer1 to generate interrupt every 32ns using a 4MHz clock.
 
 in this case have the following doubts:
 
 1-PIC can generate interrupts every 32ns clocked at 4 MHz?
 
 2-I have to use it on (timer mode, on each cycle) or (counter mode, on each rising edge)? TMR1CS
 
 only to explain, do not try to compile.
 
  	  | Code: |  	  | 
 # use delay (4M = int)
 
 / * = 1:1 TMR0 Prescaler Period = 224 ns = 32 * /
 # define tmr1_value 224 (interrupt Every 32 cycles, with 4 MHz internal clock)
 
 # int_TIMER1
 TIMER1_isr void (void) {
 set_timer1 (tmr1_value);
 
 output_toggle (PIN_B1)
 }
 
 void main () {
 setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
 set_timer1 (tmr1_value);
 enable_interrupts (INT_TIMER1);
 enable_interrupts (GLOBAL);
 
 while (1) {}
 }
 
 | 
 
 however the minimum time is greater than 98ns
 
 know there's something wrong, or am I missing in the code or not pic can´t interrupt too fast clocked at 4mhz.
 
 Thank you in advance.
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Dec 28, 2011 3:56 pm |   |  
				| 
 |  
				| No way. You are so many orders of magnitude from being able to do this it is insane...
 
 Your master clock is 4Mhz - 250nSec cycle.
 A single instruction of the PIC takes 4 clock cycles - 1000nSec.
 An interrupt, using standard handlers, takes typically 60+ clock instructions - 60000nSec
 
 The chip is a factor of perhaps 2000* too slow to achieve this.
 
 I think you are slipping your number formats and possibly mean uSec, not nSec. Still a factor of about 2* too slow, but actually just about possible with special coding. However the chip won't be able to do anything else at all.
 1) If you want to actually do anything else, use the hardware PWM. It is designed to generate clocks for you without the CPU doing anything.
 2) If the functions you want to use only execute in the interrupt code, then don't use an interrupt!. Use 'linear' coding, putting everything in the main. You can put a maximum of about 30 instructions in a routine looping in the main, and get operation at 32uSec/loop.
 
 Best Wishes
 |  |  
		|  |  
		| freesat 
 
 
 Joined: 08 Feb 2011
 Posts: 32
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Dec 28, 2011 4:33 pm |   |  
				| 
 |  
				| Hi Ttelmah, thanks for reply. 
 I want to do a AC Phase Control with 255 steps, and it is not possible with hardware pwm.
 
 
 I can do it with 85 steps at 4Mhz, but with 85 steps, increments are only by 3.
 
  	  | Code: |  	  | setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
 set_timer1( 200 );
 
 | 
 So, what clock I need to use to get 255 steps? ( 8.33ms / 255 = 0.032 ) Minimal of 12mhz?
 
 ps... use delay instead timer to trigger triac is not good, pic freeze  on delay, don't do anything before delay expire.
 
 Maybe I'm confused with uSec and nSec.
 |  |  
		|  |  
		| RHA 
 
 
 Joined: 25 Apr 2006
 Posts: 31
 Location: Germany
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Dec 29, 2011 3:37 am |   |  
				| 
 |  
				| As Ttelmah already described, the compiler generates some code for the interrupts (saving/reload registers an so on) which takes some time : 
  	  | Code: |  	  | 00008:  MOVWF  04 0000A:  MOVFF  FD8,05
 0000E:  MOVFF  FE0,06
 00012:  MOVLB  0
 00014:  MOVFF  FE9,0C
 00018:  MOVFF  FEA,07
 0001C:  MOVFF  FE1,08
 00020:  MOVFF  FE2,09
 00024:  MOVFF  FD9,0A
 00028:  MOVFF  FDA,0B
 0002C:  MOVFF  FF3,12
 00030:  MOVFF  FF4,13
 00034:  MOVFF  FFA,14
 00038:  MOVFF  FF5,15
 0003C:  MOVFF  FF6,16
 00040:  MOVFF  FF7,17
 00044:  MOVFF  00,0E
 00048:  MOVFF  01,0F
 0004C:  MOVFF  02,10
 00050:  MOVFF  03,11
 00054:  BTFSS  FF2.5
 00056:  GOTO   0060
 0005A:  BTFSC  FF2.2
 0005C:  GOTO   00D2
 00060:  BTFSS  F9D.0
 00062:  GOTO   006C
 00066:  BTFSC  F9E.0
 00068:  GOTO   00E6
 0006C:  BTFSS  F9D.1
 0006E:  GOTO   0078
 00072:  BTFSC  F9E.1
 00074:  GOTO   00F4
 00078:  BTFSS  FA0.1
 0007A:  GOTO   0084
 0007E:  BTFSC  FA1.1
 00080:  GOTO   00FA
 00084:  MOVFF  0E,00
 00088:  MOVFF  0F,01
 0008C:  MOVFF  10,02
 00090:  MOVFF  11,03
 00094:  MOVFF  0C,FE9
 00098:  MOVFF  07,FEA
 0009C:  BSF    07.7
 0009E:  MOVFF  08,FE1
 000A2:  MOVFF  09,FE2
 000A6:  MOVFF  0A,FD9
 000AA:  MOVFF  0B,FDA
 000AE:  MOVFF  12,FF3
 000B2:  MOVFF  13,FF4
 000B6:  MOVFF  14,FFA
 000BA:  MOVFF  15,FF5
 000BE:  MOVFF  16,FF6
 000C2:  MOVFF  17,FF7
 000C6:  MOVF   04,W
 000C8:  MOVFF  06,FE0
 000CC:  MOVFF  05,FD8
 000D0:  RETFIE 0
 | 
 
 Because of that your controller will be too slow at 4 MHz when using interrupts for the PWM.
 You have to use a faster Controller (or a higher Clock) or try to use hardware PWM.
 Why do you mean it is not possible to use hardware PWM ?
 Does your controller have PLL? If so you can use 16MHz with internal clock.
 Which controller are you using?
 |  |  
		|  |  
		| FvM 
 
 
 Joined: 27 Aug 2008
 Posts: 2337
 Location: Germany
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Dec 29, 2011 4:00 am |   |  
				| 
 |  
				|  	  | Quote: |  	  | Maybe I'm confused with uSec and nSec. | 
 Obviously you are. The required time resolution is in fact 32 us, which isn't a problem with 4 MHz clock. You won't want to trigger an interrupt every 32 us, which still may be too fast regarding interrupt overhead rather than set the timer event to the calculated switching time, or use the timer output compare feature, if available with your PIC familiy.
 |  |  
		|  |  
		| RHA 
 
 
 Joined: 25 Apr 2006
 Posts: 31
 Location: Germany
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Dec 29, 2011 5:03 am |   |  
				| 
 |  
				|  	  | FvM wrote: |  	  |  	  | Quote: |  	  | Maybe I'm confused with uSec and nSec. | 
 Obviously you are. The required time resolution is in fact 32 us, which isn't a problem with 4 MHz clock. You won't want to trigger an interrupt every 32 us, which still may be too fast regarding interrupt overhead rather than set the timer event to the calculated switching time, or use the timer output compare feature, if available with your PIC familiy.
 | 
 Yes, he is.
 
 He want´s to build a phase control, i think for 60Hz. So you have 16,66ms per period, which means 8,33ms per a half period. He want´s to control in 255 steps .... per half period. So you have 32us (0,032ms) per step.
 
 But in fact, 32us are a problem for the controller.
 
 The controller, with 4MHz clock, has a cycle from 1us. if you take a look to the assembler code which is generated from the compiler for handling the interrupts you will see that only the code for that needs more than 32us. so i think every second interrupt will be lost.
 |  |  
		|  |  
		| FvM 
 
 
 Joined: 27 Aug 2008
 Posts: 2337
 Location: Germany
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Dec 29, 2011 11:16 am |   |  
				| 
 |  
				|  	  | Quote: |  	  | But in fact, 32us are a problem for the controller. | 
 A periodical 32 us interrupt, yes. But there are better way to achieve phase angle control with 32 us resolution.
 |  |  
		|  |  
		| RHA 
 
 
 Joined: 25 Apr 2006
 Posts: 31
 Location: Germany
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Dec 29, 2011 11:26 pm |   |  
				| 
 |  
				| I would use a controller with hardware-PWM and synchronize it with zero crossing. |  |  
		|  |  
		| bkamen 
 
 
 Joined: 07 Jan 2004
 Posts: 1617
 Location: Central Illinois, USA
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Dec 30, 2011 1:01 pm |   |  
				| 
 |  
				|  	  | freesat wrote: |  	  | Maybe I'm confused with uSec and nSec.
 | 
 
 Yes, you are.
 
 1mS = 1/1000th of a second. (10E-3)
 1uS = 1/1,000,000 of a second (10E-6)
 1nS = 1/1,000,000,000 of a second (10E-9)
 
 Another item to consider is that a lot of the IRQ overhead can go away if you use FAST interrupts -- but you need a PIC18F device for that if I remember correctly.
 
 (I use PIC18 pretty much all the time now, so I don't remember if the PIC16 has the fast stack return or not. I don't think they do)
 
 Check the CCS manual for the different between HIGH and FAST interrupts.
 
 You might be able to get 32uS (NOT nS!!) if you use a PIC with the fastest clock you can get (48MHz or more) and a FAST ISR.
 
 -Ben
 _________________
 Dazed and confused? I don't think so. Just "plain lost" will do.  :D
 |  |  
		|  |  
		| freesat 
 
 
 Joined: 08 Feb 2011
 Posts: 32
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jan 04, 2012 10:33 pm |   |  
				| 
 |  
				| I want to say thanks for explanations, I'm using a 20mhz clock and it is working fine... thanks all. 
 I want to explain the reason I do not use hardware pwm, is because I have to control 12 pwm on same pic and I only do it with success using interrupts. With interrupts, I can turn on every pwm pin at different duty.
 
 Thanks.
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |