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 );
}