| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| berel 
 
 
 Joined: 20 Oct 2011
 Posts: 15
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jun 24, 2020 10:07 am |   |  
				| 
 |  
				| Hello Ttelmah, thanks for adding additional explanations  !!!
 It makes fun using the OLEDS, even the small 128x32 one, also for debugging very helpful.
 |  |  
		|  |  
		| MikeW 
 
 
 Joined: 15 Sep 2003
 Posts: 185
 Location: Warrington UK
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Jun 07, 2021 9:38 am |   |  
				| 
 |  
				| @Ttelmah 
 I tried the revised bargraph routine.
 When ctr is =100, I still get a blank at the end.
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jun 09, 2021 6:07 am |   |  
				| 
 |  
				| You realise that you need both the code change, and the alteration to the font used?. The right hand closing character has to be changed to make it
 work.
 |  |  
		|  |  
		| MikeW 
 
 
 Joined: 15 Sep 2003
 Posts: 185
 Location: Warrington UK
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Jun 13, 2021 8:52 am |   |  
				| 
 |  
				| @Ttelmah 
 That fixed it, thank you.
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Jun 14, 2021 11:02 pm |   |  
				| 
 |  
				| Goodly.   
 Have fun
 |  |  
		|  |  
		| blowtorch 
 
 
 Joined: 11 Jun 2013
 Posts: 35
 Location: Cape Town
 
 
			    
 
 | 
			
				| 128 x 32 changes |  
				|  Posted: Fri Aug 27, 2021 12:49 pm |   |  
				| 
 |  
				| Hi Ttelmah 
 Thank you for your great library - I have it working with a tiny 128 x 32 display.  The changes required for this was to modify the value in the init_sequence for the command S_SETCOMPINS.  This is command 0xDA.  Change the value (next byte) from 0x12 to 0x02.  If this is not done the vertical spacing is off.
 
 And of course the define S_LCDHEIGHT should be changed to 32.
 
 Thanks again for all your work and willingness to share.
 |  |  
		|  |  
		| hsogukpinar 
 
 
 Joined: 20 Sep 2021
 Posts: 8
 
 
 
			      
 
 | 
			
				| ssd1309 library code |  
				|  Posted: Tue Sep 21, 2021 12:12 am |   |  
				| 
 |  
				|  	  | Ttelmah wrote: |  	  | As an update, I've just been running this with the SSD1309 (gives larger displays like 2.4"), and it runs fine. Only thing that gave problems was I found these needed a reset signal to stay low for a little while after power was applied to work reliably (ended up using a capacitor on the RES line), for reliable operation. Because this takes time, I had to pause for longer at boot. With this done works well.  | 
 
 Can you please share the SSD 1309 display code
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Sep 23, 2021 5:03 am |   |  
				| 
 |  
				| It is the same code. Provided you have the SSD1309 wired for I2C comms, and with the caveat
 about needing a reset to the chip (either a resistive/diode/capacitive reset
 to the controller chip or another PIC line to operate the reset signal).
 Obviously you need to pause at the start till the reset is done, and then
 about another 20mSec.
 |  |  
		|  |  
		| MikeW 
 
 
 Joined: 15 Sep 2003
 Posts: 185
 Location: Warrington UK
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Aug 24, 2022 8:54 am |   |  
				| 
 |  
				| @hsogukpinar 
 Just bought a 1309 display.
 
 What value of reset capacitor would you suggest ?
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Sep 07, 2022 6:18 am |   |  
				| 
 |  
				| Not who you were asking. 
 Look at figure 8.16 in the data sheet.
 Note the level on RES can be high or low to the left. The point is it
 must not go up to high till at least 3uSec after Vdd, and Vcc must
 rise after this.
 Some fiddling with capacitor values needed, depending on your supply.
 |  |  
		|  |  
		| paulie2907 
 
 
 Joined: 25 Jun 2020
 Posts: 5
 
 
 
			    
 
 | 
			
				| height problem |  
				|  Posted: Mon Mar 13, 2023 8:17 pm |   |  
				| 
 |  
				| Ttelmah : I use your metod, it work with some edit. But bottom side is showing some pixel and  Y adreses not work for me (work but not idealy), i can´t find proble. ... look 
 driver set (for check)
 
  	  | Code: |  	  | //directly from the data sheet - commands - not all used #define S_EXTERNALVCC            0x01
 #define S_SWITCHCAPVCC           0x02
 #define S_SETLOWCOLUMN           0x00
 #define S_SETHIGHCOLUMN          0x10
 #define S_MEMORYMODE             0x20
 #define S_COLUMNADDR             0x21
 #define S_PAGEADDR               0x22
 #define S_SETSTARTLINE           0x40
 #define S_ROWADDRESS             0xB0//----------------
 #define S_SETCONTRAST            0x81
 #define S_CHARGEPUMP             0x8D
 #define S_SEGREMAP               0xA0//A0
 #define S_DISPLAYALLON_RESUME    0xA4
 #define S_DISPLAYALLON           0xA5
 #define S_NORMALDISPLAY          0xA6
 #define S_INVERTDISPLAY          0xA7
 #define S_SETMULTIPLEX           0xA8
 #define S_DISPLAYOFF             0xAE
 #define S_DISPLAYON              0xAF
 #define S_COMSCANINC             0xC0
 #define S_COMSCANDEC             0xC8
 #define S_SETDISPLAYOFFSET       0xD3
 #define S_SETCOMPINS             0xDA
 #define S_SETVCOMDETECT          0xDB
 #define S_SETDISPLAYCLOCKDIV     0xD5
 #define S_SETPRECHARGE           0xD9
 #define DIV_RATIO                0xA0//recommended ratio
 #define MULTIPLEX                0xA0 //and multiplex
 #define INT_VCC                  0x14
 
 
 ROM BYTE init_sequence[] = S_DISPLAYOFF,
 S_SETDISPLAYCLOCKDIV,
 DIV_RATIO,
 S_SETMULTIPLEX,
 MULTIPLEX,
 S_SETDISPLAYOFFSET,
 0,                                   // no offset
 S_SETSTARTLINE,
 S_CHARGEPUMP,
 INT_VCC,                             // using internal VCC
 S_MEMORYMODE,                        //Since byte is vertical writing column by column
 0,                                   // default horizontal addressing
 (S_SEGREMAP | 0x01),                  // rotate screen 180
 S_COMSCANDEC,
 S_SETCOMPINS,
 0x12,
 S_SETCONTRAST,
 0x8F,                                //experiment.... 0xCf for 1306/org :  0XEF
 S_SETPRECHARGE,
 0xF1,
 S_SETVCOMDETECT,
 0x40,
 S_DISPLAYALLON_RESUME,
 S_NORMALDISPLAY,
 S_DISPLAYON;                         //switch on OLED
 | 
 
 main
 
  	  | Code: |  	  | //Inicializace Displaye
 void Display_init(void)
 {
 output_high(POWER_LCD);                               //Zapne napájení pro LCD
 delay_ms(200);
 output_low(SSD1306_RST);                              //Resetuje LCD (logická 0)
 delay_ms(200);
 output_high(SSD1306_RST);                             //Vypne reset (logická 1)
 delay_ms(200);
 Display_Backlight(2);                                 //Nastaví MAX podsvícení
 OLED_commands(init_sequence,sizeof(init_sequence));   // Sekvence příkazů z knihovny
 }
 
 void main(void)
 {
 // Zabliká LED při zapnutí
 for(int8 q=0; ;q<21; q++)
 {
 delay_ms(50);
 output_toggle(LED);
 }
 output_low(LED);
 Display_init();
 
 int8 ctr;
 char text[50];
 
 //First try some text
 OLED_CLS(); //clear the physical screen
 set=true;
 clear_window(); //clear the window buffer
 OLED_gotoxy(0,0);
 strcpy(text,"SERVICE MODE - Test");
 size=NORMAL;
 OLED_text(text,strlen(text));
 delay_ms(5000);
 
 //now some graphics
 line(0,1,128,1); //draw line in window
 line(0,3,128,3); //draw line in window
 line(0,5,128,5); //draw line in window
 line(0,7,128,7); //draw line in window
 line(0,9,128,9); //draw line in window
 line(0,11,128,11); //draw line in window
 line(0,13,128,13); //draw line in window
 line(0,31,128,31); //draw line in window
 //line(10,10,61,0);//and a second
 //now write the window to the screen
 draw_window(0,0); //at 64 pixels across and top of screen
 
 //delay_ms(5000);
 //set=FALSE; //inverted drawing
 //clear_window(); //clear the window to fully set!
 //line(0,0,60,15);
 //line(20,10,40,10);
 //circle(24,8,8,1); //just touch the edge of the window
 //draw_window(0,4); //put this window half way down screen
 
 delay_ms(1000);
 while (TRUE)
 {
 delay_ms(1000);
 output_toggle(LED);
 }
 ; //and stop7 bez toho to stojí na nule (do odpojení baterie);
 //OSC_Enable();
 
 }
 | 
 
 I am answering based on a previous topic in my thread :
 http://www.ccsinfo.com/forum/viewtopic.php?t=59975
 
 I have this LCD : https://www.ebay.com/itm/301220791533
 
 This is image showing the problem (look on line Y adresses)
 https://www.romar-electronic.cz/3.jpg
 https://www.romar-electronic.cz/4.jpg
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Mar 14, 2023 7:29 am |   |  
				| 
 |  
				| Have you tried with #define SH1106?. This is needed for the chips that are offset a couple of bits away from the
 origin.
 |  |  
		|  |  
		| paulie2907 
 
 
 Joined: 25 Jun 2020
 Posts: 5
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Mar 14, 2023 8:06 am |   |  
				| 
 |  
				|  	  | Ttelmah wrote: |  	  | Have you tried with #define SH1106?. This is needed for the chips that are offset a couple of bits away from the
 origin.
 | 
 
 Yes i have use this define
  	  | Code: |  	  | void OLED_address(unsigned int8 x, unsigned int8 y) {
 //routine to move the memory pointers to x,y.
 //x is 0 to 127 (column), y (row) is 0 to 7 (page only)
 #ifdef SH1106
 x+=4;
 #endif
 i2c_start(SSD1306_STREAM);
 i2c_write(SSD1306_STREAM, SSDADDR); //select the display
 i2c_write(SSD1306_STREAM, COMMAND_ONLY); //we are sending command(s)
 i2c_write(SSD1306_STREAM, S_ROWADDRESS | y); //select the display row
 i2c_write(SSD1306_STREAM, S_SETLOWCOLUMN | (x & 0x0F)); //low col address
 i2c_write(SSD1306_STREAM, S_SETHIGHCOLUMN | ((x>>4) & 0x0F)); //high col address
 i2c_stop(SSD1306_STREAM);
 } //also made more efficient
 
 | 
 
 I must edit x to shift to 4
  |  |  
		|  |  
		| paulie2907 
 
 
 Joined: 25 Jun 2020
 Posts: 5
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Mar 14, 2023 3:13 pm |   |  
				| 
 |  
				| I fix "ramdomly pixel" on init display. 
 But display still only show half .
 
 On code :
  	  | Code: |  	  | line(0,0,128,0); //line UP line(0,0,0,31); //line left
 line(126,0,126,31); //line in right
 line(0,32,128,32); //line bottom
 | 
 
 But fill on display work normally. Can see on image
 
 https://www.romar-electronic.cz/5.jpg
 https://www.romar-electronic.cz/6.jpg
 
 Thanks for reply
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Mar 20, 2023 7:43 am |   |  
				| 
 |  
				| That is not how you use the define. 
 All you do is before loading the driver, have the line:
 
 #DEFINE SH1106
 
 The driver then switches the origin and calculations it does based on this.
 
 The big problem though is knowing how your chip actually relates to the
 'real' SSD and SH chips. Do you have the actual chip number, and a link
 to the data sheet for this?. Post these, and I'll see what has to be changed
 in the driver.
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |