If you enable interrupts, then you need an interrupt handler. If you prefer just to monitor the
timer1 overflow flag, then disable global interrupts.
Here's one example of monitoring the timer1 overflow flag without interrupts.
Just replace the LCD port assignments & port settings to match your board. I tested this on
a LAB-X1 board.
Note: You can remove the TOGGLE 0 stuff. I used the output for a scope probe.
	Code:
	DEFINE OSC 4
DEFINE LOADER_USED 1
'=================================================
'Setting LCD parameters
'=================================================
 
' Define LAB-X1 LCD registers and bits
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTE
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTE
Define  LCD_EBIT        1
Define  LCD_COMMANDUS   2000
Define  LCD_DATAUS      50
ticker VAR WORD
T1LO CON $F1    ' constant values for 10mS timer1 overflows
T1HI CON $D8    ' use with 1:1 prescale at 4MHz
ticker = 0      ' clear ticker on power-up
ADCON1 = 7      ' Set PORTA and PORTE to digital
Low PORTE.2     ' LCD R/W line low (W)
Pause 1000      ' Wait for LCD to start up
'=================================================
'Initialisation of PORT's
'=================================================
PORTB = 0
TRISB=%11110000
OPTION_REG.7=0  'Enable Pull-Up's on PORTB
T1CON = 0       '1:1 prescale, internal clock
PIE1.0 = 1      'enables the tmr1 overflow interrupt 
PIR1.0 = 0      'resets tmr1 interrupt flag 
INTCON.6 = 0    'disable peripheral interrupts
INTCON.7 = 0    'disable global interrupts
'=================================================
'Main Program
'=================================================
    pause 500 'initialise LCD
    LCDOUT $FE, 1, "Hello"
    LCDOUT $FE, $C0, "World"
    pause 2000 'displays the above for 5 seconds
    LCDOUT $fe,1
    LCDOUT "-- press button"
    
    TMR1H = T1HI   ' load timer1 for 10mS interrupts
    TMR1L = T1LO
    
waitforstart:
    if PORTB.5 = 0 then 
      LCDOUT $FE, 1, "Timer started"
      T1CON.0 = 1 'starts timer
      goto loop
    endif
    goto waitforstart
    
loop: ' loop waiting for timer1 overflow
    WHILE PIR1.0=0  ' timer1 overflow?
    WEND            ' no, keep waiting
    PIR1.0 = 0      ' clear overflow flag
    TOGGLE 0        ' 10mS pulse on RB0
    ticker = ticker + 1 ' inc ticker
    LCDout $FE,$C0,DEC5 ticker ' display ticker
    
    ' timer1 is still ticking, so we'll stop it, then add
    ' in our value for 10mS interrupts
    T1CON.0 = 0           ' stop timer1
    TMR1L = TMR1L + T1LO  ' add in low byte
    IF TMR1L < T1LO THEN  ' did low byte overflow?
       TMR1H = TMR1H + 1  ' yes, increment high byte
    ENDIF
    TMR1H = TMR1H + T1HI  ' no, just add in high byte
    T1CON.0=1             ' start timer1 
    GOTO Loop
    
    END
 If you want to use interrupts, here's another version using ON INTERRUPT,
	Code:
	DEFINE OSC 4
DEFINE LOADER_USED 1
'=================================================
'Setting LCD parameters
'=================================================
 
' Define LAB-X1 LCD registers and bits
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTE
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTE
Define  LCD_EBIT        1
Define  LCD_COMMANDUS   2000
Define  LCD_DATAUS      50
ticker VAR WORD
T1LO CON $F1    ' constant values for 10mS interrupts with
T1HI CON $D8    ' timer1 1:1 prescale and 4MHz osc
ticker = 0      ' clear ticker on power-up
ADCON1 = 7      ' Set PORTA and PORTE to digital
Low PORTE.2     ' LCD R/W line low (W)
Pause 1000      ' Wait for LCD to start up
'=================================================
'Initialisation of PORT's
'=================================================
PORTB = 0
TRISB=%11110000
OPTION_REG.7=0  'Enable Pull-Up's on PORTB
T1CON = 0       '1:1 prescale, internal clock
PIE1.0 = 1      'enables the tmr1 overflow interrupt 
PIR1.0 = 0      'resets tmr1 interrupt flag 
INTCON.6 = 1    'enables all unmasked peripheral interrupts
INTCON.7 = 1    'enables global interrupts
'=================================================
'Main Program
'=================================================
    pause 500 'initialise LCD
    LCDOUT $FE, 1, "Hello"
    LCDOUT $FE, $C0, "World"
    pause 2000 'displays the above for 5 seconds
    LCDOUT $fe,1
    LCDOUT "-- press button"
    
    TMR1H = T1HI   ' load timer1 for 10mS interrupts
    TMR1L = T1LO
    
waitforstart:
    if PORTB.5 = 0 then 
      LCDOUT $FE, 1, "Timer started"
      T1CON.0 = 1 'starts timer
      goto loop
    endif
    goto waitforstart
   ON INTERRUPT goto BasicInt
    
loop: ' loop waiting for interrupt & display updates
    @ NOP
    GOTO Loop
    
    ' update & display ticker on each interrupt
    DISABLE
BasicInt:
    TOGGLE 0              ' toggle RB0 every 10mS
    ticker = ticker + 1   ' increment ticker
    LCDout $FE,$C0,DEC5 ticker  ' display ticker
    
    ' timer1 is still ticking, so we'll stop it, then add
    ' in our value for 10mS interrupts
    T1CON.0 = 0           ' stop timer1
    PIR1.0 = 0            ' clear overflow flag
    TMR1L = TMR1L + T1LO  ' add in low byte
    IF TMR1L < T1LO THEN  ' did low byte overflow?
       TMR1H = TMR1H + 1  ' yes, increment high byte
    ENDIF
    TMR1H = TMR1H + T1HI  ' no, just add in high byte
    T1CON.0=1             ' start timer1 
    RESUME
    ENABLE
    
    END
 Once you understand how these work, you can go for the big guns, and use Darrel Taylors'
instant interrupts here http://www.picbasic.co.uk/forum/showthread.php?t=3251
Then you'll really start having fun...;o}
				
			
Bookmarks