PIC 16F628A en 128*32 LCD

Bavelt

Golden Member

Er staan al veel topics over LCD en PIC's. Toch kon ik niet vinden wat ik zoek:

Ik heb een 128*32 LCT-tje. (12832 SSD1306). Bevat slechts 4 aansluitingen:
GND, VCC, SCL, SDA.

Is zo'n ding te gebruiken i.c.m. met een PIC16F628A om wat mee te experimenteren? Waar zou ik een aansluitschema kunnen vinden?

Fouten zijn het bewijs dat je het probeert..

GND gaat naar massa.
VCC naar voeding (5 Volt of 3V3 ?)
SCL en SDA naar de I2C pinnen. Zie datasheet van de PIC16F628A.

En dan nog even software zoeken...

Ik denk dat je in een 628a teweinig ram hebt zitten, vandaar dat ze een 18F26K22 gebruiken want dit is een grafisch display waar de characters niet in rom zitten zoals bij een gewoon display maar in ram moet opslaan.

LDmicro user.

MGP helemaal correct, je hebt voor de normale 64x128 OLED display 1024 bytes alleen al voor de display nodig (64*128/8). Deze 32x128 display's zijn zodanig bedraad dat alleen de oneven lijnen worden weergegeven op de display.
Daar ik een lui mens ben, heb ik voor deze "halve" displays (in de software die Henry S. aangeeft) toch nog gewoon de 64x128 bits ruimte (dus 1024bytes) gebruikt.

Ergo dit gaat met deze software nooit werken als er niet ruim 1K RAM in de PIC aanwezig is.

Arco

Special Member

Je kunt wel 'iets' laten zien met een 628a, maar wel beperkt. (geen hele karakterset, die neemt de meeste ruimte in)
Voor tekst met een 6x8 karakterset kost het ongeveer 4k flash:

https://www.uploadarchief.net/files/download/oled1_3b.jpg

Dit is een 1.3" SPI versie (zelfde controller). I2C gebruik ik nooit voor grafisch, is erg traag.
Wel weer hetzelfde probleem: de 628a heeft geen MSSP (I2C en SPI)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Mooi gemaakt maar 4k flash? moet dat geen 2K zijn een 628a heeft er maar 3.5k en daar moet uw programma nog bij.

