STAR Firmware by JonnyC - Source Code and Explanation

Ah, shows what I know. I didn’t realize, or forgot (same thing), that just using / linking against a library required that you be licensed under GPL. Looking at the GNU licenses FAQ I see that now.

intellectual license and giving credit where credit is due, more or less leaving the writers name in the original source code is good enough for me

open source, community development copyleft

I’ve updated the zip file in the link ( http://www.mikec.se/Stuff/MikeC01.zip ) with a new C file that includes the same “Free to use, modify, and share for private use” as STAR v1.1. Is that OK? Otherwise feel free to write what I need to add to make it free for anyone to do as they please with it for private use and I’ll update the file on the link.

Any comments on what I’ve done with it? Any obvious blunders?

Also, does anyone know how to change the WDT interrupt time? It’s about 0.5 seconds default. I can’t see any obvious way of adjusting it. Not that it’s really needed but I would very much like to know how.

Works for me. On my site I say "use these programs however you wish".

Look at..

WDTCR = (1<<WDTIE) | (1<<WDP2) | (1<<WDP0); // Enable interrupt every 500ms

Download the datasheet for the Attiny13A from Atmel and just search for WDTCR and you'll see the different timing options.

Thanks, I’ll look into it.

Nice firmware, thanks for sharing it.
Just had a short look into the momentary firmware and found something which might be useful.
You only enter sleep mode if the light is switched off, I always try to use a sleepmode also in the other modes especially in the moonlight mode because if you use only some mA another some mA consumed by the controller arent perfect.

This could probably easy be added with a else in the main loop. This is what I use to make sure the idle mode is the standard.

In luxdrv it shows

#define SLEEP asm volatile (“SLEEP”)

Then where you want SLEEP you just add SLEEP;

I believe…I really don’t know anything about C

I like to write it like in the link, I set the sleep mode and then start the sleep mode. Its easy to read and i know which mode i used.
The controllers have different sleepmodes with different pro and contras so this is a specific ucontroller thing.
If that is wrong please correct me.

You are the coding master…always best to pay attention to those who know better :wink:

I just tried the offtime memory. Awesome stuff. not tested it in a light but on a power supply it works perfect.
I used a 10uF cap and a CAP_TRESHHOLD value of 200.
The batteryprotection kicked in abit to low for my feeling so I bumped the criticallevel a bit.
I like it very much that you have added a level were the power is totally down. THUMBS UP!
I just added a line to disable the ADC, you already have a procedure in the code. This helps to reduce the current a lot. You even use the idle mode as a standard.
No memory works like a champ too. Fantastic.

I have a question because there is something which confuses me
What does this line: while (!low_voltage(ADC_CRIT));
its in the main routine.

It (busy)loops until voltage is critically low.

I would put the semicolon to separate line to improve readability. :)

Yup, _the_ has it right. Glad it's working for you!

I posted up a dual switch program on my site (for rear clicky + side switch), but I haven't fully tested it out yet and RMM hasn't given it his normal runthrough either. Once it's tested I will post up and we can see what additions can be added if needed.

I flashed the momentary firmware last night on a nanjg, it works quite well.
Never played with the turbo timer but thought for a small light it might be usefull.
I can read the code quite well and it is a simple but very nice code.
I changed it a bit so that it slowly dims down to previous mode and not so harsh and I also dim down on the two highest modes because the half power mode is on 3rd place. But because I thought that dimming is just for pussies I dim down after 5minutes but this is to long to prevent finger burning….5minutes on 4.4A and again 5 with 3A are to much…maybe I will shorten that a bit after a few days of playing with it.

I used a sipik ck12 clone and a 4.4A nanjg.

I've started work on putting an ATtiny13A on a LD29 driver board. Thread link: here is the LD-29 MCU pinout (eg how to put your ATtiny13A in there...). An adapter PCB is pictured in post #27 which will allow the ATtiny to pickup the right pins for power, ground, ADC inputs, etc.

