Go Down

Topic: Help supply clock signal from Arduino (to debrick AVR) (Read 1 time) previous topic - next topic

Vaselinessa

Jun 01, 2012, 07:54 am Last Edit: Jun 01, 2012, 07:57 am by Vaselinessa Reason: 1
In error, I set a fuse bit on my ATtiny85 to expect an external clock (lfuse:w:0x62:m) instead of a crystal (lfuse:w:0x6f:m).

That locked me out of running or reprogramming it, but I imagined I could reprogram it if I simply supplied the desired clock signal, using PWM from another Arduino. However, what I set up isn't doing the trick. Anybody care to help troubleshoot? (Or is the whole concept faulty?)

The setup



I'm using the Arduino UNO as ISP (that's also what I used to brick the ATtiny85).  I'm using the Arduino MEGA to supply a pulse for the clock.

The sketch on the Mega (for supplying the pulse) is as follows:

Code: [Select]
void setup()
{
 setup2560();
}

void setup2560()
{
 // OC0A is PB7, i.e. D13
 pinMode(13, OUTPUT);
 // PWM mode, non-inverted
 TCCR0A = (3<<WGM00) | (2<<COM0A0);
 // use Output Compare Register A, no prescaling
 TCCR0B = (1<<WGM02) | (1<<CS00);
 // Output Compare Register A
 OCR0A = 4;
}

void loop()
{
}


My command to avrdude is:
avrdude -p attiny85 -P com8     -c stk500v1    -b 19200 -U flash:w:main.hex

The error message
Code: [Select]
avrdude.exe: Device signature = 0x000000
avrdude.exe: Yikes!  Invalid device signature.
            Double check connections and try again, or use -F to override
            this check.


The error message is exactly what it was when the ATtiny85 had a crystal hooked up instead of the Arduino MEGA. (And same as when nothing was connected for clock.)

I didn't do any math to ensure that my MEGA's pulse frequency should equal the 16MHz which I instructed the ATtiny85 to expect (back when I bricked it). But I don't suppose that matters so much as the fact that the pulse is well over four times as fast as the programmer's Overriding Baud Rate of 19200 (which I set in the args for avrdude).

jwatte

I'm assuming the hook-up is correct, but you really should check it against the data sheet for the device.

Did you look at that clock on a scope? It should have the same duty cycle for "on" as for "off." If "4" is your compare value, the PWM should run with TOP=8.

Also, when running with a slower clock, you should use a higher delay value in the ISP. You may need to delay as much as 1 millisecond between each bit. With avrdude, this is the -i option. Start with -i 100 and see how it goes.

Nick Gammon

I uploaded that and got no output. However this outputs 4 MHz:

Code: [Select]
void setup()
{
  setup2560();
}

void setup2560()
{
  // OC0A is PB7, i.e. D13
  pinMode(13, OUTPUT);
  // CTC, toggle output
  TCCR0A = (1<<WGM01) | (1<<COM0A0);
  // no prescaling
  TCCR0B = (1<<CS00);
  // Output Compare Register A
  OCR0A = 1;
}

void loop()
{
}

Coding Badly

In error, I set a fuse bit on my ATtiny85 to expect an external clock (lfuse:w:0x62:m) instead of a crystal (lfuse:w:0x6f:m).


Which core are you using that you have to set the fuses "by hand"?

Quote
(Or is the whole concept faulty?)


The concept is not faulty.  It works well.  Supply a reasonable clock (I typically use 1 MHz for no particle reason) to the XTAL1 pin and you're good to go.

Quote
I didn't do any math to ensure that my MEGA's pulse frequency should equal the 16MHz which I instructed the ATtiny85 to expect (back when I bricked it). But I don't suppose that matters so much


It doesn't.  Any clock should work.

In addition to Nick's code, Lady Ada has published a version of ArduinoISP that outputs a "recovery clock".  If Nick's code doesn't help and you have trouble finding Lady Ada's sketch, send me a Personal Message; I have something that works.

Nick Gammon

I have another stand-alone sketch for the Atmega328:

Code: [Select]
// For Atmega328

void setup ()
  {
  // set up 8 MHz timer on pin 9
  pinMode (9, OUTPUT);
  // set up Timer 1
  TCCR1A = _BV (COM1A0);  // toggle OC1A on Compare Match
  TCCR1B = _BV(WGM12) | _BV(CS10);   // CTC, no prescaling
  OCR1A =  0;       // output every cycle
  }
 
void loop () {}

Vaselinessa

Wow! Thank you all for your assistance. (NIck's code worked great for de-bricking to ATtiny.)

jwatte, I have no oscilloscope. Perhaps that will be on my wish list ere long.

Go Up