PDA

View Full Version : Counter problem



lerameur
- 9th December 2010, 02:48
Hello,

I am having difficulties troubleshooting this problem. I have a countdown timer and when it comes to 59:51 the next number it turns to is 59:44:
the calculations is good , I did a simulation in excel and the formula does work, what the heck is the problem:
I am using the DS 1337 and pic16F887


OSCCON = %01110000 '8 Mhz
DEFINE OSC 8
ANSELH = 0

'///////////////////////////
'// Interrupt section //
'///////////////////////////


'/////////////////////////
'// LCD configuration //
'/////////////////////////

DEFINE LCD_DREG PORTB ' Set LCD Data port
DEFINE LCD_DBIT 4 ' Set starting Data bit (0 or 4) if 4-bit bus RB.4, RB.5, RB.6, RB.7
DEFINE LCD_RSREG PORTB ' Set LCD Register Select port
DEFINE LCD_RSBIT 1 ' Set LCD Register Select bit
DEFINE LCD_EREG PORTB ' Set LCD Enable port
DEFINE LCD_EBIT 0 ' Set LCD Enable bit
DEFINE LCD_BITS 4 ' Set LCD bus size (4 or 8 bits) '4 therefore put wire at 4, 5, 6 and 7 of LCD
DEFINE LCD_LINES 2 ' Set number of lines on LCD
DEFINE LCD_COMMANDUS 2500
DEFINE LCD_DATAUS 250
DEFINE CHAR_PACING 2000
pause 1000

'/////////////////////////
'// PIN configuration //
'/////////////////////////

TRISB = %00000000 ' Set PORTB to all output
TRISA = %11111111 ' Set PORTA to all input
TRISC = %11000000 ' Set PORTC to all output


'///////////////////////////////////////////////
'// Variable Declaration and initialization //
'///////////////////////////////////////////////

SDApin var PORTC.4 ' RTC data
SCLpin var PORTC.3 ' RTC clock

Total_time var word
RTCSec var byte :RTCMin var byte :RTCHour var byte :RTCWDay var byte :RTCDay var byte :RTCMonth var byte :RTCYear var byte :RTCCtrl var byte

lcdout $FE,1, "Bienvenue"
lcdout $FE,$C0, "Welcome"
pause 1000

'////////////////////////////////////////////////////
'////////////////// PROGRAM /////////////////////////
'////////////////////////////////////////////////////

Mainloop:
if PORTC.6 =0 then
Gosub CountDown
lcdout $FE,1, "Out of Countdown"
lcdout $FE,$C0, " Press C.6 to Start "
Pause 150
Endif

goto Mainloop
End

CountDown:
I2CWRITE SDApin,SCLpin,$D0,$00,[$00,$00,$00,$00,$00,$00,$00,$00] ' Write to DS1307 to start counter at ZERO
Pause 20
while RTCHour != 1

I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCY ear,RTCCtrl]
Pause 20
'Will get the time from timer chip and do a 60 min count down
'Also add interrupt if someone presses start to view the charge/discharge cycle
Total_time = (RTCMin * 60) + RTCSec
Total_time = 3600 - Total_time
lcdout $FE,1, "Time left"
lcdout $FE,$C0, " Diff: ", dec2 RTCHour, ":", dec2 Total_time/60 ,":", dec2 Total_time//60
Pause 150
Wend
return

lerameur
- 9th December 2010, 12:31
Hi,

I also tried a clock program with the DS1337, works good, just that the seconds do not stop at 59, it continues to 80....or 89, thats was last night. How can the chip gives me this kinf of values ????

K

Charles Linquis
- 9th December 2010, 13:47
The clock setting and ouput values are in BCD

There are lots of DS1307 examples on the forum that explain the conversion.

lerameur
- 9th December 2010, 14:03
I think it might the mod mode, I will try this tonight, basic basic basic:


while RTCHour != 1

