Go Down

Topic: Dumping firmware/software...and/or reflashing?? (Read 30880 times) previous topic - next topic

Coding Badly


Argh!  Stupid brain!  Pay attention!

Sorry about that.  You had stated earlier that the processor runs at 5V.  Apparently, my brain had gone on walkabout.

What will you be using as a programmer?  An Arduino Uno?

:) No worries.  I'm only pretending to know what I'm talking about.  :smiley-eek:

At the moment, I have a LcSoft USBasp programmer.

Coding Badly


Have you used it to program an AVR processor?  Are you familiar with AVRDUDE?

Do you have a link to a schematic for the programmer?  It may already include series resistors.  They are nothing more than a resistor connected between the programmer and the target in series.  There would be three or four resistors and they are very likely the same values.  1K ohms seems to be a popular choice.

Speak of the devil..while I was typing my response, the doorbell rang to deliver my Atmel AVRISP mkII.  I don't have the schematic for this one, but I think the schematic of the USBasp is here:

http://www.fischl.de/usbasp/

Coding Badly


No for the series resistor question.  I'll assume you're familiar with AVRDUDE and have used the USBASP programmer.


The first phase is to get the target to respond; no programming.  I suggest powering the target using it's normal power source (the 9V battery) (but don't power the target until the end).  I suggest having the programmer schematic accessiable and the ATtiny84 (44 is in the family) datasheet open to the 1. Pin Configurations section while connecting the programmer to the target.  In other words, carefully review my instructions.  With all the power off, connect...

• GND to GND.  From the programmer schematic either pin 8 or pin 10 will work.  This is connected to pin 14 (upper-right corner) on the target.

• VCC is not connected.  Pin 2 on the programmer should not be connected.

• MOSI is connected to MOSI with a series resistor (220 ohms or higher).  Pin 1 on the programmer is connected to a resistor which is then connected to pin 7 on the target (lower-left corner).

• MISO is connected to MISO with a series resistor (220 ohms or higher).  Pin 9 on the programmer is connected to a resistor which is then connected to pin 8 on the target (lower-right corner).

• SCK is connected to SCK with a series resistor (220 ohms or higher).  Pin 7 on the programmer is connected to a resistor which is then connected to pin 9 on the target (lower-right corner just above MISO).

• SS to RESET with a series resistor (220 ohms or higher).  Pin 5 on the programmer is connected to a resistor which is then connected to pin 4 on the target (left side in the middle).


At this point I suggest connecting the programmer to the computer and building up an AVRDUDE command.  AVRDUDE will be able to communicate with the programmer but the programmer will not yet be able to communicate with the target (no power).  Include extra verbose mode (-v -v -v -v) when running AVRDUDE. 

When you are content you have the command you want to run (feel free to ask on the forum for an opinion; I'm sure someone will have one) power the target and then run the command.

If all goes well AVRDUDE will read the signature bytes (it always does this) and then output the signature byte (that's the purpose of extra verbose).  If that works, you are in business!

bag06a

Wow thats alot of information :-\. I feel extremely ill informed just by reading that and I'm realizing that I have ALOT of learning to do. I still want to partake in this project, however it will be more of a step-by-step learning experience I think.

With that said, do you have any book suggestions to read on this topic? Microconrollers/chips in general and definitely ones that cover the topics of what each pin is (such as MISO and MOSI and CLK and SCK and what not). Through a little bit of reading I know that MISO is Master In Slave Out and MOSI is Master Out Slave In (which MOSI  usually connects to a MISO right?) CLK is clock I believe. I want to learn more about this stuff so suggestions would be great :)

Coding Badly

With that said, do you have any book suggestions to read on this topic?


Unfortunately, no.  This was the last book I read on embedded programming... http://www.amazon.com/Practical-UML-Statecharts-Second-Edition/dp/0750687061  Everything I learned about AVR processors I learned from the Arduino website, Atmel datasheets, and the internet at large.

I believe the question of "which book" has been discussed a few times on the forum.  I suggest spending some time with Google...
https://www.google.com/search?q=book+site%3Aarduino.cc%2Fforum

Quote
Microconrollers/chips in general and definitely ones that cover the topics of what each pin is (such as MISO and MOSI and CLK and SCK and what not).


This is a fairly good description of SPI...
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus

Essentially, the programmer sends four byte programming commands, over the SPI bus, to the target, which executes those commands.

Quote
Through a little bit of reading I know that MISO is Master In Slave Out and MOSI is Master Out Slave In ... CLK is clock I believe.


Correct.

Quote
(which MOSI  usually connects to a MISO right?)


No.  The pins are always from the perspective of the master.  Master Out Slave In (MOSI) out of the master is still Master Out Slave (MOSI) in into the slave.

In the case of in-system serial programming the master is the programmer (LcSoft USBasp programmer) and the slave is the target (ATtiny84).

Quote
I want to learn more about this stuff so suggestions would be great :)


