c and asm to flowcode5

For C and ASSEMBLY users to post questions and code snippets for programming in C and ASSEMBLY. And for any other C or ASM course related questions.

Moderators: Benj, Mods

Post Reply
bnelson
Posts: 9
Joined: Wed Aug 01, 2012 12:04 am
Has thanked: 1 time
Contact:

c and asm to flowcode5

Post by bnelson »

I do not understand c or asm language. I am looking for someone to help me implement some c and asm into flowcode v5.
I would like for some one to be able to take snips of code from the samples I have and show me how they would look in the flowcode.
Basically I would like to take the c and asm and convert it to flowcode.

The code that I have is copywrited, so I do not want to publicly post it. I can send it privately.

Thanks in advance.

medelec35
Matrix Staff
Posts: 9520
Joined: Sat May 05, 2007 2:27 pm
Location: Northamptonshire, UK
Has thanked: 2585 times
Been thanked: 3815 times
Contact:

Re: c and asm to flowcode5

Post by medelec35 »

Hi bnelson,
Since code is copywrited, you could just post one of each command your interested in converting and not the whole code.

That way your not breaking any copywrite laws.

Martin
Martin

bnelson
Posts: 9
Joined: Wed Aug 01, 2012 12:04 am
Has thanked: 1 time
Contact:

Re: c and asm to flowcode5

Post by bnelson »

Here is the code that I would like to put into flowcode5 any help is appreciated:


---
#define PIC16F72
#define PSC_MOTOR_CONTROL
;#define THREE_PHASE_MOTOR_CONTROL
;----------------------------------------------------------------
;----------------------------------------------------------------
INCLUDE <MC_16F72.INC>
;----------------------------------------------------------------
;Configuration bits definition
;Oscillator : HS
;Watchdog timer : off
;Power up timer : on
;Brown out detect : on
;Code protect :off
; __CONFIG 0x2007, 0x5A
;----------------------------------------------------------------


;Macro
MULT MACRO BIT ;MACRO FOR UNSIGNEDMULTIPLICATION
btfsc NO_1_LSB,BIT
addwf RESULT_MSB,F
RRF RESULT_MSB,F
RRF RESULT_LSB,F
ENDM ;END OF MACRO FOR MULTIPLICATION

;----------------------------------------------------------------
STARTUP CODE 0X00 ;RESET VECTOR ADDRESS
goto START

CODE 0X04 ;INTERRUPT VECTOR LOCATION
goto ISR_INT ;goto INTERRUPT SERVICE ROUTINE

;****************************************************************
PROG CODE
START
;****************************************************************
;INITIALIZATION OF THE PORTS AND TIMERS
bsf STATUS,RP0
movlw 0X03
movwf TRISB ;RB0-1 AND CONFIGURED AS INPUT
movlw 0X00
movwf TRISC ;RC0-RC7 CONFIGURED AS OUTPUT
bcf STATUS,RP0

movlw b'00101010' ;Turn off PWM1,3,5 PWMs(active low) at the beginning of the cycle
movwf PWM_PORT ;& turn on PWM0,2,4
clrf PWM_PR_CH1_Buff
clrf PWM_PR_CH2_Buff
clrf PWM_PR_CH3_Buff
clrf PWM1_DS_Buff
clrf PWM2_DS_Buff
clrf PWM3_DS_Buff
clrf PWM4_DS_Buff

clrf FLAGS ;CLEAR ALL FLAGS
clrf FLAGS2 ;CLEAR ALL FLAGS

call STOP_MOTOR ;STOP MOTOR

call COPY_TABLE_TO_RAM ;COPY SINE TABLE FROM PROGRAM MEMORY TO RAM FOR FASTER ACCESS
;******************************************************************
;INITIALIZE ADC REGISTERS
;******************************************************************
bcf STATUS,RP0
movlw 0X81
movwf ADCON0 ;CONFIGURE FOR 32TOSC AND CHANNEL FOR CONVERSION - RA0 (FREQUNENCY)
bsf STATUS,RP0
movlw 0x02 ;CONFIGURE RA0-RA4 AS ANALOG INPUT
movwf ADCON1
movlw 0X07 ;RA0-RA3 INPUT and RA4-RA7 OUTPUT
movwf TRISA
bcf STATUS,RP0

;******************************************************************
;TIMER1 INITIALIZATION WITH PRESCALER - USED FOR SETTING THE PWM TIMING
;******************************************************************

movlw b'00100001' ;LOAD THE T1CON WITH CONTROL WORD
movwf T1CON ;FOR TMR1 ON AND PRESCALAR IS 1:4, INTERNAL CLOCK

;******************************************************************
;TIMER0 INITIALIZATION WITH PRESCALER - USED FOR ACCELERATION,DECELERATION AND ADC TRIGGER FOR FREQ. CONV.
;******************************************************************
bsf STATUS,RP0
movlw b'10000110' ;prescale 1:128
movwf OPTION_REG
bcf STATUS,RP0