I've also started work on the changes to get STAR_offtime working with this, see post #34. As I posted the code I noticed one glaring mistake (STAR2_PIN should have been removed), but I welcome any review to find additional mistakes.

FWIW, I’ve started a firmware repository and I added a new STAR flavor designed for use as a bike tail light.

The repository currently only contains STAR and a couple derivatives, but I’ll be adding anything and everything I can get permission to share.

The biking tail light code will go into a little 1x16340 light with red XP-E2 as soon as I get the host. It has the following modes: moon, low, med, high, moon-low flasher, low-med flasher, med-high flasher, and heartbeat. It’s my first attiny firmware and I only spent a couple hours on it so far, so it’s a work in progress. However, it does at least work if anyone is interested.

The firmware repository is on Launchpad: Flashlight Firmware Repository in Launchpad
Here’s the link if you’d like to browse the code online.

The tail light .hex file is also pre-built for easy flashing: here.

Nice thanks!!

BTW, I just wanted to thank everyone who has contributed to the STAR firmware.

When I was little, I learned how to read from a programming manual. I learned about variables and syntax errors before I ever heard of Dick & Jane or an Etch-A-Sketch. As long as I can remember, I’ve been putting code into a computer to make it do what I want, and my current computers have their screens filled up almost entirely with stuff I created. It’s just how I do things.

But with flashlights, something was always missing. I’ve really enjoyed them, and modding lights made it even more fun, but there were always little things I still wanted to change…

Until the past couple days, that is.

Today I took apart one of my lights, wrote some new firmware for it, flashed it, tweaked it, put it all back together, and now it’s finally doing what I wanted all along — namely, whatever I told it to do. Its behavior may have been just thrown together quickly based on what I wanted from it today, but that’s okay. It feels right. That’s how things are supposed to be. It’s running custom code which didn’t exist this morning, a crystalized snapshot of my ideas, dumped out of my brain so I could get rid of them and make room for new ideas.

Is it “finished”? Probably not. I’ll probably reflash it a few dozen more times in the foreseeable future. But that’s okay too, code is fluid and changes with circumstance.

As for STAR, I’m thankful because other people already did all the hard parts. It’s a great basis for derivative projects. I didn’t have to spend all week referring to the encyclopedic attiny13a manual to figure out basic things like using the watchdog timer to implement short-cycle memory, or painstakingly measure the values for low-voltage detection. I got to do the fun parts instead, designing modes and watching them in action just moments later. So thank you! I’m having a great time and making all sorts of terrible blinky things.

Awesome ToyKeeper! Thanks for sharing your experience. It's fun stuff! I'm at the point now where my lights do what I want them to with a basic 3-mode with off-time. I'm really done tinkering with new versions of the code, programmability, flashy modes, etc. But this is great because I can now focus on other things.

Toykeeper could you please explain a bit what this is?
Can I send you a modified STAR Firmware and you will add them in this STAR Encyclopedia or what?

Werner, I’m basically just applying some of the most common “best practices” from the software world and applying them to flashlight firmware. I’m hoping it will encourage more collaboration.

In general, open-source software projects organize their activities around a project management service such as Launchpad or GitHub. This provides a central hub for storing and publishing source code and other project files, along with a system for keeping old revisions and managing code patches. It also provides bug tracking or issue tracking, along with a variety of other optional services like mailing lists or documentation systems. Plus, it’s just nice having everything in one place.

So, you could send me a modified version and I could add it to the repository for you. Or you could branch the repo, add your improvements, publish your own branch, and share it. Or submit a merge proposal to get it back into the main repository. Or you could fork the whole thing complete with history and start your own project if you don’t like the way it’s being managed.

A lot of the features are probably more than we really need, but it’s nice to have room to grow. For example, I doubt we’ll need to bisect the revision history to figure out exactly where a bug was introduced in a firmware’s code, but stuff like that is available if anyone needs it.