| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| phamkien 
 
 
 Joined: 18 Jan 2018
 Posts: 5
 Location: Vietnam
 
 
			    
 
 | 
			
				| SINE INVERTER |  
				|  Posted: Sun Jan 21, 2018 11:55 pm |   |  
				| 
 |  
				| Hi Everyone! 
 I'm writting a code to make a sine wave inverter using pic 16f684. Please kindly give me some advices. I had wrote the code as below:
 At first, PIN_C5 ( CCP1) will be used for creating spwm signal.
 and the two square wave signal ( 50Hz ). I will use Pin C0 and Pin C1.
 When I try to simulate on Proteus. I saw the delay time like the attached picture.
 [img]https://photos.app.goo.gl/erggeFTNOxMV7Jru1[/img]
 what I need is: Square wave signal turn on at the same time with Spwm signal and turn off when it finish a half Sine wave.
 May I know which one will be used for control Spwm. Is it TMR2 ?
 When I read the net, they wrote: TMR2 will increase from 0 to PR2. When TMR2=PR2, timer 2 interrupt is enabled.
 
 I had tried the below code but it didn't work as expected.
 
 Please kindly give me an advice. Thank you! 	  | Code: |  	  | If(TMR2==0) { output_high(pin_c0); output_low(pin_c1); }.... | 
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Jan 22, 2018 3:04 am |   |  
				| 
 |  
				| Problem is that assuming the loop doing the testing is doing anything else, it can very easily miss TMR2 being actual being equal to 0.... 
 Now you say TMR2 interrupt is enabled. Do you have an interrupt handler?.
 
 You must never enable an interrupt without a handler.
 
 However assuming you do just want to test for the moment when TMR2 passes it's top count, and goes back to zero, then you don't actually want to enable the interrupt....
 
  	  | Code: |  	  | 
 //before you start waiting
 disable_interrupts(INT_TIMER2);
 clear_interrupt(INT_TIMER2);
 
 
 //Now your loop whatever it involves 'xxx'
 while (xxx)
 {
 if (interrupt_active(INT_TIMER2))
 {
 //whetever you have to do when the timer has wrapped
 output_high(pin_c0); output_low(pin_c1); //etc.
 clear_interrupts(INT_TIMER2);
 }
 
 //other stuff in the loop
 }
 
 | 
 
 Key thing is to understand, that the interrupt will set (and you can clear it), even if it is _not_ enabled. What 'enabling' does, is says that this interrupt can call a handler. Once this is set, the interrupt _will_ call a handler (so the handler must be present), if the global interrupt flag is also set.
 
 If you are using an interrupt handler, then if you want this code outside, instead of testing for TMR2==0, set a flag in the interrupt handler and test for this (again like the interrupt clear it once used).
 |  |  
		|  |  
		| phamkien 
 
 
 Joined: 18 Jan 2018
 Posts: 5
 Location: Vietnam
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Jan 22, 2018 9:47 pm |   |  
				| 
 |  
				| Dear Mr Ttelmah 
 Thank you for your help. Can you please help me one more time? Refer to your instruction, I had wrote a code as below but it still doesn't work properly. Here is my code.
 
  	  | Code: |  	  | void main()
 {
 char duty_cycle[41]={0, 15, 31, 46, 60, 75, 89, 102, 115,
 127, 139, 149, 159, 168, 176, 183, 188, 193, 196, 199, 200, 200, 199,
 196, 193, 188, 183, 176, 168, 159, 149, 139, 127, 115, 102, 89, 75,
 60, 46, 31, 15};
 setup_timer_2(T2_DIV_BY_4,249,1);
 setup_ccp1(CCP_PWM);
 set_pwm1_duty(0);
 clear_interrupt(INT_TIMER2);
 disable_interrupts(INT_TIMER2);
 enable_interrupts(GLOBAL);
 output_low(pin_c0); output_low(pin_c1);
 
 while(true)
 {
 if (interrupt_active(INT_TIMER2))
 {
 clear_interrupt(INT_TIMER2);
 i++;
 if(i==40) {i=0; j++; if(j==2) j=0;}
 }
 
 set_pwm1_duty(duty_cycle[i]);
 if(j==0) {output_high(pin_c0); output_low(pin_c1);}
 if(j==1) {output_low(pin_c0); output_high(pin_c1);}
 }
 }
 ]
 
 | 
 https://photos.app.goo.gl/14XtPE2WGWJgxeBq1
 
 Thank you!
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jan 23, 2018 12:29 am |   |  
				| 
 |  
				| One fundamental thing, the 'set_pwm_duty' wants to be inside the part only called when the i changes. |  |  
		|  |  
		| phamkien 
 
 
 Joined: 18 Jan 2018
 Posts: 5
 Location: Vietnam
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jan 23, 2018 1:03 am |   |  
				| 
 |  
				| Dear Mr Ttelmah 
 Thank you very much for your help.
 
 Best regards!
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |