tmr2 interrupt problem


Results 1 to 28 of 28

Threaded View

  1. #8
    Join Date
    Dec 2007
    Location
    The Netherlands, Groningen
    Posts
    16


    Did you find this post helpful? Yes | No

    Default

    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
    Last edited by ADCON; - 28th December 2007 at 22:45.

Similar Threads

  1. Problem with Interrupt on PIC18F4620 PORTB
    By rookie in forum Off Topic
    Replies: 1
    Last Post: - 22nd March 2007, 01:34
  2. Problem with PBP interrupt and Serin, please help
    By rgregor in forum mel PIC BASIC
    Replies: 0
    Last Post: - 22nd August 2006, 19:02
  3. Interrupt Problem
    By Kamikaze47 in forum mel PIC BASIC Pro
    Replies: 15
    Last Post: - 16th November 2005, 20:58
  4. Interrupt stack overflow problem with Resume {label}
    By Yuantu Huang in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 3rd May 2005, 01:17
  5. USART interrupt not interrupting right
    By Morpheus in forum mel PIC BASIC Pro
    Replies: 12
    Last Post: - 6th March 2005, 01:07

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts