Hello. I have PIC16F1939 with the following code running.
The LCD is common 1602 LCD, at 4 or 8mhz oscillator speed it works just fine. However, it does not work at 16mhz speed - either shows garbage symbols on screen, or some letters are missing, or nothing is shown.
I found that changing value of DEFINE LCD_DATAUS 44 from default 44 to say 88 or 100 partially improves situation - screen works 50% times now, but still not a solution. Increasing this value more, or changing DEFINE LCD_COMMANDUS 1500 to another value does nothing.
The only workaround I found is to switch oscillator speed before using LCD to 8mhz and then back to 16 mhz, but I don't think this is right.
Any ideas?
Here's the reference code.
Code:;----[16F1939 Hardware Configuration]------------------------------------------- #IF __PROCESSOR__ = "16F1939" #DEFINE MCU_FOUND 1 #CONFIG cfg1 = _FOSC_INTOSC ; INTOSC oscillator: I/O function on CLKIN pin cfg1&= _WDTE_OFF ; WDT disabled cfg1&= _PWRTE_OFF ; PWRT disabled cfg1&= _MCLRE_ON ; MCLR/VPP pin function is digital input cfg1&= _CP_ON ; Program memory code protection is enabled cfg1&= _CPD_OFF ; Data memory code protection is disabled cfg1&= _BOREN_OFF ; Brown-out Reset disabled cfg1&= _CLKOUTEN_OFF ; CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin cfg1&= _IESO_ON ; Internal/External Switchover mode is enabled cfg1&= _FCMEN_ON ; Fail-Safe Clock Monitor is enabled __CONFIG _CONFIG1, cfg1 cfg2 = _WRT_OFF ; Write protection off cfg2&= _VCAPEN_OFF ; All VCAP pin functionality is disabled cfg2&= _PLLEN_OFF ; 4x PLL disabled cfg2&= _STVREN_ON ; Stack Overflow or Underflow will cause a Reset cfg2&= _BORV_19 ; Brown-out Reset Voltage (Vbor), low trip point selected. cfg2&= _LVP_OFF ; High-voltage on MCLR/VPP must be used for programming __CONFIG _CONFIG2, cfg2 #ENDCONFIG #ENDIF ;----[Verify Configs have been specified for Selected Processor]---------------- ; Note: Only include this routine once, after all #CONFIG blocks #IFNDEF MCU_FOUND #ERROR "No CONFIGs found for [" + __PROCESSOR__ +"]" #ENDIF 'nixie led clock electronics direct drive DEFINE LCD_DREG PORTC DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTD DEFINE LCD_RSBIT 6 DEFINE LCD_EREG PORTC DEFINE LCD_EBIT 3 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 1500 DEFINE LCD_DATAUS 44 DEFINE ADC_BITS 10 ' Set number of bits in result DEFINE ADC_CLOCK 3 ' Set clock source (rc = 3) DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds ADCON1=%11110011 'enable adc internal reference and justify FVRCON=%11001111 'set internal reference to 4.096V OSCCON=%111111111 'SET INTOSC TO 16MHZ ANSELE=%00000000 'enable adc input porte.2 ANSELA=%00001111 'disable ADC on A except 4 ANSELB=%00000000 'disable ADC on B ANSELD=%00000000 'disable ADC on D TRISC=%00000000 'set PORTC as output all TRISD=%00000000 'set PORTD as output all TRISB=%00000000 'set PORTB as output all TRISA=%00001111 'set PORTA part as input TRISE=%00000000 'set PORTE as output all WPUB=%00000000 'DISABLE B PULL UPS OPTION_REG=%100000000 'disable all pull ups LCDCON=%00000000 'disable LCD controller pins LCDSE0=%00000000 LCDSE1=%00000000 LCDSE2=%00000000 DEFINE OSC 16 'set oscillator speed pause 1000 lcdout $fe, $1, "test" pause 1000 stop




Bookmarks