0
\$\begingroup\$

I've been building a small handheld gaming device based around the ATTiny85 and an SSD1306 OLED screen. It's a very limited system and as such I needed to be creative about how I used the I/O pins. I asked a question for replacing the SSD1306 reset logic with passive? components.

This worked in my initial prototype and I was happy. Today I received new PCBs with a smaller, closer layout and a different power source and the reset circuit no-longer works properly.

This is the circuit in question:

schematic

simulate this circuit – Schematic created using CircuitLab

New schematic

The schematic shows the original design when I was using a 3.7v lipo cell to power it. I'n my new design, I'm using a CR2032 lithium cell and I'm wondering if that has caused the issue.

When the system is powered on 'cold' everything works fine. If I power off and then on again within about 10 seconds, the OLED doesn't get the proper reset signal and displays garbage. Pressing the reset button resets the micro controller but not the screen properly - it'll display progressively less garbage until it just goes blank on successive resets, MC still resetting fine (it has a 'startup' tone that plays, and button presses beep as expected).

As mentioned - I got the reset circuit from another question I asked, but I'm not sure I completely understand how it works. I'd really appreciate a short description of what happens when it powers on / reset button pressed.

Is my issue likely the small change in voltage? I know that when I first put together my first prototype I accidentally used the wrong resistor, putting a 1k ohm in place of the 10k ohm one and this also caused the circuit to stop working properly - Am I naive in hoping that I can tweak the resistor value to make things work again?

Things I've tried based on comments below:

  1. Added a delay to program start-up of 200ms. No Effect.
  2. Replaced 3v CR2032 with original 3.7v LIPO. No Effect.
  3. Holding a 10uF capacitor in parallel with the existing 0.1 (C1). No Effect.
  4. Bypassed D2 with a bit of wire. No Effect.

On my old prototype, holding down the reset button caused the screen to blank and reset, holding down the reset button here doesn't affect the screen at all until it's released. All I did between revisions was move pads around, connections are all the same. My multimeter appears to confirm this too. #4 though makes me wonder if there's something mechanical wrong though.

\$\endgroup\$
  • 1
    \$\begingroup\$ would you mind drawing your schematic with ground at the bottom, marked clearly as such, and Vcc at the top, the same? this is really painful to read. As for your question - the circuit just seems to diode-or the uc out and the reset switch. But the input to the OLED only gets down to 0.7V or so. In a 3V3 or 5V circuit this would be fine, but it might be a bit marginal - if you are now running from a CR2032, your supply voltage is now quite low? Try reducing the value of R1 or maybe using a schottky diode? \$\endgroup\$ – danmcb Jun 22 '18 at 20:07
  • 2
    \$\begingroup\$ @OlinLathrop I'm actually trying really hard to be as clear as I can. I've added the schematic exported from KiCad which I think is a little clearer as I spent a couple of days on it, rather than the hour or so on the web editor CircuitLab thing. \$\endgroup\$ – MalphasWats Jun 22 '18 at 21:11
  • 1
    \$\begingroup\$ No no. What you are reading is SSD controller data sheet. Since we are talking about. module here, we have to adhere to only module data sheet \$\endgroup\$ – Umar Jun 22 '18 at 21:52
  • 3
    \$\begingroup\$ After a reset, the ATtiny85 might awaken before the OLED awakens. Any ATtiny85 code that writes to OLED could be ignored by a sleepy OLED. Try adding a bit of code that just delays before trying to talk to that awakening OLED. \$\endgroup\$ – glen_geek Jun 23 '18 at 0:56
  • 1
    \$\begingroup\$ I'd suggest editing the title to something more descriptive, like "passive reset circuit for multi-chip game design". The present vague title may be contributing to your down-votes. \$\endgroup\$ – bmow Jun 23 '18 at 6:09
2
\$\begingroup\$

Bulking the cap to a few 10s of uF (at least 3us of low reset pulse is expected during power on.. Currently, it looks like it is marginal.. ) should improve reset timing.

I would short both reset pins together (by replacing diode with 0 ohm resistor) and I don't see any negative effect of the same. What is the reason for D2? It is also avoiding press switch reset to provide reset to this display by keeping the reset pin above forward voltage drop of the diode.

If possible, I would use a dedicated reset generator ICs too but I am not sure about the constraints you have.

  1. Place a 100nF cap if possible near VCC pin of the display module.
  2. 10k pull up for MCU is missing currently. It will not hurt to have it pulled high to VCC via 10k.

Please also share the waveform shape for first power on subsequent power on.

When Reset button is pressed: The capacitor immediately discharges through the switch. The reset pin of both MCU and the display module will be held to ground.

When reset button is released: The capacitor slowly charges to 3 V via the 10k resistor. 3RC time is roughly 3 * 10k * 100n which is 3 u seconds.

Hence, the current capacitor resistor way too small to generate a low pulse of 3us. Increasing capacitor value to higher value will help.

When power is removed: The charge in this capacitor is discharged via diode which is in parallel with the Resistor in KiCAD schematics version. Hence, discharge happens faster.

\$\endgroup\$
  • \$\begingroup\$ Thank you for your efforts with this answer - the description of what was actually happening, although probably obvious to many seasoned electron wranglers, was very helpful in checking through my design. As it turned out, I think my heavy-handed soldering broke a connection somewhere on my board. I soldered a new piece of wire between D1 and C1/reset and my reset circuit works as it should. I will definitely take your feedback on the size of C1 into consideration when I build the next one! Thank you. \$\endgroup\$ – MalphasWats Jun 24 '18 at 15:51
1
\$\begingroup\$

I think you'll need to actively reset the OLED from your program code, to achieve reliable operation. This passive reset circuit could maybe be tuned to work when the reset button is pressed, but it'll be more difficult to handle the case when the power is turned off and then quickly back on.

Since you don't have any spare MCU output pins to use for OLED reset, one of the existing pins will need to serve double duty. I suggest using the OLED's D/C# input signal, with this simple circuit:

schematic

simulate this circuit – Schematic created using CircuitLab

The microcontroller can hold D/C# low for about 30 milliseconds to reset the OLED. In normal operation D/C# is almost always high, and there is no reason you'd ever want it to be low for 30 ms, so accidental OLED resets shouldn't be a problem.

This solution also uses fewer components than the proposed passive reset circuit.

\$\endgroup\$
  • \$\begingroup\$ Isn't the data command line is being pulled low via a capacitor? Think what would happen when MCU sends a short pulse (10us) of low signal. The charge in cap has to discharge via R1 but it will take a few ms to empty out..until then there won't be physical low signal on the line.. So this is not a viable solution. \$\endgroup\$ – Umar Jun 23 '18 at 8:35
  • \$\begingroup\$ @Umar R1 prevents the charge on the capacitor from interfering with with the D/C# signal. In the situation you described, initially there will be a 5V drop across R1, so D/C# can go immediately to 0V while RES remains at 5V. \$\endgroup\$ – bmow Jun 23 '18 at 13:59
  • \$\begingroup\$ My bad. I agree, totally. \$\endgroup\$ – Umar Jun 23 '18 at 14:23
0
\$\begingroup\$

Designing a bulletproof reset circuit is, as you have found, non-trivial. Many consumer products are cursed with substandard reset circuits because the designer chose to save a dime or two.

I strongly suggest you simply buy a proper reset circuit that handles brownout and other conditions reliably. ADM80x is one such circuit. It incorporates a reference, an comparator and a timer, all of which are guaranteed to function (and thus assert valid reset levels) down to less than 1V supply voltage. Don't be passive, be assertive!

There are some that have a manual reset option if you really need that.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.