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

startup troubles DSPIC30F4013

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



Joined: 05 Jun 2006
Posts: 41
Location: Belgium

View user's profile Send private message Visit poster's website MSN Messenger

startup troubles DSPIC30F4013
PostPosted: Mon Aug 03, 2009 11:03 am     Reply with quote

Hey folk's
I have a strange problem,

Following code is running well in development mode.
When I reboot (power cycle) the system hangs.
When I change the fuse NOWDT in WDT, the system starts up, but restarted every XXX seconds...

What could be the problem?

Carl



Code:

#include <30f4013.h>
//#device adc=12

#FUSES NOWDT // Watch Dog Timer
#FUSES EC
#FUSES NOCKSFSM //Clock Switching is disabled, fail Safe clock monitor is disabled
//#fuses pr
#fuses HS2_PLL4 // div by 3 and  multiply the ext. clock of 40mhz by 8x
#FUSES PR_PLL // pll mode
//#fuses HS // div by 3 and  multiply the ext. clock of 40mhz by 8x
//#FUSES PR // pll mode
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#define XTAL_FREQUENCY 64000000
#use delay(clock=XTAL_FREQUENCY)
#use rs232(stream = RS232, baud=19200,parity=N,xmit=PIN_F5,rcv=PIN_F4,bits=8)
int32 freq;
int32 teller,waarde;
int32 tellerfirst,laatstewaarde;
int32 gemetenwaarde;
int32 displayvalue;
int32 setpunt_maxgewicht,setpunt_maxfrequentie,setpunt_minfrequentie,setpunt_oscillator;
int run_as_master, lastview;
#define spiclk   PIN_F6   // output
#define spidata   PIN_F3   // output
#define text1   PIN_B0   // output
#define text2   PIN_B1   // output
#include <math.h>
#include <display2.c>

//////////////////////////////////////////////////////////////////////////
//interrrupt komende van DEMAG module/
//via optokcopler                    /
//////////////////////////////////////////////////////////////////////////
#int_ext0
void EXT_ISR()
{
   if (teller ==2)
      {
      // waarde opslagen van eerste meting om niet te gebruiken.....   
      tellerfirst = get_timer23();
      }
   if (teller <1000)
      {
      //   freq = get_timer23();
         teller++;
               
      }
   if (teller ==203)
      {
         laatstewaarde = get_timer23();
         set_timer23(0);   
         teller=0;
         gemetenwaarde=(laatstewaarde-tellerfirst)/200;
      }

}
///////////////////////////////////////////////////////////////////////////
Void main()
{

   set_tris_b(0b11000011);
   EXT_INT_EDGE(H_TO_L);
   enable_interrupts(int_timer3);
    set_timer23(0);
   setup_timer2(TMR_EXTERNAL|TMR_DIV_BY_1|TMR_32_bit);
   enable_interrupts(INT_EXT0);
   enable_interrupts(intr_GLOBAL);
   gemetenwaarde = 0;
   tellerfirst=0;
   printf("hello\n\r");
   teller=0;
run_as_master=0;
   setpunt_maxgewicht = 16000;
   setpunt_maxfrequentie= 10500;
   setpunt_minfrequentie=645;
   setpunt_oscillator = 10000000;   
   
   sendbyte(72);
   sendbyte(69);
   sendbyte(76);
   sendbyte(76);
   sendbyte(79);
   delay_ms(1000);
   While(1)
   {
      // volgens Van den Berg ligt de frequentie tussen 500 en 10500 Hz
      // dus
      // bij 500 hz = 4000000 / 500 = 40000 / 5 = 8000
      // bij 15000 hz = 4000000/10500 = 380
      // resolutie = 8000-380 = 7620
      // 16000 / 7620 = 2 kgr / digit

// berekening 10 mhz
      // 10.000.000 / 500 = 20.000
      // 10.000.000 / 10500 = 952
      // 20.000 - 952 = 19048
      //   16000 / 19048 = 0.83 kgr / digid

      // instelligen....
      // frequentie
      // min bereik freq
      // max bereik freq
      // min waarde display
      // maximum waarde display
      if (input(text2)== true)
         {
            sendbyte(32);
            sendbyte(32);
            sendbyte(32);
            sendbyte(32);
            sendbyte(32);

            sendbyte(72);   //H
            sendbyte(69);    //E
            sendbyte(76);   //L
            sendbyte(80);   //P
            sendbyte(32);   //
         }

      if (lastview > 30 & input(text1) == 1)
         {
            sendbyte(32);
            sendbyte(32);
            sendbyte(32);
            sendbyte(32);
            sendbyte(32);

            sendbyte(77);
            delay_ms(300);
            sendbyte(65);
            delay_ms(300);
            sendbyte(83);
            delay_ms(300);
            sendbyte(84);
            delay_ms(300);
            sendbyte(69);
            delay_ms(300);
            sendbyte(82);
            delay_ms(300);
            sendbyte(32);
            delay_ms(500);
            sendbyte(32);
            delay_ms(300);
            sendbyte(32);
            delay_ms(300);
            sendbyte(32);
            delay_ms(300);
            sendbyte(32);
            lastview = 0;
         }
      lastview ++;      
       delay_ms(1000);

   display(ABS(((10000000/GEMETENWAARDE)-setpunt_minfrequentie)* 1630/1000));

      printf("%c[2J%c[H",27,27);
      printf("FRQ            %u\n\r",freq-tellerfirst);
      printf("FRQ            %u\n\r", freq);
      printf("tellerfirst    %u\n\r",tellerfirst);
      printf("laatstewaarde  %u\n\r",laatstewaarde);
      printf("gemetenwaarde  %u\n\r",gemetenwaarde);
      printf("displayvalue   %u\n\r",displayvalue);


   }
}
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Mon Aug 03, 2009 11:37 am     Reply with quote

