Here is my version of your assembler. I have verified on the scope that I can strobe the enable line with lcdenable = 1, delay, then lcdenable = 0.
this program still will not start with a slow dV/dT but works a treat with a MCLR reset or a 'snap on' power supply.
I have tried
DEFINE LCD_RWREG PORTD 'LCD read/write port
DEFINE LCD_RWBIT 6 'LCD read/write bit
as well as explicitly raising/lowering the read write line.
No joy from that quarter.
define osc 20
define loader_used 1
Define LCD_DREG PORTD
Define LCD_DBIT 0
Define LCD_RSREG PORTD
Define LCD_RSBIT 5
Define LCD_EREG PORTD
Define LCD_EBIT 4
DEFINE LCD_LINES 2
DEFINE LCD_BITS 4
DEFINE LCD_RWREG PORTD 'LCD read/write port
DEFINE LCD_RWBIT 6 'LCD read/write bit
'DEFINE LCD_COMMANDUS 5000 'Command delay time in us
'DEFINE LCD_DATAUS 250 'Data delay time in us
define char_pacing 200
DEFINE SHIFT_PAUSEUS 500
@ Device pic16F877A, HS_OSC, BOD_ON, LVP_OFF, PWRT_ON, WDT_ON, PROTECT_OFF
'
'****************** hardware definition **********************
'PortA
Function var porta.0 'pin 2 analog from 12 position switch IN
RunStop var porta.1 ' SWp6 to 877p3 Front panel toggle IN
Enter var porta.2 ' SWp4 to 877p4 Selects current value IN
Up var porta.3 ' SWp2 to 877p5 Advances selection IN
AutoMan var porta.4 ' SWp7 to 877p6 Local/Remote control IN
Down var porta.5 ' SWp3 to 877p7 Reduces selection IN
TRISA = %00011111
CMCON = %00000111 ' comparators disabled
ADCON0 = %11000000 ' int RC clock, ADC disabled
ADCON1 = %11001110 ' port 0 analog, all others digital
'PortB
GMData var portb.0 'bidirecional data to/from Master Controller
GMStrobe1 var portb.1 'signals MC that GM needs attention
GMStrobe2 var portb.2 'signals GM that MC has data
GMSpare var portb.3 'a PCB trace between PeeWee50 pin 9 and 877p36
LED2 var portb.4 'front panel LED2
N2 var portb.5 'Nitrogen solenoid
SClk var portb.6 'Intersema SClk OUT to MS5534 & 5535
DIn var portb.7 'Intersems Data In OUT from 877a to MS5534 & 5535
TRISB = %00001111
PortB = %00000000
'PortC
CO2 var portc.0 'CO2 solenoid
O2 var portc.1 'O2 solenoid
MClk var portc.2 'MClk to Intersema PWM2 32678 Hz OUT to MS5534/5
Vent var portc.3 'Vent/dump solenoid
Delvry var portc.4 'delivery solenoid controls final delivery
SpareSol var portc.5 'spare solenoid OUT
TxD var portc.6 'Boot loader and RS232 OUT
RxD var portc.7 'Boot & RS232 IN
TRISC = %10000000
PortC = %00000000
'PortD
DB4 var portd.0 'Data bit 4 to LCD
DB5 var portd.1 'Data bit 5 to LCD
DB6 var portd.2 'Data bit 6 to LCD
DB7 var portd.3 'Data bit 7 to LCD
LCDEnable var portd.4 'LCD ENABLE line OUT to LCD
RegSel var portd.5 'LCD Register Select OUT to LCD
ReadWrite var portd.6 'LCD Read/Write line OUT to LCD
LED1 var portd.7 'Front Panel LED1
TRISD = %00000000
'PortD = %00110000
PortD = %00000000
'PortE
ClrEntry var porte.0 'SWp5 to 877p8 Clears entry on front panel??? IN
Dout1 var porte.1 'Input from 14 bar Intersema
Dout2 var porte.2 'Input from 1 bar Intersema
TRISE = %11111111
PortE = %00000000
'****************** Variable assignments *******************
'OPTION_REG = %10001111 ' no pullups, prescaler to WDT /128
A var byte ' General purpose Variable
B var byte ' General purpose Variable
C var byte ' General purpose Variable
I var byte
J var byte
K var byte
FuncSel var byte ' Switch position after decoding ADC value
ADCval var word
LoopCtr var byte
U var word
V var word
W var word
X var word
Y var word
Z var word
RunFlag var bit
C1 var word ' Pressure sensitivity
C2 var word ' Pressure Offset
C3 var word ' Temp Coef of pressure sensitivity
C4 var word ' Temp Coef of Pressure Offset
C5 var word ' Reference temperature
C6 var word ' Temp coef of Temp reading
D1 var word ' raw word from 5535
D2 var word ' raw word from 5535
W1 var word ' coefficient from 5535
W2 var word ' coefficient from 5535
W3 var word ' coefficient from 5535
W4 var word ' coefficient from 5535
dT var word ' intermediate calc value
UT1 var word ' Calibration temperature
Temp var word ' Sensor temperature
Tempnegflag var bit ' set if temperature is below zero C
Press var word ' Pressure
Offset var word '
Sens var word '
'portd = 0
'pause 1
'Loop2:
' portd.4 = 1
' pause 1
' portd.4 = 0
' pause 1
'goto loop2
Goto endofsubroutines
'Subroutines
Strobe: ' drives the enable line to latch data into LCD
lcdenable = 1
pauseus 20
lcdenable = 0
pauseus 50
return
EndOfSubRoutines:
InitialiseLCD:
TRISD = %00000000
portd = 0 ' set all lines low
pause 250 ' power up delay
portd = 3 ' 0011 written to DB7 ~ DB4 Do it 4 times
gosub strobe
pause 5 ' > 4.1 mSec
portd = 3
gosub strobe
pauseus 150 '> 100 uSec
portd = 3
gosub strobe
pauseus 150
portd = 3
gosub strobe
pauseus 150
portd = 2 'function set
gosub strobe
portd = 8 'set 2 lines 5x7 font
gosub strobe
portd = 0 'display OFF
gosub strobe
portd = 8 'display off
gosub strobe
portd = 0 'display clear
gosub strobe
portd = 1 'display clear
gosub strobe
portd = 0 'Entry mode set
gosub strobe
portd = 6 'increment position
gosub strobe
portd = 0 'display ON
gosub strobe
portd = 15
gosub strobe 'display on, cursor on, blink on
Loop:
lcdout $FE, $01
LCDOUT "Hello "
pause 500
lcdout $FE, $01, $FE, $C0
lcdout "World"
pause 500
goto loop
Bookmarks