forked from KolibriOS/kolibrios
141 lines
5.8 KiB
NASM
141 lines
5.8 KiB
NASM
;throttle_pulse.asm
|
|
|
|
.NOLIST
|
|
; ***************************************************************************************
|
|
; * PWM MODEL RAILROAD THROTTLE *
|
|
; * *
|
|
; * WRITTEN BY: PHILIP DEVRIES *
|
|
; * *
|
|
; * Copyright (C) 2003 Philip DeVries *
|
|
; * *
|
|
; * This program is free software; you can redistribute it and/or modify *
|
|
; * it under the terms of the GNU General Public License as published by *
|
|
; * the Free Software Foundation; either version 2 of the License, or *
|
|
; * (at your option) any later version. *
|
|
; * *
|
|
; * This program is distributed in the hope that it will be useful, *
|
|
; * but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
; * GNU General Public License for more details. *
|
|
; * *
|
|
; * You should have received a copy of the GNU General Public License *
|
|
; * along with this program; if not, write to the Free Software *
|
|
; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
|
|
; * *
|
|
; ***************************************************************************************
|
|
.LIST
|
|
|
|
.ifdef PULSE_ENABLED
|
|
;********************************************************************************
|
|
;* PULSE_GENERATE *
|
|
;* Top level routine *
|
|
;* *
|
|
;* Inputs: throttle_set *
|
|
;* Returns: none *
|
|
;* Changed: B_Temp,ramp_target,ramp_target1 *
|
|
;* Calls: SET_PWM_DUTY *
|
|
;* COUNT_PWM_CYCLES *
|
|
;* Goto: none *
|
|
;********************************************************************************
|
|
|
|
HILOCAL1 ramp_target
|
|
HILOCAL2 ramp_target1
|
|
|
|
;*****************************************************************
|
|
;* If throttle_set is less than 128 (0x80)
|
|
;* Ramp up from wherever the pwm is up to (255 - throttle)
|
|
;* If throttle_set is greater than 127 0x7F)
|
|
;* Ramp up to throttle_set
|
|
;*****************************************************************
|
|
|
|
mov ramp_target1,throttle_set
|
|
sbrs ramp_target1,7
|
|
|
|
.ifdef PULSE_AMPLITUDE_SCALE
|
|
com ramp_target1 ; Ramp up to this value
|
|
.else
|
|
ldi ramp_target1,0x80
|
|
.endif
|
|
|
|
mov ramp_target,ramp_target1
|
|
|
|
subi ramp_target,pulse_slope_up ; Ramp up value - pulse_slope
|
|
|
|
WAIT_FOR_PWM_1: ; Wait for PWM to reset to 0
|
|
in B_Temp,TIFR
|
|
sbrs B_Temp,OCF1A
|
|
rjmp WAIT_FOR_PWM_1
|
|
|
|
ldi B_Temp,0b01000000
|
|
out TIFR,B_Temp
|
|
|
|
inc Cycle_count
|
|
|
|
in B_Temp,OCR1A ; Find PWM value
|
|
cp B_Temp,ramp_target ; Make sure won't go past max.
|
|
brsh DONE_SLOPING_UP
|
|
|
|
subi B_Temp, 0x100-pulse_slope_up ; OCR1A + pulse_slope_up
|
|
|
|
rcall SET_PWM_DUTY
|
|
rjmp WAIT_FOR_PWM_1
|
|
|
|
DONE_SLOPING_UP:
|
|
mov B_Temp,ramp_target1
|
|
rcall SET_PWM_DUTY
|
|
|
|
;*****************************************************************
|
|
;* See if we need to slope down to the throttle setting
|
|
;*****************************************************************
|
|
in B_Temp,OCR1A ; Find PWM value
|
|
cp B_Temp,throttle_set
|
|
breq PULSE_GENERATE_RETURN ; Do nothing if already at final voltage
|
|
|
|
;*****************************************************************
|
|
;* Hang about at the top of the pulse for a while...
|
|
;*****************************************************************
|
|
|
|
.ifdef PULSE_WIDTH_SCALE
|
|
mov ramp_target1,throttle_set
|
|
.else
|
|
clr ramp_target1
|
|
.endif
|
|
|
|
add ramp_target1,Cycle_count
|
|
|
|
subi ramp_target1,0x100-pulse_width_min ; ramp_target1 + pulse_width_min
|
|
|
|
mov B_Temp1,ramp_target1
|
|
|
|
rcall COUNT_PWM_CYCLES
|
|
|
|
;*****************************************************************
|
|
;* Slope down
|
|
;*****************************************************************
|
|
|
|
mov ramp_target,throttle_set ; Ramp DOWN to this value
|
|
|
|
subi ramp_target,0x100-pulse_slope_down ;ramp_target + pulse_slope_down
|
|
|
|
WAIT_FOR_PWM_2: ; Wait for PWM to reset to 0
|
|
in B_Temp,TIFR
|
|
sbrs B_Temp,OCF1A
|
|
rjmp WAIT_FOR_PWM_2
|
|
|
|
ldi B_Temp,0b01000000
|
|
out TIFR,B_Temp
|
|
|
|
inc Cycle_count
|
|
|
|
in B_Temp,OCR1A ; Find PWM value
|
|
cp ramp_target,B_Temp ; Make sure won't go past min
|
|
brsh PULSE_GENERATE_RETURN
|
|
|
|
subi B_Temp,pulse_slope_down
|
|
|
|
rcall SET_PWM_DUTY
|
|
rjmp WAIT_FOR_PWM_2
|
|
|
|
PULSE_GENERATE_RETURN:
|
|
.endif ;PULSE_ENABLED
|