Vreemd gedrag OLED display

Bavelt

Golden Member

Ik heb de datasheet van de chip SSD1306 op het Oled Display nog eens goed bekeken .

In tegenstelling tot wat ik dacht is de normale situatie rond de schermorientatie:

pic basic code:


'Lcd_WrCmd(0xA0)                                 'Set segment remap rotation to right
'Lcd_WrCmd(0xC0)                                 'Common output scan 

Ik heb echter staan: (overgenomen uit een voorbeeld)

pic basic code:


'Lcd_WrCmd(0xA1)                                 'Set segment remap rotation to left
'Lcd_WrCmd(0xC8)                                 'Common output scan 

Beide commando's kunnen, maar de eerste is de standaard bij reset.
Dus denk ik dat het beter is die eerste te kiezen. Blijkbaar komt de display op één of andere manier in een reset situatie terecht.

Het enige wat ik dan hoef te doen is het displaytje om te draaien...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Met een beetje fantasie kan ik het allemaal nog verklaren ook;

Het relais zit op dezelfde voeding als de chip en de display. Als deze wordt ingeschakeld vanuit de PIC, ontstaat er even een kleine spanningspiek op de voeding.
(Kan je aan het powerledje zien en duidelijk te meten op de scope).

De PIC overleeft dat, echter de SSD1306 zou hierdoor wel eens kunnen worden gereset (het ding werkt eigenlijk ook op 3V3, zit een level shifter tussen van 5V naar 3V3).

Eenmaal gereset ontstaat dan de situatie zoals geschetst (spiegelbeeld horizontaal en verticaal).

Kan dit een beetje kloppen?

Fouten zijn het bewijs dat je het probeert..

Ja. Een alternatief is dat de chip de "effe minder" precies als een "zet rotatie-op-nul" leest.

Als je weet dat het met het relais te maken heeft, moet je even een complete verversing van het schermpje triggeren (De inhoud is kennelijk nauwelijks aangetast, maar kan wel veranderd zijn!) Inclusief dus "rotatie instellen". Als je toch iedere zoveel seconden (om inbranden te voorkomen :-) ) de scherminhoud ververst is het instellen van de orientatie misschien voldoende.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Bavelt

Golden Member

Ik kan eens kijken hoe ik dat het beste kan inbouwen. De rotatie is opgelost, maar nu verschuift alles een regel omlaag bij inschakelen van het relais.

Het blijft echter altijd wel wat 'geklier' met een in-en uit schakelend relais en de inschakelpulsen. Ik heb al een 'blusdiode' over de spoel gezet.

Maar toch blijf je een piek zien bij in-en uitschakelen. Oplossing zou kunnen zijn een aparte voeding voor het relais. Dat lijkt me wat overdreven.
Misschien een hogere voeding en de voeding voor de PIC via een 7905 op 5V zetten in de hoop dat de inschakelpuls daar niet komt. Maar misschien blijft de 'pief' dan toch.

Zou ik dat wellicht op een andere manier kunnen elimineren? Er wordt toch wel vaker gebruik gemaakt van een relais in schakelingen met één voeding?

Fouten zijn het bewijs dat je het probeert..
KGE

Golden Member

Op 17 januari 2023 21:40:50 schreef Arco:
RPi is wel heeel overdreven... (zoiets als een muis verdelgen met een atoombom... :) )
Alleen een paar kleurenbandjes kost weinig geheugen, maar je hebt er normaliter ook weinig aan...

Filmpje van Breakout pastte niet in het bericht helaas maar geeft wel aan dat je geen vele kilobytes nodig hebt om iets op een kleuren OLED/LCD te toveren.

Arco

Special Member