clrf INTCON ;DISABLE ALL INTERRUPTS AND FLAGS ASSOCIATED WITH
clrf PIR1 ;DISABLE ALL INTERRUPT FLAGS
bsf STATUS,RP0
clrf PIE1 ;DISABLE ALL INTERRUPTS

movlw 0X03 ;SET #POR AND #BOR FLAGS
movwf PCON

bcf STATUS,RP0
;---------
WAIT_HERE
btfss KEY_PORT,FWD_REV_KEY
goto WAIT_HERE
;***********************************************************************
call BIG_DELAY

;Very important, turning on this bit will turn on DC bus to the IRAMS
bsf PORT_RELAY,RELAY_BIT ; PORTB,7


call BIG_DELAY
;***********************************************************************
call RUN_MOTOR_AGAIN
movlw 0x30
movwf NEW_FREQ
call UPDATE_PWM_DUTYCYCLES ;YES, UPDATE THE PWM DUTY CYCLE WITH NEW VALUE
call PRIORATIZE_PWMS
call UPDATE_TABLE_OFFSET ;UPDATE 3 OFFSETS
call CALCULATE_NEW_SPEED

bcf STATUS,RP0
bsf INTCON,INTE ;ENABLE RB PORT CHANGE INTERRUPT FOR RB4
bsf INTCON,PEIE ;PERIPHERAL INTERRUPTS ENABLE
bsf INTCON,GIE ;GLOBAL INTERRUPT ENABLE

;******************************************************************
;MAIN LOOP, THE PROGRAM WILL BE LOOPING
;******************************************************************
MAIN_LOOP
btfss FLAGS,MOTOR_FREQ_COUNTER
goto BYPASS
bcf FLAGS,MOTOR_FREQ_COUNTER ;CLEAR TMR1 OV FLAG
call UPDATE_PWM_DUTYCYCLES ;YES, UPDATE THE PWM DUTY CYCLE WITH NEW VALUE
call PRIORATIZE_PWMS
call UPDATE_TABLE_OFFSET ;UPDATE 3 OFFSETS
call CALCULATE_NEW_SPEED

btfss ADCON0, GO ;If AD Conversion is complete
bsf ADCON0, GO ; then start a new conversion
BYPASS

btfsc PIR1,ADIF ;ADC CONVERSION COMPLETE INTERRUPT?
call AD_CONV_COMPLETE ;YES - CONVERSON RESULT 'F - MOTOR FREQUENCY'

call KEY_CHECK ;Check keys change
call PROCESS_KEY_PRESSED
goto MAIN_LOOP ;GO BACK TO MAIN LOOP
;******************************************************************
;INTERRUPT SERVICE ROUTINE
;******************************************************************
ISR_INT
movwf W_TEMP ;COPY W TO A TEMPORARY REGISTER
swapf STATUS,W ;SWAP STATUS NIBBLES AND PLACE INTO W REGISTER
movwf STATUS_TEMP ;SAVE STATUS TO A TEMPORARY REGISTER IN BANK0

bcf STATUS,RP0
btfsc PIR1,TMR1IF ;TIMER1 OVERFLOW INTERRUPT?
goto TIMER1_OVERFLOW ;YES - INTERRUPT FOR UPDATING TMR1 REGISTERS BASED ON POT SETTING
btfsc INTCON,T0IF ;TIMER0 OVERFLOW INTERRUPT?
goto TIMER0_OVERFLOW ;YES - INTERRUPT FOR UPDATING TMR1 REGISTERS BASED ON POT SETTING
btfsc INTCON,INTF ;RB INTERRUPT?
goto CHECK_FAULT ;YES - OVER CURRENT FAULT

POPUP ;RETRIEVE SAVED WREG AND STAUS REGISTER VALUES
swapf STATUS_TEMP,W ;SWAP ORIGINAL STATUS REGISTER VALUE INTO W (RESTORES ORIGINAL BANK)
movwf STATUS ;RESTORE STATUS REGISTER FROM W REGISTER
swapf W_TEMP,F ;SWAP W_TEMP NIBBLES AND RETURN VALUE TO W_TEMP
swapf W_TEMP,W ;SWAP W_TEMP TO W TO RESTORE ORIGINAL W VALUE WITHOUT AFFECTING STATUS
RETFIE ;RETURN FROM INTERRUPT

;******************************************************************
TIMER1_OVERFLOW ;TMR1 OVERFLOW ISR
bcf PIR1,TMR1IF ;CLEAR TMR1IF

;---
btfss FLAGS1,PWM_FIRST
goto TAKE_CARE_PWM_SECOND