When you have the watchdog enabled, it must be "tickled" frequently to
tell the code that everything is working correctly.
restart_wdt();//at least one in the main while(1) loop


Your delays may not work with wdt on without using
#use delay(clock=18432000,RESTART_WDT)
on7nh



Joined: 05 Jun 2006
Posts: 41
Location: Belgium

View user's profile Send private message Visit poster's website MSN Messenger

PostPosted: Mon Aug 03, 2009 12:24 pm     Reply with quote

Yes ! This is working !
Only I don't know why the pic is not booting without the WDT.

Now the time between power and booting is really long (about half a minute). Any sugestions to decrease this time?

Thanks
Carl
parasram



Joined: 09 Sep 2009
Posts: 2

View user's profile Send private message

dspic30f4013 startup issue
PostPosted: Thu Aug 05, 2010 10:59 pm     Reply with quote

I am seeing this same problem.
My guess is that the external clock needs some time to stabilize.
What is happening is that you may be getting an oscillator fail trapped and the code hangs until the WDT expires (30s in your case).
I believe the solution is to enable clock switching and start with the internal clock 7.37Mhz and then switch the external crystal and few seconds later.

What was your final solution?
djani



Joined: 19 Dec 2012
Posts: 5

View user's profile Send private message Send e-mail

PostPosted: Wed Dec 11, 2013 5:34 am     Reply with quote

HI there,

I dint get this and am having same problem, can some one please put a small explanation code.

Many thanks
Ttelmah



Joined: 11 Mar 2010
Posts: 19509

View user's profile Send private message

PostPosted: Thu Dec 12, 2013 3:35 am     Reply with quote

Post your fuses, crystal frequency, what speed you are trying to run, the exact chip, and compiler version.

The original post has several problems, such as 'EC', as well as 'HS2'. These are 'either/or' fuses, not both. So the actual configuration may well have not been 'viable'. The frequency that was being used (64MHz), is also not viable for the PLL4 selection. Look at table 20-3 in the data sheet....

Best Wishes
djani



Joined: 19 Dec 2012
Posts: 5

View user's profile Send private message Send e-mail

startup troubles DSPIC30F4013
PostPosted: Thu Dec 12, 2013 5:07 am     Reply with quote

Hi there,

resonator=16Mhz clock=32Mhz using (HS/2 PLLx4)

it did give me error in compiler when i tried to use below line.
#use delay(clock=32Mhz,crystal=16Mhz)

Please find my code below. I tried to use watchdog but still cant get the startup time to below 16seconds. Ideally want it to start up straight away.

This works fine when I change the clock to 16MHz (withouth the PLL).

Also starts straight away in Clock=32MHz (with PLL) but only when ICD3 is connected to micro. Never seen this prob before.

MPLAB IDE v8.88 + CCS compiler 4.138 (IDE,PCB,PCM,PCH,PCD)

Code:
#if defined(__PCD__)
#include <30F4013.h>
//#device ICD=TRUE
#device ADC=12
//#fuses HS,NOWDT,NOPROTECT   //HS2_PLL4,FRC_PLL4
#fuses HS2_PLL4,WDT,NOPROTECT,NODEBUG   //PUT64,NOCKSFSM,NOPUT,NOWRT
#use delay(clock=32Mhz) //(,crystal=16Mhzclock=16MHz)

//#use rs232(UART1, baud=9600)
#endif

// The following initializes the first 4 locations of the data EERPOM
//  using the #ROM directive
#if defined(__PCD__)
#rom 0x007FFC00={1,2,3,4}
#endif

//EEPROM Address where TxID is saved
//#define CALIB   0x0034
#define ID_ADDRESS   0x0010
      

// CAN data buffer (to be transmitted)
unsigned int8 data[5][8]={
                        0x01,0x00,0x52,0x56,0x30,0x30,0x37,0x00,
                        0x02,0x00,0x01,0x01,0x01,0x01,0x00,0x00,
                        0x03,0x00,0x01,0x01,0x01,0x01,0x00,0x00,
                        0x04,0x00,0x01,0x01,0x01,0x01,0x00,0x00,
                        0x05,0x00,0x01,0x01,0x01,0x01,0x00,0x00,
                     };
      
