alec
- 24th January 2010, 12:29
Hello all
I have what should be a simple program to control a car heater motor - two pushbuttons to increment or decrement a counter and the counter becomes the duty cycle for a PWM output. For some reason, whenever I depress one of the buttons the program freezes - the PWM output continues but it stops cycling. When I hit the reset button on my EasyPic 5 board, the PWM ceases and gos to five volts until I cycle power on and off. I thought that it was getting stuck in one of the increment or decrement loops so I added a pilot for that - it never comes on. I'm using version 2.5, and compiling through MicroCode Studio. Any thoughts or comments would be appreciated - it's driving me batty...
'************************************************* ***************
'* Name : auto_heater_controller.pbp *
'* Author : Alec Noble *
'* Notice : Copyright (c) 2010 Alec Noble *
'* : All Rights Reserved *
'* Date : 1/18/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'************************************************* ***************
@ device pic16F628a
@ device INTRC_OSC_NOCLKOUT
CMCON =7 'port a digital i/o
VRCON =0 'a/d voltage refernce disabled
TRISB = %00000000 'port b all outputs
TRISA = %11000000 'a.7, a.6 inputs, all else output
'********************** assing I/O ****************************
up var porta.6 'up or increment button input
down var porta.7 'down or drcrement button input
heat var portb.3 'heater PWM output
LED var word '10 bits - 1 for each led segment
'********************** create variables **********************
duty var byte 'variable for the dutycycle
counter var byte 'variable to increment/decrement
led_chk var byte
pwr var bit 'on/off bit
preset con 183 'minimum pwm duty value for low
stp con 18 'duty cycle steps
'*********************** initialize variables *****************
pwr = 1
duty = 0
counter = 0
LED = 0
porta.3 = 0
porta.4 = 0
'*********************** program begins here ******************
pause 1000
main:
'********** button_chk ***********
if up = 0 then increment
if down = 0 then decrement
'********** duty_set **************
duty = preset + counter
if duty >=255 then duty = 255
if pwr = 0 then duty = 0
hpwm 1, duty, 20000
'********** display ***************
led = 0
' pause 1000
lookdown2 duty, [93, 111, 129, 147, 165, 183, 201, 219, 237, 255], led_chk
lookup led_chk, [%0000000001, %0000000011, %0000000111, %0000001111, %0000011111, _
%0000111111, %0001111111, %0011111111, %0111111111, %1111111111], led
if led.0 = 1 then portb.0 = 1
if led.1 = 1 then portb.1 = 1
if led.2 = 1 then portb.2 = 1
if led.3 = 1 then portb.4 = 1
if led.4 = 1 then portb.5 = 1
if led.5 = 1 then portb.6 = 1
if led.6 = 1 then portb.7 = 1
if led.7 = 1 then porta.0 = 1
if led.8 = 1 then porta.1 = 1
if led.9 = 1 then porta.2 = 1
pause 100
toggle porta.3 'heartbeat
goto main
end
increment:
high porta.4
' pause 20 'debounce
' if up = 1 then main
pause 500
if up = 1 then 'check for button release
counter = counter + stp 'if so, increment
low porta.4
goto main
endif
pause 2500 'check if button still pushed
if up = 0 then
pwr = 1 'if turn heater on
counter = counter + stp
low porta.4
goto main
endif
decrement:
pause 20 'debounce
if down = 1 then main
pause 500
if down = 1 then 'check for button release
counter = counter - stp 'if so, decrement
goto main
endif
pause 2500
if down = 0 then 'check if button still pushed
pwr = 0 'if so, turn heated off
endif
goto main
I have what should be a simple program to control a car heater motor - two pushbuttons to increment or decrement a counter and the counter becomes the duty cycle for a PWM output. For some reason, whenever I depress one of the buttons the program freezes - the PWM output continues but it stops cycling. When I hit the reset button on my EasyPic 5 board, the PWM ceases and gos to five volts until I cycle power on and off. I thought that it was getting stuck in one of the increment or decrement loops so I added a pilot for that - it never comes on. I'm using version 2.5, and compiling through MicroCode Studio. Any thoughts or comments would be appreciated - it's driving me batty...
'************************************************* ***************
'* Name : auto_heater_controller.pbp *
'* Author : Alec Noble *
'* Notice : Copyright (c) 2010 Alec Noble *
'* : All Rights Reserved *
'* Date : 1/18/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'************************************************* ***************
@ device pic16F628a
@ device INTRC_OSC_NOCLKOUT
CMCON =7 'port a digital i/o
VRCON =0 'a/d voltage refernce disabled
TRISB = %00000000 'port b all outputs
TRISA = %11000000 'a.7, a.6 inputs, all else output
'********************** assing I/O ****************************
up var porta.6 'up or increment button input
down var porta.7 'down or drcrement button input
heat var portb.3 'heater PWM output
LED var word '10 bits - 1 for each led segment
'********************** create variables **********************
duty var byte 'variable for the dutycycle
counter var byte 'variable to increment/decrement
led_chk var byte
pwr var bit 'on/off bit
preset con 183 'minimum pwm duty value for low
stp con 18 'duty cycle steps
'*********************** initialize variables *****************
pwr = 1
duty = 0
counter = 0
LED = 0
porta.3 = 0
porta.4 = 0
'*********************** program begins here ******************
pause 1000
main:
'********** button_chk ***********
if up = 0 then increment
if down = 0 then decrement
'********** duty_set **************
duty = preset + counter
if duty >=255 then duty = 255
if pwr = 0 then duty = 0
hpwm 1, duty, 20000
'********** display ***************
led = 0
' pause 1000
lookdown2 duty, [93, 111, 129, 147, 165, 183, 201, 219, 237, 255], led_chk
lookup led_chk, [%0000000001, %0000000011, %0000000111, %0000001111, %0000011111, _
%0000111111, %0001111111, %0011111111, %0111111111, %1111111111], led
if led.0 = 1 then portb.0 = 1
if led.1 = 1 then portb.1 = 1
if led.2 = 1 then portb.2 = 1
if led.3 = 1 then portb.4 = 1
if led.4 = 1 then portb.5 = 1
if led.5 = 1 then portb.6 = 1
if led.6 = 1 then portb.7 = 1
if led.7 = 1 then porta.0 = 1
if led.8 = 1 then porta.1 = 1
if led.9 = 1 then porta.2 = 1
pause 100
toggle porta.3 'heartbeat
goto main
end
increment:
high porta.4
' pause 20 'debounce
' if up = 1 then main
pause 500
if up = 1 then 'check for button release
counter = counter + stp 'if so, increment
low porta.4
goto main
endif
pause 2500 'check if button still pushed
if up = 0 then
pwr = 1 'if turn heater on
counter = counter + stp
low porta.4
goto main
endif
decrement:
pause 20 'debounce
if down = 1 then main
pause 500
if down = 1 then 'check for button release
counter = counter - stp 'if so, decrement
goto main
endif
pause 2500
if down = 0 then 'check if button still pushed
pwr = 0 'if so, turn heated off
endif
goto main