Code:
'PIC 16F917
'------------------------------------------------------------------------------------------
'Clock setup
Define OSC 20
'Interrupt setups
INTCON = %11000000 'Enable: Global interrupts, Peripheral interrupts
PIE1 = %01110000 'Enable: ADC interrupt, Rx interrupt, Tx interrupt
'Pin setups
ANSEL = %10000000 'Analog input on E.2/AN7, all others digital
TRISA = %11000000 'PortA: 0-5 = output, 6-7 = input
TRISB = %11111111 'PortB: 0-7 = input (defaults)
TRISC = %11011111 'PortC: 0-5&7 = input, 6 = output
TRISD = %11111111 'PortD: 0-7 = input (defaults)
TRISE = %00000100 'PortE: 0&1 = output, 2 = input, 3-7 = N/A
'Vref setups
VRCON = %10001111 'Enable Vref, set high range, set value (3.59 Vdc)
'Usart setups
SPBRG = %00011001 'Set 9600 baud w/20MHz clock
TXSTA = %00100110 'Enable transmit, set BRGH high
RCSTA = %10010000 'Enable Usart, enable receiver
'ADC setups
ADCON0 = %10011101 'Right justify (8 bit result in ADRESL), Select ch.7, enable ADC
ADCON1 = %00100000 'Set ADC clock to 625kHz
'------------------------------------------------------------------------------------------
'LCD setup (16 x 2 lines)
Define LCD_BITS 4 '4 data interface lines
Define LCD_DREG PORTA 'LCD data port
Define LCD_DBIT 0 'LCD data bits 0-4
Define LCD_RSREG PORTA 'LCD register select port
Define LCD_RSBIT 4 'LCD register select bit
Define LCD_EREG PORTA 'LCD enable port
Define LCD_EBIT 5 'LCD enable bit
'------------------------------------------------------------------------------------------
Ser_Cmd_Numb var byte
Ser_Cmd_Val var byte
THC_Enable_In var PORTC.0
TTV_Val var byte
HYS_Val var byte
Torch_V_Now var byte
Torch_Up var PORTE.0
Torch_Dn var PORTE.1
TTV_Val = 120
HYS_Val = 0
pause 1000 'Pause for 1 second for LCD warmup
LCDout $fe, 1, "---LCD WARMUP---"
Lcdout $fe, $40, "----FINISHED----"
pause 5000 'Pause for 5 seconds for user viewing
Start:
IF THC_Enable_In = 0 then
PIE1.6 = 0 'Turn off ADC interrupt
PIE1.5 = 1 'Turn on Rx interrupt
LCDout $fe, 1, "READY TO RECEIVE"
Lcdout $fe, $40, "COMMAND:C###V###"
If PIR1.5 = 1 Then Goto New_SerIn
PAUSE 500
GOTO START
ELSE
PIE1.6 = 1 'Turn on ADC interrupt
PIE1.5 = 0 'Turn off Rx interrupt
ADCON0.1 = 1 'Start ADC conversion
if PIR1.6 = 1 THEN GOTO New_ADC
LCDout $fe, 1, "TARGET VDC : ", dec TTV_Val
Lcdout $fe, $40, "PLASMA VDC : ", dec Torch_V_Now
select case Torch_V_Now
case Torch_V_Now > TTV_Val + hys_val
high torch_dn
low torch_up
case Torch_V_Now < TTV_Val - hys_val
high torch_up
low torch_dn
case else
low torch_up
low torch_dn
end select
endif
GOTO Start
New_ADC:
Torch_V_Now = ADRESL
PIR1.6 = 0
Return
New_SerIn:
'******Command structure is: C###V###
PIE1 = %00000000 'Disable interrupts
hserin 100, start, [wait ("C"),dec3 Ser_Cmd_numb]
hserin 100, start, [wait ("V"),dec3 Ser_Cmd_val]
LCDout $fe, 1, "COMMAND RECEIVED"
Lcdout $fe, $40, "-- C", dec Ser_Cmd_numb," V", dec Ser_Cmd_val, " --"
pause 3000 'Pause for 3 seconds for user viewing
GOTO Chk_Cmd
PIE1 = %01110000 'Enable interrupts
Return
Chk_Cmd:
select case Ser_Cmd_numb '001 to 256
case 1 'Torch Target Voltage
TTV_val = Ser_Cmd_Val
case 2 'Hysteresis Value
HYS_Val = Ser_Cmd_Val
Case else
LCDout $fe, 1, " COMMAND NOT IN "
Lcdout $fe, $40, " DEFINED SCOPE! "
END SELECT
RETURN
Cut and shuffle as you will
Bookmarks