I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCY ear,RTCCtrl]
Pause 20
'Will get the time from timer chip and do a 60 min count down
'Also add interrupt if someone presses start to view the charge/discharge cycle
Rest_seconds = 59 - RTCSec
Rest_min = 59 - RTCMin
lcdout $FE,1, "Time: ", dec2 RTCHour, ":", dec2 RTCMin, ":", dec2 RTCSec
lcdout $FE,$C0, " Dif: ", dec2 RTCHour, ":", dec2 Rest_min ,":", dec2 Rest_seconds
Pause 150
Wend

lerameur
- 9th December 2010, 14:08
BCD... o crap, yes would explain why it went from 9 to 16 !!!, thanks. Missed that on the spec sheet.

mackrackit
- 9th December 2010, 19:05
sec VAR BYTE ' seconds
mins VAR BYTE ' minutes
hr VAR BYTE ' hours
day VAR BYTE ' day
date VAR BYTE ' date
mon VAR BYTE ' month
yr VAR BYTE ' year
'DEC VARS
SEC_O VAR BYTE
SEC_T VAR BYTE
MIN_O VAR BYTE
MIN_T VAR BYTE
HR_O VAR BYTE
HR_T VAR BYTE
MON_O VAR BYTE
MON_T VAR BYTE
DATE_O VAR BYTE
DATE_T VAR BYTE
YR_O VAR BYTE
YR_T VAR BYTE

'#################################################
READ_RTC:
I2CREAD DS_SDA, DS_SCL, RTC, SecReg, [sec,mins,hr,day,date,mon,yr]

SEC_T = sec & $70
SEC_T = SEC_T>>4
SEC_O = sec & $0F

MIN_T = mins & $70
MIN_T = MIN_T>>4
MIN_O = MINs & $0F

HR_T = hr & $70
HR_T = HR_T>>4
HR_O = hr & $0F

MON_T = mon & $70
MON_T = MON_T>>4
MON_O = mon & $0F

DATE_T = date & $70
DATE_T = DATE_T>>4
DATE_O = date & $0F

YR_T = yr & $70
YR_T = YR_T>>4
YR_O = yr & $0F

lerameur
- 9th December 2010, 19:43
Hey dave, thanks for the help. I had written this program with two Subroutine that I found on this site somewhere.. I will test it tonight.

CountDown:
I2CWRITE SDApin,SCLpin,$D0,$00,[$00,$00,$00,$00,$00,$00,$00,$00] ' Write to DS1307 to start counter at ZERO
Pause 20
while RTCHour != 1

I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCY ear,RTCCtrl]
Pause 20
'Will get the time from timer chip and do a 60 min count down
'Also add interrupt if someone presses start to view the charge/discharge cycle

TempVal=RTCSec
GoSub BCD_TO_BIN
Secs=TempVal

TempVal=RTCmin
GoSub BCD_TO_BIN
Mins=TempVal

Rest_seconds = 59 - Secs
Rest_min = 59 - Mins
lcdout $FE,1, "Time: ", dec2 RTCHour, ":", dec2 RTCMin, ":", dec2 RTCSec
lcdout $FE,$C0, " Dif: ", dec2 RTCHour, ":", dec2 Rest_min ,":", dec2 Rest_seconds
Pause 150
Wend
return

BCD_TO_BIN: ' Convert the BCD values into BIN

Temp1 = $0F & TempVal ' Clear off the top four bits
Temp1 = Temp1 Dig 0
Temp2 = TempVal >> 4 ' Shift down four to read 2 BCD value
Temp2 = Temp2 Dig 0
TempVal = Temp2 * 10 + Temp1

Return

BIN_TO_BCD:

Temp1 = TempVal Dig 0 ' GET THE DEC DIGIT FOR THE FIRST NIBBLE
Temp2 = TempVal Dig 1 ' GET THE DEC DIGIT FOR THE FIRST NIBBLE
Temp2 = Temp2 << 4 ' MOVE NUMBER OVER TO 2ND NIBBLE
TempVal = Temp1 ^ Temp2 ' XOR THEM TOGTHER TO MAKE THE WHOLE BCD NUMBER

Return