CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

sprintf resetting PIC24

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
alan



Joined: 12 Nov 2012
Posts: 357
Location: South Africa

View user's profile Send private message

sprintf resetting PIC24
PostPosted: Wed Dec 12, 2012 2:44 pm     Reply with quote

I am using sprintf to format a string, but the PIC keeps on resetting if I use the sprintf. If I remove the sprintf then no problem. I have replaced the sprintf with writing the data in one byte at a time and then everything works OK, tried to use sprintf to tidy the code up and more readable.

CCS 4.140
PIC24F16KA302

Osc.h
Code:

#include <24F16KA302.h>
//#device ICD=TRUE
#DEVICE ADC=12
#include <stdlib.h>
#include <math.h>
//#FUSES WPRES32                  //Watch Dog Timer PreScalar 1:32
//#FUSES WPOSTS3                  //Watch Dog Timer PostScalar 1:4
#FUSES SOSC_DIGITAL
#FUSES NOWRT                      //Program Memory Write Protected
#FUSES NOPROTECT                  //Code protected from reads
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES OSCIO                    //OSC2 is general purpose output
#FUSES NOCKSFSM                 //Clock Switching is disabled, fail Safe clock monitor is disabled
//#FUSES WDT_NOSL                 //Watch Dog Timer, disabled during SLEEP
//#FUSES DEBUG                    //Debug mode for use with ICD
#FUSES FRC_PLL
#FUSES NOWDT                 // No Watchdog timer
#CASE

//#use delay(clock=32000000,RESTART_WDT)
#use standard_IO(A)
#use standard_IO(B)
//--- IO assignment for LCD PG12864 --------------------------------------------
#define  A0  PIN_B8    //A0
#define  CS  PIN_B12
#define  SCL PIN_B5
#define  SDA PIN_B6
#define  RES PIN_B10
#define  VBat 0
#define  V1Ch 5
#define  V2Ch 1
#define  I1Ch 4
#define  I2Ch 15
#byte  SPI1STAT = 0x0240
#byte  SPI1CON2 = 0x0244

#define REG_VOLT 338  //Voltage output of Reference
extern int8 Cnt;
extern  char BatDisp[10];
extern  char V1Disp[10];
extern  char V2Disp[10];
extern  char I1Disp[10];
extern  char I2Disp[10];
extern  int8 GainTest;

int1 Temp;

void delay_ms(int16 delay);


Osc1.c
Code:

#include <Osc1.h>
//--- Add modules headers ------------------------------------------------------
#include "font_eb.h"
#include "PgSer.h"
#include "ADC.h"
#include "PGA.h"

//--- Add module code ----------------------------------------------------------
#include "PgSer.c"
#include "ADC.c"
#include "PGA.c"

char BVolt[12]= "Bat = ";
char V1Volt[12]="V1 = ";
char V2Volt[12]="V2 = ";
char I1Volt[12]="I1 = ";
char I2Volt[12]="I2 = ";

int8 Cnt;
char BatDisp[10];
char V1Disp[10];
char V2Disp[10];
char I1Disp[10];
char I2Disp[10];
int8 GainTest;

#int_TIMER2
void  TIMER2_isr(void)
{
// Test Code flashing LED
   Cnt = Cnt + 1;
   if (Cnt >= 5) {
     Temp = input(PIN_A2);
     Temp = !Temp;
     output_bit(PIN_A2,Temp);
     Cnt = 0;
   }
}
#int_SPI2
void  SPI2_isr(void)
{
  //Finished writing, disable CS
  output_bit(CS,1);
}

void delay_ms(int16 delay) {
    int16 i;
    int16 j,a;
    j= delay;
    for (j=0;j<delay;j++) {
       for (i=0;i<delay;i++) {
        a=i*3;
        a=a*4;
    }
    }

}

void main()
{

   setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_4 | SPI_XMIT_L_TO_H | SPI_MODE_8B | SPI_SS_DISABLED);
   setup_spi2(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_4);

   setup_adc_ports(sAN0 | sAN1 | sAN4 | sAN5 | sAN15);
   setup_adc(ADC_CLOCK_INTERNAL | ADC_TAD_MUL_31);
   //setup_adc(ADC_CLOCK_DIV_32 | ADC_TAD_MUL_16);
   setup_timer2(TMR_INTERNAL |TMR_DIV_BY_256 ,6250); //100ms interrupt
   setup_timer4(TMR_DISABLED |TMR_DIV_BY_1 ,0);
 //  setup_timer3(TMR_INTERNAL |TMR_DIV_BY_64 ,250);  //1ms interrupt
   setup_timer5(TMR_DISABLED |TMR_DIV_BY_1 ,0);
   setup_oscillator(OSC_INTERNAL,8000000);


   setup_timer1(TMR_DISABLED);

   //Define TRIS REG
   enable_interrupts(INT_TIMER2);
  glcd_Init();                  //initialize LCD

  while(TRUE){                  //loop forever
    ReadBatVolt();
    ReadV1();
    ReadV2();
    delay_ms(1000);
  }
}


ADC.c
Code:

void ReadBatVolt(void) {
  int16 adcVal;
  float BatVolt;

  set_adc_channel(VBat);
  delay_ms(1);
  adcVal = read_adc();
  BatVolt = ((float)adcVal*REG_VOLT/88200);
  sprintf(BatDisp,"%4.2f V",BatVolt);
}

void ReadV1(void) {
  int16 adcVal;
  float Volt1;

  set_adc_channel(V1Ch);
  delay_ms(1);
  adcVal = read_adc();
  if (adcVal < 12) { //Overflow of positive signal
    strcpy(V1Disp,"OFlow");
    return;
  }
  adcVal = (GV1Off[pgaGV1E]-adcVal)/pgaGV1A;
  Volt1 = ((float)adcVal*REG_VOLT*0.12/4096);
  sprintf(V1Disp,"%4.2f V",Volt1);
}

void ReadV2(void) {
  int16 adcVal;
  float Volt;

  set_adc_channel(V2Ch);
  delay_ms(1);
  adcVal = read_adc();
  if (adcVal < 12) { //Overflow of positive signal
    strcpy(V2Disp,"OFlow");
    return;
  }
  adcVal = (GV2Off[pgaGV2E]-adcVal)/pgaGV2A;
  Volt = ((float)adcVal*REG_VOLT*0.12/4096);
  sprintf(V2Disp,"%4.2f V",Volt);
}


Thanks Alan
temtronic



Joined: 01 Jul 2010
Posts: 9225
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Dec 12, 2012 3:36 pm     Reply with quote

comment...
I'm curious as to how the compiler handled your 'delay_ms()' function when it already has one.
I'd have thought some sort of error message would have occoured...
Ttelmah



Joined: 11 Mar 2010
Posts: 19504

View user's profile Send private message

PostPosted: Wed Dec 12, 2012 3:59 pm     Reply with quote

Commonest reason for printf/sprintf problems on PIC24. Stack not large enough.

Best Wishes
alan



Joined: 12 Nov 2012
Posts: 357
Location: South Africa

View user's profile Send private message

PostPosted: Wed Dec 12, 2012 11:13 pm     Reply with quote

Thanks for replies.

temtronic, I always battle with the CCS delay when simulating or debugging. On production code I use CCS. I found if I just define after #USE delay, compiler sees it as overload and uses that.

Ttelmah, any suggestions or work around. If I do it 'manually' it generates a lot of overhead code, eg. on 16k PIC ROM used go from 46% to 54%.

Thanks again
alan



Joined: 12 Nov 2012
Posts: 357
Location: South Africa

View user's profile Send private message

PostPosted: Wed Dec 12, 2012 11:30 pm     Reply with quote

Sorry Tlelmah, I missed the solution last night, already on forum. Embarassed

Need to include

Code:

#build (stack=256)
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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