Dumping firmware/software...and/or reflashing??

lol...thanks, though I wouldn't have anything if it weren't for the excellent assistence from Coding Badly. ... I agree, coding badly has been extremely valuable in this project. If I could I'd by him a drink (if he drinks....otherwise a root beer ....I personally would take ge root beer ha)

My pleasure. And, yes, I do occasionally enjoy a beer. However, I will never ever refuse a...

https://www.google.com/search?q=dr+pepper+cane+sugar&tbm=shop

Don't let anyone try to fool you. With cane sugar is the only way to make Dr. Pepper!

In case I did not mention it earlier: The ATtiny84 is a drop-in replacement for the ATtiny44 with double the memory. If your new trigger code won't fit you can easily upgrade to a "bigger" processor.

Muhahahahaha!! ]:smiley:

My first version of my new code deployed on the new Attiny44 on the Phenom Board:

Next, I think I'm going to work on creating a menu system so you can change the firing mode without reprogramming. At the moment, I've created full auto and three round burst.

again, you're incredible lol.

Can I see the code you have so far?

Still plan on sharing this with the world and not shutting me out when its done? :wink:

As well what are the things I'll need when I am able to program this on my own?

bag06a:
Still plan on sharing this with the world and not shutting me out when its done? :wink:

No, now I have it and it's mine! ]:smiley: j/k

Of course! At the moment things are a mess, but you're more than welcome to have a look. I'm programming in the Atmel AVR studio, but things should transfer easily to Arduino if you choose. I'll paste the code at the end of this post.

bag06a:
...what are the things I'll need when I am able to program this on my own?

You will need an ISP, software that works with the ISP, some jumper wire, code (and/or binary file from me), and really steady hands. I bought an AVRISP mkII because I was concerned that I wouldn't get another ISP to work. On hand, I had a cheap USBasp ISP and an Arduino. I was able to get both the Arduino and the mkII to work. No luck with the generic USBasp.

I'll post better instructions once I build a proper forum for it. Perhaps I'll start a blog on it.

#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>

#define HIGH 1
#define LOW 0

int BALLS_PER_SECOND;
int ROUND_DELAY; // delay between shots in ms
int DEBOUNCE;  // Debounce in ms

void initialize() {
	BALLS_PER_SECOND = 30;
	DEBOUNCE = 8;
	ROUND_DELAY = (1000 - DEBOUNCE) / BALLS_PER_SECOND;
}

void delay_ms( int ms ){
	for (int i = 0; i < ms; i++) {
		_delay_ms(1);
	}
}

int getPinMask(int pinNumber) {
	if (pinNumber == 2) {
		return (1 << 0);
	} else if (pinNumber == 3) {
		return (1 << 1);
	} else if (pinNumber == 4) {
		return (1 << 3);
	} else if (pinNumber == 5) {
		return (1 << 2);
	} else if (pinNumber == 6) {
		return (1 << 7);
	} else if (pinNumber == 7) {
		return (1 << 6);
	} else if (pinNumber == 8) {
		return (1 << 5);
	} else if (pinNumber == 9) {
		return (1 << 4);
	} else if (pinNumber == 10) {
		return (1 << 3);
	} else if (pinNumber == 11) {
		return (1 << 2);
	} else if (pinNumber == 12) {
		return (1 << 1);
	} else if (pinNumber == 13) {
		return (1 << 0);
	}
	
	return 0;
}

void setInputPin(int pinNumber) {
	if (pinNumber >= 2 && pinNumber <= 5) {
		DDRB &= ~(getPinMask(pinNumber));
	} else if (pinNumber >=6 && pinNumber <= 13) {
		DDRA &= ~(getPinMask(pinNumber));
	}
}

void setOutputPin(int pinNumber) {
	if (pinNumber >= 2 && pinNumber <= 5) {
		DDRB |= (getPinMask(pinNumber));
	} else if (pinNumber >= 6 && pinNumber <= 13) {
		DDRA |= (getPinMask(pinNumber));
	}
}

void pinOutput(int pinNumber, int state) {
	if (pinNumber >= 2 && pinNumber <= 5) {
		if (state == HIGH) {
			PORTB |= (getPinMask(pinNumber));
		} else {
			PORTB &= ~(getPinMask(pinNumber));
		}
	} else if (pinNumber >= 6 && pinNumber <= 13) {
		if (state == HIGH) {
			PORTA |= (getPinMask(pinNumber));
		} else {
			PORTA &= ~(getPinMask(pinNumber));
		}
	}
}

