This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

bq32000 jumps to 16 minuites after 9 minutes(i.e suppose right know it is showing 12:09 after that it shows 16 minuites)

Other Parts Discussed in Thread: BQ32000

bq32000 jumps to 16 minuites after 9 minutes(i.e suppose right know it is showing 12:09 after that it shows 16 minuites)

it display 12:00

;

;

12:09 then it shows directly

12: 16

12:17

;

;

12:25 then it shows directly

12:32

not able to figure out reason for it

my code is given bellow

-------------------------------------------------------------------------------------------------------------------------------------------

//******************************************************************************
//MSP-FET430P140Demo-WDT,ToggleP1.0,IntervalOverflowISR,DCOSMCLK
//
//Description:ToggleP1.0usingsoftwaretimedbytheWDTISR.Togglerate
//isapproximately30msbasedondefault~800khzDCO/SMCLKclocksource
//usedinthisexamplefortheWDT.
//ACLK=n/a,MCLK=SMCLK=defaultDCO~800k
//
//        MSP130F149
//-----------------
///|\|XIN|-
//|||
//--|RSTXOUT|-
//||
//|P1.0|-->LED
//
//M.Buccini
//TexasInstrumentsInc.
//Feb2005
//BuiltwithCCEVersion:3.2.0andIAREmbeddedWorkbenchVersion:3.21A
//******************************************************************************
//#include<io430x20x3.h>
#include<msp430x20x3.h>
void display(int);
char blink=0xFF;//startblinkingdisplay
void start();
void stop();
void C_slaveAdd(void);
char ack(void);
void subAdd(char);
void statusRead(void);
void statusWrite(void);
char C_read(char);
void C_write(char,char);
void B_slaveAdd(void);
void SDA1(void);
void SDA0(void);
char B_read(char);
void B_write(char,char);
void delay(int);
void ButtonManage(void);
int sec,min,hr,count=0;
char BT1 = 'f';
/*Mainbodycontrolsthefuntionoftime*/
void main(void)
{
 WDTCTL=WDTPW+WDTHOLD;
sec=0,min=0,hr=0;
P1OUT = 0x7f;
P1DIR=0x7f;
P1IFG = 0x00;
P1IES = 0x7f;
P1IE = ~ 0x7f;
P2SEL = 0x00;
P2OUT = 0x00;
P2DIR = 0xff;
//C_write(0x01,0x80);//test variable
//1 sec delay to switchover RTC from backup to power supply mode

for(int a=0;a<3;a++)
{for(int a=0;a<32000;a++){}}
for(int a=0;a<3;a++)
{for(int a=0;a<32000;a++){}}

if(C_read(0x07) != 0xC0 )//Read CAL_CFG register
{C_write(0x07,0xC0);}


if(C_read(0x22) != 0x01)//Read SFR register
{
  C_write(0x20,0x5e);
  C_write(0x21,0xc7);
  C_write(0x22,0x01);
}

if((C_read(0x01) & 0x80) == 0x80)//read oscilator register
{
 
  C_write(0x00,0x80);
  C_write(0x00,0x00);
  C_write(0x01,0x00);
}




//for reading input
B_write(0x03,0xff);
__enable_interrupt();// stoped for testing

  //for dispalying data and controling input
  for(;1;){   
   
   //for setting oscilator
  if((C_read(0x01) & 0x80) == 0x80)
  /*  {
     
     char x;
     x = C_read(0x00) | 0x80;
     C_write(0x00,x );
     x = C_read(0x00) & 0x7f;
     C_write(0x00, x );
     x = C_read(0x01) & 0x7f;
     C_write(0x01,x);
      
    }*/
 
     // min = C_read(0x01);
      // hr = C_read(0x02);
     //display time
    P1OUT |= BIT5;
     display(min%10);
     P1OUT &= ~BIT5;
     display(min/10);
     if(sec%2 == 0)
     {display(8);}
    else
     {display(1);}
     display(hr%10);
     display(hr/10);
   
 
  }
}



//WatchdogTimerinterruptserviceroutine

/*UsedfordisplayingTIME*/
void display(int hr)
{
unsigned int b1,b2,b3,b4,r1,r2,r3,r4;

P1OUT|=BIT6;//CLKON
P1OUT&=~BIT6;//CLKOFF
b1 = hr/2;
r1 = hr%2;
b2 = b1/2;
r2 = b1%2;
b3 = b2/2;
r3 = b2%2;
b4 = b3/2;
r4 = b3%2;

if(r1!=0)
P1OUT|=BIT0;
if(r2!=0)
P1OUT|=BIT1;
if(r3!=0)
P1OUT|=BIT2;
if(r4!=0)
P1OUT|=BIT3;
P1OUT|=BIT4;//showdisplaybit
for(int a=0;a<50;a++){}
P1OUT&=~BIT4;
P1OUT&=~(BIT0+BIT1+BIT2+BIT3);
}

void start()
{
P2DIR=0xFF;
P2OUT|=0x40;
P2OUT|=0x80;
P2OUT&=0x80;
P2OUT&=0x00;
}

void C_slaveAdd(void)
{
SDA1();
SDA1();
SDA0();
SDA1();
SDA0();
SDA0();
SDA0();
}

