W EQU H'0000' F EQU H'0001' ;----- Register Files------------------------------------------------------ INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' PORTA EQU H'0005' PORTB EQU H'0006' INTCON EQU H'000B' OPTION_REG EQU H'0081' TRISA EQU H'0085' TRISB EQU H'0086' CMCON EQU H'001F' ;----- STATUS Bits -------------------------------------------------------- IRP EQU H'0007' RP1 EQU H'0006' RP0 EQU H'0005' NOT_TO EQU H'0004' NOT_PD EQU H'0003' Z EQU H'0002' DC EQU H'0001' C EQU H'0000' ;========================================================================== ; ; RAM Definition ; ;========================================================================== __MAXRAM H'01FF' __BADRAM H'07'-H'09', H'0D', H'13'-H'14', H'1B'-H'1E' __BADRAM H'87'-H'89', H'8D', H'8F'-H'91', H'93'-H'97', H'9E' __BADRAM H'105', H'107'-H'109', H'10C'-H'11F', H'150'-H'16F' __BADRAM H'185', H'187'-H'189', H'18C'-H'1EF' ;========================================================================== ; ; Configuration Bits ; ;========================================================================== _BODEN_ON EQU H'3FFF' _BODEN_OFF EQU H'3FBF' _CP_ALL EQU H'03FF' _CP_75 EQU H'17FF' _CP_50 EQU H'2BFF' _CP_OFF EQU H'3FFF' _DATA_CP_ON EQU H'3EFF' _DATA_CP_OFF EQU H'3FFF' _PWRTE_OFF EQU H'3FFF' _PWRTE_ON EQU H'3FF7' _WDT_ON EQU H'3FFF' _WDT_OFF EQU H'3FFB' _LVP_ON EQU H'3FFF' _LVP_OFF EQU H'3F7F' _MCLRE_ON EQU H'3FFF' _MCLRE_OFF EQU H'3FDF' _ER_OSC_CLKOUT EQU H'3FFF' _ER_OSC_NOCLKOUT EQU H'3FFE' _INTRC_OSC_CLKOUT EQU H'3FFD' _INTRC_OSC_NOCLKOUT EQU H'3FFC' _EXTCLK_OSC EQU H'3FEF' _LP_OSC EQU H'3FEC' _XT_OSC EQU H'3FED' _HS_OSC EQU H'3FEE' __CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ORG 0 ;Reset vector address GOTO RESET ;goto RESET routine when boot. ; ********************************** ; ** RESET : main boot routine ** ; ********************************** RESET MOVLW B'00000111' ;Disable Comparator module's MOVWF CMCON BSF STATUS,RP0 ;Switch to register bank 1 ;Disable pull-ups ;INT on rising edge ;TMR0 to CLKOUT ;TMR0 Incr low2high trans. ;Prescaler assign to Timer0 ;Prescaler rate is 1:256 MOVLW B'11010111' ;Set PIC options (See datasheet). MOVWF OPTION_REG ;Write the OPTION register. CLRF INTCON ;Disable interrupts MOVLW B'11000000' MOVWF TRISB ;RB7 & RB6 are inputs. ;RB5...RB0 are outputs. MOVLW B'11111111' ;all RA ports are inputs MOVWF TRISA BCF STATUS,RP0 ;Switch Back to reg. Bank 0 CLRF PORTB GOTO PCM_LOOP ; *********************************************** ; * PCM Routine which does BLDC commutation * ; * Without the delays rotates in 48uS (21kHz) * ; *********************************************** PCM_LOOP MOVLW B'00011010' ; 1 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00010010' ; 2 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00010110' ; 3 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00000110' ; 4 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00100110' ; 5 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00100100' ; 6 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00100101' ; 7 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00100001' ; 8 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00101001' ; 9 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00001001' ; 10 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00011001' ; 11 MOVWF PORTB CALL DELAY_ROUTINE NOP ; Give symmetry NOP ; Give symmetry MOVLW B'00011000' ; 12 MOVWF PORTB CALL DELAY_ROUTINE GOTO PCM_LOOP ; ********************************************* ; * Example of a delay routine * ; ********************************************* SW1 EQU H'00' ;SW1 is triggering RA0 SW2 EQU H'01' ;SW2 is triggering RA1 SW3 EQU H'02' ;SW3 is triggering RA2 SW4 EQU H'03' ;SW4 is triggering RA3 TIMER1 EQU H'20' ;Used in delay routine TIMER2 EQU H'21' ; " " " DELAY_ROUTINE MOVLW H'7F' MOVWF TIMER1 DEL_LOOP1 MOVLW H'FF' MOVWF TIMER2 ;DEL_LOOP2 BTFSC PORTA,SW1 ; BTFSC PORTA,SW2 ; BTFSC PORTA,SW3 ; BTFSC PORTA,SW4 ; DECFSZ TIMER2,F DEL_LOOP2 DECFSZ TIMER2,F GOTO DEL_LOOP2 DECFSZ TIMER1,F GOTO DEL_LOOP1 RETLW 0 DELAY_ROUTINE_ MOVLW H'FF' MOVWF TIMER1 DEL_LOOP3 DECFSZ TIMER1,F GOTO DEL_LOOP3 RETLW 0 END