int pinHasInput(int pinNumber) {
	if (pinNumber >= 2 && pinNumber <= 5) {
		return (PINB & (getPinMask(pinNumber))) <= 0;
	} else if (pinNumber >= 6 && pinNumber <= 13) {
		return (PINA & (getPinMask(pinNumber))) <= 0;
	} else {
		return 0;
	}
}

void threeRoundBurst() {
	for (int i = 0; i < 3; i++) {
		pinOutput(6, HIGH);
		delay_ms(DEBOUNCE);
		pinOutput(6, LOW);
				
		// don't delay on the last round
		if (i < 2) {
			delay_ms(ROUND_DELAY);
		}
	}
}

void fullAuto() {
	while (pinHasInput(7)) {
		pinOutput(6, HIGH);
		delay_ms(DEBOUNCE);
		pinOutput(6, LOW);
		delay_ms(ROUND_DELAY);
	}	
}

int main (void) {
	
	initialize();
	
	setOutputPin(12);
	setOutputPin(11);
	setInputPin(7);
	setInputPin(5);
	setOutputPin(6);
	setInputPin(3);
	
	////////////////////////////////////
	// Enable pull up on trigger inputs
	////////////////////////////////////
	
	// Trigger
	pinOutput(5, HIGH);
	pinOutput(7, HIGH);
	
	pinOutput(3, HIGH);
	pinOutput(13, HIGH);
	pinOutput(10, HIGH);
	pinOutput(9, LOW);
	pinOutput(8, LOW);
	pinOutput(12, LOW);
	
	// turn on green LED
	pinOutput(11, HIGH);
	
	while(1) {
		if (!pinHasInput(7)) {
			
			delay_ms(DEBOUNCE);
			while (!pinHasInput(7)) {
				// NOOP
			}
			
			// Fire!
			//threeRoundBurst();
			fullAuto();
		}		
	}
	return 1;
}

Ok...The code is a mess (it's been a long time since I've coded in C), but it seems to work. I want to add one more firing mode, but for now the code supports full-auto, three round burst, and auto-response. To enter configuration mode, turn off the board, hold the trigger, power on the board and release the trigger after 2 seconds. The rest of the configuration is very similar to the Tippmann manual. I'm not allowing Debounce and Dwell to be changed at the moment.

My next task is to setup a blog or other site so I can post some instructions on how to program your own chip. I'm not sure which programmer you may have, but I'm going to need your help with figuring that part out. I know I can program the chip with the Atmel AVRISP mkII, but I'd like to find a solution using either the Arduino or another programmer (USBasp) for a lower cost solution.

I've included the latest code and hex dump.

ATtiny44Phenom.hex (11.3 KB)

Phenom.zip (42.4 KB)

Does the tactile button have no function now then? Also They way u described your programming mode it sounds similar to the x7 classic. Do u have classic or phenom?

I have a Phenom X7. I decided to change the programming around a little because I don't want to have to whip out a special tool to get to programming. I was planning on using the button for "reset to factory default" (e.g. on startup, hold the button for 5 seconds to reset the board).

Also, just a warning, I have not tested this latest code on the actual board yet. I hope to get to that this weekend. I'm mostly worried about the red LED. Everything else has already been proven.

Hahaha, well...my plans were foiled. I just tested out the new build in the full system and found that you cannot hold the trigger down and switch from the "F" position to "FA" (to turn on the board). So I switched the programming to use the pushbutton rather than the trigger to enter programming mode.

Other than that, I made some tweaks to Auto-Response and the new build mostly works. I say mostly because successBlink is not working for some odd reason. I'm baffled why it is not working on the board when it does on the testbed, but I'll figure that out later. successBlink is supposed to blink green + red three times to indicate that your changes have been saved to the EEPROM.

I'm starting a google code project with everything I do. I expect to put documentation, pictures, videos, etc up there.

http://code.google.com/p/phenomx7-etrigger/

If you'd like to contribute to some of the documentation etc, let me know. I think all I need is an email address of yours to set you up.

From this point forward, new code and builds will be posted there.

mikedehaan:
Hahaha, well...my plans were foiled. I just tested out the new build in the full system and found that you cannot hold the trigger down and switch from the "F" position to "FA" (to turn on the board). So I switched the programming to use the pushbutton rather than the trigger to enter programming mode.

Other than that, I made some tweaks to Auto-Response and the new build mostly works. I say mostly because successBlink is not working for some odd reason. I'm baffled why it is not working on the board when it does on the testbed, but I'll figure that out later. successBlink is supposed to blink green + red three times to indicate that your changes have been saved to the EEPROM.

I'm starting a google code project with everything I do. I expect to put documentation, pictures, videos, etc up there.

Google Code Archive - Long-term storage for Google Code Project Hosting.

