Timer1 would be better, but this should get you started.Code:@ DEVICE LVP_OFF,HS_OSC DEFINE OSC 20 DEFINE INTHAND TMRint 'Variables for saving state in interrupt handler wsave VAR BYTE $70 system ' Saves W ssave VAR BYTE bank0 system ' Saves STATUS psave VAR BYTE bank0 system ' Saves PCLATH fsave VAR BYTE bank0 system ' Saves FSR TMR0_Ticks VAR BYTE system TMR0 = 96 GoTo Init Asm TMRint ; Uncomment the following if the device has less than 2k of code space ; movwf wsave ; Save W ; swapf STATUS, W ; Swap STATUS to W (swap avoids changing STATUS) ; clrf STATUS ; Clear STATUS ; movwf ssave ; Save swapped STATUS ; movf PCLATH, W ; Move PCLATH to W ; movwf psave ; Save PCLATH ; Increment ticks, reload, clr int flags ;------------------------------------------------------------------------------ incf TMR0_Ticks,f ; increment overflow ticks movlw 96 ; 256-96=160. 160x200nSx256=8.192mS. 8.192mSx122=0.999mS= ~1S movwf TMR0 ; reload bcf INTCON,2 ; clear TMR0 int flag ;---------------------------------------------------------------------------- movf fsave, W ; retrieve FSR value movwf FSR ; Restore FSR movf psave, W ; Retrieve PCLATH value movwf PCLATH ; Restore PCLATH swapf ssave, W ; (swap to avoid changing STATUS) movwf STATUS ; Restore STATUS swapf wsave, F ; Swap the stored W value swapf wsave, W ; Restore it to W (swap to avoid changing STATUS) retfie ; Return from the interrupt EndAsm Init: PORTD = 0 TRISD = 0 OPTION_REG = %00000111 ' 1:256 prescaler to TMR0 INTCON = %11100000 ' Enable TIMR0 interrupts Main: IF TMR0_Ticks >= 122 THEN TMR0_Ticks = 0 PORTD.0 = PORTD.0 ^ 1 ' ~1 second pulse on RD0 ENDIF GOTO Main End
Bookmarks