btfsc PWM_PR_CH1_Buff,0
bsf PWM_PORT,PWM1_PIN ;PWM1 is active low
btfsc PWM_PR_CH1_Buff,1
bsf PWM_PORT,PWM3_PIN ;PWM3 is active low
btfsc PWM_PR_CH1_Buff,2
bsf PWM_PORT,PWM5_PIN ;PWM5 is active low
btfsc PWM_PR_CH1_Buff,0
bcf PWM_PORT,PWM0_PIN ;PWM0 is active low
btfsc PWM_PR_CH1_Buff,1
bcf PWM_PORT,PWM2_PIN ;PWM2 is active low
btfsc PWM_PR_CH1_Buff,2
bcf PWM_PORT,PWM4_PIN ;PWM4 is active low
bcf FLAGS1,PWM_FIRST
movlw 0xFF
movwf TMR1H
bsf FLAGS1,PWM_SECOND
comf PWM2_DS_Buff,W
movwf TMR1L
btfss STATUS,Z
goto POPUP
;---
TAKE_CARE_PWM_SECOND
btfss FLAGS1,PWM_SECOND
goto TAKE_CARE_PWM_THIRD

btfsc PWM_PR_CH2_Buff,0
bsf PWM_PORT,PWM1_PIN ;PWM1 is active low
btfsc PWM_PR_CH2_Buff,1
bsf PWM_PORT,PWM3_PIN ;PWM3 is active low
btfsc PWM_PR_CH2_Buff,2
bsf PWM_PORT,PWM5_PIN ;PWM5 is active low
btfsc PWM_PR_CH2_Buff,0
bcf PWM_PORT,PWM0_PIN ;PWM0 is active low
btfsc PWM_PR_CH2_Buff,1
bcf PWM_PORT,PWM2_PIN ;PWM2 is active low
btfsc PWM_PR_CH2_Buff,2
bcf PWM_PORT,PWM4_PIN ;PWM4 is active low
bcf FLAGS1,PWM_SECOND
movlw 0xFF
movwf TMR1H
bsf FLAGS1,PWM_THIRD
comf PWM3_DS_Buff,W
movwf TMR1L
btfss STATUS,Z
goto POPUP
;---
TAKE_CARE_PWM_THIRD
btfss FLAGS1,PWM_THIRD
goto TAKE_CARE_FOR_NEXT_CYCLE
btfsc PWM_PR_CH3_Buff,0
bsf PWM_PORT,PWM1_PIN ;PWM1 is active low
btfsc PWM_PR_CH3_Buff,1
bsf PWM_PORT,PWM3_PIN ;PWM3 is active low
btfsc PWM_PR_CH3_Buff,2
bsf PWM_PORT,PWM5_PIN ;PWM5 is active low
btfsc PWM_PR_CH3_Buff,0
bcf PWM_PORT,PWM0_PIN ;PWM0 is active low
btfsc PWM_PR_CH3_Buff,1
bcf PWM_PORT,PWM2_PIN ;PWM2 is active low
btfsc PWM_PR_CH3_Buff,2
bcf PWM_PORT,PWM4_PIN ;PWM4 is active low

bcf FLAGS1,PWM_THIRD
movlw 0xFF
movwf TMR1H
bsf FLAGS1,PWM_NEW_CYCLE
comf PWM4_DS_Buff,W
movwf TMR1L
btfss STATUS,Z
goto POPUP
;---
TAKE_CARE_FOR_NEXT_CYCLE
movlw b'00111111' ;Turn off all PWMs(active low)
movwf PWM_PORT
comf PWM1_DS_Buff,W
movwf TMR1L
movlw 0xFF
movwf TMR1H
bcf FLAGS1,PWM_NEW_CYCLE
bsf FLAGS1,PWM_FIRST
movlw b'00010101' ;Turn on PWM1,3,5 PWMs(active low) at the beginning of the cycle
movwf PWM_PORT
goto POPUP

;******************************************************************
TIMER0_OVERFLOW ;TMR0 overflow ISR
movf MOTOR_FREQUENCY,W ;Load the Lower byte of SpeedCommand to TMR0L
movwf TMR0
bsf FLAGS,MOTOR_FREQ_COUNTER
bcf INTCON,T0IF ;Clear T0IF

movlw HARDWARE_OC_COUNT ;Over current count from the comparator
movwf OC_COUNT

goto POPUP

;******************************************************************
CHECK_FAULT
bcf INTCON,INTF
decfsz OC_COUNT,F
goto POPUP
call STOP_MOTOR ;STOP MOTOR
goto POPUP

;*****************************************************************
AD_CONV_COMPLETE ;ADC INTERRUPT
bcf PIR1,ADIF ;ADIF FLAG IS CLEARED FOR NEXT INTERRUPT
btfsc FLAGS2,FREQ_REF ;IS THE CONVERSION RESULT is FREQUENCY REF?
goto CONV_IS_FREQ
btfsc FLAGS2,MOTOR_CUR ;IS THE CONVERSION RESULT is Motor current?
goto CONV_IS_MOTOR_CURRENT ;YES - READ RESULT AS MOTOR_CURRENT
btfsc FLAGS2,HEATSINK_TEMP ;IS THE CONVERSION RESULT is Motor current?
goto CONV_IS_HS_TEMP ;YES - READ RESULT AS MOTOR_CURRENT
bsf FLAGS2,FREQ_REF
bcf ADCON0,3
bcf ADCON0,4
return

CONV_IS_FREQ
bcf FLAGS2,FREQ_REF
bsf FLAGS2,MOTOR_CUR
bsf ADCON0,3 ;Channle1 is selected for next conversion
bcf ADCON0,4

movf ADRES,W ;READ AD CONVERSION RESULT
movwf NEW_FREQ ;CHECK FOR LOWER AND UPPER ALLOWED LIMIT OF FREQ.
sublw 0X30 ;MINIMUM FREQUENCY SET TO 5HZ (SCALING FACTOR X4)
btfss STATUS,C ;IS POT SETTING FOR FREQ, MORE THAT LOWER SET LIMIT?
goto CHECK_UPPER_LIMIT_FREQUENCY ;YES - NOW CHECK UPPER LIMIT
movlw 0X30 ;NO - SET FREQ. TO LOWER ALLOWED LIMIT - 5HZ (X4)
movwf NEW_FREQ
return

CHECK_UPPER_LIMIT_FREQUENCY
movlw 0XD0
subwf NEW_FREQ,W
btfss STATUS,C ;IS POT SETTING MORE THAN ALLOWED UPPER LIMIT OF FREQ?
return ;NO - RETURN FROM INTERRUPT
movlw 0XD0 ;YES - SET FREQ TO UPPER ALLOWED LIMIT - 60HZ (X4)
movwf NEW_FREQ
return

CONV_IS_MOTOR_CURRENT
bsf FLAGS2,HEATSINK_TEMP
bcf FLAGS2,MOTOR_CUR
bcf ADCON0,3 ;Channle2 is selected for next conversion
bsf ADCON0,4

movf ADRES,W ;READ AD CONVERSION RESULT
sublw MAX_MOTOR_CURRENT ;Max current limit
btfss STATUS,C ;IS current > SET LIMIT?
bsf FLAGS2,OVER_CURRENT ;Yes, Take action
return
CONV_IS_HS_TEMP
bsf FLAGS2,FREQ_REF
bcf FLAGS2,HEATSINK_TEMP
bcf ADCON0,3 ;Channle0 is selected for next conversion
bcf ADCON0,4

movf ADRES,W ;READ AD CONVERSION RESULT
sublw MAX_HEATSINK_TEMP ;Max temp limit
btfsc STATUS,C ;IS temp > SET LIMIT?
return
bsf FLAGS,OVER_TEMPARATURE ;Yes, Take action
; call STOP_MOTOR
return



;*************************************************************************
;THIS ROUTINE WILL UPDATE THE PWM DUTY CYCLE ACCORDING TO THE
;OFFSET TO THE TABLE
;THIS ROUTINE SCALES THE PWM VALUE FROM THE TABLE BASED ON THE FREQUENCY TO KEEP V/F
;CONSTANT AND LOADS THEM IN APPROPRIATE REGISTER DEPENDING ON SETTING
;*************************************************************************
UPDATE_PWM_DUTYCYCLES
movlw LOW SINE_TABLE_RAM
movwf FSR ;BASE ADDRESS OF SINE TABLE IN RAM IS LOADED TO FSR
movf TABLE_OFFSET1,W ;TABLE_OFFSET1 IS COPIED TO WREG
addwf FSR,F ;ADRESS TO BE READ=SINE TABLE BASE ADRESS + TABLE_OFFSET1
BANKISEL SINE_TABLE_RAM
movf INDF,W ;COPY SINE TABLE VALUE, POINTED BY FSR, TO WREG
btfsc STATUS,Z ;CHECK IS VALUE READ ZERO?
goto PWM1_IS_0 ;YES, goto PWM1_IS_0
movwf NO_1_LSB ;NO, SINE TABEL VALUE X SET_FREQ TO SCALE TABLE VALUE BASED ON FREQUENCY SETTING
call MUL_8X8 ;CALL ROUTINE FOR UNSIGNED 8x8 BIT MULTIPLICATION
movf RESULT_MSB,W ;8 MSB OF 16 BIT RESULT IS STORED
movwf TEMP_LOC ;AT TEMP_LOC - THIS REPRESENT PWM DUTY CYCLE VALUE FOR PHASE 1
goto UPDATE_PWM2 ;GO FOR UPDATING PWM DUTY CYCLE FOR 2ND PHASE
PWM1_IS_0
clrf TEMP_LOC ;CLEAR PWM DUTY CYCLE VALUE FOR PHASE 1