My suggestion is to get your hands dirty.  Nearly anything with an AVR processor and a USB connection can act as a programmer (Uno, ATmega328 on a breadboard, LcSoft USBasp) and test targets are fairly cheap...
http://search.digikey.com/us/en/products/ATTINY84-20PU/ATTINY84-20PU-ND/1245916
http://www.mouser.com/ProductDetail/Atmel/ATTINY84-20PU/?qs=2nyfZ6BV3ohscROPiyTV88GRZOsCDQSKLmyBo24c8Ug%3d
http://www.newark.com/jsp/search/productdetail.jsp?SKU=68T3783&CMP=AFC-GB100000001
http://www.sparkfun.com/products/11232

Add this to the Arduino IDE...
http://code.google.com/p/arduino-tiny/

And you are ready to go!

bag06a

Every now and then I really wish I wouldnt have left school for Computer Science after 2 years haha. But I guess it is what it is ya know?

I ordered a few ATTiny44 chips since I don't want to test on the phenom board just yet.  Once those chips arrive, I'll try the steps you recommend.  I tried the steps on the ATTiny20 chips (with different pin positions based on the datasheet), however, no matter what I tried I could not get the AVRISPmkII Programmer to read or write to the chip.

Well....I tried programming a brand new ATtiny44 with several different programmers including the Atmel AVRISP mkII using AVR Studio 6, USBasp using avrdude, and an arduino Uno with Arduino IDE.  I tried first with the Atmel mkII since it was Atmel branded and the chips were Atmel, I figured I would go the Atmel route all the way.  No matter what I tried, I could not get the programmer to read or write program data.  I was able to get it to read the target voltage, and the LED on the mkII went from red to green when I connected the pins according to their documentation, but nothing.

Next, I tried the USBasp with avrdude.  With this, I kept getting the error "avrdude: warning: cannot set sck period. please check for usbasp firmware update."  I didn't get far with this solution.  I could do more research to try and figure out what's wrong, but instead I moved on to the Arduino as an ISP.

The Arduino Uno as an ISP did something.  I can't say what exactly, but once I configured the Arduino to be an ISP (uploaded the ArduinoISP sketch and changed some settings in the IDE), I was able to deploy to my test ATTiny44.  To test my deployment, however, I hooked up an LED to one of the pins and got nothing (I deployed the blink sketch).  I changed the blink program to turn multiple pins on and off just in case I got the wrong one on the board.  Still nothing.  At this point, I gave up and decided to try the Atmel mkII approach again, thinking that since Arduino worked a little, maybe I'd have better luck this time.

I don't know what the Arduino did, but when I got back into the AVR Studio 6 IDE, I could read and write to the chip.  At least that's what the tool said it was doing.  I was able to read Lock, Memory, and Fuse information.  I was even able to "deploy" a simple application (similar to Blink) to the chip....at least the deployment didn't fail.  The program was still not working (no LEDs were being lit).  It's like the program is not making it to the chip.

I checked the LED, and it is working, and I made sure I had the polarity proper when putting it in the circuit.

I'm not sure what I may be doing wrong, I'll try some more combinations tomorrow.

Any ideas why the Atmel route would not recognize the chip until Arduino wrote something to it?  How do I initialize virgin chips?

Coding Badly

Any ideas why the Atmel route would not recognize the chip until Arduino wrote something to it?


Purely coincidence.

Quote
How do I initialize virgin chips?


