kolibrios/contrib/toolchain/avra/examples/throttle_pulse.asm

141 lines
5.8 KiB
NASM
Raw Normal View History

;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