UPDATE_PWM2
movlw LOW (SINE_TABLE_RAM)
movwf FSR ;BASE ADDRESS OF SINE TABLE IN RAM IS LOADED TO FSR
movf TABLE_OFFSET2,W ;TABLE_OFFSET2 IS COPIED TO WREG
addwf FSR,F ;ADRESS TO BE READ=SINE TABLE BASE ADRESS + TABLE_OFFSET2
BANKISEL SINE_TABLE_RAM
movf INDF,W ;COPY SINE TABLE VALUE, POINTED BY FSR, TO WREG
btfsc STATUS,Z ;CHECK IS VALUE READ ZERO?
goto PWM2_IS_0 ;YES, goto PWM2_IS_0
movwf NO_1_LSB ;NO, SINE TABEL VALUE X SET_FREQ TO SCALE TABLE VALUE BASED ON FREQUENCY SETTING
call MUL_8X8 ;CALL ROUTINE FOR UNSIGNED 8x8 BIT MULTIPLICATION
movf RESULT_MSB,W ;8 MSB OF 16 BIT RESULT IS STORED
movwf TEMP_LOC_1 ;AT TEMP_LOC_1 - THIS REPRESENT PWM DUTY CYCLE VALUE FOR PHASE 2
goto UPDATE_PWM3 ;GO FOR UPDATING PWM DUTY CYCLE FOR 3RD PHASE

PWM2_IS_0
clrf TEMP_LOC_1 ;CLEAR PWM DUTY CYCLE VALUE FOR PHASE 2

UPDATE_PWM3
movlw LOW SINE_TABLE_RAM
movwf FSR ;BASE ADDRESS OF SINE TABLE IN RAM IS LOADED TO FSR
BANKSEL TABLE_OFFSET3
movf TABLE_OFFSET3,W ;TABLE_OFFSET3 IS COPIED TO WREG
addwf FSR,F ;ADRESS TO BE READ=SINE TABLE BASE ADRESS + TABLE_OFFSET3
BANKISEL SINE_TABLE_RAM
movf INDF,W ;COPY SINE TABLE VALUE, POINTED BY FSR, TO WREG
btfsc STATUS,Z ;CHECK IS VALUE READ ZERO?
goto PWM3_IS_0 ;YES, goto PWM3_IS_0
movwf NO_1_LSB ;NO, SINE TABEL VALUE X SET_FREQ TO SCALE TABLE VALUE BASED ON FREQUENCY SETTING
call MUL_8X8 ;CALL ROUTINE FOR UNSIGNED 8x8 BIT MULTIPLICATION
movf RESULT_MSB,W ;8 MSB OF 16 BIT RESULT IS STORED
movwf TEMP_LOC_2 ;AT TEMP_LOC_2 - THIS REPRESENT PWM DUTY CYCLE VALUE FOR PHASE 3
goto SET_PWM12 ;GO FOR CHECKING DIRECTION OF MOTOR ROTATION REEQUIRED

PWM3_IS_0
clrf TEMP_LOC_2 ;CLEAR PWM DUTY CYCLE VALUE FOR PHASE 3

SET_PWM12
movf TEMP_LOC,W
movwf PWM1_DS_Buff
movf TEMP_LOC_1,W ;CCPR1L AND CCPR2L RESPECTIVELY FOR
movwf PWM2_DS_Buff
movf TEMP_LOC_2,W
movwf PWM3_DS_Buff

RETURN


;*******************************************************************************
;THIS ROUTINE UPDATES THE OFFSET POINTERS TO THE TABLE AFTER EVERY ACCESS
;*******************************************************************************
UPDATE_TABLE_OFFSET
bcf STATUS,RP0
btfss FLAGS,OFFSET1_FLAG ;IF SET INCR. ON TABLE
goto DECREMENT_OFFSET1
movlw (SINE_TABLE_ENTRIES-1) ;CHECK FOR THE LAST VALUE ON THE TABLE
SUBWF TABLE_OFFSET1,W
btfsc STATUS,C
goto CLEAR_OFFSET1_FLAG
INCF TABLE_OFFSET1,F ;INCREMENT OFFSET1
goto UPDATE_OFFSET2
CLEAR_OFFSET1_FLAG
bcf FLAGS,OFFSET1_FLAG
DECREMENT_OFFSET1
DECFSZ TABLE_OFFSET1,F ;DECREMENT OFFSET1
goto UPDATE_OFFSET2
bsf FLAGS,OFFSET1_FLAG

UPDATE_OFFSET2
btfss FLAGS,OFFSET2_FLAG ;IF SET INCR. ON TABLE
goto DECREMENT_OFFSET2
movlw (SINE_TABLE_ENTRIES-1) ;CHECK FOR THE LAST VALUE ON THE TABLE
SUBWF TABLE_OFFSET2,W
btfsc STATUS,C
goto CLEAR_OFFSET2_FLAG
INCF TABLE_OFFSET2,F ;INCREMENT OFFSET2
goto UPDATE_OFFSET3
CLEAR_OFFSET2_FLAG
bcf FLAGS,OFFSET2_FLAG
DECREMENT_OFFSET2
DECFSZ TABLE_OFFSET2,F ;DECREMENT OFFSET2
goto UPDATE_OFFSET3
bsf FLAGS,OFFSET2_FLAG

