| ??? 11/22/06 09:18 Read: times |
#128405 - This Code Works ! Responding to: ???'s previous message |
Dear Russell,
No harm done like mentioned earlier. It's water under the bridge, and life must go on. I've attached a new set of codes which has produced the ultimate solution desired, since you was the kindest in giving a helping hand. With this code, I've managed to get a linear ramp-up frequency which is fed into a panasonic servo amplifier. My only problem now is that the ramp is so steep & changing the number of pulses does not reduce the steep. This code is posted as soon result materialized. Now I'm looking at whats causing the steep ramp-up from 1Khz ~ 10Khz ( same even if frequency is higher )& which cannot be reduced despite attempt to increase the number of pulses per Khz.
MAIN:
ACALL PCA_INIT
SJMP $ ; Only for testing
PCA_INIT: ;Initializa PCA Timer
MOV CMOD,#02H ; Input to PCA Timer = 1/4 * Fosc
MOV CH,#00
MOV CL,#00
MOV CCAPM0,#04DH ; HSO with Interrupt Enabled
MOV CCAP0L,#.LOW(1000) ; Not sure what this does !!!!!
MOV CCAP0H,#.HIGH(1000) ; Not sure what this does !!!!!
CLR P1.3
SETB EC ; Enable PCA Interrupt
SETB EA
SETB CR
MOV PULSE_COUNTER,#0 ; ACTUAL PULSES PRODUCED
MOV PULSES,#250 ; PULSES DESIRED
MOV A,PULSES
MOV B,#02H ; PCA TIMESOUT EVERY 500us ( HOWEVER two 500uS timeouts makes 1 pulse )
MUL AB
MOV .LOW(PULSES),A
MOV .HIGH(PULSES),B ; Now Pulse Counter Holds correct pulses needed
MOV TABLE_POINTER,#0
RET
PCA_INTERRUPT:
CLR CCF0
CONT_INIT:
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
PUSH B
MOV A,TABLE_POINTER ; POINT TO DESIRED FREQ VALUE
CLR C
RL A
mov dptr,#FREQ_TABLE
movc a,@a+dptr ;get low byte
mov b,a ;save low into B
mov a,TABLE_POINTER
clr c
rl a
inc a ;+1
movc a,@a+dptr ;get high byte
CLR EA
ADD A,CCAP0L ; ----
MOV CCAP0L,A ; |
MOV A,B ; > generated the actual pulse
ADDC A,CCAP0H ; |
MOV CCAP0H,A ; ----
ISR_1: DJNZ PULSES,DONE
INC TABLE_POINTER ; collect next freq
MOV A,TABLE_POINTER
CJNE A,#10,FREQ_RAMP
SJMP KILL_PCA ; 10 FREQ REACHED - END OF FREQ TABLE, KILL PCA
FREQ_RAMP:
MOV PULSES,#250 ; PULSES DESIRED
MOV A,PULSES
MOV B,#02H ; PCA TIMESOUT EVERY 500us ( HOWEVER two 500uS timeouts makes 1 pulse )
MUL AB
MOV .LOW(PULSES),A
MOV .HIGH(PULSES),B ; Now Pulse Counter Holds correct pulses needed
MOV A,PULSES
CJNE A,#0,DONE
KILL_PCA:
MOV CCAPM0,#00H
DONE:
INC PULSE_COUNTER
BIT_HIGH:
SETB EA
POP B
POP DPL
POP DPH
POP PSW
POP ACC
RETI
FREQ_TABLE:
.DCW 3125,1563,1042,781, 625,521 ,446,391,343,313 ; 1 ~ 10Khz
; .DCW 284,260,240,223,208,195,184,174,164,156 ; 11~ 20Khz
; .DCW 142,136,130,125,120,116,112,108,104,101 ; 21~ 30KHZ
.aseg __data,data
.org 20H
TABLE_POINTER .DSB
PULSES .DSB
GENERATOR .DSB
PULSE_COUNTER .DSB
.end
|



