TITLE "interrupt mode example for USBoLo" LIST P=18F2550 INCLUDE ; Tx every second a char (1..9) to host (paddy.strebel@datacomm.ch) usbds EQU H'0012' ; USB driver service usbtx EQU H'0006' ; USB transmit W cntr EQU H'000' ; counter (6..255) timr EQU H'001' ; timer (0..9, flag) ORG H'0800' ; user code at mstart GOTO mstart ORG H'0808' ; high priority user interrupt BCF PIR1,TMR2IF ; reset interrupt flag INCFSZ cntr,F ; STATUS and W remain unchanged RETFIE BSF cntr,2 ; preset to 6 (divide by 250) BSF cntr,1 ; 12MHz/16/15/200/250=1Hz BSF timr,7 ; set flag RETFIE ORG H'0818' ; low priority usb interrupt CALL usbds ; handled by usbds BCF PIR2,USBIF ; reset interrupt flag RETFIE ORG H'0820' ; init concurrent interrupts mstart BSF RCON,IPEN ; enable interrupt priorities BCF IPR2,USBIP ; set low priority BSF PIE2,USBIE ; enable USB interrupt MOVLW B'01110010' ; timer 2: postscaler 15, prescaler 16 MOVWF T2CON MOVLW D'200' ; timer 2 period MOVWF PR2 BSF IPR1,TMR2IP ; high priority interrupt (default) BSF PIE1,TMR2IE ; enable timer 2 interrupt BSF T2CON,TMR2ON ; enable timer 2 BSF INTCON,GIEL ; enable low priority interrupts BSF INTCON,GIEH ; enable high priority interrupts mloop BTFSS timr,7 ; check update flag GOTO mloop ; no usb code in idle loop BCF timr,7 ; clear flag INCF timr,F ; count timer up MOVLW D'10' ; reset if 10 XORWF timr,W BTFSC STATUS,Z CLRF timr MOVF timr,W ; output ADDLW '0' ; convert to ASCII CALL usbtx GOTO mloop END