UPDATE_OFFSET3
btfss FLAGS,OFFSET3_FLAG ;IF SET INCR. ON TABLE
goto DECREMENT_OFFSET3
movlw (SINE_TABLE_ENTRIES-1) ;CHECK FOR THE LAST VALUE ON THE TABLE
SUBWF TABLE_OFFSET3,W
btfsc STATUS,C
goto CLEAR_OFFSET3_FLAG
INCF TABLE_OFFSET3,F ;INCREMENT OFFSET3
RETURN
CLEAR_OFFSET3_FLAG
bcf FLAGS,OFFSET3_FLAG
DECREMENT_OFFSET3
DECFSZ TABLE_OFFSET3,F ;DECREMENT OFFSET3
RETURN
bsf FLAGS,OFFSET3_FLAG
RETURN


;*******************************************************************************

CALCULATE_NEW_SPEED
movf NEW_FREQ,W
movwf MOTOR_FREQUENCY
movlw 0x22
addwf MOTOR_FREQUENCY,F
bcf STATUS,C
rrf MOTOR_FREQUENCY,F
bcf STATUS,C
rrf MOTOR_FREQUENCY,F
movlw 0xB5
addwf MOTOR_FREQUENCY,F
return

;*************************************************************************
;PWMs are arranged from low duty cycle to high duty cycle
;Original duty cycles are input to routine on PWMx_DS
;Output on PWM_PRx and PWM_PR_CHx
PRIORATIZE_PWMS

movlw 0x1
movwf PWM_PR_CH1_Buff
movlw 0x2
movwf PWM_PR_CH2_Buff
movlw 0x4
movwf PWM_PR_CH3_Buff

movf PWM1_DS_Buff,W
subwf PWM2_DS_Buff,W
btfss STATUS,C
goto INTCHG_1_2
goto CHECK_2_3
INTCHG_1_2
;interchange duty cycles in 1 and 2
movf PWM1_DS_Buff,W
movwf TEMP_LOC
movf PWM2_DS_Buff,W
movwf PWM1_DS_Buff
movf TEMP_LOC,W
movwf PWM2_DS_Buff
;interchange the PWM outputs
movf PWM_PR_CH1_Buff,W
movwf TEMP_LOC
movf PWM_PR_CH2_Buff,W
movwf PWM_PR_CH1_Buff
movf TEMP_LOC,W
movwf PWM_PR_CH2_Buff

CHECK_2_3
;interchange duty cycles in 2 and 3
movf PWM2_DS_Buff,W
subwf PWM3_DS_Buff,W
btfss STATUS,C
goto INTCHG_2_3
goto CHECK_1_2_AGN
INTCHG_2_3
movf PWM2_DS_Buff,W
movwf TEMP_LOC
movf PWM3_DS_Buff,W
movwf PWM2_DS_Buff
movf TEMP_LOC,W
movwf PWM3_DS_Buff
;interchange the PWM outputs pins
movf PWM_PR_CH2_Buff,W
movwf TEMP_LOC
movf PWM_PR_CH3_Buff,W
movwf PWM_PR_CH2_Buff
movf TEMP_LOC,W
movwf PWM_PR_CH3_Buff

CHECK_1_2_AGN
;interchange duty cycles in 1 and 2
movf PWM1_DS_Buff,W
subwf PWM2_DS_Buff,W
btfss STATUS,C
goto INTCHG_1_2_AGN
goto CALCULATE_TIMER_RELOAD
INTCHG_1_2_AGN
movf PWM1_DS_Buff,W
movwf TEMP_LOC
movf PWM2_DS_Buff,W
movwf PWM1_DS_Buff
movf TEMP_LOC,W
movwf PWM2_DS_Buff
;interchange the PWM outputs pins
movf PWM_PR_CH1_Buff,W
movwf TEMP_LOC
movf PWM_PR_CH2_Buff,W
movwf PWM_PR_CH1_Buff
movf TEMP_LOC,W
movwf PWM_PR_CH2_Buff

CALCULATE_TIMER_RELOAD
movlw 0x9C ;Corresponding to 8KHz count with Timer1 prescale 1:4
movwf PWM4_DS_Buff
movf PWM3_DS_Buff,W
subwf PWM4_DS_Buff,F
movf PWM2_DS_Buff,W
subwf PWM3_DS_Buff,F
movf PWM1_DS_Buff,W
subwf PWM2_DS_Buff,F

RETURN


;*******************************************************************************
;This routine checks for the keys status. 2 keys are checked, Run/Stop and
;Forward(FWD)/Reverse(REV)
;*******************************************************************************
KEY_CHECK
btfss KEY_PORT,RUN_STOP_KEY ;Is key pressed "RUN/STOP"?
goto CHECK_FWD_REV_KEY
btfsc FLAGS1,DEBOUNCE
return
call KEY_DEBOUNCE
btfss FLAGS1,DEBOUNCE
return
bsf FLAGS1,KEY_RS
return

CHECK_FWD_REV_KEY
btfss KEY_PORT,FWD_REV_KEY ;Is key pressed "RUN/STOP"?
goto SET_KEYS
btfsc FLAGS1,DEBOUNCE
return
call KEY_DEBOUNCE
btfss FLAGS1,DEBOUNCE
return
bsf FLAGS1,KEY_FR
return

SET_KEYS
btfss FLAGS1,DEBOUNCE
return
bcf FLAGS1,DEBOUNCE
bsf FLAGS1,KEY_PRESSED
btfss FLAGS1,KEY_RS
goto ITS_FWD_REV
btfss FLAGS1,RUN_STOP ;Toggle RUN_STOP bit
goto $+3
bcf FLAGS1,RUN_STOP
return
bsf FLAGS1,RUN_STOP
return

ITS_FWD_REV
btfss FLAGS1,FWD_REV ;Toggle RUN_STOP bit
goto $+3
bcf FLAGS1,FWD_REV
return
bsf FLAGS1,FWD_REV
return

;*******************************************************************************
KEY_DEBOUNCE
decfsz DEBOUNCE_COUNTER,F ;Key debounce time checked
return
bsf FLAGS1,DEBOUNCE
movlw DEBOUNCE_COUNT
movwf DEBOUNCE_COUNTER
return
;*******************************************************************************
;This routine takes action for the keys pressed
;If SW1(RUN/STOP) Key is pressed, the state toggles between RUN and STOP
;If SW2(FWD/REV) Key is pressed, the state toggles between FORWARD and REVERSE
PROCESS_KEY_PRESSED
btfss FLAGS1,KEY_PRESSED ;Is there a key press waiting?
return
btfss FLAGS1,KEY_RS ;Is it RUN/STOP?
goto CHECK_FWD_REV
btfss FLAGS1,RUN_STOP ;Yes,Was the previous state a Stop?
goto STOP_MOTOR_NOW
call RUN_MOTOR_AGAIN ;Yes, Then RUN the motor
bcf FLAGS1,KEY_PRESSED ;Clear the Flag
bcf FLAGS1,KEY_RS
; bsf LED_PORT,RUN_STOP_LED ;Turn on LED to indicate motor running
return

STOP_MOTOR_NOW
call STOP_MOTOR ;Was the previous state a RUN?, Then stop the motor
bcf FLAGS1,KEY_PRESSED
bcf FLAGS1,KEY_RS
; bcf LED_PORT,RUN_STOP_LED ;Clear Flags and indicate motor stopped on LED
return


CHECK_FWD_REV
btfss FLAGS1,KEY_FR ;Is the Key pressed = FWD/REV?
return

; btg LED_PORT,FWD_REV_LED ;Yes,
; bcf LED_PORT,RUN_STOP_LED
call STOP_MOTOR ;Stop the motor before reversing

call BIG_DELAY ;Delay between reversing the direction
call BIG_DELAY

call RUN_MOTOR_AGAIN ;Run the motor in Reverse direction
bcf FLAGS1,KEY_PRESSED ;Clear Flags
bcf FLAGS1,KEY_FR
; bsf LED_PORT,RUN_STOP_LED
return


;*******************************************************************************
;THIS ROUTINE STOPS THE MOTOR BY DRIVING THE PWMS TO 0% DUTY CYCLE. ALSO DISABLE
;SELECT INTERRUPT TO MAINTAIN STOP CONDITION OF MOTOR
;*******************************************************************************
STOP_MOTOR
movlw b'00111111' ;Turn off PWM1,3,5 PWMs(active low) at the beginning of the cycle
movwf PWM_PORT ;& turn on PWM0,2,4
bsf STATUS,RP0
bcf PIE1,TMR1IE
bcf PIE1,ADIE
bcf STATUS,RP0
bcf INTCON,T0IE
bcf FLAGS,MOTOR_FREQ_COUNTER
clrf TABLE_OFFSET1
clrf TABLE_OFFSET2
clrf TABLE_OFFSET3

; bcf PORT_RELAY,RELAY_BIT
RETURN
;*******************************************************************************
;THIS ROUTINE STARTS MOTOR FROM PREVIOUS STOP WITH MOTOR PARAMETERS INITIALIZED
;*******************************************************************************
RUN_MOTOR_AGAIN
call INIT_MOTOR_PARAMETERS
bsf STATUS,RP0
bsf PIE1,TMR1IE
bcf STATUS,RP0
bsf INTCON,T0IE
RETURN

