Hi, I found this problem with using the PCF8574 i2c interface, where the "locate 1.0" command doesn't work properly.
Let me explain using the 1602 display together with the pcf8574 it doesn't write anything on the second line and likewise for the other lines.
I solved it like this:
locate 0,0 ' 1 row
PRINT "DISPLAY ON 1 row"
locate 0,40 ' 2 row
PRINT "DISPLAY ON 2 row"
locate 0,16 ' 3 row
PRINT "DISPLAY ON 3 row"
locate 0,80 ' 4 row
PRINT "DISPLAY ON 4 row"
using both a 4 line and a two line display and trying also with more PCF8574 and also on pic16f88.
I hope I was helpful, sorry for my english.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I state that I'm using 16x2 and 16x4 displays with PCF8574 interface.
Sorry but in the previous post I had put MY solution to get around the problem, in fact if one loads the prog as I wrote it it displays on the second line, while if one uses "locate1,0" it doesn't display on the second line.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
That is an old version of the toolchain. Upgrade when you can.
But, I think we need to see you program.
Make a program that the absolute minimum line of code to reproduce the error, So, #chip;lcd set up; and the locate and print. Post the small program and the associated ASM file.
I have a PCF8574 setup here on the bench so I can look when I get this example program.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
locate 0,0
PRINT "DISPLAY ON 1 row"
locate 0,40 '
PRINT "DISPLAY ON 2 row"
locate 0,16 '
PRINT "DISPLAY ON 3 row"
locate 0,80 '
PRINT "DISPLAY ON 4 row"
*/'******************************************************;ChipSettings#chip 16F88,4#include <pcf8574.h>'#option explicit;-----DefineHardwaresettings' THIS CONFIG OF THE SERIAL PORT TO A PC TERMINAL via a TTL Converter' USART settings#define USART_BAUD_RATE 19200 '!!!!!error speed 9600DirPORTA.3OutDirPORTA.4In#define USART_DELAY 10 ms#define USART_BLOCKING#define led PortA.2 'DirledOut' out;-----DefineHardwaresettings' Define I2C settings - CHANGE PORTS#define I2C_MODE Master#define I2C_DATA PORTB.0 'pin#define I2C_CLOCK PORTB.1 'pin#define I2C_DISABLE_INTERRUPTS ON#define I2C_BIT_DELAY 0 us '0#define I2C_CLOCK_DELAY 1 us '1#define I2C_END_DELAY 0 us '0#define LCD_IO 10'#define LCD_I2C_Address_ 0x4E#define LCD_I2C_Address_1 0x4E'#define LCD_I2C_Address_1 0x27'''Set up LCD 'You may need to use SLOW or MEDIUM if your LCD is a slower device. #define LCD_SPEED SLOW 'FAST #define LCD_Backlight_On_State 1 #define LCD_Backlight_Off_State 0; ----- Quick Command Reference: '''SetLCD_10to10fortheYwRobotLCD1602IICV1ortheSainsmartLCD_PICI2Cadapter'''Set LCD_10 to 12 for the Ywmjkdz I2C adapter with pot bent over top of chip' variabiliDim yy As byte 'Dim xx As byte ''i =0; ----- Main body of program commences here.Inittimer1 OSC, PS_64Starttimer 1Settimer 1, 50 ;Preload TimerOn Interrupt Timer1Overflow Call Flash_LEDSub Flash_LEDSettimer 1, 50 'Preload timer led=!led ' 'pulseout led, 100 msEnd Sub HSerPrint "Locate 0,40" HSerSend 13 HSerSend 10 'lampeggio LCDBacklight OFF WAIT 500 ms LCDBacklight ON WAIT 500 ms/* LOCATE 1,0 CLS PRINT "Address ": LCDHex( LCD_I2C_Address_Current, 2) wait 3 s*//**/ Do Forever wait 1 s cls locate 0,0 PRINT "DISPLAY ON 1 row" locate 0,40 '2 row PRINT "DISPLAY ON 2 row" locate 0,16 '3 row PRINT "DISPLAY ON 3 row" locate 0,80 '4 row PRINT "DISPLAY ON 4 row" wait 3 s cls locate 0,0 PRINT " x 1 " print 1 locate 0,40 ' PRINT " 3 2 " print 2 locate 0,16 ' PRINT " 2 3 " print 3 locate 0,80 ' PRINT " 6 ON 4 " print 4 wait 5 s loopend
thank you for the reply
Last edit: Anobium 2023-02-09
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
this is the listing in asm
thank you for the reply
;Program compiled by Great Cow BASIC (1.00.00 2023-01-01 (Windows 64 bit) : Build 1213) for Microchip MPASM/MPLAB-X Assembler using FreeBASIC 1.07.1/2023-01-02 CRC64
;Need help?
; See the GCBASIC forums at http://sourceforge.net/projects/gcbasic/forums,
; Check the documentation and Help at http://gcbasic.sourceforge.net/help/,
;or, email us:
; w_cholmondeley at users dot sourceforge dot net
; evanvennn at users dot sourceforge dot net
;**************
;Set up the assembler options (Chip type, clock source, other bits and pieces)
LIST p=16F88, r=DEC
STARTTIMER
decf TMRNUMBER,W
btfsc STATUS, Z
bsf T1CON,TMR1ON
movlw 2
subwf TMRNUMBER,W
btfsc STATUS, Z
bsf T2CON,TMR2ON
return
;**************
SYSCOMPEQUAL
clrf SYSBYTETEMPX
movf SYSBYTETEMPA, W
subwf SYSBYTETEMPB, W
btfsc STATUS, Z
comf SYSBYTETEMPX,F
return
;**************
SYSCOMPLESSTHAN
clrf SYSBYTETEMPX
bsf STATUS, C
movf SYSBYTETEMPB, W
subwf SYSBYTETEMPA, W
btfss STATUS, C
comf SYSBYTETEMPX,F
return
;**************
SYSDIVSUB
movf SYSBYTETEMPB, F
btfsc STATUS, Z
return
clrf SYSBYTETEMPX
movlw 8
movwf SYSDIVLOOP
SYSDIV8START
bcf STATUS, C
rlf SYSBYTETEMPA, F
rlf SYSBYTETEMPX, F
movf SYSBYTETEMPB, W
subwf SYSBYTETEMPX, F
bsf SYSBYTETEMPA, 0
btfsc STATUS, C
goto DIV8NOTNEG
bcf SYSBYTETEMPA, 0
movf SYSBYTETEMPB, W
addwf SYSBYTETEMPX, F
DIV8NOTNEG
decfsz SYSDIVLOOP, F
goto SYSDIV8START
return
;**************
SYSMULTSUB
clrf SYSBYTETEMPX
MUL8LOOP
movf SYSBYTETEMPA, W
btfsc SYSBYTETEMPB, 0
addwf SYSBYTETEMPX, F
bcf STATUS, C
rrf SYSBYTETEMPB, F
bcf STATUS, C
rlf SYSBYTETEMPA, F
movf SYSBYTETEMPB, F
btfss STATUS, Z
goto MUL8LOOP
return
Hi, I modified the program (removing the serial and interrupt) but the result changed slightly.
Let me explain: the same listing on avr8515 does not display correctly and is missing on the second line, both with 2-line and 4-line display.
On pic16f88 it writes correctly on the display, but not on the 4-line display.
thanks for now
;ProgramcompiledbyGreatCowBASIC(1.00.002023-01-01(Windows64bit):Build1213)forMicrochipAVRAssemblerusingFreeBASIC1.07.1/2023-01-02CRC64;Needhelp?;SeetheGCBASICforumsathttp://sourceforge.net/projects/gcbasic/forums,;CheckthedocumentationandHelpathttp://gcbasic.sourceforge.net/help/,;or,emailus:;w_cholmondeleyatusersdotsourceforgedotnet;evanvennnatusersdotsourceforgedotnet;********************************************************************************;ChipModel:MEGA8515;Assemblerheaderfile.INCLUDE"m8515def.inc";SREGbitnames(forAVRAssemblercompatibility,GCBASICusesdifferentnames)#define C 0#define H 5#define I 7#define N 2#define S 4#define T 6#define V 3#define Z 1;********************************************************************************;Setasidememorylocationsforvariables.EQUI2CACK=113;0x71.EQUI2CACKPOLLSTATE=114;0x72.EQUI2CBYTE=115;0x73.EQUI2CMATCH=116;0x74.EQUI2CSTATE=117;0x75.EQUI2C_LCD_BYTE=118;0x76.EQULCDBYTE=119;0x77.EQULCDCOLUMN=120;0x78.EQULCDLINE=121;0x79.EQULCD_BACKLIGHT=122;0x7A.EQULCD_I2C_ADDRESS_CURRENT=123;0x7B.EQULCD_STATE=124;0x7C.EQUPRINTLEN=125;0x7D.EQUSTRINGPOINTER=126;0x7E.EQUSYSLCDTEMP=127;0x7F.EQUSYSPRINTDATAHANDLER=128;0x80.EQUSYSPRINTDATAHANDLER_H=129;0x81.EQUSYSPRINTTEMP=130;0x82.EQUSYSREPEATTEMP1=131;0x83.EQUSYSREPEATTEMP2=132;0x84.EQUSYSSTRINGPARAM1=96;0x60;********************************************************************************;Registervariables.DEFDELAYTEMP=r25.DEFDELAYTEMP2=r26.DEFSYSBITTEST=r5.DEFSYSBYTETEMPA=r22.DEFSYSBYTETEMPB=r28.DEFSYSBYTETEMPX=r0.DEFSYSCALCTEMPA=r22.DEFSYSCALCTEMPB=r28.DEFSYSCALCTEMPX=r0.DEFSYSREADA=r30.DEFSYSREADA_H=r31.DEFSYSSTRINGA=r26.DEFSYSSTRINGA_H=r27.DEFSYSSTRINGB=r28.DEFSYSSTRINGB_H=r29.DEFSYSSTRINGLENGTH=r25.DEFSYSVALUECOPY=r21.DEFSYSWAITTEMP10US=r27.DEFSYSWAITTEMPMS=r29.DEFSYSWAITTEMPMS_H=r30.DEFSYSWAITTEMPS=r31.DEFSYSWAITTEMPUS=r27.DEFSYSWAITTEMPUS_H=r28.DEFSYSTEMP1=r1.DEFSYSTEMP2=r16.DEFSYSTEMP3=r2;********************************************************************************;Vectors;Interruptvectors.ORG0rjmpBASPROGRAMSTART;Reset.ORG1reti;INT0.ORG2reti;INT1.ORG3reti;TIMER1_CAPT.ORG4reti;TIMER1_COMPA.ORG5reti;TIMER1_COMPB.ORG6reti;TIMER1_OVF.ORG7reti;TIMER0_OVF.ORG8reti;SPI_STC.ORG9reti;USART_RX.ORG10reti;USART_UDRE.ORG11reti;USART_TX.ORG12reti;ANA_COMP.ORG13reti;INT2.ORG14reti;TIMER0_COMP.ORG15reti;EE_RDY.ORG16reti;SPM_RDY;********************************************************************************;Startofprogrammemorypage0.ORG18BASPROGRAMSTART:;InitialisestackldiSysValueCopy,high(RAMEND)outSPH,SysValueCopyldiSysValueCopy,low(RAMEND)outSPL,SysValueCopy;CallinitialisationroutinesrcallINITSYSrcallINITI2CrcallINITLCD;StartofthemainprogramldiSysWaitTempS,1rcallDelay_SSysDoLoop_S1:rcalllbCLSldiSysValueCopy,0stsLCDLINE,SysValueCopyldiSysValueCopy,0stsLCDCOLUMN,SysValueCopyrcallLOCATEldiSysStringB,low(SYSSTRINGPARAM1)ldiSysStringB_H,high(SYSSTRINGPARAM1)ldiSysReadA,low(StringTable1<<1)ldiSysReadA_H,high(StringTable1<<1)rcallSYSREADSTRINGldiSysValueCopy,low(SYSSTRINGPARAM1)stsSysPRINTDATAHandler,SysValueCopyldiSysValueCopy,high(SYSSTRINGPARAM1)stsSysPRINTDATAHandler_H,SysValueCopyrcallPRINT108ldiSysValueCopy,1stsLCDLINE,SysValueCopyldiSysValueCopy,0stsLCDCOLUMN,SysValueCopyrcallLOCATEldiSysStringB,low(SYSSTRINGPARAM1)ldiSysStringB_H,high(SYSSTRINGPARAM1)ldiSysReadA,low(StringTable2<<1)ldiSysReadA_H,high(StringTable2<<1)rcallSYSREADSTRINGldiSysValueCopy,low(SYSSTRINGPARAM1)stsSysPRINTDATAHandler,SysValueCopyldiSysValueCopy,high(SYSSTRINGPARAM1)stsSysPRINTDATAHandler_H,SysValueCopyrcallPRINT108ldiSysValueCopy,2stsLCDLINE,SysValueCopyldiSysValueCopy,0stsLCDCOLUMN,SysValueCopyrcallLOCATEldiSysStringB,low(SYSSTRINGPARAM1)ldiSysStringB_H,high(SYSSTRINGPARAM1)ldiSysReadA,low(StringTable3<<1)ldiSysReadA_H,high(StringTable3<<1)rcallSYSREADSTRINGldiSysValueCopy,low(SYSSTRINGPARAM1)stsSysPRINTDATAHandler,SysValueCopyldiSysValueCopy,high(SYSSTRINGPARAM1)stsSysPRINTDATAHandler_H,SysValueCopyrcallPRINT108ldiSysValueCopy,3stsLCDLINE,SysValueCopyldiSysValueCopy,0stsLCDCOLUMN,SysValueCopyrcallLOCATEldiSysStringB,low(SYSSTRINGPARAM1)ldiSysStringB_H,high(SYSSTRINGPARAM1)ldiSysReadA,low(StringTable4<<1)ldiSysReadA_H,high(StringTable4<<1)rcallSYSREADSTRINGldiSysValueCopy,low(SYSSTRINGPARAM1)stsSysPRINTDATAHandler,SysValueCopyldiSysValueCopy,high(SYSSTRINGPARAM1)stsSysPRINTDATAHandler_H,SysValueCopyrcallPRINT108ldiSysWaitTempS,3rcallDelay_SrjmpSysDoLoop_S1SysDoLoop_E1:rjmpBASPROGRAMENDBASPROGRAMEND:sleeprjmpBASPROGRAMEND;********************************************************************************lbCLS:ldsSysValueCopy,SYSLCDTEMPcbrSysValueCopy,1<<1stsSYSLCDTEMP,SysValueCopyldiSysValueCopy,1stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiSysWaitTempMS,4ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,128stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiDELAYTEMP,66DelayUS1:decDELAYTEMPbrneDelayUS1rjmpPC+1ret;********************************************************************************Delay_10US:D10US_START:ldiDELAYTEMP,12DelayUS0:decDELAYTEMPbrneDelayUS0nopdecSysWaitTemp10USbrneD10US_STARTret;********************************************************************************Delay_MS:incSysWaitTempMS_HDMS_START:ldiDELAYTEMP2,43DMS_OUTER:ldiDELAYTEMP,30DMS_INNER:decDELAYTEMPbrneDMS_INNERdecDELAYTEMP2brneDMS_OUTERdecSysWaitTempMSbrneDMS_STARTdecSysWaitTempMS_HbrneDMS_STARTret;********************************************************************************Delay_S:DS_START:ldiSysWaitTempMS,232ldiSysWaitTempMS_H,3rcallDelay_MSdecSysWaitTempSbrneDS_STARTret;********************************************************************************I2CRESTART:rjmpI2CSTART;********************************************************************************I2CSEND:sbiDDRC,3cbiPORTC,3ldiSysValueCopy,8stsSysRepeatTemp2,SysValueCopySysRepeatLoop2:ldsSysBitTest,I2CBYTEsbrsSysBitTest,7rjmpELSE8_1cbiDDRC,4rjmpENDIF8ELSE8_1:sbiDDRC,4cbiPORTC,4ENDIF8:ldsSysValueCopy,I2CBYTErolSysValueCopystsI2CBYTE,SysValueCopycbiDDRC,3SysWaitLoop1:sbisPINC,3rjmpSysWaitLoop1rjmpPC+1rjmpPC+1sbiDDRC,3cbiPORTC,3ldsSysTemp1,SysRepeatTemp2decSysTemp1stsSysRepeatTemp2,SysTemp1brneSysRepeatLoop2SysRepeatLoopEnd2:cbiDDRC,4cbiDDRC,3SysWaitLoop2:sbisPINC,3rjmpSysWaitLoop2sbisPINC,4rjmpELSE9_1ldiSysValueCopy,0stsI2CACK,SysValueCopyldiSysValueCopy,0stsI2CACKPOLLSTATE,SysValueCopyrjmpENDIF9ELSE9_1:ldiSysValueCopy,255stsI2CACK,SysValueCopyldiSysValueCopy,255stsI2CACKPOLLSTATE,SysValueCopyENDIF9:sbiDDRC,3cbiPORTC,3sbiDDRC,4cbiPORTC,4ret;********************************************************************************I2CSTART:cbiDDRC,4cbiDDRC,3sbiDDRC,4cbiPORTC,4rjmpPC+1rjmpPC+1sbiDDRC,3cbiPORTC,3ret;********************************************************************************I2CSTOP:sbiDDRC,3cbiPORTC,3sbiDDRC,4cbiPORTC,4cbiDDRC,3rjmpPC+1rjmpPC+1cbiDDRC,4ret;********************************************************************************INITI2C:cbiDDRC,4cbiDDRC,3ldiSysValueCopy,0stsI2CMATCH,SysValueCopyret;********************************************************************************INITI2CLCD:ldiSysWaitTempMS,15ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,0stsI2C_LCD_BYTE,SysValueCopyldiSysValueCopy,3stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiSysWaitTempMS,5ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,3stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiSysWaitTempMS,1ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,3stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiSysWaitTempMS,1ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,3stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiSysWaitTempMS,1ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,2stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiSysWaitTempMS,1ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,40stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiSysWaitTempMS,1ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,12stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiSysWaitTempMS,1ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,1stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiSysWaitTempMS,15ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,6stsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldiSysWaitTempMS,1ldiSysWaitTempMS_H,0rcallDelay_MSrjmplbCLS;********************************************************************************INITLCD:;asmshowdebug`LCD_IOselectedis`LCD_IO;asmshowdebug`LCD_SpeedisFAST`;asmshowdebug`OPTIMALissetto`OPTIMAL;asmshowdebug`LCD_Speedissetto`LCD_SpeedrcallINITI2CldiSysValueCopy,1stsLCD_BACKLIGHT,SysValueCopyldiSysWaitTempMS,2ldiSysWaitTempMS_H,0rcallDelay_MSldiSysValueCopy,2stsSysRepeatTemp1,SysValueCopySysRepeatLoop1:ldiSysValueCopy,78stsLCD_I2C_ADDRESS_CURRENT,SysValueCopyrcallINITI2CLCDldsSysTemp1,SysRepeatTemp1decSysTemp1stsSysRepeatTemp1,SysTemp1brneSysRepeatLoop1SysRepeatLoopEnd1:ldiSysValueCopy,12stsLCD_STATE,SysValueCopyret;********************************************************************************INITSYS:ldiSysValueCopy,0outPORTA,SysValueCopyldiSysValueCopy,0outPORTB,SysValueCopyldiSysValueCopy,0outPORTC,SysValueCopyldiSysValueCopy,0outPORTD,SysValueCopyldiSysValueCopy,0outPORTE,SysValueCopyret;********************************************************************************LCDNORMALWRITEBYTE:ldsSysBitTest,SYSLCDTEMPsbrsSysBitTest,1rjmpELSE4_1ldsSysValueCopy,I2C_LCD_BYTEsbrSysValueCopy,1<<0stsI2C_LCD_BYTE,SysValueCopyrjmpENDIF4ELSE4_1:ldsSysValueCopy,I2C_LCD_BYTEcbrSysValueCopy,1<<0stsI2C_LCD_BYTE,SysValueCopyENDIF4:ldsSysValueCopy,I2C_LCD_BYTEcbrSysValueCopy,1<<1stsI2C_LCD_BYTE,SysValueCopycbrSysValueCopy,1<<3ldsSysBitTest,LCD_BACKLIGHTsbrcSysBitTest,0sbrSysValueCopy,1<<3stsI2C_LCD_BYTE,SysValueCopyrcallI2CRESTARTldsSysValueCopy,LCD_I2C_ADDRESS_CURRENTstsI2CBYTE,SysValueCopyrcallI2CSENDldsSysValueCopy,I2C_LCD_BYTEcbrSysValueCopy,1<<7ldsSysBitTest,LCDBYTEsbrcSysBitTest,7sbrSysValueCopy,1<<7stsI2C_LCD_BYTE,SysValueCopycbrSysValueCopy,1<<6ldsSysBitTest,LCDBYTEsbrcSysBitTest,6sbrSysValueCopy,1<<6stsI2C_LCD_BYTE,SysValueCopycbrSysValueCopy,1<<5ldsSysBitTest,LCDBYTEsbrcSysBitTest,5sbrSysValueCopy,1<<5stsI2C_LCD_BYTE,SysValueCopycbrSysValueCopy,1<<4ldsSysBitTest,LCDBYTEsbrcSysBitTest,4sbrSysValueCopy,1<<4stsI2C_LCD_BYTE,SysValueCopysbrSysValueCopy,1<<2stsI2C_LCD_BYTE,SysValueCopystsI2CBYTE,SysValueCopyrcallI2CSENDldsSysValueCopy,I2C_LCD_BYTEcbrSysValueCopy,1<<2stsI2C_LCD_BYTE,SysValueCopystsI2CBYTE,SysValueCopyrcallI2CSENDldsSysValueCopy,I2C_LCD_BYTEcbrSysValueCopy,1<<7ldsSysBitTest,LCDBYTEsbrcSysBitTest,3sbrSysValueCopy,1<<7stsI2C_LCD_BYTE,SysValueCopycbrSysValueCopy,1<<6ldsSysBitTest,LCDBYTEsbrcSysBitTest,2sbrSysValueCopy,1<<6stsI2C_LCD_BYTE,SysValueCopycbrSysValueCopy,1<<5ldsSysBitTest,LCDBYTEsbrcSysBitTest,1sbrSysValueCopy,1<<5stsI2C_LCD_BYTE,SysValueCopycbrSysValueCopy,1<<4ldsSysBitTest,LCDBYTEsbrcSysBitTest,0sbrSysValueCopy,1<<4stsI2C_LCD_BYTE,SysValueCopysbrSysValueCopy,1<<2stsI2C_LCD_BYTE,SysValueCopystsI2CBYTE,SysValueCopyrcallI2CSENDldsSysValueCopy,I2C_LCD_BYTEcbrSysValueCopy,1<<2stsI2C_LCD_BYTE,SysValueCopystsI2CBYTE,SysValueCopyrcallI2CSENDrcallI2CSTOPldiSysValueCopy,12stsLCD_STATE,SysValueCopyldiDELAYTEMP,13DelayUS2:decDELAYTEMPbrneDelayUS2nopldsSysBitTest,SYSLCDTEMPsbrcSysBitTest,1rjmpENDIF5ldsSysCalcTempA,LCDBYTEcpiSysCalcTempA,16brshENDIF6ldiSysCalcTempA,7ldsSysCalcTempB,LCDBYTEcpSysCalcTempA,SysCalcTempBbrshENDIF7ldsSysValueCopy,LCDBYTEstsLCD_STATE,SysValueCopyENDIF7:ENDIF6:ENDIF5:ret;********************************************************************************LOCATE:ldsSysValueCopy,SYSLCDTEMPcbrSysValueCopy,1<<1stsSYSLCDTEMP,SysValueCopyldiSysCalcTempA,1ldsSysCalcTempB,LCDLINEcpSysCalcTempA,SysCalcTempBbrshENDIF1ldsSysTemp1,LCDLINEldiSysTemp2,2subSysTemp1,SysTemp2stsLCDLINE,SysTemp1ldsSysTemp1,LCDCOLUMNldiSysTemp2,20addSysTemp1,SysTemp2stsLCDCOLUMN,SysTemp1ENDIF1:ldsSysBYTETempA,LCDLINEldiSysBYTETempB,64mulSysByteTempA,SysByteTempBmovSysTemp2,SysByteTempXldsSysTemp3,LCDCOLUMNaddSysTemp2,SysTemp3movSysTemp1,SysTemp2ldiSysTemp2,128orSysTemp1,SysTemp2stsLCDBYTE,SysTemp1rcallLCDNORMALWRITEBYTEldiSysWaitTemp10US,5rjmpDelay_10US;********************************************************************************PRINT108:ldsSysStringA,SysPRINTDATAHandlerldsSysStringA_H,SysPRINTDATAHandler_HldSysValueCopy,XstsPRINTLEN,SysValueCopyldsSysCalcTempA,PRINTLENtstSysCalcTempAbrneENDIF2retENDIF2:ldsSysValueCopy,SYSLCDTEMPsbrSysValueCopy,1<<1stsSYSLCDTEMP,SysValueCopyldiSysValueCopy,1stsSYSPRINTTEMP,SysValueCopySysForLoop1:ldsSysTemp1,SysPRINTDATAHandlerldsSysTemp3,SYSPRINTTEMPaddSysTemp1,SysTemp3movSysStringA,SysTemp1ldsSysTemp1,SysPRINTDATAHandler_HldiSysTemp2,0adcSysTemp1,SysTemp2movSysStringA_H,SysTemp1ldSysValueCopy,XstsLCDBYTE,SysValueCopyrcallLCDNORMALWRITEBYTEldsSysTemp3,PRINTLENldsSysTemp2,SYSPRINTTEMPsubSysTemp3,SysTemp2movSysTemp1,SysTemp3movSysBYTETempA,SysTemp1ldiSysBYTETempB,0rcallSYSCOMPEQUALcomSysByteTempXsbrsSysByteTempX,0rjmpENDIF3ldsSysTemp1,SYSPRINTTEMPincSysTemp1stsSYSPRINTTEMP,SysTemp1rjmpSysForLoop1ENDIF3:SysForLoopEnd1:ret;********************************************************************************SYSCOMPEQUAL:clrSYSBYTETEMPXcpseSYSBYTETEMPA,SYSBYTETEMPBretcomSYSBYTETEMPXret;********************************************************************************SYSREADSTRING:lpmmovSYSCALCTEMPA,SYSCALCTEMPXincSYSREADAbrnePC+2incSYSREADA_HstY+,SYSCALCTEMPArjmpSYSSTRINGREADCHECKSYSREADSTRINGPART:lpmmovSYSCALCTEMPA,SYSCALCTEMPXincSYSREADAbrnePC+2incSYSREADA_HaddSYSSTRINGLENGTH,SYSCALCTEMPASYSSTRINGREADCHECK:cpiSYSCALCTEMPA,0brneSYSSTRINGREADretSYSSTRINGREAD:lpmincSYSREADAbrnePC+2incSYSREADA_HstY+,SYSCALCTEMPXdecSYSCALCTEMPAbrneSYSSTRINGREADret;********************************************************************************SysStringTables:StringTable1:.DB16,68,73,83,80,76,65,89,32,79,78,32,49,32,114,111,119,0StringTable2:.DB16,68,73,83,80,76,65,89,32,79,78,32,50,32,114,111,119,0StringTable3:.DB16,68,73,83,80,76,65,89,32,79,78,32,51,32,114,111,119,0StringTable4:.DB16,68,73,83,80,76,65,89,32,79,78,32,52,32,114,111,119,0;********************************************************************************
I state that I'm using 16x2 and 16x4 displays with PCF8574 interface.
Sorry but in the previous post I had put MY solution to get around the problem, in fact if one loads the prog as I wrote it it displays on the second line, while if one uses "locate1,0" it doesn't display on the second line.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
The first device is a 1602 and the 1604.
I have a 1602 here in the same PCF chip and it works.
So, let us try to figure this out.
Please try the attached the program. It is your program but I have tested it here.
Test on a PIC16F88 and LCD 1602 ONLY. I need to figure one thing at a time.
On pic16f88 your program works.
But on mega 8515 it works ????
I've already tried on mega8515 but it doesn't write, see attached photo
characters are missing
However, try the attachment on the 16F88 and connect a serial terminal. Get the values displayed. These values are the locate values being sent to the LCD via I2C. Get the values.
Do the same on the mega. Should be the same values.
I tested with pic16f88 and the result is:
20, 0, 0, 128
20, 1, 0, 192
while I tested with mega8515 the result is
20, 0, 0, 128
20, 1, 0, 128
as in the attached photo, (also tested with another identical display and another pcf8574 interface but I got the same result.
Note the communication speed, in the program it is 19200, while I had to set the terminal at 9600.....but this is another matter.
I will try the #DEFINE LCD_SPEED 255 change and let you know
I have tested the same program on the PIC16F88 with a 1602 and 2004 and both work.
So, we know a baseline works. I am using the same program I posted above. So, using software I2C.
Try this on both chips.
#DEFINE LCD_SPEED 255 This will slow the intra-byte communication which may give the LCD time to process. You try 50000 but these will add seriously long intra-byte delay.
Remember, the setting of the position of cursor is bytes of data being sent to the LCD. So, if the LCD CPU is really slow the LCD could miss some byte data - this would explain the errors you are seeing. So, hence the #DEFINE LCD_SPEED 255
Test and post the results.
Last edit: Anobium 2023-02-09
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hi, I found this problem with using the PCF8574 i2c interface, where the "locate 1.0" command doesn't work properly.
Let me explain using the 1602 display together with the pcf8574 it doesn't write anything on the second line and likewise for the other lines.
I solved it like this:
locate 0,0 ' 1 row
PRINT "DISPLAY ON 1 row"
locate 0,40 ' 2 row
PRINT "DISPLAY ON 2 row"
locate 0,16 ' 3 row
PRINT "DISPLAY ON 3 row"
locate 0,80 ' 4 row
PRINT "DISPLAY ON 4 row"
using both a 4 line and a two line display and trying also with more PCF8574 and also on pic16f88.
I hope I was helpful, sorry for my english.
I state that I'm using 16x2 and 16x4 displays with PCF8574 interface.
Sorry but in the previous post I had put MY solution to get around the problem, in fact if one loads the prog as I wrote it it displays on the second line, while if one uses "locate1,0" it doesn't display on the second line.
I add that I also tested it on MEGA8515
Hello Romtek,
What version of the compiler? If you are using GCStudio -it is shown in the About. Knowing this is very important.
Hi the version I used are two.
0.99.01 2022-01-27 (Windows 64-bit) : Build 1073
and the version
Version: 1.73.1
Release: 22314
Date: 2022-11-10T18:28:26.414Z
Electron: 19.0.17
Chromium: 102.0.5005.167
Node.js: 16.14.2
V8: 10.2.154.15-electron.0
OS: Windows_NT ia32 10.0.19045
Sandboxed: No
thank you for answering me.
I hope this GCB project becomes more popular, I'm passing the word to my friends, Cheers.
That is an old version of the toolchain. Upgrade when you can.
But, I think we need to see you program.
Make a program that the absolute minimum line of code to reproduce the error, So, #chip;lcd set up; and the locate and print. Post the small program and the associated ASM file.
I have a PCF8574 setup here on the bench so I can look when I get this example program.
1.73.1
Release: 22314
Commit: 14f2d26367b7e8f03ff2352516ba27d6302dd7b1
Data: 2022-11-10T18:28:26.414Z
Electron: 19.0.17
Chromium: 102.0.5005.167
Node.js: 16.14.2
V8: 10.2.154.15-electron.0
''********
/*
Locate 0,40
thank you for the reply
Last edit: Anobium 2023-02-09
This problem occurs on both pic16f88 and mega8515
this is the listing in asm
thank you for the reply
;Program compiled by Great Cow BASIC (1.00.00 2023-01-01 (Windows 64 bit) : Build 1213) for Microchip MPASM/MPLAB-X Assembler using FreeBASIC 1.07.1/2023-01-02 CRC64
;Need help?
; See the GCBASIC forums at http://sourceforge.net/projects/gcbasic/forums,
; Check the documentation and Help at http://gcbasic.sourceforge.net/help/,
;or, email us:
; w_cholmondeley at users dot sourceforge dot net
; evanvennn at users dot sourceforge dot net
;**************
;Set up the assembler options (Chip type, clock source, other bits and pieces)
LIST p=16F88, r=DEC
include <p16f88.inc></p16f88.inc>
__CONFIG _CONFIG1, _CP_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _MCLRE_OFF & _WDTE_OFF & _INTRC_IO
__CONFIG _CONFIG2, _FCMEN_ON
;**************
;Set aside memory locations for variables
COMPORT EQU 32 ; 0x20
DELAYTEMP EQU 112 ; 0x70
DELAYTEMP2 EQU 113 ; 0x71
I2CACK EQU 33 ; 0x21
I2CACKPOLLSTATE EQU 34 ; 0x22
I2CBYTE EQU 35 ; 0x23
I2CMATCH EQU 36 ; 0x24
I2CSTATE EQU 37 ; 0x25
I2C_LCD_BYTE EQU 38 ; 0x26
LCDBYTE EQU 39 ; 0x27
LCDCOLUMN EQU 40 ; 0x28
LCDLINE EQU 41 ; 0x29
LCDTEMP EQU 42 ; 0x2A
LCDVALUE EQU 43 ; 0x2B
LCDVALUETEMP EQU 44 ; 0x2C
LCD_BACKLIGHT EQU 45 ; 0x2D
LCD_I2C_ADDRESS_CURRENT EQU 46 ; 0x2E
LCD_STATE EQU 47 ; 0x2F
PRINTLEN EQU 48 ; 0x30
SAVEPCLATH EQU 49 ; 0x31
SAVESYSTEMP1 EQU 50 ; 0x32
SERDATA EQU 51 ; 0x33
STRINGPOINTER EQU 52 ; 0x34
SYSBYTETEMPA EQU 117 ; 0x75
SYSBYTETEMPB EQU 121 ; 0x79
SYSBYTETEMPX EQU 112 ; 0x70
SYSCALCTEMPA EQU 117 ; 0x75
SYSCALCTEMPX EQU 112 ; 0x70
SYSDIVLOOP EQU 116 ; 0x74
SYSLCDTEMP EQU 53 ; 0x35
SYSPRINTDATAHANDLER EQU 54 ; 0x36
SYSPRINTDATAHANDLER_H EQU 55 ; 0x37
SYSPRINTTEMP EQU 56 ; 0x38
SYSREPEATTEMP1 EQU 57 ; 0x39
SYSREPEATTEMP2 EQU 58 ; 0x3A
SYSSTATUS EQU 127 ; 0x7F
SYSSTRINGA EQU 119 ; 0x77
SYSSTRINGA_H EQU 120 ; 0x78
SYSSTRINGB EQU 114 ; 0x72
SYSSTRINGB_H EQU 115 ; 0x73
SYSSTRINGLENGTH EQU 118 ; 0x76
SYSSTRINGPARAM1 EQU 479 ; 0x1DF
SYSTEMP1 EQU 59 ; 0x3B
SYSTEMP2 EQU 60 ; 0x3C
SYSW EQU 126 ; 0x7E
SYSWAITTEMP10US EQU 117 ; 0x75
SYSWAITTEMPMS EQU 114 ; 0x72
SYSWAITTEMPMS_H EQU 115 ; 0x73
SYSWAITTEMPS EQU 116 ; 0x74
SYSWAITTEMPUS EQU 117 ; 0x75
SYSWAITTEMPUS_H EQU 118 ; 0x76
TMRNUMBER EQU 61 ; 0x3D
TMRPRES EQU 62 ; 0x3E
TMRSOURCE EQU 63 ; 0x3F
TMRVALUE EQU 64 ; 0x40
TMRVALUE_H EQU 65 ; 0x41
;**************
;Vectors
ORG 0
pagesel BASPROGRAMSTART
goto BASPROGRAMSTART
ORG 4
INTERRUPT
;**************
;Save Context
movwf SysW
swapf STATUS,W
movwf SysSTATUS
banksel STATUS
;Store system variables
movf SysTemp1,W
movwf SaveSysTemp1
movf PCLATH,W
movwf SavePCLATH
clrf PCLATH
;On Interrupt handlers
banksel PIE1
btfss PIE1,TMR1IE
goto NotTMR1IF
banksel PIR1
btfss PIR1,TMR1IF
goto NotTMR1IF
call FLASH_LED
bcf PIR1,TMR1IF
goto INTERRUPTDONE
NotTMR1IF
;User Interrupt routine
INTERRUPTDONE
;Restore Context
;Restore system variables
banksel SAVESYSTEMP1
movf SaveSysTemp1,W
movwf SysTemp1
movf SavePCLATH,W
movwf PCLATH
swapf SysSTATUS,W
movwf STATUS
swapf SysW,F
swapf SysW,W
retfie
;**************
;Start of program memory page 0
ORG 37
BASPROGRAMSTART
;Call initialisation routines
call INITSYS
call INITUSART
call INITI2C
call INITLCD
;Enable interrupts
bsf INTCON,GIE
bsf INTCON,PEIE
;Start of the main program
banksel TRISA
bcf TRISA,3
bsf TRISA,4
bcf TRISA,2
movlw 1
banksel TMRSOURCE
movwf TMRSOURCE
movlw 3
movwf TMRPRES
call INITTIMER1
movlw 1
movwf TMRNUMBER
call STARTTIMER
movlw 1
movwf TMRNUMBER
movlw 50
movwf TMRVALUE
clrf TMRVALUE_H
call SETTIMER176
banksel PIE1
bsf PIE1,TMR1IE
movlw low SYSSTRINGPARAM1
movwf SysStringB
movlw high SYSSTRINGPARAM1
movwf SysStringB_H
movlw low StringTable1
movwf SysStringA
movlw high StringTable1
movwf SysStringA_H
banksel STATUS
call SYSREADSTRING
movlw low SYSSTRINGPARAM1
movwf SysPRINTDATAHandler
movlw high SYSSTRINGPARAM1
movwf SysPRINTDATAHandler_H
movlw 1
movwf COMPORT
call HSERPRINT306
movlw 13
movwf SERDATA
call HSERSEND295
movlw 10
movwf SERDATA
call HSERSEND295
clrf LCDTEMP
call LCDBACKLIGHT
movlw 244
movwf SysWaitTempMS
movlw 1
movwf SysWaitTempMS_H
call Delay_MS
movlw 1
movwf LCDTEMP
call LCDBACKLIGHT
movlw 244
movwf SysWaitTempMS
movlw 1
movwf SysWaitTempMS_H
call Delay_MS
SysDoLoop_S1
movlw 1
movwf SysWaitTempS
call Delay_S
call CLS
clrf LCDLINE
clrf LCDCOLUMN
call LOCATE
movlw low SYSSTRINGPARAM1
movwf SysStringB
movlw high SYSSTRINGPARAM1
movwf SysStringB_H
movlw low StringTable2
movwf SysStringA
movlw high StringTable2
movwf SysStringA_H
call SYSREADSTRING
movlw low SYSSTRINGPARAM1
movwf SysPRINTDATAHandler
movlw high SYSSTRINGPARAM1
movwf SysPRINTDATAHandler_H
call PRINT109
clrf LCDLINE
movlw 40
movwf LCDCOLUMN
call LOCATE
movlw low SYSSTRINGPARAM1
movwf SysStringB
movlw high SYSSTRINGPARAM1
movwf SysStringB_H
movlw low StringTable3
movwf SysStringA
movlw high StringTable3
movwf SysStringA_H
call SYSREADSTRING
movlw low SYSSTRINGPARAM1
movwf SysPRINTDATAHandler
movlw high SYSSTRINGPARAM1
movwf SysPRINTDATAHandler_H
call PRINT109
clrf LCDLINE
movlw 16
movwf LCDCOLUMN
call LOCATE
movlw low SYSSTRINGPARAM1
movwf SysStringB
movlw high SYSSTRINGPARAM1
movwf SysStringB_H
movlw low StringTable4
movwf SysStringA
movlw high StringTable4
movwf SysStringA_H
call SYSREADSTRING
movlw low SYSSTRINGPARAM1
movwf SysPRINTDATAHandler
movlw high SYSSTRINGPARAM1
movwf SysPRINTDATAHandler_H
call PRINT109
clrf LCDLINE
movlw 80
movwf LCDCOLUMN
call LOCATE
movlw low SYSSTRINGPARAM1
movwf SysStringB
movlw high SYSSTRINGPARAM1
movwf SysStringB_H
movlw low StringTable5
movwf SysStringA
movlw high StringTable5
movwf SysStringA_H
call SYSREADSTRING
movlw low SYSSTRINGPARAM1
movwf SysPRINTDATAHandler
movlw high SYSSTRINGPARAM1
movwf SysPRINTDATAHandler_H
call PRINT109
movlw 3
movwf SysWaitTempS
call Delay_S
call CLS
clrf LCDLINE
clrf LCDCOLUMN
call LOCATE
movlw low SYSSTRINGPARAM1
movwf SysStringB
movlw high SYSSTRINGPARAM1
movwf SysStringB_H
movlw low StringTable6
movwf SysStringA
movlw high StringTable6
movwf SysStringA_H
call SYSREADSTRING
movlw low SYSSTRINGPARAM1
movwf SysPRINTDATAHandler
movlw high SYSSTRINGPARAM1
movwf SysPRINTDATAHandler_H
call PRINT109
movlw 1
movwf LCDVALUE
call PRINT110
clrf LCDLINE
movlw 40
movwf LCDCOLUMN
call LOCATE
movlw low SYSSTRINGPARAM1
movwf SysStringB
movlw high SYSSTRINGPARAM1
movwf SysStringB_H
movlw low StringTable7
movwf SysStringA
movlw high StringTable7
movwf SysStringA_H
call SYSREADSTRING
movlw low SYSSTRINGPARAM1
movwf SysPRINTDATAHandler
movlw high SYSSTRINGPARAM1
movwf SysPRINTDATAHandler_H
call PRINT109
movlw 2
movwf LCDVALUE
call PRINT110
clrf LCDLINE
movlw 16
movwf LCDCOLUMN
call LOCATE
movlw low SYSSTRINGPARAM1
movwf SysStringB
movlw high SYSSTRINGPARAM1
movwf SysStringB_H
movlw low StringTable8
movwf SysStringA
movlw high StringTable8
movwf SysStringA_H
call SYSREADSTRING
movlw low SYSSTRINGPARAM1
movwf SysPRINTDATAHandler
movlw high SYSSTRINGPARAM1
movwf SysPRINTDATAHandler_H
call PRINT109
movlw 3
movwf LCDVALUE
call PRINT110
clrf LCDLINE
movlw 80
movwf LCDCOLUMN
call LOCATE
movlw low SYSSTRINGPARAM1
movwf SysStringB
movlw high SYSSTRINGPARAM1
movwf SysStringB_H
movlw low StringTable9
movwf SysStringA
movlw high StringTable9
movwf SysStringA_H
call SYSREADSTRING
movlw low SYSSTRINGPARAM1
movwf SysPRINTDATAHandler
movlw high SYSSTRINGPARAM1
movwf SysPRINTDATAHandler_H
call PRINT109
movlw 4
movwf LCDVALUE
call PRINT110
movlw 5
movwf SysWaitTempS
call Delay_S
goto SysDoLoop_S1
SysDoLoop_E1
goto BASPROGRAMEND
BASPROGRAMEND
sleep
goto BASPROGRAMEND
;**************
CLS
bcf SYSLCDTEMP,1
movlw 1
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 4
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
movlw 128
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 16
movwf DELAYTEMP
DelayUS1
decfsz DELAYTEMP,F
goto DelayUS1
nop
return
;**************
Delay_10US
D10US_START
movlw 2
movwf DELAYTEMP
DelayUS0
decfsz DELAYTEMP,F
goto DelayUS0
decfsz SysWaitTemp10US, F
goto D10US_START
return
;**************
Delay_MS
incf SysWaitTempMS_H, F
DMS_START
movlw 142
movwf DELAYTEMP2
DMS_OUTER
movlw 1
movwf DELAYTEMP
DMS_INNER
decfsz DELAYTEMP, F
goto DMS_INNER
decfsz DELAYTEMP2, F
goto DMS_OUTER
decfsz SysWaitTempMS, F
goto DMS_START
decfsz SysWaitTempMS_H, F
goto DMS_START
return
;**************
Delay_S
DS_START
movlw 232
movwf SysWaitTempMS
movlw 3
movwf SysWaitTempMS_H
call Delay_MS
decfsz SysWaitTempS, F
goto DS_START
return
;**************
FLASH_LED
movlw 1
movwf TMRNUMBER
movlw 50
movwf TMRVALUE
clrf TMRVALUE_H
call SETTIMER176
clrf SysTemp1
btfsc PORTA,2
incf SysTemp1,F
comf SysTemp1,F
bcf PORTA,2
btfsc SysTemp1,0
bsf PORTA,2
return
;**************
HSERPRINT306
movf SysPRINTDATAHandler,W
movwf FSR
bcf STATUS, IRP
btfsc SysPRINTDATAHandler_H,0
bsf STATUS, IRP
movf INDF,W
movwf PRINTLEN
movf PRINTLEN,F
btfsc STATUS, Z
goto ENDIF37
movlw 1
movwf SYSPRINTTEMP
SysForLoop2
movf SYSPRINTTEMP,W
addwf SysPRINTDATAHandler,W
movwf FSR
bcf STATUS, IRP
btfsc SysPRINTDATAHandler_H,0
bsf STATUS, IRP
movf INDF,W
movwf SERDATA
call HSERSEND296
movf SYSPRINTTEMP,W
subwf PRINTLEN,W
movwf SysTemp1
movwf SysBYTETempA
clrf SysBYTETempB
call SYSCOMPEQUAL
comf SysByteTempX,F
btfss SysByteTempX,0
goto ENDIF38
incf SYSPRINTTEMP,F
goto SysForLoop2
ENDIF38
SysForLoopEnd2
ENDIF37
return
;**************
HSERSEND295
SysWaitLoop1
btfss PIR1,TXIF
goto SysWaitLoop1
SysWaitLoop2
banksel TXSTA
btfss TXSTA,TRMT
goto SysWaitLoop2
banksel SERDATA
movf SERDATA,W
movwf TXREG
movlw 10
movwf SysWaitTempMS
clrf SysWaitTempMS_H
goto Delay_MS
;**************
HSERSEND296
HSERSENDUSART1HANDLER
SysWaitLoop5
btfss PIR1,TXIF
goto SysWaitLoop5
SysWaitLoop6
banksel TXSTA
btfss TXSTA,TRMT
goto SysWaitLoop6
banksel SERDATA
movf SERDATA,W
movwf TXREG
movlw 10
movwf SysWaitTempMS
clrf SysWaitTempMS_H
goto Delay_MS
;**************
I2CRESTART
goto I2CSTART
;**************
I2CSEND
banksel TRISB
bcf TRISB,1
banksel PORTB
bcf PORTB,1
movlw 8
movwf SysRepeatTemp2
SysRepeatLoop2
btfss I2CBYTE,7
goto ELSE39_1
banksel TRISB
bsf TRISB,0
goto ENDIF39
ELSE39_1
banksel TRISB
bcf TRISB,0
banksel PORTB
bcf PORTB,0
ENDIF39
banksel I2CBYTE
rlf I2CBYTE,F
banksel TRISB
bsf TRISB,1
SysWaitLoop3
banksel PORTB
btfss PORTB,1
goto SysWaitLoop3
nop
banksel TRISB
bcf TRISB,1
banksel PORTB
bcf PORTB,1
decfsz SysRepeatTemp2,F
goto SysRepeatLoop2
SysRepeatLoopEnd2
banksel TRISB
bsf TRISB,0
bsf TRISB,1
SysWaitLoop4
banksel PORTB
btfss PORTB,1
goto SysWaitLoop4
btfss PORTB,0
goto ELSE40_1
clrf I2CACK
clrf I2CACKPOLLSTATE
goto ENDIF40
ELSE40_1
movlw 255
movwf I2CACK
movlw 255
movwf I2CACKPOLLSTATE
ENDIF40
banksel TRISB
bcf TRISB,1
banksel PORTB
bcf PORTB,1
banksel TRISB
bcf TRISB,0
banksel PORTB
bcf PORTB,0
return
;**************
I2CSTART
banksel TRISB
bsf TRISB,0
bsf TRISB,1
bcf TRISB,0
banksel PORTB
bcf PORTB,0
nop
banksel TRISB
bcf TRISB,1
banksel PORTB
bcf PORTB,1
return
;**************
I2CSTOP
banksel TRISB
bcf TRISB,1
banksel PORTB
bcf PORTB,1
banksel TRISB
bcf TRISB,0
banksel PORTB
bcf PORTB,0
banksel TRISB
bsf TRISB,1
nop
bsf TRISB,0
banksel STATUS
return
;**************
INITI2C
banksel TRISB
bsf TRISB,0
bsf TRISB,1
banksel I2CMATCH
clrf I2CMATCH
return
;**************
INITI2CLCD
movlw 15
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
clrf I2C_LCD_BYTE
movlw 3
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 5
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
movlw 3
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 1
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
movlw 3
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 1
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
movlw 3
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 1
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
movlw 2
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 1
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
movlw 40
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 1
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
movlw 12
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 1
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
movlw 1
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 15
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
movlw 6
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 1
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
goto CLS
;**************
INITLCD
;asm showdebug
LCD_IO selected is
LCD_IO;asm showdebug
LCD_Speed is SLOW
;asm showdebug
OPTIMAL is set to
OPTIMAL;asm showdebug
LCD_Speed is set to
LCD_Speedcall INITI2C
movlw 1
movwf LCD_BACKLIGHT
movlw 2
movwf SysWaitTempMS
clrf SysWaitTempMS_H
call Delay_MS
movlw 2
movwf SysRepeatTemp1
SysRepeatLoop1
movlw 78
movwf LCD_I2C_ADDRESS_CURRENT
call INITI2CLCD
decfsz SysRepeatTemp1,F
goto SysRepeatLoop1
SysRepeatLoopEnd1
movlw 12
movwf LCD_STATE
return
;**************
INITSYS
;asm showdebug This code block sets the internal oscillator to ChipMHz
;asm showdebug OSCCON type is 104' NoBit(SPLLEN) And NoBit(IRCF3) Or Bit(INTSRC)) and ifdef Bit(HFIOFS)
movlw 143
banksel OSCCON
andwf OSCCON,F
bsf OSCCON,IRCF2
bsf OSCCON,IRCF1
bcf OSCCON,IRCF0
;asm showdebug _Complete_the_chip_setup_of_BSR,ADCs,ANSEL_and_other_key_setup_registers_or_register_bits
bcf ADCON1,ADFM
banksel ADCON0
bcf ADCON0,ADON
banksel ANSEL
clrf ANSEL
movlw 7
movwf CMCON
banksel PORTA
clrf PORTA
clrf PORTB
return
;**************
INITTIMER1
movf TMRPRES,F
btfsc STATUS, Z
goto ENDIF28
movlw 16
subwf TMRPRES,W
btfsc STATUS, Z
goto ENDIF34
movlw 32
subwf TMRPRES,W
btfsc STATUS, Z
goto ENDIF35
movlw 48
subwf TMRPRES,W
btfss STATUS, Z
clrf TMRPRES
ENDIF35
ENDIF34
ENDIF28
btfsc T1CON,TMR1ON
bsf TMRPRES,0
decf TMRSOURCE,W
btfss STATUS, Z
goto ENDIF30
bcf TMRPRES,1
bcf TMRPRES,3
ENDIF30
movlw 2
subwf TMRSOURCE,W
btfss STATUS, Z
goto ENDIF31
bsf TMRPRES,1
bcf TMRPRES,3
ENDIF31
movlw 3
subwf TMRSOURCE,W
btfss STATUS, Z
goto ENDIF32
bsf TMRPRES,1
bsf TMRPRES,3
ENDIF32
movlw 4
subwf TMRSOURCE,W
btfsc STATUS, Z
bcf TMRPRES,3
movf TMRPRES,W
movwf T1CON
return
;**************
INITUSART
movlw 12
banksel SPBRG
movwf SPBRG
bsf TXSTA,BRGH
bcf TXSTA,SYNC
bsf TXSTA,TXEN
banksel RCSTA
bsf RCSTA,SPEN
bsf RCSTA,CREN
return
;**************
LCDBACKLIGHT
movf LCDTEMP,F
btfsc STATUS, Z
clrf LCD_BACKLIGHT
decf LCDTEMP,W
btfss STATUS, Z
goto ENDIF22
movlw 1
movwf LCD_BACKLIGHT
ENDIF22
bcf SYSLCDTEMP,1
clrf LCDBYTE
goto LCDNORMALWRITEBYTE
;**************
LCDNORMALWRITEBYTE
btfss SYSLCDTEMP,1
goto ELSE8_1
bsf I2C_LCD_BYTE,0
goto ENDIF8
ELSE8_1
bcf I2C_LCD_BYTE,0
ENDIF8
bcf I2C_LCD_BYTE,1
bcf I2C_LCD_BYTE,3
btfsc LCD_BACKLIGHT,0
bsf I2C_LCD_BYTE,3
call I2CRESTART
movf LCD_I2C_ADDRESS_CURRENT,W
movwf I2CBYTE
call I2CSEND
bcf I2C_LCD_BYTE,7
btfsc LCDBYTE,7
bsf I2C_LCD_BYTE,7
bcf I2C_LCD_BYTE,6
btfsc LCDBYTE,6
bsf I2C_LCD_BYTE,6
bcf I2C_LCD_BYTE,5
btfsc LCDBYTE,5
bsf I2C_LCD_BYTE,5
bcf I2C_LCD_BYTE,4
btfsc LCDBYTE,4
bsf I2C_LCD_BYTE,4
bsf I2C_LCD_BYTE,2
movf I2C_LCD_BYTE,W
movwf I2CBYTE
call I2CSEND
bcf I2C_LCD_BYTE,2
movf I2C_LCD_BYTE,W
movwf I2CBYTE
call I2CSEND
bcf I2C_LCD_BYTE,7
btfsc LCDBYTE,3
bsf I2C_LCD_BYTE,7
bcf I2C_LCD_BYTE,6
btfsc LCDBYTE,2
bsf I2C_LCD_BYTE,6
bcf I2C_LCD_BYTE,5
btfsc LCDBYTE,1
bsf I2C_LCD_BYTE,5
bcf I2C_LCD_BYTE,4
btfsc LCDBYTE,0
bsf I2C_LCD_BYTE,4
bsf I2C_LCD_BYTE,2
movf I2C_LCD_BYTE,W
movwf I2CBYTE
call I2CSEND
bcf I2C_LCD_BYTE,2
movf I2C_LCD_BYTE,W
movwf I2CBYTE
call I2CSEND
call I2CSTOP
movlw 12
movwf LCD_STATE
movlw 13
movwf DELAYTEMP
DelayUS2
decfsz DELAYTEMP,F
goto DelayUS2
btfsc SYSLCDTEMP,1
goto ENDIF9
movlw 16
subwf LCDBYTE,W
btfsc STATUS, C
goto ENDIF10
movf LCDBYTE,W
sublw 7
btfsc STATUS, C
goto ENDIF11
movf LCDBYTE,W
movwf LCD_STATE
ENDIF11
ENDIF10
ENDIF9
return
;**************
LOCATE
bcf SYSLCDTEMP,1
movf LCDLINE,W
sublw 1
btfsc STATUS, C
goto ENDIF3
movlw 2
subwf LCDLINE,F
movlw 20
addwf LCDCOLUMN,F
ENDIF3
movf LCDLINE,W
movwf SysBYTETempA
movlw 64
movwf SysBYTETempB
call SYSMULTSUB
movf LCDCOLUMN,W
addwf SysBYTETempX,W
movwf SysTemp1
movlw 128
iorwf SysTemp1,W
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movlw 5
movwf SysWaitTemp10US
goto Delay_10US
;**************
PRINT109
movf SysPRINTDATAHandler,W
movwf FSR
bcf STATUS, IRP
btfsc SysPRINTDATAHandler_H,0
bsf STATUS, IRP
movf INDF,W
movwf PRINTLEN
movf PRINTLEN,F
btfsc STATUS, Z
return
bsf SYSLCDTEMP,1
movlw 1
movwf SYSPRINTTEMP
SysForLoop1
movf SYSPRINTTEMP,W
addwf SysPRINTDATAHandler,W
movwf FSR
bcf STATUS, IRP
btfsc SysPRINTDATAHandler_H,0
bsf STATUS, IRP
movf INDF,W
movwf LCDBYTE
call LCDNORMALWRITEBYTE
movf SYSPRINTTEMP,W
subwf PRINTLEN,W
movwf SysTemp1
movwf SysBYTETempA
clrf SysBYTETempB
call SYSCOMPEQUAL
comf SysByteTempX,F
btfss SysByteTempX,0
goto ENDIF5
incf SYSPRINTTEMP,F
goto SysForLoop1
ENDIF5
SysForLoopEnd1
return
;**************
PRINT110
clrf LCDVALUETEMP
bsf SYSLCDTEMP,1
movlw 100
subwf LCDVALUE,W
btfss STATUS, C
goto ENDIF6
movf LCDVALUE,W
movwf SysBYTETempA
movlw 100
movwf SysBYTETempB
call SYSDIVSUB
movf SysBYTETempA,W
movwf LCDVALUETEMP
movf SYSCALCTEMPX,W
movwf LCDVALUE
movlw 48
addwf LCDVALUETEMP,W
movwf LCDBYTE
call LCDNORMALWRITEBYTE
ENDIF6
movf LCDVALUETEMP,W
movwf SysBYTETempB
clrf SysBYTETempA
call SYSCOMPLESSTHAN
movf SysByteTempX,W
movwf SysTemp1
movf LCDVALUE,W
movwf SysBYTETempA
movlw 10
movwf SysBYTETempB
call SYSCOMPLESSTHAN
comf SysByteTempX,F
movf SysTemp1,W
iorwf SysByteTempX,W
movwf SysTemp2
btfss SysTemp2,0
goto ENDIF7
movf LCDVALUE,W
movwf SysBYTETempA
movlw 10
movwf SysBYTETempB
call SYSDIVSUB
movf SysBYTETempA,W
movwf LCDVALUETEMP
movf SYSCALCTEMPX,W
movwf LCDVALUE
movlw 48
addwf LCDVALUETEMP,W
movwf LCDBYTE
call LCDNORMALWRITEBYTE
ENDIF7
movlw 48
addwf LCDVALUE,W
movwf LCDBYTE
goto LCDNORMALWRITEBYTE
;**************
SETTIMER176
goto SETTIMER177
;**************
SETTIMER177
movf TMRNUMBER,F
btfss STATUS, Z
goto ENDIF25
movf TMRVALUE,W
movwf TMR0
return
ENDIF25
decf TMRNUMBER,W
btfss STATUS, Z
goto ENDIF26
movf TMRVALUE_H,W
movwf TMR1H
movf TMRVALUE,W
movwf TMR1L
ENDIF26
movlw 2
subwf TMRNUMBER,W
btfss STATUS, Z
goto ENDIF27
movf TMRVALUE,W
movwf TMR2
ENDIF27
return
;**************
STARTTIMER
decf TMRNUMBER,W
btfsc STATUS, Z
bsf T1CON,TMR1ON
movlw 2
subwf TMRNUMBER,W
btfsc STATUS, Z
bsf T2CON,TMR2ON
return
;**************
SYSCOMPEQUAL
clrf SYSBYTETEMPX
movf SYSBYTETEMPA, W
subwf SYSBYTETEMPB, W
btfsc STATUS, Z
comf SYSBYTETEMPX,F
return
;**************
SYSCOMPLESSTHAN
clrf SYSBYTETEMPX
bsf STATUS, C
movf SYSBYTETEMPB, W
subwf SYSBYTETEMPA, W
btfss STATUS, C
comf SYSBYTETEMPX,F
return
;**************
SYSDIVSUB
movf SYSBYTETEMPB, F
btfsc STATUS, Z
return
clrf SYSBYTETEMPX
movlw 8
movwf SYSDIVLOOP
SYSDIV8START
bcf STATUS, C
rlf SYSBYTETEMPA, F
rlf SYSBYTETEMPX, F
movf SYSBYTETEMPB, W
subwf SYSBYTETEMPX, F
bsf SYSBYTETEMPA, 0
btfsc STATUS, C
goto DIV8NOTNEG
bcf SYSBYTETEMPA, 0
movf SYSBYTETEMPB, W
addwf SYSBYTETEMPX, F
DIV8NOTNEG
decfsz SYSDIVLOOP, F
goto SYSDIV8START
return
;**************
SYSMULTSUB
clrf SYSBYTETEMPX
MUL8LOOP
movf SYSBYTETEMPA, W
btfsc SYSBYTETEMPB, 0
addwf SYSBYTETEMPX, F
bcf STATUS, C
rrf SYSBYTETEMPB, F
bcf STATUS, C
rlf SYSBYTETEMPA, F
movf SYSBYTETEMPB, F
btfss STATUS, Z
goto MUL8LOOP
return
;**************
SYSREADSTRING
movf SYSSTRINGB, W
movwf FSR
bcf STATUS, IRP
btfsc SYSSTRINGB_H, 0
bsf STATUS, IRP
call SYSSTRINGTABLES
movwf SYSCALCTEMPA
movwf INDF
addwf SYSSTRINGB, F
goto SYSSTRINGREADCHECK
SYSREADSTRINGPART
movf SYSSTRINGB, W
movwf FSR
bcf STATUS, IRP
btfsc SYSSTRINGB_H, 0
bsf STATUS, IRP
call SYSSTRINGTABLES
movwf SYSCALCTEMPA
addwf SYSSTRINGLENGTH,F
addwf SYSSTRINGB,F
SYSSTRINGREADCHECK
movf SYSCALCTEMPA,F
btfsc STATUS,Z
return
SYSSTRINGREAD
call SYSSTRINGTABLES
incf FSR, F
movwf INDF
decfsz SYSCALCTEMPA, F
goto SYSSTRINGREAD
return
;**************
SysStringTables
movf SysStringA_H,W
movwf PCLATH
movf SysStringA,W
incf SysStringA,F
btfsc STATUS,Z
incf SysStringA_H,F
movwf PCL
StringTable1
retlw 11
retlw 76 ;L
retlw 111 ;o
retlw 99 ;c
retlw 97 ;a
retlw 116 ;t
retlw 101 ;e
retlw 32 ;
retlw 48 ;0
retlw 44 ;,
retlw 52 ;4
retlw 48 ;0
StringTable2
retlw 16
retlw 68 ;D
retlw 73 ;I
retlw 83 ;S
retlw 80 ;P
retlw 76 ;L
retlw 65 ;A
retlw 89 ;Y
retlw 32 ;
retlw 79 ;O
retlw 78 ;N
retlw 32 ;
retlw 49 ;1
retlw 32 ;
retlw 114 ;r
retlw 111 ;o
retlw 119 ;w
StringTable3
retlw 16
retlw 68 ;D
retlw 73 ;I
retlw 83 ;S
retlw 80 ;P
retlw 76 ;L
retlw 65 ;A
retlw 89 ;Y
retlw 32 ;
retlw 79 ;O
retlw 78 ;N
retlw 32 ;
retlw 50 ;2
retlw 32 ;
retlw 114 ;r
retlw 111 ;o
retlw 119 ;w
StringTable4
retlw 16
retlw 68 ;D
retlw 73 ;I
retlw 83 ;S
retlw 80 ;P
retlw 76 ;L
retlw 65 ;A
retlw 89 ;Y
retlw 32 ;
retlw 79 ;O
retlw 78 ;N
retlw 32 ;
retlw 51 ;3
retlw 32 ;
retlw 114 ;r
retlw 111 ;o
retlw 119 ;w
StringTable5
retlw 16
retlw 68 ;D
retlw 73 ;I
retlw 83 ;S
retlw 80 ;P
retlw 76 ;L
retlw 65 ;A
retlw 89 ;Y
retlw 32 ;
retlw 79 ;O
retlw 78 ;N
retlw 32 ;
retlw 52 ;4
retlw 32 ;
retlw 114 ;r
retlw 111 ;o
retlw 119 ;w
StringTable6
retlw 9
retlw 32 ;
retlw 32 ;
retlw 32 ;
retlw 32 ;
retlw 32 ;
retlw 120 ;x
retlw 32 ;
retlw 49 ;1
retlw 32 ;
StringTable7
retlw 8
retlw 32 ;
retlw 32 ;
retlw 32 ;
retlw 51 ;3
retlw 32 ;
retlw 32 ;
retlw 50 ;2
retlw 32 ;
StringTable8
retlw 9
retlw 32 ;
retlw 32 ;
retlw 50 ;2
retlw 32 ;
retlw 32 ;
retlw 32 ;
retlw 32 ;
retlw 51 ;3
retlw 32 ;
StringTable9
retlw 13
retlw 32 ;
retlw 32 ;
retlw 32 ;
retlw 32 ;
retlw 32 ;
retlw 32 ;
retlw 54 ;6
retlw 32 ;
retlw 79 ;O
retlw 78 ;N
retlw 32 ;
retlw 52 ;4
retlw 32 ;
;**************
;Start of program memory page 1
ORG 2048
END
@RomTek... attach next time. Please.
Please remove the interrupt, before I investigate. What happens?
Hi, I modified the program (removing the serial and interrupt) but the result changed slightly.
Let me explain: the same listing on avr8515 does not display correctly and is missing on the second line, both with 2-line and 4-line display.
On pic16f88 it writes correctly on the display, but not on the 4-line display.
thanks for now
file asm
I wrote this routine in mikrobasic and it works perfectly with a 20x4 display.
I hope it can be useful. 1 for row 1 and col 1
@Romtek
I am confused. In the first post you indicate that you are using an LCD1602. This would imply an LCD 16 * 2 chars.
In the same post and the code you share I see
locate 0,40 ' 2 row
. This would imply an LCD 40 * 2 chars.Which one do you have?
I state that I'm using 16x2 and 16x4 displays with PCF8574 interface.
Sorry but in the previous post I had put MY solution to get around the problem, in fact if one loads the prog as I wrote it it displays on the second line, while if one uses "locate1,0" it doesn't display on the second line.
photo of the problem
photo of the problem always on 8515
The first device is a 1602 and the 1604.
I have a 1602 here in the same PCF chip and it works.
So, let us try to figure this out.
Please try the attached the program. It is your program but I have tested it here.
Test on a PIC16F88 and LCD 1602 ONLY. I need to figure one thing at a time.
On pic16f88 your program works.
But on mega 8515 it works ????
I've already tried on mega8515 but it doesn't write, see attached photo
characters are missing
On 16f88 with display 4 row does not display correctly see attached photo
Can you please do one analysis at a time. See the post below: https://sourceforge.net/p/gcbasic/discussion/579125/thread/77d70d5624/?limit=50#7298
OK. So, we now know it works on 16F88.
However, try the attachment on the 16F88 and connect a serial terminal. Get the values displayed. These values are the locate values being sent to the LCD via I2C. Get the values.
Do the same on the mega. Should be the same values.
I need the values. They should be.
I tested with pic16f88 and the result is:
20, 0, 0, 128
20, 1, 0, 192
while I tested with mega8515 the result is
20, 0, 0, 128
20, 1, 0, 128
as in the attached photo, (also tested with another identical display and another pcf8574 interface but I got the same result.
Note the communication speed, in the program it is 19200, while I had to set the terminal at 9600.....but this is another matter.
I will try the #DEFINE LCD_SPEED 255 change and let you know
So, the values being sent the LCD are good on the PIC16F88.
Can you confirm the source program is the same? The result in the mega8515 is incorrect at the moment. The seconds line should be 20, 1, 0, 192
@RomTek
I have tested the same program on the PIC16F88 with a 1602 and 2004 and both work.
So, we know a baseline works. I am using the same program I posted above. So, using software I2C.
Try this on both chips.
#DEFINE LCD_SPEED 255
This will slow the intra-byte communication which may give the LCD time to process. You try50000
but these will add seriously long intra-byte delay.Remember, the setting of the position of cursor is bytes of data being sent to the LCD. So, if the LCD CPU is really slow the LCD could miss some byte data - this would explain the errors you are seeing. So, hence the
#DEFINE LCD_SPEED 255
Test and post the results.
Last edit: Anobium 2023-02-09