Pak het bij de bron aan: relais en logica scheiden... ;)
Waarom een level shifter? (is ook een potentieele storingsbron, cpu en oled kunnen beide toch op 3.3v werken?

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

Golden Member

Op 18 januari 2023 17:15:20 schreef Arco:
Pak het bij de bron aan: relais en logica scheiden... ;)
Waarom een level shifter? (is ook een potentieele storingsbron, cpu en oled kunnen beide toch op 3.3v werken?

Relais en logica scheiden betekent dus 2 voedingen?

De level shifter zit vastgebakken op het printje met SSD1306 en het Oled display.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Als je beiden alleen scheidt met een rf spoeltje en extra elco voor beiden dan scheelt dat al.
Ik gebruik nooit 5v relais, maar 12v (of hoger), dan is de stroom een stuk lager en ik heb bijna altijd een 230v -> 12v -> 3.3v voeding.

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

Golden Member

Wat voor waarde zou zo'n rf spoeltje moeten hebben?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Standaard bead (zoals de BL01 of BLM18 van Murata), of 20 windingen draad op een 1M, ¼w weerstand. Meestal iets van 1uH.

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

Golden Member

Relais en logica scheiden betekent dus 2 voedingen?

Niet persee. In ieder geval de massa aansluiting zoveel mogelijk gescheiden houden en zo dicht mogelijk bij de voeding pas de massa's aan elkaar knopen. Meeste storing kan namelijk via de massa. De massa is niet altijd 0V maar die kan opgetild worden en dat vind elektronika vaak erger dan dat de spanning even iets lager is.

Het zelfde voor de + zijde.
Extra condensator toevoegen aan de CPU kant help ook enorm. Die condensator vangt dan grote spanningspieken of dippen op.
Vaak reset elektronica omdat de spanning op de reset ingang net even voor heel kort iets te laag is geworden.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Op 17 januari 2023 21:40:50 schreef Arco:
RPi is wel heeel overdreven... (zoiets als een muis verdelgen met een atoombom... :) )

Ik denk dat jij in verwarring was met "raspberry pi 4": Een Linux computer. Da's overkill. Maar werkt wel. :-)

Hij zei raspberry pi pico. Dat is een ontwikkelbordje gebaseerd op de RP2040 processor (en naast externe SPI flash en een 3.3V DCDC converter verder niets op het printje.)

De processor is ongeveer 2x goedkoper dan de ATMEGA328. Maar heeft wel 130x meer RAM, en 64x meer flash geheugen (op de pico. Ik zelf monteer meestal 4Mbyte, de 2Mbyte flash chips zijn nauwelijks goedkoper). Oh en hij is 32 bit, dual core en 6x snellere clock.

[Bericht gewijzigd door rew op woensdag 18 januari 2023 21:55:43 (16%)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Bavelt

Golden Member

Op 18 januari 2023 15:22:28 schreef rew:
Ja. Een alternatief is dat de chip de "effe minder" precies als een "zet rotatie-op-nul" leest.

Als je weet dat het met het relais te maken heeft, moet je even een complete verversing van het schermpje triggeren (De inhoud is kennelijk nauwelijks aangetast, maar kan wel veranderd zijn!) Inclusief dus "rotatie instellen". Als je toch iedere zoveel seconden (om inbranden te voorkomen :-) ) de scherminhoud ververst is het instellen van de orientatie misschien voldoende.

Het was een beetje kiezen tussen wat kwaden..De oorzaak is dat er storingspulsen op de voeding komen door een schakelend relais. Daar heeft het displaytje last van.
Ik heb inderdaad links en rechts ontkoppel-condensatortjes aangebracht, spoeltjes van 1uH in de VCC leiding opgenomen, etc.

Maar de beste oplossing in dit geval was softwarematig. Omdat ik toch al veel schrijf naar het display, kan die INIT er ook nog wel bij. Qua tijd merk je daar niks van.

Het display herstelt onmiddellijk na een verstoring. En hij blijft nu goed.. :)

Vreemd punt wat ik wel tegen kwam bij die SSD1306, is dat wanneer je de RES-pin laag maakt (=Reset), het ding niet meer aan de praat komt als je RES weer hoog maakt. Dan zul je echt de spanning er even af moeten halen en er weer op zetten.
Ik gebruik dit dus ook niet.

Fouten zijn het bewijs dat je het probeert..

