|
|
View previous topic :: View next topic |
Author |
Message |
prayami
Joined: 22 Dec 2004 Posts: 78
|
Output Pulse moving |
Posted: Wed Sep 07, 2005 8:31 pm |
|
|
Hi..I am using PIC18F4525. I am reading a input signal and calculating
input frequency. And generate the output pulses at desire frequency.
The frequency of the output pulse in correct. But the problem is the
output pulse is not steady at any place. It is actually moving on right
side.
Is this mean that it is not generating at exact time?
What can be the problem?
Thanks in advance....... |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Wed Sep 07, 2005 8:37 pm |
|
|
Hard to say without any code. |
|
|
prayami
Joined: 22 Dec 2004 Posts: 78
|
|
Posted: Wed Sep 07, 2005 9:45 pm |
|
|
Hi...Here with I am sending code that I have used. I have tried to keep
less code in the interrupt. And tried to do more generic way because
I am going to add three more interrupts in this program. And input
pulses can ce of any duty cycle and upto from 1Hz to 200Hz.
I have generated output on PIN_E2. If you will see both the input and
output pulses on the scope then. Input and output will look same but
the problem is input is steady. But output is moving on right side slowly.
This is not allowed because I am going to add phase shift in the next step
of the project.
Code: |
#CASE
#include <18F4525.h>
#fuses H4,NOWDT,NOLVP,NOBROWNOUT,NOPBADEN,PUT,NOXINST,NOMCLR,
NOLPT1OSC,PROTECT,CPD,NOWRT,NOWRTD,EBTR,NOCPB,EBTRB,NOWRTC,NOWRTB
#use delay(clock=40000000)
int1 RPMOutStatus=0,isCCP1=0;
int1 GetOutTimer=1;
unsigned int16 temptimer1,tempcount1,temptimer1_1,tempcount1_1;
unsigned int16 mytimerL0,mycountL0,mytimerH0,mycountH0;
int1 HighPulse,ChangePulse,ChangeStatus;
unsigned int16 counttimer1;
unsigned int32 TimerCycle,Timer0CyH,Timer0CyL;
unsigned int8 IntTimer0;
#int_ccp1
void isr()
{
if(RPMOutStatus==0)
{
setup_ccp1(CCP_CAPTURE_FE);
RPMOutStatus=1;
temptimer1 = get_timer1();
tempcount1 = counttimer1;
set_timer1(0);
counttimer1=0;
isCCP1=1;
}
else
{
temptimer1_1 = get_timer1();
tempcount1_1 = counttimer1;
setup_ccp1(CCP_CAPTURE_RE);
RPMOutStatus=0;
}//if(RPMOutStatus==0)
}//#int_ccp1
#INT_TIMER1
void timer1_isr() {
if(counttimer1<65534)
counttimer1++;
}
#INT_RTCC // fast
void timer0_isr() {
if(ChangeStatus==1)
{
if(HighPulse==0)
{
output_high(PIN_E2);
HighPulse=1;
}
else
{
output_low(PIN_E2);
HighPulse=0;
}//if(HighPulse==1)
ChangeStatus=0;
}//if(ChangeStatus==1)
IntTimer0++;
if(HighPulse==1)
{
if(IntTimer0>mycountH0)
{
set_timer0(65535-mytimerH0);
IntTimer0=0;
ChangeStatus=1;
}//if(IntTimer0>mycountH0)
}
else
{
if(IntTimer0>mycountL0)
{
set_timer0(65535-mytimerL0);
IntTimer0=0;
ChangeStatus=1;
GetOutTimer=1;
}//if(IntTimer0>mycountH0)
}//if(HighPulse==1)
}//timer0_isr
void main() {
#PRIORITY RTCC
HighPulse=0;
ChangePulse=1;
ChangeStatus=1;
set_tris_e(0x00); //All output
setup_adc(ADC_OFF);
setup_ccp1(CCP_CAPTURE_RE);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
set_timer1(0);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2);
set_timer0(0);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
while(TRUE) {
//-----Start RPM 1 calculation-----------------------------
if(isCCP1==1)
{
TimerCycle = make32(tempcount1,temptimer1);
isCCP1=0;
}//if(isCCP1==1)
//-----End RPM 1 calculation-----------------------------
//---Start RPM Output Pulse--------------------------
if(GetOutTimer==1)
{
mytimerH0=temptimer1_1;
mycountH0=tempcount1_1;
Timer0CyL = (unsigned int32)((make32(tempcount1,temptimer1) - make32(tempcount1_1,temptimer1_1))/2);
Timer0CyH = (unsigned int32)(make32(tempcount1_1,temptimer1_1)/2);
mycountH0=0;
while(Timer0CyH>65535)
{
Timer0CyH = Timer0CyH - 65536;
mycountH0++;
}
mytimerH0 = (unsigned int16)Timer0CyH;
//---------------------
mycountL0=0;
while(Timer0CyL>65535)
{
Timer0CyL = Timer0CyL - 65536;
mycountL0++;
}
mytimerL0 = (unsigned int16)Timer0CyL;
GetOutTimer=0;
}//if(GetOutTimer==1)
//---End RPM Output Pulse----------------------------
}//while(TRUE)
}//main
|
Last edited by prayami on Wed Sep 07, 2005 10:26 pm; edited 2 times in total |
|
|
asmallri
Joined: 12 Aug 2004 Posts: 1634 Location: Perth, Australia
|
|
Posted: Wed Sep 07, 2005 10:02 pm |
|
|
you used the "quote button" instead of the "code button" If you edit you listing it will be able to make it easier to read.
You did not mention how you are triggering the scope. Are you using a daul trace cro and looking at both traces simultaneously? If so what event are you triggering on? _________________ Regards, Andrew
http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!! |
|
|
prayami
Joined: 22 Dec 2004 Posts: 78
|
|
Posted: Wed Sep 07, 2005 10:30 pm |
|
|
I am using Digital Scope from PICO Technology Ltd.
On channel one: Frequency Input
On Channel two: Frequency Output
I am Triggering channel A on rising edge. |
|
|
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
|
Posted: Wed Sep 07, 2005 11:15 pm |
|
|
prayami wrote: |
And generate the output pulses at desire frequency.
I am using Digital Scope from PICO Technology Ltd. |
Looked up PICO scopes and their software on the web. It looks like one of the functions the software provides is the spectrum analyzer. You have probably tried this already, but if you look at your output pulse with a spectrul analyzer you should see the primary frequency and it's harmonics. If your output squarewave frequency is steady, it's primary and harmonics will not be shifting on the analyzer (regardless of what your trigger your data acquisition on). |
|
|
sseidman
Joined: 14 Mar 2005 Posts: 159
|
Re: Output Pulse moving |
Posted: Thu Sep 08, 2005 6:36 am |
|
|
prayami wrote: | Hi..I am using PIC18F4525. I am reading a input signal and calculating
input frequency. And generate the output pulses at desire frequency.
The frequency of the output pulse in correct. But the problem is the
output pulse is not steady at any place. It is actually moving on right
side.
Is this mean that it is not generating at exact time?
What can be the problem?
Thanks in advance....... |
If you have one pulse on your oscilloscope screen, and it is "moving on the right side", and steady on the left, it means that your pulse width is not constant, and it doesn't say anything at all about your pulse rate.
If you have more than one pulse on the screen, and the pulses after the pulse that triggers the sweep don't seem steady in time, then you are likely having pulse rate problems, and possibly pulse width as well.
Make sure your scope is triggering off the waveform, and not in any "autotrigger" mode. |
|
|
rnielsen
Joined: 23 Sep 2003 Posts: 852 Location: Utah
|
|
Posted: Thu Sep 08, 2005 8:17 am |
|
|
If the left side of your pulse is steady but the 'width' of the pulse varies(the right side moves) this is most likely caused by your ISR's. An interrupt will happen at any time during your code. Say, the left side of the signal goes High and everything excecutes just fine. The next time the pulse goes High your Timer1 ISR is called(the interrupt is flagged). The processor will execute this code and then return to the normal code. This has, in effect, lengthened your pulse width.
Ronald |
|
|
|
|
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
|