OLED Display Noise problem


Closed Thread
Results 1 to 25 of 25

Hybrid View

  1. #1
    Join Date
    Dec 2012
    Location
    Türkiye
    Posts
    103


    Did you find this post helpful? Yes | No

    Default Re: OLED Display Noise problem

    Quote Originally Posted by pedja089 View Post
    That sound to me as bad PCB design and/or power supply. But sill could be bad LCD driver.
    If long delays make artifact disappear, then capacitive coupling between LCD signals and power lines can cause that.
    You can try test that. Add pull down resistor 1K to LCD Enable pin, and create easy way to disconnect LCD and resistor from PIC, as close as possible to LCD.
    Code:
    pause 500
                            
    lcdout $FE,$28
    lcdout $FE,$17
    lcdout $FE,$06
    lcdout $FE,$08
    lcdout $FE,$01
    lcdout $FE,$02
    lcdout $FE,$0C
    
    lcdout $FE,$80,"BU BiR DENEMEDiR"
    LCDOUT $FE,$C0,"  iKiNCi SATIR  "
    PAUSE 10000' Disconnect only LCD enable pin before pause timeout
    Main:
    lcdout $FE,$80,"BU BiR DENEMEDiR"
    LCDOUT $FE,$C0,"  iKiNCi SATIR  "
    GOTO Main
    Display shouldn't update any more. If you see dots then 99% problem is with PCB layout, and decoupling.
    If there is no dots on LCD then problem is with LCD.
    Well ;

    I did exactly as you asked me to do and as you say it's got to do with the lcd then ...
    - Ipsa scientia potestas est -

  2. #2
    Join Date
    Oct 2009
    Posts
    583


    Did you find this post helpful? Yes | No

    Default Re: OLED Display Noise problem

    Quote Originally Posted by gunayburak View Post
    Well ;

    I did exactly as you asked me to do and as you say it's got to do with the lcd then ...
    I don't have the same chip, but used an 18F4580 with a 2 x 16 LCD and just changed the lines to run the LCD from port B to suit the EasyPIC5 development board and I don't get any strange random pixels and I'm running the chip at 20Mhz so the switching is much faster, so it would suggest that it is your hardware that is at fault.

    Code:
    ASM 
      __CONFIG    _CONFIG1H, _OSC_HS_1H
      __CONFIG    _CONFIG2L, _PWRT_ON_2L  
      __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
      __CONFIG    _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H  
      __CONFIG    _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
    ENDASM
    
    
    DEFINE  OSC 20    
    
    DEFINE LCD_DREG  PORTB                  ' LCD Data port
    DEFINE LCD_DBIT  0                      ' starting Data bit (0 or 4)
    DEFINE LCD_EREG  PORTB                  ' LCD Enable port
    DEFINE LCD_EBIT  5                      '     Enable bit  (on EasyPIC 5 LCD)
    DEFINE LCD_RSREG PORTB                  ' LCD Register Select port
    DEFINE LCD_RSBIT 4                      '     Register Select bit   (on EasyPIC 5 LCD)
    DEFINE LCD_BITS  4                      ' LCD bus size (4 or 8 bits)
    DEFINE LCD_LINES 4                      ' number of lines on LCD
    DEFINE LCD_COMMANDUS 2000               ' Command delay time in us 
    DEFINE LCD_DATAUS 50                    ' Data delay time in us 
    
    '-------------------------------------------------------------------------------
    PORTA=%00000000     :      PORTB=%00000000
    TRISA=%00000000     :      TRISB=%00000000 
    'ADCON0=%00000001    :      ADCON1=%10110000
    'ANSELA=%00000       :      ANSELB=%00000000
    'OPTION_REG.7=0     
    '-------------------------------------------------------------------------------                                 
    
    
    pause 500
                            
    lcdout $FE,$28
    lcdout $FE,$17
    lcdout $FE,$06
    lcdout $FE,$08
    lcdout $FE,$01
    lcdout $FE,$02
    lcdout $FE,$0C
     
    MAIN:
                  
    lcdout $FE,$80,"BU BiR DENEMEDiR"
    LCDOUT $FE,$C0,"  iKiNCi SATIR  "
    
    goto main

    Replaced the 20Mhz with a 4Mhz xtal and recoded and the display was fine.

  3. #3
    Join Date
    Dec 2012
    Location
    Türkiye
    Posts
    103


    Did you find this post helpful? Yes | No

    Default Re: OLED Display Noise problem

    Quote Originally Posted by Scampy View Post
    I don't have the same chip, but used an 18F4580 with a 2 x 16 LCD and just changed the lines to run the LCD from port B to suit the EasyPIC5 development board and I don't get any strange random pixels and I'm running the chip at 20Mhz so the switching is much faster, so it would suggest that it is your hardware that is at fault.

    Code:
    ASM 
      __CONFIG    _CONFIG1H, _OSC_HS_1H
      __CONFIG    _CONFIG2L, _PWRT_ON_2L  
      __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
      __CONFIG    _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H  
      __CONFIG    _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
    ENDASM
    
    
    DEFINE  OSC 20    
    
    DEFINE LCD_DREG  PORTB                  ' LCD Data port
    DEFINE LCD_DBIT  0                      ' starting Data bit (0 or 4)
    DEFINE LCD_EREG  PORTB                  ' LCD Enable port
    DEFINE LCD_EBIT  5                      '     Enable bit  (on EasyPIC 5 LCD)
    DEFINE LCD_RSREG PORTB                  ' LCD Register Select port
    DEFINE LCD_RSBIT 4                      '     Register Select bit   (on EasyPIC 5 LCD)
    DEFINE LCD_BITS  4                      ' LCD bus size (4 or 8 bits)
    DEFINE LCD_LINES 4                      ' number of lines on LCD
    DEFINE LCD_COMMANDUS 2000               ' Command delay time in us 
    DEFINE LCD_DATAUS 50                    ' Data delay time in us 
    
    '-------------------------------------------------------------------------------
    PORTA=000000     :      PORTB=000000
    TRISA=000000     :      TRISB=000000 
    'ADCON0=000001    :      ADCON1=110000
    'ANSELA=000       :      ANSELB=000000
    'OPTION_REG.7=0     
    '-------------------------------------------------------------------------------                                 
    
    
    pause 500
                            
    lcdout $FE,$28
    lcdout $FE,$17
    lcdout $FE,$06
    lcdout $FE,$08
    lcdout $FE,$01
    lcdout $FE,$02
    lcdout $FE,$0C
     
    MAIN:
                  
    lcdout $FE,$80,"BU BiR DENEMEDiR"
    LCDOUT $FE,$C0,"  iKiNCi SATIR  "
    
    goto main

    Replaced the 20Mhz with a 4Mhz xtal and recoded and the display was fine.
    What can I say .. I am so unlucky with these OLEDs .. But thanks for your effort anyway ..
    - Ipsa scientia potestas est -

  4. #4
    Join Date
    Dec 2012
    Location
    Türkiye
    Posts
    103


    Did you find this post helpful? Yes | No

    Default Re: OLED Display Noise problem

    Today a new EA OLED display has arrived yet the same problem still occurs ... There might be a picbasic incompatibility with the lcd because my connections are exactly the same with the code I shared , nothing more nothing less ..
    - Ipsa scientia potestas est -

  5. #5
    Join Date
    Oct 2009
    Posts
    583


    Did you find this post helpful? Yes | No

    Default Re: OLED Display Noise problem

    Looking at the data sheet, by default it's in 4/8 bit mode so should work the same way as a normal 2 x 16 LCD display. The only suggestion to prove if the OLED is part of a faulty batch would be to run the code above on a different PIC (18F4580 or the good old 16F877A) - If that works then the problem would appear to be with the original pic, if the OLED still gives odd pixels then its the display and I would send them back for a refund and order from a different supplier

  6. #6
    Join Date
    Aug 2011
    Posts
    453


    Did you find this post helpful? Yes | No

    Default Re: OLED Display Noise problem

    Usually issues with junk appearing in the display have to do with not allowing the LCD time to process commands.
    If you want to hammer the display as fast as possible then you might try reading the BUSY status flag between operations.

    Try this and see if it gets any better (untested, so beware)...
    Code:
    '-------------------------------------------------------------------------------
    define OSC 4
    OSCCON=%01101010    'OSC is @ 4 MHZ
    
    '------------- LCD DEFINES ------------------------
    DEFINE LCD_DREG PORTB   'LCD data port 
    DEFINE LCD_DBIT 4       'LCD data starting bit 0 or 4 
    
    DEFINE LCD_RSREG PORTA  'LCD register select port 
    DEFINE LCD_RSBIT 7      'LCD register select bit
    
    DEFINE LCD_RWREG PORTA  'LCD read/write port
    DEFINE LCD_RWBIT 0      'LCD read/write pin bit  
    
    DEFINE LCD_EREG PORTA   'LCD enable port 
    DEFINE LCD_EBIT 6       'LCD enable bit
    
    DEFINE LCD_BITS 4       'LCD bus size 4 or 8 
    DEFINE LCD_LINES 2      'Number lines on LCD
    
    DEFINE LCD_COMMANDUS 6200   'command delay time (in us) - clear display requires 6.2ms
    DEFINE LCD_DATAUS 50        'data delay time (in us)
    
    '-------------------------------------------------------------------------------
    PORTA = %00000000
    PORTB = %00000000
    TRISA = %00000000
    TRISB = %00000000 
    ANSELA = %00000
    ANSELB = %00000000
    'ADCON0=%00000001
    'ADCON1=%10110000
    'OPTION_REG.7=0     
    '-------------------------------------------------------------------------------
    
    pause 500           'wait for display powerup
                            
    lcdout $FE,$28      'function set 4-bit mode
    call lcd_busy_wait
    lcdout $FE,$08      'display off
    call lcd_busy_wait
    lcdout $FE,$06      'entry mode set
    call lcd_busy_wait
    lcdout $FE,$17      'char mode + internal power
    call lcd_busy_wait
    lcdout $FE,$01      'clear display (requires long delay)
    call lcd_busy_wait
    lcdout $FE,$02      'home
    call lcd_busy_wait
    lcdout $FE,$0C      'display on
     
    MAIN:
        call lcd_busy_wait
        lcdout $FE,$80,"BU BiR DENEMEDiR"
        call lcd_busy_wait
        lcdout $FE,$C0,"  iKiNCi SATIR  "
    goto main
    
    'sub lcd_busy_wait
    'read lcd busy flag until busy=0
    WAITST CON 1        ' delay 1us
    busy var bit
    lcd_busy_wait:
        busy = 1
        TRISB = TRISB or $F0        'set PORTB D4-D7 to inputs
        @ bcf LCD_RSREG, LCD_RSBIT  'RS=0
        @ bsf LCD_RWREG, LCD_RWBIT  'RW=1
        pauseus WAITST
    
        'wait for lcd busy flag (D7) to be low
        do while (busy = 1)
            @ bsf LCD_EREG, LCD_EBIT    'EN=1
            pauseus WAITST
            busy = PORTB.7              'read busy bit (bit 7 in upper nibble)
            @ bcf LCD_EREG, LCD_EBIT    'EN=0
            pauseus WAITST
            ' dummy read of lower nibble
            @ bsf LCD_EREG, LCD_EBIT    'EN=1
            pauseus WAITST
            @ bcf LCD_EREG, LCD_EBIT    'EN=0
            pauseus WAITST
        loop
    
        TRISB = TRISB and not $F0       'set PORTB D4-D7 back to outputs
        @ bcf LCD_RWREG, LCD_RWBIT      'RW=0
     return
    You might find that you need to split the cursor position commands and data...
    Code:
        call lcd_busy_wait
        lcdout $FE,$80        'move cursor
        call lcd_busy_wait
        lcdout "BU BiR DENEMEDiR"   'send data
    Even with doing things like this some displays just don't like being continuously written to and you need to use delays.
    Reading the BUSY flag really needs to be done for each byte transferred, so it may not help much at all.
    Last edited by tumbleweed; - 5th June 2016 at 14:26.

  7. #7
    Join Date
    Dec 2012
    Location
    Türkiye
    Posts
    103


    Did you find this post helpful? Yes | No

    Default Re: OLED Display Noise problem

    Quote Originally Posted by tumbleweed View Post
    Usually issues with junk appearing in the display have to do with not allowing the LCD time to process commands.
    If you want to hammer the display as fast as possible then you might try reading the BUSY status flag between operations.

    Try this and see if it gets any better (untested, so beware)...
    Code:
    '-------------------------------------------------------------------------------
    define OSC 4
    OSCCON=%01101010    'OSC is @ 4 MHZ
    
    '------------- LCD DEFINES ------------------------
    DEFINE LCD_DREG PORTB   'LCD data port 
    DEFINE LCD_DBIT 4       'LCD data starting bit 0 or 4 
    
    DEFINE LCD_RSREG PORTA  'LCD register select port 
    DEFINE LCD_RSBIT 7      'LCD register select bit
    
    DEFINE LCD_RWREG PORTA  'LCD read/write port
    DEFINE LCD_RWBIT 0      'LCD read/write pin bit  
    
    DEFINE LCD_EREG PORTA   'LCD enable port 
    DEFINE LCD_EBIT 6       'LCD enable bit
    
    DEFINE LCD_BITS 4       'LCD bus size 4 or 8 
    DEFINE LCD_LINES 2      'Number lines on LCD
    
    DEFINE LCD_COMMANDUS 6200   'command delay time (in us) - clear display requires 6.2ms
    DEFINE LCD_DATAUS 50        'data delay time (in us)
    
    '-------------------------------------------------------------------------------
    PORTA = %00000000
    PORTB = %00000000
    TRISA = %00000000
    TRISB = %00000000 
    ANSELA = %00000
    ANSELB = %00000000
    'ADCON0=%00000001
    'ADCON1=%10110000
    'OPTION_REG.7=0     
    '-------------------------------------------------------------------------------
    
    pause 500           'wait for display powerup
                            
    lcdout $FE,$28      'function set 4-bit mode
    call lcd_busy_wait
    lcdout $FE,$08      'display off
    call lcd_busy_wait
    lcdout $FE,$06      'entry mode set
    call lcd_busy_wait
    lcdout $FE,$17      'char mode + internal power
    call lcd_busy_wait
    lcdout $FE,$01      'clear display (requires long delay)
    call lcd_busy_wait
    lcdout $FE,$02      'home
    call lcd_busy_wait
    lcdout $FE,$0C      'display on
     
    MAIN:
        call lcd_busy_wait
        lcdout $FE,$80,"BU BiR DENEMEDiR"
        call lcd_busy_wait
        lcdout $FE,$C0,"  iKiNCi SATIR  "
    goto main
    
    'sub lcd_busy_wait
    'read lcd busy flag until busy=0
    WAITST CON 1        ' delay 1us
    busy var bit
    lcd_busy_wait:
        busy = 1
        TRISB = TRISB or $F0        'set PORTB D4-D7 to inputs
        @ bcf LCD_RSREG, LCD_RSBIT  'RS=0
        @ bsf LCD_RWREG, LCD_RWBIT  'RW=1
        pauseus WAITST
    
        'wait for lcd busy flag (D7) to be low
        do while (busy = 1)
            @ bsf LCD_EREG, LCD_EBIT    'EN=1
            pauseus WAITST
            busy = PORTB.7              'read busy bit (bit 7 in upper nibble)
            @ bcf LCD_EREG, LCD_EBIT    'EN=0
            pauseus WAITST
            ' dummy read of lower nibble
            @ bsf LCD_EREG, LCD_EBIT    'EN=1
            pauseus WAITST
            @ bcf LCD_EREG, LCD_EBIT    'EN=0
            pauseus WAITST
        loop
    
        TRISB = TRISB and not $F0       'set PORTB D4-D7 back to outputs
        @ bcf LCD_RWREG, LCD_RWBIT      'RW=0
     return
    You might find that you need to split the cursor position commands and data...
    Code:
        call lcd_busy_wait
        lcdout $FE,$80        'move cursor
        call lcd_busy_wait
        lcdout "BU BiR DENEMEDiR"   'send data
    Even with doing things like this some displays just don't like being continuously written to and you need to use delays.
    Reading the BUSY flag really needs to be done for each byte transferred, so it may not help much at all.
    Thanks for your great effort but now it doesn't show anything on the display ..
    - Ipsa scientia potestas est -

Similar Threads

  1. Winstar OLED Display Problem with lcdout comands
    By bubbleless in forum mel PIC BASIC Pro
    Replies: 32
    Last Post: - 31st December 2019, 05:53
  2. Help With OLED Display / 128X64 SSD1306
    By Denner in forum General
    Replies: 6
    Last Post: - 25th May 2013, 15:40
  3. Problem with GOSUB/GOTO and Newhaven OLED question
    By Christopher4187 in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 12th April 2013, 10:24
  4. Pretty Sure a Noise Problem
    By Tobias in forum General
    Replies: 3
    Last Post: - 10th December 2009, 00:46
  5. OLED 128x128 color display
    By Ron Marcus in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 21st May 2007, 01:45

Members who have read this thread : 0

You do not have permission to view the list of names.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts