0,0 → 1,140 |
;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 |