Ik ben er tijdens het debuggen van dit ding er achter gekomen dat er twee reset lijnen waren. Daar bleek het uiteindelijk niet aan te liggen. Maar ik verwacht dat een reset lijn redelijk lomp het ding reset en de reset weer hoog moet dat ongedaan maken. Wat er bij jou precies mis gaat bij de "reinitialize na reset" kan ik vanaf hier niet zeggen, maar de diagnose: "Na een reset doet de SSD1306 het niet meer" is niet correct. Het zal iets zijn als "Bavelt doet iets niet goed waardoor hij de SSD1306 niet meer aan de praat krijgt na een reset".

"F*** it, zo werkt het ook" is een prima strategie om sneller tot resultaten te komen, dus ik keur het niet af om het zo te laten, maar als je je durft te realiseren dat je toch iets niet goed doet na de reset dan kom je WEL tot een resultaat als die alternatieve oplossing NIET mogelijk is.

Wacht je lang genoeg na de reset? Uit m'n hoofd staat er een belachelijk lange "wacht met het sturen van het eerste commando" in het datasheet. 50 of 500 ms of zo.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Bavelt

Golden Member

Ik realiseer me zeker dat mijn 'oplossing' een symptoombestrijding is en niet een echte oplosing.

Maar op een gegeven moment moet je toch wat.. :)

Het resetten gebeurt door

RES = 0
Delay_Ms(500)
RES = 1

Daar kun je toch niet veel aan fout doen lijkt me.

Na deze reset doe ik dezelfde INIT als bij start:

pic basic code:

'===============================================================================
Sub Procedure Display_Init()
'===============================================================================
  Lcd_WrCmd(0xAE)                                 'Turn OLED panel off
  Lcd_WrCmd(0xA8)                                 'Multiplex ratio set to
  Lcd_WrCmd(0x3F)                                 '63
  Lcd_WrCmd(0xD3)                                 'Display offset RAM counter
  Lcd_WrCmd(0x00)                                 'none
  Lcd_WrCmd(0x40)                                 'Start line address
  Lcd_WrCmd(0xA0)                                 'Set segment remap rotation to right
  Lcd_WrCmd(0xC0)                                 'Common output scan direction  
  Lcd_WrCmd(0xDA)                                 'Common signals pad
  Lcd_WrCmd(0x12)                                 'value
  Lcd_WrCmd(0x81)                                 'Contrast control
  Lcd_WrCmd(0xFF)                                 'value
  Lcd_WrCmd(0xA4)
  Lcd_WrCmd(0xA6)                                 'Normal display
  Lcd_WrCmd(0xD5)                                 'Clock ratio:oscillator frequency
  Lcd_WrCmd(0x80)                                 'oooo:rrrr
  Lcd_WrCmd(0x8D)
  Lcd_WrCmd(0x14)
  Lcd_WrCmd(0x00)                                 'Set lower column address
  Lcd_WrCmd(0x10)                                 'Set higher column address
  Lcd_WrCmd(0xD9)                                 '15 clocks, discharge 1 clock
  Lcd_WrCmd(0xF1)                                 'dddd:pppp
  Lcd_WrCmd(0xDB)                                 'Common output voltage
  Lcd_WrCmd(0x40)                                 'level
  Lcd_WrCmd(0x20)                                 'Addressing mode
  Lcd_WrCmd(0x02)                                 'value
  Lcd_WrCmd(0xAF)                                 'Turn OLED panel on
End Sub

Maar die reset heeft het ding gedoofd. Na spanning er af en er weer op gaat hij  weer

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Meestal komt dit soort storingen door verkeerd aangelegde voeding. + en Gnd van relais en micro moeten direct naar de voeding als 'ster', nooit doorlussen.
Resetpuls zou moeten werken, 3uS is voldoende. (alles moet dan wel opnieuw ingesteld...)

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

Golden Member

Op 19 januari 2023 13:15:14 schreef Arco:
Meestal komt dit soort storingen door verkeerd aangelegde voeding. + en Gnd van relais en micro moeten direct naar de voeding als 'ster', nooit doorlussen.
Resetpuls zou moeten werken, 3uS is voldoende. (alles moet dan wel opnieuw ingesteld...)

[bijlage]

Ik had dit inderdaad ook gelezen in de datasheet. En ik liet

pic basic code:


RES = 0
Delay_Ms (500)
RES = 1

daarom ook volgen door Display_Init() om alles te zetten zoals het moet.

Maar dat werkt dus niet. Ik kan wel eens een apart projectje maken om dit eens grondig uit te testen.

Ondertussen heb ik te vroeg gejuicht: na een nachtje draaien en x keer het relais aan-en uit gegaan, is de display weer op tilt geslagen. Weg is de tekst en dit staat er nu:

Het patroon lijkt me 'te mooi' voor rommel, je zou haast zeggen dat het geprogrammeerd is. Maar dat is niet zo.

Dat van die voeding en massa kan ik nog gaan proberen. ik heb alles op een breadboard zitten, maar kan daar wel een eigen GND creeren.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Het probleem met de RES lijkt opgelost:

Het Commando RES moet ook worden voorafgegaan door de chip select te setten:

pic basic code:


RES = 0
Delay_Ms(500)
RES = 1

Moet zijn:

pic basic code:


C_S = 0
RES = 0
Delay_Ms(500)
C_S = 1
C_S = 0  
RES = 1
Delay_Ms(500)
Display_Init()
C_S = 1
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Zou het nog een goed idee zijn om over te gaan naar een 12V voeding, en dan twee keer een 7905 Voltage regulator te nemen: eentje voor het relais en de andere voor de logica? Dan is het wel gescheiden lijkt me.

Fouten zijn het bewijs dat je het probeert..
benleentje

Golden Member

Er is al een aantal keer gezegd om de gnd goed gescheiden te houden en die maar op 1 punt aan elkaar te knopen via een ster punt, waarop van jouw kant nog geen reactie is gekomen.
Als de hele gnd opbouw slecht is uitgevoerd help 2x een 7805 regelaar nemen ook niet omdat je dan ook daar de GND weer aan elkaar moet maken. Het zal wel iets helpen en waarschijnlijk je probleem oplossen maar het is ook weer symptoom bestrijding.

[Bericht gewijzigd door benleentje op donderdag 19 januari 2023 18:11:18 (15%)

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
Bavelt

Golden Member

Dat had ik wel gedaan, zie post:

Dat van die voeding en massa kan ik nog gaan proberen. ik heb alles op een breadboard zitten, maar kan daar wel een eigen GND creeren.

Dat bood echter nog geen soelaas.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb de schakeling opnieuw opgebouwd. Nu gekozen voor een 12V voeding. Vanuit de voeding twee LM7805 regulators zodat ik twee keer een 5V heb. Eentje gebruik ik voor de logica, de andere voor het relais.
De aarde is als een ster aangelegd, alles naar één punt toe dus geen doorlussen.

Toch wordt het displaytje verstoord en schiet af en toe in de stress. Het zit in een ruimte waar veel dingen aanspringen (pompen van verwarming, koelkast, wasmachine, droger, waterontharder, TL buizen etc).

M.a.w. een redelijk storingsrijke omgeving.

Met een button als test kan ik de reset en Init aanroepen en het displaytje is dan weer normaal (voor de time being).

Toch blijven het storings gevoelige dingen en is het lastig het stabiel te krijgen.
De voeding zal zijn rol ook wel spelen. Ik kan anders wel eens testen door de schakeling op een 5V accu aan te sluiten en eens kijken of de voeding van invloed is.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Zit er een 100nF aan de resetpin van het display? (en ook over de voeding van het display?)

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

Golden Member

Op 20 januari 2023 14:00:01 schreef Arco:
Zit er een 100nF aan de resetpin van het display? (en ook over de voeding van het display?)

Wel over de voeding (heel dichtbij). Niet over de RES pin.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb een tweede (kopie) schakeling gemaakt, nu echter met een I2C Oledje ipv een SPI.

Om eens te kijken hoe die reageert..
Die heeft immers geen Chip Select, RES en Data Command.

Het valt me op dat deze I2C Oled een stuk trager is. (de regels bouwen traag op met praktische dezelfde routine als uit de SPI variant)

Zou dat kunnen dat die zoveel trager zijn?

Fouten zijn het bewijs dat je het probeert..