char ack(void)
{
char x = 0x00;
P2OUT |= 0x40;

P2DIR =~ 0x40;
x |= P2IN;
P2OUT|=0x80;




P2OUT&=~0x80;

x&=0x40;

P2DIR=0xff;

return x;
}

void subAdd(char a)
{
  P2DIR=0xFF;

    for(int a1=0;a1<=7;a1++)
      {
        char b=0x80;
        char c;
        c=b&a;

          if(c==0x00)
            {
              SDA0();
            }
          else
            {
              SDA1();
            }

          a = a << 1;

          }
}

void statusRead()
{
P2OUT=0x40;

P2OUT|=0x80;

P2OUT&=0x40;

P2OUT|=0x00;

}

void statusWrite()
{
P2OUT &= 0x00;

P2OUT|=0x80;

P2OUT&=0x00;

}

void stop(void)
{
P2OUT |= 0x80;
P2OUT |= 0x40;
P2OUT &= 0x40;
P2OUT &= 0x00;
}

char C_read(char x1)
{
//P2OUT&=0x01;
Sta:
start();
C_slaveAdd();
statusWrite();
//P2OUT=0x01;

if(ack() != 0x00)
{
stop();
goto Sta;
}
//P2OUT&=0x00;
subAdd(x1);

if(ack() != 0x00)
{
stop();
goto Sta;
}
//P2OUT&=0x00;//P2.0isdatabitandP2.1isclkbit
start();
C_slaveAdd();
statusRead();
//P2OUT=0x01;

if(ack() != 0)
{
stop();
goto Sta;
}
//icundertest
char b=0x00;
for(int a=0;a<=7;a++)
{

 b=b<<1;
 if(ack() != 0x00)
  {
    b=b|0x01;
  }
  else
  {
    b=b|0x00;
  }
 
 
}
P2OUT = 0x00;
P2OUT |= 0x80;
P2OUT &= 0x00;

stop();

return b;
}

void C_write(char x1,char data)
{
s1:
start();
C_slaveAdd();
statusWrite();

if(ack()>0)
{
stop();
goto s1;
}
subAdd(x1);

if(ack()>0)
{
stop();
goto s1;
}
subAdd(data);

if(ack()>0)
{
stop();
goto s1;
}
stop();
}

void B_slaveAdd(void)
{
SDA1();
SDA0();
SDA0();
SDA0();
SDA0();
SDA0();
SDA1();
}

void SDA1(void)
{
P2OUT=0x40;

P2OUT|=0x80;

P2OUT&=0x40;

}
void SDA0(void)
{
P2OUT=0x00;

P2OUT|=0x80;

P2OUT&=0x00;

}

char B_read(char cmd)
{

Sta:
start();
B_slaveAdd();
statusWrite();


if(ack()>0)
{
stop();
goto Sta;
}
//icundertest
subAdd(cmd);

if(ack()>0)
{
stop();
goto Sta;
}
start();
B_slaveAdd();
statusRead();

if(ack()>0)
{
stop();
goto Sta;
}
char b=0x00;
for(int a=0;a<=7;a++)
{
b = b << 1;
if(ack()>0x00)
{
b=b|0x01;

}
else
{
b=b|0x00;

}

}
P2OUT=0x00;
P2OUT|=0x80;
P2OUT&=0x00;
//P1OUT=b;
stop();
return b;
}

void B_write(char cmd,char data)
{
start();
B_slaveAdd();
statusWrite();

if(ack() != 0)
{
stop();
}
subAdd(cmd);

if(ack() != 0)
{
stop();
}
subAdd(data);

if(ack()>0)
{
stop();
}

stop();
}

//interrupt vector
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
sec = C_read(0x00);
 min = C_read(0x01);
 min &= 0x7f;
 hr = C_read(0x02);
 hr &= 0x3f;
  P1IFG = 0x00;
  char x = B_read(0x00);
 
   if(BT1 == 't' && x == 0xFF)
   {BT1 = 'f';}
  else if(BT1 == 'f' && x == 0xFE)
    {
      BT1 = 't';
      char x;
      x=C_read(0x00) | BIT7;
    C_write(0x00,x );
     ButtonManage();
   
    }
   
    
}

void ButtonManage(void)
{
 // C_write(0x00,C_read(0x00) | BIT7 );
  int count =0;
  while(1)
  {
    for( int a=0;a<100;a++){
      P1OUT |= BIT5;
     display(C_read(0x01)%10);
     P1OUT &= ~BIT5;
     display(C_read(0x01)/10);
     display(8);
     display(C_read(0x02)%10);
     display(C_read(0x02)/10);}
   int x = B_read(0x00);
  if(x == 0xFF && BT1 == 't')
  {
    BT1 = 'f';
  }
    else if(x == 0xFE && BT1 == 'f')
    {
       BT1 = 't';
      break;
     
    }
   else if(x == 0xFD)
    {
      min++;
        if(min>59)
        { C_write(0x01,0x00);
        min=0;}
        else
        { C_write(0x01,min);}
        //minB = 'f';
    }
    else if(x == 0xFB)
    {
      hr++;
        if(hr>23)
        { C_write(0x02,0x00);
        hr = 0;}
        else
        { C_write(0x02,hr);}
        //hrB = 'f';
    }
    //display time
    for( int a=0;a<32000;a++){
    }
  }
  char x;
  x = C_read(0x00) & ~BIT7;
  C_write(0x00,x );
}

please help i am not able to figure out what is going wrong