;*******************************************************************************
;THIS ROUTINE INITIALIZES THE PARAMETERS REQUIRED FOR MOTOR INITIALIZATION.
;*******************************************************************************
INIT_MOTOR_PARAMETERS
#ifdef PSC_MOTOR_CONTROL

movlw 0X012 ;INITIALIZE THE TABLE OFFSET TO 3 REGISTERS
movwf TABLE_OFFSET1 ;TO FORM 0-120-240 DEGREES

movlw 0X00
movwf TABLE_OFFSET2

movlw 0X08
movwf TABLE_OFFSET3

bcf FLAGS,OFFSET1_FLAG ;OFFSET FLAGS INITIALIZATION
bsf FLAGS,OFFSET2_FLAG

btfsc FLAGS1,FWD_REV
goto INIT_MOT_REV
bsf FLAGS,OFFSET3_FLAG ;Offset3 initialized
goto INIT_MOT_FREQ
INIT_MOT_REV
bcf FLAGS,OFFSET3_FLAG
#endif
#ifdef THREE_PHASE_MOTOR_CONTROL
movlw 0x09 ;Initialize the table offset to 3 registers
movwf TABLE_OFFSET1 ;to form 0-120-240 degrees
bsf FLAGS,OFFSET1_FLAG ;Offset flags initialization

btfsc FLAGS1,FWD_REV
goto INIT_MOT_REV

movlw 0x03
movwf TABLE_OFFSET2
bcf FLAGS,OFFSET2_FLAG

movlw 0x0F
movwf TABLE_OFFSET3
bcf FLAGS,OFFSET3_FLAG
goto INIT_MOT_FREQ

INIT_MOT_REV
movlw 0x0F
movwf TABLE_OFFSET2
bcf FLAGS,OFFSET2_FLAG

movlw 0x03
movwf TABLE_OFFSET3
bcf FLAGS,OFFSET3_FLAG

#endif

INIT_MOT_FREQ
movlw 0XB1
movwf TMR0
bsf FLAGS,MOTOR_FREQ_COUNTER
RETURN

;*******************************************************************************
;ROUTINE FOR 8*8 BIT MULTIPLICAION
;*******************************************************************************
MUL_8X8
clrf RESULT_MSB
clrf RESULT_LSB
movf NEW_FREQ,W ;MOVE THE MULTIPLICAND TO W REG.
bcf STATUS,C ;CLEAR THE CARRY BIT IN THE STATUS REG.
MULT 0
MULT 1
MULT 2
MULT 3
MULT 4
MULT 5
MULT 6
MULT 7
RETLW 0

;*******************************************************************************
;UPON INITIALIZATION THE SINE TABLE CONTENTS ARE COPIED TO THE RAM FROM
;PROGRAM MEMORY
;*******************************************************************************
COPY_TABLE_TO_RAM
BANKSEL SINE_TABLE_RAM
BANKISEL SINE_TABLE_RAM
movlw LOW SINE_TABLE_RAM
movwf FSR
movlw 0X13
movwf TEMP_LOC
clrf TEMP_LOC_1
COPY_AGAIN
movlw HIGH SINE_TABLE
movwf PCLATH
movf TEMP_LOC_1,W
call SINE_TABLE
movwf INDF
INCF TEMP_LOC_1,F
INCF FSR,F
DECFSZ TEMP_LOC,F
goto COPY_AGAIN

movlw LOW SINE_TABLE_RAM ;FSR POINTS TO THE STARTING OF THE TABLE
movwf FSR
RETURN

;*******************************************************************************
;GENERAL PURPOSE DELAY ROUTINE - PRESENT DELAY TIME ~38msec
;*******************************************************************************
DELAY
movlw DELAY_COUNT1
movwf TEMP_LOC
DEC_TEMP_LOC
movlw DELAY_COUNT2
movwf TEMP_LOC_1
DEC_TEMP_LOC_1
DECFSZ TEMP_LOC_1,F
goto DEC_TEMP_LOC_1
DECFSZ TEMP_LOC,F
goto DEC_TEMP_LOC
RETURN

B_DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
return

BIG_DELAY
call B_DELAY
call B_DELAY
call B_DELAY
call B_DELAY
return

;*******************************************************************************
;EQUATION USED FOR CALCULATION OF SINE TABLE ENTRIES = (SIN(ANGLE)+1)*FF/2
;Sine table has value corresponding to every 10 electrical degrees
;*******************************************************************************
TABLE CODE 0X0005
SINE_TABLE
addwf PCL,F

RETLW .2
RETLW .4
RETLW .8
RETLW .16
RETLW .24
RETLW .34
RETLW .50
RETLW .64
RETLW .80
RETLW .96
RETLW .112
RETLW .128
RETLW .144
RETLW .156
RETLW .168
RETLW .178
RETLW .184
RETLW .188
RETLW .190





END

Post Reply