My isr is long, but at 4MHz and no delay instructions it has not to be the problem.
Well, I tried to set the presale to 1:16. 1:4 had to make a interrupt every 2mSec.
after that I tried to turn off the timer and after that, turn it back on. All had no effect.
So, I came back here.
This is all my code:
first config, var's and isr
then main loop
after that the complete menu
Much of the code was for a rtc-clock using a lcd. Thats why some of the loops are empty now.
Code:
@ device pic16F628a, INTRC_OSC_NOCLKOUT
@ device pic16F628a, MCLR_ON
@ device pic16F628a, LVP_OFF
@ device pic16F628a, WDT_OFF
@ device pic16F628a, PWRT_ON
@ device pic16F628a, BOD_OFF'ON
INCLUDE "modedefs.bas" 'for shiftout
pause 50
' Defines
' ----------------
'I2C pins
DS_SCL VAR PORTA.0 ' I2C clock pin
DS_SDA VAR PORTA.1 ' I2C data pin
'RTC CON %11010000 ' RTC device address (byte addressing) not needed
'Setting the RTC so we can get out 1Hz tick output
'-------------------------------------------------
' -------------- RTC definitions -----------------
SecReg CON $00 ' seconds address (00 - 59)
' MSB of SecReg must be set to a 0 to enable RTC
MinReg CON $01 ' minutes address (00 - 59)
HourReg CON $02 ' hours address (01 - 12) or (00 - 23)
DayReg CON $03 ' day address (1 - 7)
DateReg CON $04 ' date address (01 - 28/29, 30, 31)
MonthReg CON $05 ' month address (01 - 12)
YearReg CON $06 ' year address (00 - 99)
ContReg CON $07 ' control register
RTCflag CON 0 ' RTC flag (location 0 of internal EEPROM)
cntrl CON %00010000 ' sets the SQW/OUT to 1Hz pulse, logic level low
' The variable below holds the values entered:
'menu var's
_sec VAR BYTE ' $00 set seconds
_min VAR BYTE ' $56 set minutes
_hr VAR BYTE ' $23 set hour
_day VAR BYTE ' $06 set day
_date VAR BYTE ' $28 set date
_mon VAR BYTE ' $02 set month
_yr VAR BYTE ' $03 set year
'rtc var's
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
'button input
'-------------------
SetButton var PORTa.7 ' Press to Set/memorise Button
DecButton var PORTa.3 ' Press to Decrement Button
IncButton var PORTa.2 ' Press to Increment Button
'other var's
'------------------
CounterA var byte ' General purpose Variable
CounterB var byte ' General purpose Variable
CounterC var byte ' General purpose Variable
CounterD var byte ' General purpose Variable
ButtonRepeat con 200 ' Timeperiod (in mS for Edit Buttons auto-repeat
' should you want to hold them down...
RTCCtrl var byte ' Control
TimeOut var word ' Variable for SetUp Menu Time-Out
SetTime var byte ' 12/24 Hour Clock
RTCWDay var byte ' Weekday
timeformat var word ' place for displaying am/pm
counter var byte
counter2 var byte
counter3 var word ' delaycounter
counter4 var word ' counter at redisplayloop
segments var byte
myBCD var byte
toDEC var byte
'I/O pins
'port conditions
'---------------
CMCON=7
TRISA=0
TRISB=0
PORTA=0
PORTB=0
'timer and interruptconditions
'----------------
PIE1 = %00000010
'0------- Disable EE write complete interrupt
'-0------ Disable comparator interrupt
'--0----- Disable USART receive interrupt
'---0---- Disable USART transmit interrupt
'----x--- unimplemented
'-----0-- Disable CCP1 interrupt
'------1- Enable TMR2 to PR2 match interrupt
'-------0 Disable TMR1 overflow interrupt
T2CON = %00000010
'X------- Unimplemented
'-0000--- postscale 1:1
'-----0-- Timer2 off
'------10 prescaler 1:16
GIE VAR INTCON.7
PEIE VAR INTCON.6
TMR2IF VAR PIR1.1
TMR2ON VAR T2CON.2
RELOAD CON 131
ON INTERRUPT GOTO ISR
TMR2 = RELOAD
PR2 = 0 ' load period register for 2mSec
PEIE = 1 ' Enable peripheral interupt
GIE = 1 ' enable Global interrupt
TMR2ON = 1 ' TMR2 ON
GOTO LOOP
disable
ISR: 'interruptroutine
TMR2ON=0
'later to use to reduce the isr text. then only shiftout the var's
if counter3=>200 then 'number of shiftouts
counter3=0
else
counter3=counter3+1
endif
'hours
'the one that is 0 wil blink
'for segments the opposite
counter = %01111111 '1 segment
toDEC = hr
if hr.6=1 then '12 uurs mode
todec = todec <<3
todec = todec >>7
else '24 uurs mode
todec = todec <<2
todec = todec >>6
endif
gosub findsegments
if hr.6 = 1 then 'add in the am/pm indication
if hr.5 = 1 then
segments.7 = %1
endif
endif
gosub segmentsshiftout
counter = %10111111 '2 segment
toDEC = hr
toDEC = toDEC << 4 'shiftout unusable data
todec = todec >> 4 'shiftback usable data
gosub findsegments
if portA.6 = 1 then segments.7 = %1 'add the blinkin dot
gosub segmentsshiftout
'minits
counter = %11011111 '3 segment
toDEC = MINs
todec = todec >> 4 'shiftback usable
gosub findsegments
gosub segmentsshiftout
counter = %11101111 '4 segment
toDEC = MINs
todec = todec << 4 'shiftout unusable data
todec = todec >> 4
gosub findsegments
gosub segmentsshiftout
'seconds
counter = %11110111 '5 segment
toDEC = sec
todec = todec >> 4 'shiftback usable
gosub findsegments
gosub segmentsshiftout
counter = %11111011 '6 segment
toDEC = sec
todec = todec << 4 'shiftout unusable data
todec = todec >> 4
gosub findsegments
if hr.6=1 then 'mode indication
segments.7=%1
endif
gosub segmentsshiftout
counter = %11111111 'to take care that no segment is blinking harder
todec = %00000000'todec >> 4
gosub segmentsshiftout
segmentsshiftout:
SHIFTOUT PORTB.0, PORTB.1, LSBFIRST,[counter\8,segments\8] 'data, clock
pulsout PORTA.4,1
return
findsegments:
if todec=%00000000 then '0
segments = %01111110
endif
if todec=%00000001 then '1
segments = %00110000
endif
if todec=%00000010 then '2
segments = %01101101
endif
if todec=%00000011 then '3
segments = %01111001
endif
if todec=%00000100 then '4
segments = %00110011
endif
if todec=%00000101 then '5
segments = %01011011
endif
if todec=%00000110 then '6
segments = %01011111
endif
if todec=%00000111 then '7
segments = %01110000
endif
if todec=%00001000 then '8
segments = %01111111
endif
if todec=%00001001 then '9
segments = %01111011
endif
return
TMR2 = RELOAD
TMR2ON = 1
TMR2if=0 ' Clear interrupt flag
resume
enable
LOOP:
I2CRead DS_SDA,DS_SCL,$D0,$00, [sec,MINs,hr,day,date,mon,yr] ' Read Ds1307
If sec.7=1 then goto coldstart
If setbutton = 0 then 'if setbutton is pressed
_hr=hr
_min=MINs
_sec=sec
gosub SetButtonRelease
Gosub SetTimeAndDate 'after release
endif
counter3=0
repeat 'show the segments for 5 times.
pauseus 10
until counter3 > 5
GoTo Loop
end
Segmentswrite2:'write settimevar's to timevar's in bcd
CounterA=_hr
If SetTime=1 then
If CounterA>12 then CounterA=CounterA-12
If CounterA=0 then CounterA=12
endif
Gosub ConvertBCD
hr=CounterB
' Save the Hours Value
If SetTime=1 then
hr.6=1
' Save the 12 Hour Mode Flag
If _hr=>12 then hr.5=1
' Save the 'PM' Flag
endif
'
' Save Minutes
' ------------
CounterA=_min
Gosub ConvertBCD
MINs=CounterB
'
' Save Seconds
' ------------
CounterA=_sec
Gosub ConvertBCD
sec=CounterB
'gosub segmentswrite
return
'paste here the other half of the code
Bookmarks