If you'd like to contribute to some of the documentation etc, let me know. I think all I need is an email address of yours to set you up.

From this point forward, new code and builds will be posted there.

Hello mikedehaan, any news about your firmware?

What things I need to flash my phenom with your firm?

Correct me if I'm wrong:

  1. ATTINY44A-PU
    http://www.ebay.com/itm/2x-8-bit-Microcontroller-ATTINY44A-PU-/221023275589?pt=LH_DefaultDomain_2&hash=item3376038a45

  2. PROGRAMER
    http://www.ebay.com/itm/ATtiny24A-SSU-ATtiny24-ATtiny44-ATtiny84-AVR-SOIC14-150-mil-Programming-Adapter-/261012681784?pt=LH_DefaultDomain_0&hash=item3cc5917438

  3. Your HEX File

================================

I need desolder the original chip from my board? or exist the posibility to program it directly in the board? Or is read only?

Your work is awesome!

Sorry for my very poor English... (Entiendes español?)

Cainxxx:
Hello mikedehaan, any news about your firmware?

Yes! I post updates for the firmware at the google project wiki. A new version was uploaded last night. Check it out here:

http://code.google.com/p/phenomx7-etrigger/wiki/Home

Cainxxx:
What things I need to flash my phenom with your firm?

Correct me if I'm wrong:

  1. ATTINY44A-PU
    http://www.ebay.com/itm/2x-8-bit-Microcontroller-ATTINY44A-PU-/221023275589?pt=LH_DefaultDomain_2&hash=item3376038a45

You do not need to buy a chip (unless you want to develop for the project). The instructions on the wiki (the link above) will show you how to apply the new firmware directly to the chip inside your eGrip without desoldering.

Cainxxx:
2) PROGRAMER
http://www.ebay.com/itm/ATtiny24A-SSU-ATtiny24-ATtiny44-ATtiny84-AVR-SOIC14-150-mil-Programming-Adapter-/261012681784?pt=LH_DefaultDomain_0&hash=item3cc5917438

This programmer looks like it will do the job, but it quite a bit more expensive than what you will need. The programmer I used was:

Though you can find cheaper (eBay). Just make sure it support ISP, is supported by AVRDUDE, and is supported by your Operating System. It would be nice if it supplies 5v power.

Cainxxx:
3) Your HEX File

New versions of the program are uploaded to the following link:

https://code.google.com/p/phenomx7-etrigger/downloads/list

Cainxxx:
I need desolder the original chip from my board? or exist the posibility to program it directly in the board? Or is read only?

No, you do not need to desolder the chip from the board. You can directly program the chip on the board. The chip is writable, but must first be erased. There is no way to backup the existing manufacturer's program, so USE AT YOUR OWN RISK. There is no turning back once you install this software.

Good luck, and keep asking questions if you have trouble.

mikedehaan:
Good luck, and keep asking questions if you have trouble.

Thanks for all replies man!! Last question, is there a way to backup original firmware?

Cainxxx:
...is there a way to backup original firmware?

Unfortunately, there is no way to backup the original firmware.

To implement in the future, this are the modes of Xboard Firmware:

Programmable Rate Of Fire-
1 to 30

Programmable Burst-mode-
2 to 8

Safe Burst mode –
Pulling the trigger three times in less than one second results in an X-shot burst on the third trigger pull. Each pull of the trigger in less than one second after this, results in another X-shot burst (X= 2 to 8 ).

Safe Full-Auto mode-
Pulling the trigger three times in less than one second results in full-automatic firing. Holding the trigger down on the third pull sustains this full-auto mode.

Auto-Response mode –
The marker fires on the pull and on the release of the trigger.

Turbo-mode –
Pulling the trigger three times in less than one seconds results in full-automatic firing at rate of 15 BPS. To sustain this rate of fire the trigger must be pulled at least once a second.

Semi-Auto –
This mode is the same as selecting the F firing mode with the selector switch (one pull/release of the trigger fires one time).

Burst mode –
The marker fires an X-shot burst on each trigger pull (X= 2 to 8 ).

Full-Auto mode –
Pulling the trigger results in full-automatic firing. Holding the trigger down on the first pull sustains this full-auto mode.

X mode –
Pulling the trigger results in full-automatic firing. Holding the trigger down on the first pull sustains this full-auto mode. The Rate of fire (ROF) will gradually increase depending on how long the trigger is held (10 to 25bps).

Super Response mode – aka A.D.A.M. mode
The marker fires an X-shot burst on each trigger pull and on the release of the trigger (X= 2 to 8 ).

===========================================

The follow feature is suggested by me:

Abbility to Change RATE OF FIRE (betwen 2 rates, 15 and 25 for example) directly by pressing program button