#include "DEFS.h"   
#include "can-dsPIC30.c"
//#include "can-dsPIC30.h"
#include <internal_eeprom.c>
#include <math.h>
#include "adc.c"

unsigned int16 ms;


// Interrupt Timer2
#int_timer2
void isr_timer2(void)
{
   ms++;
}




void main(void)
{
   // Structure & variables set for use with data received from CAN communication
//   struct rx_stat rxstat;
//   unsigned int32 rx_id;      //The CAN ID(RxID) received on the CAN message
//   unsigned int8 rxbuffer[8];   //The CAN data following the CAN ID
//   unsigned int8 rx_len;
   unsigned int32 tx_id;      //The CAN ID used by device. This can be changed by changing the contents of EEPROM.
   unsigned int8 index;
   
/*   switch(restart_cause())
      {
         case RESTART_POWER_UP:
         {
            data[0][7]= 0x01;
            break;
         }
         case RESTART_BROWNOUT:
         {            
            data[0][7]= 0x02;
            break;
         }
         case RESTART_WATCHDOG:
         {           
            data[0][7]= 0x03;
            break;
         }
         case RESTART_SOFTWARE:
         {
            data[0][7]= 0x04;
            break;
         }
         case RESTART_MCLR:
         {
            data[0][7]= 0x05;
            break;
         }
         case RESTART_ILLEGAL_OP:
         {           
            data[0][7]= 0x06;
            break;
         }
         case RESTART_TRAP_CONFLICT:
         {
            data[0][7]= 0x07;
            break;
         }        
      }*/
      
   setup_wdt(WDT_ON);
   restart_wdt();

   
   //setup timer2 to interrupt every 1ms if using 16MHz clock
   setup_timer2(TMR_INTERNAL,10000);   //|TMR_HALT_IDLE, TMR_32_BIT||TMR_32_BIT

      SET_TRIS_A(0x0000);     
      SET_TRIS_B(0x1F3F);
      SET_TRIS_C(0x0000);
      SET_TRIS_D(0x0000);
      SET_TRIS_F(0x00);

     // Setup ADC clock & ports to be used
     setup_adc(ADC_CLOCK_INTERNAL);
      setup_adc_ports(sAN0|sAN1|sAN2|sAN3|sAN4|sAN5|sAN8|sAN9|sAN10|sAN11|sAN12|VSS_VDD);
 
   // Get TxID value from the EEPROM
   //  & Check if the value is valid
   write_int16_eeprom(ID_ADDRESS,0x400);
   
   tx_id = read_int16_eeprom(ID_ADDRESS);
   if((tx_id>0x00000900) || (tx_id<0x00000100))
   {
      write_int16_eeprom(ID_ADDRESS,0x0400);
   }
   
   // Initialise CAN port
   can_init();
   
   // Enable all interrupts - (Timer2)
   enable_interrupts(INT_TIMER2);
   enable_interrupts(INTR_GLOBAL);
   
   // Loop continuosly
   while(TRUE)
   {
      restart_wdt();
      
      acquire_data();      // Acquire data from the Analog channels
      arrange_data();      // Arrange data in the buffer to be transmitted

      // In order to Transmit data, put the data on the CAN transmit buffer
      for(index=0;index<5;index++)
      {   
         /* The calculation for the delay is  = 10000(setup_timer)x4(ms in while loop)x(1/16MHz freq)x4(clock cycles)*/      
         while(   (!can_tbe())|| (ms<160)){}; // every ONE mili seconds, send new data if transmit buffer is empty
            
             ms=0;//reset the count every 1ms or as calculated above.
         
         can_putd(tx_id,&data[index][0], 8, 0, 0, 0);   //Send the data out on to the CAN buffer for Transmit.               
      }   
   }   
}
Ttelmah



Joined: 11 Mar 2010
Posts: 19509

View user's profile Send private message

PostPosted: Thu Dec 12, 2013 8:36 am     Reply with quote

Seriously 1000* more complicated than it should be to debug a problem like this.
All you should have is a simple 'flash an LED' type program, and you can then see immediately how quickly the processor starts. With lots of extra code, the problem could be that it is waiting for something.....
The flash an LED program will also confirm the actual clock rate.

So:
Code:

#include <30F4013.h>
#fuses HS2_PLL4,NOWDT,NOPROTECT,NODEBUG,PUT4,NOBROWNOUT,NOMCLR 
#use delay(clock=32Mhz)

void main(void)
{
    do
    {
        output_toggle(PIN_F0);
        delay_ms(1000);
    }
    while (TRUE);
}

on a 3014 (haven't got a 3013), with just the processor include changed, wakes up only a few mSec after power is applied, and the LED toggles at the right interval.

Best Wishes
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