STAR Firmware by JonnyC - Source Code and Explanation

These would be a good place to start I think, TK has taken a lot of time to combine most of the firmware around.

https://code.launchpad.net/~toykeeper/flashlight-firmware/trunk

I’ve tried to gather things together and put them in one place. Basically, click the Link in my signature for the introductory page. A lot of the further details and links are in the readme in the repository, while a summary of available code is in the index file.

I would like a little help .

I flashed the firmware (dual switch) on wight’s fet driver : 17mm & 20/26/27mm single-sided DD/FET driver release: A17DD-SO8 / A20DD-SO8 / etc
and the boards i used : OSH Park ~

First question : Should i use OTC cap for memory ? Or what ?

2nd : the switch should be connected between ground and “A” or “B” ?

You can use OTC to control the timing boundary between a short press and a long press (or even short/medium/long), or with some code changes you could leave that part out. IIRC, the STAR dual switch code needs the OTC.

About connecting the switch, neither A nor B is the right spot. If I understand the driver layout, you probably need to connect the switch to ground and to pin 3 of the MCU. It’s the pin just to the right of “L+” on that last picture.

This is not the easiest driver layout to use for an e-switch light.

Input voltage is used at the calculation of the variables ADC_LOW, ADC_CRIT in STAR.c (and others?). Can i tweak the equation since the input i would use would be 12V? Thus;

But since this is mains powered, not a battery, the voltage won’t decrease. So what should i do, assign the same integer to both?

If you’re doing mains-powered 12V, you should probably turn off the voltage-related functions.

However, if you still want to measure voltage, you’ll at least need to change the voltage-divider resistors to keep the expected voltage within the MCU’s usable range.

You’ll also need to limit the voltage used to power the MCU, using a Zener or LDO or something. It’ll fry at 12V. So, at least one hardware modification is needed.

What would happen if I flash STAR off-time but didn’t have a capacitor in place? I’m looking for “off-time” memory during mode selection, but “no memory” once the light is powered off. Wondering if I can accomplish this without the cap.

-Garry

Usually, the result ends up being that every click is registered basically as a "short click", where the driver would advance to the next mode (not what you want).


Doesn't selecting "no memory" accomplish what you want, anyways? The off-time STAR with capacitor in place functions like you are describing.

But that IS what I want. When the light is on I always want a short click to advance modes. When the light is off & turned on I want it to always turn on in the first mode.

I found that regular “STAR” (on-time) even when set to “no memory” would require two clicks to advance modes because “memory” had set it. That was annoying.

Anyway, I just tried flashing STAR off-time to a 105D without capacitor and it IS working just as I wanted! Single-click always advances mode & always starts in first mode! (EDIT-see next post.)

My problem now is that I need reverse mode order which I originally planned to get by soldering star #3 on a 105C. Can I change mode order in the code simply by reversing the line entries to put high first? (I’m referring to the lines where I enter my desired PWM values - the only lines I ever edit.) Or are there other lines in the code to edit also?

Thanks,
-Garry

WAIT! My bad! You’re right RMM! Upon closer inspection it’s acting like a driver with “next mode memory” which is not what I want! Doh! So I guess I’m back to switching the 105D out for a 105C.

I would still like to hear an answer to switching mode order in the code though.

-Garry

You can use ToyKeeper's "NOINIT" modification to the code that will give you off-time without the capacitor, so you can use it on the 105D without adding any extra parts (for best timing, also change the fuses to those listed in the initial code description). (it's in ToyKeeper's repository).

To switch the default mode order in the code, find this:

if ((PINB & (1 << STAR3_PIN)) == 0) {
        // High to Low
        mode_dir = -1;
    } else {
        mode_dir = 1;
    }
}

Then change to this (or just solder Pin 3 to ground with the default code...):

if ((PINB & (1 << STAR3_PIN)) == 0) {
        // High to Low
        mode_dir = 1;
    } else {
        mode_dir = -1;
    }
}

Thanks RMM! Perfect solution for me! Others previously pointed me toward “Bistro” with brown out detection and I didn’t realize ToyKeeper had a version of STAR modified with brown out detection as well.

Thanks,
-Garry

this one is for the 13A Attiny?
does 25 44 ones work too?

Lexel - Yes this works for ATTiny 13A.

On another note:

Would there be a way to configure the LVT in STAR so that it would require a duration of low voltage before going into ADC_Low or ADC_Crit?

I’ve made a couple of lights that are temperamental with the LVT. A casual knock, or bump will trigger the LVT.

Any help here?

Doesn’t it already do that? In STAR it has a “lowbatt_cnt” thing so that it won’t step down unless the value is low several times in a row. You could slow it down just by increasing the number of readings required to trigger it.

Toy - as always, you’re a big help. Many thanks.

I’m assuming this is the line of code I would change:

“if (++lowbatt_cnt > 8)”

A setting of 8 (default) would be 4 seconds and in this case definitely shouldn’t be tripping it. A brief bump is really only a fraction of a second.

I’ll try increasing the value to 8, 16, etc and see if that has any effect. Is there a max length of time that this program will accept ( say one or two minutes)?

Big thanks.

I would assume it’s probably fine up to 254.

If a quick bump trips it, maybe it’s not LVP causing the problems. Maybe it’s actually losing power and rebooting? Loose springs barely making contact? Firmware won’t be able to fix that.

That was my thought as well but one thing stands out. I have removed ADC_Low and only use ADC_Crit in my program. When it senses LVT it flashes 10 times then turns off.

The 10 flashes then turnoff is exactly what it is doing when bumped.

That wouldn’t be a sign of a reboot would it?

No, doesn’t sound like a reboot. Could easily be a poor connection though. I’ve had false LVP warnings when something wasn’t connected well, and it was bump-sensitive.

Thanks for the help. I’m going to tinker with “if (++lowbatt_cnt > 8)” and just see if that makes for a quick fix.