Cainxxx:
Programmable Rate Of Fire-
1 to 30

We currently support a rate of fire between 5 and 40 (as of version 0.3)

Cainxxx:
Programmable Burst-mode-
2 to 8

We currently support a burst between 2 and 10 (as of version 0.4)

Cainxxx:
Safe Burst mode –
Pulling the trigger three times in less than one second results in an X-shot burst on the third trigger pull. Each pull of the trigger in less than one second after this, results in another X-shot burst (X= 2 to 8 ).

If more people request "safe" firing modes I will implement them, however, this was the reason behind the whole project (to remove the "safe" feature).

Cainxxx:
Safe Full-Auto mode-
Pulling the trigger three times in less than one second results in full-automatic firing. Holding the trigger down on the third pull sustains this full-auto mode.

Same as above.

Cainxxx:
Auto-Response mode –
The marker fires on the pull and on the release of the trigger.

We currently support Auto-Response (as of version 0.3)

Cainxxx:
Turbo-mode –
Pulling the trigger three times in less than one seconds results in full-automatic firing at rate of 15 BPS. To sustain this rate of fire the trigger must be pulled at least once a second.

Similar functionality can be achieved by increasing your Rate Of Fire setting on Full Auto firing mode. We do not require pumping the trigger to keep the gun firing. If more people request this feature, I can implement it.

Cainxxx:
Semi-Auto –
This mode is the same as selecting the F firing mode with the selector switch (one pull/release of the trigger fires one time).

This is the same functionality as switching the selector switch to the F firing mode and therefore has not been implemented. If more people request this feature, I will implement it.

Cainxxx:
Burst mode –
The marker fires an X-shot burst on each trigger pull (X= 2 to 8 ).

We currently support a burst between 2 and 10 (as of version 0.4). To configure, select three round burst firing mode and adjust the burst size between 2 and 10.

Cainxxx:
Full-Auto mode –
Pulling the trigger results in full-automatic firing. Holding the trigger down on the first pull sustains this full-auto mode.

We currently support Full Auto (as of version 0.3).

Cainxxx:
X mode –
Pulling the trigger results in full-automatic firing. Holding the trigger down on the first pull sustains this full-auto mode. The Rate of fire (ROF) will gradually increase depending on how long the trigger is held (10 to 25bps).

We do not currently support full auto ramping. If more people request this feature I will implement it, however, I have a few design changes I would implement instead. I did not like the YouTube demo of this feature.

Cainxxx:
Super Response mode – aka A.D.A.M. mode
The marker fires an X-shot burst on each trigger pull and on the release of the trigger (X= 2 to 8 ).

We do not currently support Auto Response Burst firing mode. My opinion on this is the trigger would start to feel heavier latency as the gun would be in the middle of firing while you either pull or release the trigger. It is incredibly easy to fully saturate your gun's mechanical limit of rounds per second with 3 round burst alone. However, if more people would like this feature, I will implement it.

Cainxxx:
Abbility to Change RATE OF FIRE (betwen 2 rates, 15 and 25 for example) directly by pressing program button

I definitely like this idea. I will put this on the list to implement.

Thank you for your ideas! Keep them coming!

The programming via the button is a great idea.

Know whats weird?? I got out my multimeter and put it on the continuity test mode and tried it on all pins (started with the pins you defined as VCC and gnd) and I didn't get any continuity? Shouldnt it be beeping???

Hopefully be getting my blank chips soon also :slight_smile:

If you put the negative multimeter lead on the negative battery terminal, and the positive multimeter lead on the GND pin of the chip on the board, I would think the multimeter would show continuity.

I'll try this at home tonight and let you know if it works for me.

bag06a:
Know whats weird?? I got out my multimeter and put it on the continuity test mode and tried it on all pins (started with the pins you defined as VCC and gnd) and I didn't get any continuity? Shouldnt it be beeping???

Don't do that! It violates the electrical specifications. While very unlikely in this case, any time the electrical specifications are violated there is a possibility of damage.

Wow, good catch. I didn't think of that. The multimeter is probably sending some voltage through to get from point A to B that might cause damage. What about measuring Ohm's? Would that do the same?

mikedehaan:
If you put the negative multimeter lead on the negative battery terminal, and the positive multimeter lead on the GND pin of the chip on the board, I would think the multimeter would show continuity.

I'll try this at home tonight and let you know if it works for me.

Confirmed-- Negative terminal to Pin14 worked for continuity.

Coding Badly -- TY for the warning....I certainly dont want to fry my chip :-. How does it violate specifications? Is it possibly sending to much current and/or voltage through the chip just with the batteries in the multimeter?