|
|
View previous topic :: View next topic |
Author |
Message |
nasreen.shayeq
Joined: 01 Apr 2010 Posts: 8
|
Unable to print result |
Posted: Thu Apr 01, 2010 12:29 pm |
|
|
Code: |
#include<18F452.h>
#include<stdlib.h>
#include<stdlibm.h>
#include<stdio.h>
#include<math.h>
#fuses HS,WDT,NOPROTECT,NOLVP
#use delay(clock=20000000,RESTART_WDT)
#use rs232(RESTART_WDT,TIMEOUT=1000,baud=38400, rcv=PIN_C7, STREAM=Input)
#use rs232(RESTART_WDT,TIMEOUT=1000,baud=9600, xmit=PIN_C6, STREAM=Output)
//Function Definition
float GetMaxValue(float*,int);
float GetMinValue(float*,int);
//Structuring Elements
int length_Bo=26;
int length_Bc=38;
//Clear the values after getting from adc
float OriginalECGSignal[90]={0
0.00105932203389831
0.00211864406779661
0.00317796610169492
0.00423728813559322
0.00529661016949153
0.00635593220338983
0.00741525423728814
0.00847457627118644
0.0451977401129944
0.0819209039548023
0.118644067796610
0.155367231638418
0.192090395480226
0.228813559322034
0.265536723163842
0.302259887005650
0.338983050847458
0.302259887005650
0.265536723163842
0.228813559322034
0.192090395480226
0.155367231638418
0.118644067796610
0.0819209039548022
0.0451977401129943
0.00847457627118644
0.00776836158192090
0.00706214689265537
0.00635593220338983
0.00564971751412429
0.00494350282485876
0.00423728813559322
0.00353107344632768
0.00282485875706215
0.00211864406779661
0.00141242937853107
0.000706214689265537
0,
-0.0960451977401130,
-0.192090395480226,
-0.288135593220339,
-0.0734463276836158,
0.141242937853107,
0.355932203389831,
0.570621468926554,
0.785310734463277,
1,
0.737288135593220,
0.474576271186441,
0.211864406779661,
-0.0508474576271187,
-0.313559322033898,
-0.576271186440678,
-0.838983050847458,
-0.559322033898305,
-0.279661016949153,
0,
0.000736919675755343,
0.00147383935151069,
0.00221075902726603,
0.00294767870302137,
0.00368459837877671,
0.00442151805453206,
0.00515843773028740,
0.00589535740604274,
0.00663227708179809,
0.00736919675755343,
0.00810611643330877,
0.00884303610906411,
0.00957995578481946,
0.0103168754605748,
0.0110537951363301,
0.0117907148120855,
0.0125276344878408,
0.0132645541635962,
0.0140014738393515,
0.0147383935151069,
0.0154753131908622,
0.0162122328666175,
0.0169491525423729,
0.0348399246704332,
0.0527306967984934,
0.0706214689265537,
0.0885122410546139,
0.106403013182674,
0.124293785310734,
0.142184557438795,
0.160075329566855,
0.177966101694915
};
int main()
{
//length of Signal
float AfterBaselineECG[5];
int n;
int m;
int i;
float * IntermediateArrayOpening;
float * IntermediateArrayClosing;
float * OpeningArray1;
float * OpeningArray2;
float * ClosingArray1;
float * ClosingArray2;
IntermediateArrayOpening=malloc(26*sizeof(float));
IntermediateArrayClosing=malloc(38*sizeof(float));
OpeningArray1=malloc(77*sizeof(float));
OpeningArray2=malloc(64*sizeof(float));
ClosingArray1=malloc(44*sizeof(float));
ClosingArray2=malloc(24*sizeof(float));
for(i=0;i<77;i++){
OpeningArray1[i]=0;
}
for(i=0;i<64;i++){
OpeningArray2[i]=0;
}
for(i=0;i<44;i++){
ClosingArray1[i]=0;
}
for(i=0;i<24;i++){
ClosingArray2[i]=0;
}
for(n=12;n<77;n++){
for(m=0;m<length_Bo;m++){
IntermediateArrayOpening[m]=OriginalECGSignal[n-12+m];
}
OpeningArray1[n]=GetMinValue(IntermediateArrayOpening,length_Bo-1);
}
for(n=12;n<64;n++){
for(m=0;m<length_Bo;m++){
IntermediateArrayOpening[m]=OpeningArray1[n-12+m];
}
OpeningArray2[n]=GetMaxValue(IntermediateArrayOpening,length_Bo-1);
}
free(IntermediateArrayOpening);
free(OpeningArray1);
for(n=19;n<44;n++){
for(m=0;m<length_Bc;m++){
IntermediateArrayClosing[m]=OpeningArray2[n-19+m];
}
ClosingArray1[n]=GetMaxValue(IntermediateArrayClosing,length_Bc-1);
}
free(OpeningArray2);
for(n=19;n<24;n++){
for(m=0;m<length_Bc;m++){
IntermediateArrayClosing[m]=ClosingArray1[n-19+m];
}
ClosingArray2[n]=GetMinValue(IntermediateArrayClosing,length_Bc-1);
}
free(IntermediateArrayClosing);
free(ClosingArray1);
fprintf(Output,"%9.5f",ClosingArray2[19]);
for(n=0;n<5;n++){
AfterBaselineECG[n]=OriginalECGSignal[85+n]-ClosingArray2[19+n];
}
free(ClosingArray2);
return 0;
}
float GetMaxValue(float *IntermediateArray,int WindowSize)
{
int8 i=0;
float MaxValue;
MaxValue=IntermediateArray[0];
for(i=0;i<WindowSize;i++)
{
if(MaxValue < IntermediateArray[i])
{
MaxValue=IntermediateArray[i];
}
}
return MaxValue;
}
float GetMinValue(float *IntermediateArray,int WindowSize)
{
int8 i=0;
float MinValue;
MinValue=IntermediateArray[0];
for(i=0;i<WindowSize;i++)
{
if(MinValue > IntermediateArray[i])
{
MinValue=IntermediateArray[i];
}
}
return MinValue;
}
|
I have written the above code. It works fine in any normal C compiler and gives the desired result but it doesn't work in the micro controller.
Initially I thought the code is too long and the WDT causes the code to start again before finishing. I tested this theory by lighting an LED after each for loop and switched each one off before the return statement. It worked fine all LEDs lit and were switched off indicating the entire code runs till the end but as soon as I try printing result on hyperterminal the code stops working. ANY IDEA WHATS GOING ON? ??
Please help me. _________________ Regards,
Nasreen |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
nasreen.shayeq
Joined: 01 Apr 2010 Posts: 8
|
|
Posted: Thu Apr 01, 2010 1:56 pm |
|
|
my compiler version is 4.057
i don't think it is a compiler bug. I think I am missing out on something in relation to sending data to the PC. _________________ Regards,
Nasreen |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Apr 01, 2010 2:11 pm |
|
|
I installed vs. 4.057, and I modified your program to get rid of the two
software UART streams. Instead, I created one hardware UART stream
as shown below:
Code: |
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS, stream=Output)
|
I also got rid of your WDT fuse. I changed it to NOWDT.
Then I compiled and ran the program in MPLAB simulator, using the
"UART1" feature of the simulator to display printf outpt in the Output Window.
It displayed this result:
This means there is nothing inherently causing it to lockup.
The math routines are not locking up. The printf does send
output to the hardware UART.
Try these changes and see if it works. If you are connecting the board
to a PC, you need a MAX232-type chip between the PIC and the PC.
If you don't have one, there are ways to do it without such a chip.
But normally, your board should have a MAX232-type chip on it. |
|
|
nasreen.shayeq
Joined: 01 Apr 2010 Posts: 8
|
|
Posted: Fri Apr 02, 2010 1:24 am |
|
|
Thank you very much.
I have a max232 and will try the changes out and let you know _________________ Regards,
Nasreen |
|
|
nasreen.shayeq
Joined: 01 Apr 2010 Posts: 8
|
|
Posted: Fri Apr 02, 2010 2:49 am |
|
|
#use delay(clock=20000000,RESTART_WDT)
Should I remove RESTART_WDT from the above statement also when I change the fuse to NOWDT??? _________________ Regards,
Nasreen |
|
|
nasreen.shayeq
Joined: 01 Apr 2010 Posts: 8
|
|
Posted: Fri Apr 02, 2010 3:21 am |
|
|
It still doesn't work :((
and when i change the fuse to NOWDT it starts giving extremely unpredictable behavior. The test LEDs that I am lighting in the code light up sometimes and sometimes they don't.
so i guess i have to use WDT, got any other ideas?
Thanks _________________ Regards,
Nasreen |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Apr 02, 2010 9:53 am |
|
|
Start with a simple program that blinks an LED. Make that program
work reliably. Then try your program. Example:
Code: |
#include <18F452.h>
#fuses HS, NOWDT,NOPROTECT, PUT, BROWNOUT, NOLVP
#use delay(clock=20000000)
//====================================
void main()
{
while(1)
{
output_high(PIN_B0);
delay_ms(500);
output_low(PIN_B0);
delay_ms(500);
}
} |
|
|
|
nasreen.shayeq
Joined: 01 Apr 2010 Posts: 8
|
|
Posted: Fri Apr 02, 2010 12:00 pm |
|
|
LED code works fine. I have tried lighting LEDs in between my code too that also works. I am just unable to print the output. If anyone could help me with that I would be very grateful. Is there anything wrong with my code?!!? _________________ Regards,
Nasreen |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Apr 02, 2010 12:18 pm |
|
|
Have you tested the rs232 output, to prove that it works ?
Try this simple test program.
Code: |
#include <18F452.h>
#fuses HS,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//======================================
void main(void)
{
printf("Hello World\n\r");
while(1);
}
|
|
|
|
nasreen.shayeq
Joined: 01 Apr 2010 Posts: 8
|
|
Posted: Fri Apr 02, 2010 12:57 pm |
|
|
yes i have done this too.
have you reviewed my code? is there anything wrong with it? _________________ Regards,
Nasreen |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Apr 02, 2010 1:11 pm |
|
|
I copied and pasted the code from your first post into MPLAB.
I didn't change anything in it. I installed vs. 4.057. It compiled
with no errors. I programmed it into an 18F452 with an ICD2.
The 18F452 is plugged into a PicDem2-Plus board. I ran the
program in normal mode (not in debug mode). It displays
this on the terminal window on my PC:
Quote: |
0.00070 0.00070 0.00070 0.00070
|
And it keeps on updating with the same thing.
So, it's working. I don't think I can do anything more for you.
My suggestion is to re-install the compiler. |
|
|
nasreen.shayeq
Joined: 01 Apr 2010 Posts: 8
|
|
Posted: Sat Apr 03, 2010 1:04 am |
|
|
Thank you very much for all your help, I will re-install my compiler now that I am sure my code works fine _________________ Regards,
Nasreen |
|
|
|
|
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
|