No need.  AVR processors come from the factory ready-to-run at 1 MHz.  The Flash memory is filled with 0xFFFF which is an illegal opcode.  Illegal opcodes are executed as NOPs (details here... http://support.atmel.com/bin/customer.exe?=&action=viewKbEntry&id=227 ).  Apply power and the processor starts executing code that does nothing.

In other words, all you have to do to "initialize" the processor is upload a program.

Quote
The Arduino Uno as an ISP did something.  I can't say what exactly, but once I configured the Arduino to be an ISP (uploaded the ArduinoISP sketch and changed some settings in the IDE),


Which settings?

Quote
I was able to deploy to my test ATTiny44.  To test my deployment, however, I hooked up an LED to one of the pins and got nothing (I deployed the blink sketch).  I changed the blink program to turn multiple pins on and off just in case I got the wrong one on the board.  Still nothing. 


What board was selected when you uploaded?

Ah Ha!  Success!    I had the circuit correct, but the arduino code wrong ::facepalm::

I hooked up the Arduino as an ISP and deployed a new version of blink and it worked.  The Arduino API refers to pins differently than I would have expected, but with a small modification to the blink program, I was able to have the chip tell me which pin had which number.  For example, Pin 3 is actually Pin 9 for the Arduino API.  So I think my first version of blink was trying to tell the GND pin to blink (or something just as stupid).


Which settings?


There was a parameter in the heartbeat() method of ArduinoISP that needed to change.  The instructions on one site said to change the delay(40) call to delay(20).


What board was selected when you uploaded?


I selected the ATtiny44 board which is only available after downloading the ATtiny addons for Arduino.  For anyone interested, I followed these turotials:

http://hlt.media.mit.edu/?p=1695

http://hlt.media.mit.edu/?p=1706

Here's my modified version of Blink.  It will cycle through all the pins on the ATtiny44 and blink the number of times indicating which pin it is:

Code: [Select]

void setup() {               
  for (int i = 0; i < 12; i++) {
    pinMode(i, OUTPUT);
  }
}

void blinkPin(int pin) {
 
  for (int x = 0; x <= pin; x++) {
    digitalWrite(pin, HIGH);
    delay(20);
    digitalWrite(pin, LOW);
    delay(20);
  }
  delay(50);
}

void loop() {
  for (int i = 0; i < 12; i++) {
    blinkPin(i);
  }
}


One problem I still have is, the delay method seems to be running slow.  I tried a delay of about 100 (which should be 100ms or 0.1 seconds) which resulted in about a 1 second delay.  In the Atmel AVR Studio, you can set the F_CPU value to indicate to delay how fast your clock is.  Is there something similar in Arduino that might be causing my delay method to run slow?

Thank you so much for your help by the way.  I sincerely appreciate it.

Coding Badly

I hooked up the Arduino as an ISP and deployed a new version of blink and it worked. 


Excellent.

Quote
The Arduino API refers to pins differently than I would have expected,


Should be top-left to top-right in a U-shape around the processor.  That's how the pins on the Uno (ATmega328 based boards) are numbered.

Quote
One problem I still have is, the delay method seems to be running slow. 


The program is compiled for 8 MHz and the processor is configured to run at 1 MHz.  I suggest using this core...
http://code.google.com/p/arduino-tiny/

I added two ATtiny44 entries for you.  Use this download...
http://code.google.com/p/arduino-tiny/downloads/detail?name=arduino-tiny-0100-0013.zip

Start with the ATtiny44 @ 1 MHz  (internal oscillator; BOD disabled) board entry.  After re-uploading, your program should blink correctly (±10%).

When you are comfortable everything is working correctly, select ATtiny44 @ 8 MHz  (internal oscillator; BOD disabled) then execute Tools / Burn Bootloader.  That will change the fuses (reconfigure the processor) to run at 8 MHz.  Even though the processor is running 8x faster, after re-uploading, your program should still blink correctly (±10%).

Running at 1 MHz is a great choice for battery power.  Running at 8 MHz is a great choice if you need the extra horsepower.

Quote
Thank you so much for your help by the way.  I sincerely appreciate it.


You are welcome.

Just to confirm the chip, I was able to hookup (briefly) to the Paintball gun circuit and the device id matches the id of a brand new ATtiny44A from Atmel.

Phenom Device ID: 0x1E9207
ATtiny44A Device ID: 0x1E9207


Coding Badly


Helpful tip: It is possible to download a binary version of the program from the Paintball gun.  You may want to do this early in your project so you have a backup.

Great news about the processor.  That will make your development effort go much more smoothly.

Go Up