[Bericht gewijzigd door MGP op zondag 29 september 2019 16:00:28 (40%)

LDmicro user.
Arco

Special Member

Nee, was een 24F pic. Daarom zeg ik ook dat een 628a beperkt is, en dat dit daar niet in past. (je kunt een kleinere tabel met maar een paar letters maken)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ok sorry, ik had uit uw antwoord begrepen dat de foto bij de 16F628a hoorde.

LDmicro user.
Bavelt

Golden Member

Je kunt wel 'iets' laten zien met een 628a, maar wel beperkt. (geen hele karakterset, die neemt de meeste ruimte in)
Voor tekst met een 6x8 karakterset kost het ongeveer 4k flash:

https://www.uploadarchief.net/files/download/oled1_3b.jpg

Dit is een 1.3" SPI versie (zelfde controller). I2C gebruik ik nooit voor grafisch, is erg traag.
Wel weer hetzelfde probleem: de 628a heeft geen MSSP (I2C en SPI)

Ik heb ook zo'n displaytje laten komen. Maar als het ding voor I2C is, kan je het dan ook anders doen?

Ik heb je (Arco) test programma gezien voor een PIC24. Je gebruikt hiervoor LCD_Write. Dat is geen I2C bij mijn weten.

De PIC16F887 zou het dan ook moeten kunnen lijkt me?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De functies staan er allemaal bij: https://www.circuitsonline.net/forum/view/message/1651024#1651024
(moet misschien voor de 8 bitters een beetje aangepast worden)

Grootste vraag is of 't in het geheugen van een 887 past. (grafisch display 'vreet' geheugen, voor bijv. de character bitmap)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Tja,
Ik heb het programma gemodificeerd voor zover ik kon naar de 887.

De 887 heeft geen F-Poort. Daarvoor koos ik ipv F.5 de C.5.
Ook heeft hij geen PoortD.9, daarvoor koos ik D.7.

Vervolgens nam ik aan dat van het LCD-tje de CLK naar poort C.5 gaat
(Data/Command) en de SDA naar D.7 (display Select).
Is dat wel juist?

Vervolgens kent de 887 de Unlock en PPS-en niet uit de INIT-App subroutine.
Als ik die als commentaar markeer gaat de vertaling goed.

Het schrijven met de Pickit3 geeft de error "Programming failed at memory address 0x000000".

Kortom er gaat van alles fout.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Laat de vorige melding maar.
Ik heb het al gezien; Het programma van Arco gebruikt een heel andere module met protocol. (a la max7219).

Wat ik hier heb is een I2C display-tje met enkel SDA en CLK.

Deze dus:

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik gebruik hetzelfde display, maar met SPI interface. (de SSD1306 op het display kan in principe beide, maar print is dan wel anders)

[Bericht gewijzigd door Arco op donderdag 14 november 2019 01:25:46 (13%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik heb hem inmiddels op de Arduino aan de praat; het device is dus goed.
Dan gaat het met MikroBasic ook wel lukken. Wel zien dat ik een datasheet van dat ding krijg.

Wel grappig hoe scherp een dergelijk klein schermpje alles nog weergeeft.
Niet te geloven. En dat voor een paar dubbeltjes...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

De werkelijkheid is nog scherper dan op de foto...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik gebruik ze voor instellingen aan te passen, heel handig...
Voor dagelijks gebruik iets aan de kleine kant. Jammer dat ze eigenlijk maar in 3 (kleine) maten bestaan: 0.92", 0.96", en 1.3"...
(en de kleurenversie in 0.95")

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Toch lastiger dan ik dacht om het display met MikroBasic te kunnen testen.

Ik dacht het hiermee te kunnen, maar het display doet niks.

pic basic code:

 '==============================================================================
Program Oled
'------------------------------------------------------------------------------

Sub Procedure Init_Oled()

  i2c1_Start()
  i2c1_Wr(0x3C)
  i2c1_Repeated_Start()
  i2c1_Wr(0x3C)
  i2c1_Wr(0x80)
  i2c1_Wr(0xAE)
  Delay_ms(20)
  i2c1_Wr(0x80)
  Delay_ms(20)
  i2c1_Wr(0x20)                             'Page adressing mode
  i2c1_Wr(0x10)
  i2c1_Wr(0x80)
  i2c1_Wr(0xD3)                             'Set offset to 0
  i2c1_Wr(0x00)
  i2c1_Wr(0x80)
  i2c1_Wr(0x40)                             'Set display start line 0
  i2c1_Wr(0x80)
  i2c1_Wr(0x81)
  i2c1_Wr(0xFF)                             'Set contrast to full
  i2c1_Wr(0x80)
  i2c1_Wr(0xA4)                             'display on continue
  i2c1_Wr(0x80)
  i2c1_Wr(0xA6)                             '$A6=NORMAL MODE;$A7=INVERSE MODE
  i2c1_Wr(0x80)
  i2c1_Wr(0xA1)                             'set column 127 as start
  i2c1_Wr(0x80)
  i2c1_Wr(0xC8)                             'Flip display vertically ****
  i2c1_Wr(0x80)
  i2c1_Wr(0xAF)                             'Display On
  Delay_ms(10)
  i2c1_Stop()
End Sub

'==============================================================================
main:

'==============================================================================
  ANSELB = 0                                    'All output/digital
  TRISA  = 1                                    'PortA Input
  TRISB  = 0
  latb.2 = 0
  OSCCON = %11110000                            '32MHz internal
  i2c1_init(100000)                             'Init i2c port 100kHz
  
 INIT_Oled()
 
  'Karakter wegschrijven
  i2c1_Start()
  i2c1_Wr(0x3C)
  i2c1_Wr(0x00)
  i2c1_Repeated_Start()
  i2c1_Wr(0x3C)
  i2c1_Wr(0x40)                           '$40 = Data    $80 = Command
  i2c1_Wr(0xAA)
  i2c1_Stop()

While True
Wend

end. 
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Helaas,

De i2c versie heb ik (gelukkig) niet... ;) (is tot 50x trager als de SPI versie, en dat wil je liever niet bij een grafisch display...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Had ik gelezen.Maar ik wilde wat ervaring opdoen met programmeren, I2C devices, etc.
Met de RTC lukte het.

Ik heb naar de datasheet gekeken en wat andere voorbeelden erbij gepakt, Maar het is vrijwel allemaal C en Arduino wat de klok slaat.
Ik heb nog geen voorbeeld in de combinatie MickoBasic en een I2C Oled gevonden.

Fouten zijn het bewijs dat je het probeert..

Jammer dat je niets meer met PicBasic doet want hier staat een SSD1306 library voor zowel I2C als SPI gebruik.

Arco

Special Member

Sourcecode zit daarbij, dus simpel om te zetten...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Sourcecode zit daarbij, dus simpel om te zetten...

Was het maar zo simpel... ;(

PicBasic werkt met Hbusout; met de I2C van de Klok (DS3231) kreeg ik dat ondanks vele posts maar niet aan de praat, een van de redenen om te switchen naar MikroBasic. Die werkt met de I2C Library zoals Arco me liet zien.

Ik had daarom als basis het werkende programma met de I2C-Klok genomen en de datasheet van de OLED I2c 128 *64 erbij gepakt.

Als je kijkt naar de datasheet van de 1306, dan staat er:

De Commands zijn

Dus dacht ik in mijn onschuld dat onderstaand klein programmaatje zou moeten werken.
Maar ongetwijfeld maak ik ergens een denkfout; de display doet helemaal niks (ik had verwacht dat die in ieder geval aan zou gaan).

pic basic code:

 '==============================================================================
Program Oled
'------------------------------------------------------------------------------
'==============================================================================
main:

'==============================================================================
  ANSELB = 0                                    'All output/digital
  TRISB  = 0

  OSCCON = %11110000                            '32MHz internal
  i2c1_init(100000)                             'Init i2c port 100kHz

 
                                'Turn Display on
  i2c1_Start()
  i2c1_Wr(%01111000)            'Slave address + write
  i2c1_Repeated_Start()
  i2c1_Wr(%01111000)            'Slave address + write
  i2c1_Wr(%01000000)            'Command
  i2c1_Wr(%10100101)            'Display On
  i2c1_Stop()

While True
Wend

end. 

Wat gaat hier nu niet goed?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Jammer dat je niets meer met PicBasic doet want hier staat een SSD1306 library voor zowel I2C als SPI gebruik.

Ik wilde dit even proberen door PICBasic weer even te installeren. Maar voor dit type MC (en vele andere, ook de kleinere) moet je je registreren.

Blijkbaar is er geen trial version om dit uit te proberen.

Fouten zijn het bewijs dat je het probeert..