Atmega 328p-AU power consumption (fake chip?)

Hi
I have recently bought 10 off 328p-AU chips from ebay, they all work but only at 3.5v and above, with a clock speed of 8Mhz, all of them fall over at below 3.5v this doesn't seem right, what speed and at what voltage is deemed ok please? I am wondering if these are fake

Andy

The safe clock speeds over the range of Vcc values for the ATmega328P is shown in Figure 28-1 of the datasheet:

I agree that the limitations you’re experiencing are unexpected.

Are you using the the internal oscillator, or an external clock?

What do you mean by “fall over”?

Do you have 0.1 uF capacitors on the power lines to the ATmega328P, right next to the chip?

(deleted)

Ebay & fake, certainly possible. How much did you save vs buying them from Digikey or Mouser, where they are just over $2 (USD)?

Another possibility is the fuse settings. Can you tell us the Low fuse byte, High fuse byte, and Extended fuse byte values?

Hi all,
I am using the internal oscillator and have decoupling caps as close as possible, by "fall over" I mean stop working, it appears to be just rebooting as the voltage just goes down then back up, but at 3.5v volts its stable. They came from ebay and were £1 each. I don't think I will send them to Microchip, instead will buy one from them to see the difference. I am using Nick Gammon's software to program the chip with the "lilypad" bootloader (8Mhz) I have an LED on PD5 with a 1K current limit resistor. I'm quite new the the chip at this level but according to the data sheet it should run ok @8Mhz 3.0v but will check as best I can, fuse settings etc. I just wondered if the cheap chips would perform differently or just not work at all. I also wondered if anybody else had experienced this.

thanks

Andy

Check the brownout voltage setting (fuses).

Hi all,

My problem stems from not having power to the ADC, this must be powered even if you are not going to use it (disabled) I found this in the data sheet, I feel a bit daft but i'm probably not the first, however, I don't understand why and would love a more detailed explanation than can be found in the data, so if a quick explanation is possible it would be appreciated (and needed!) or please point me to an article on the subject.

Thanks

Andy

the ADC, this must be powered even if you are not going to use it

That is simply not correct. See this excellent, comprehensive tutorial on low power operation.

Do you have brownout detection enabled?

I thought I had it, as it seemed to work, the chip ran on a lower voltage with power to the ADC's than it does without power so I am going to sit and read through the tutorial thoroughly.As for "brown out" all that is changed is the 8Mhz bootloader, but how about the power to ADC's should you power them at all time or not? I guess I will find this out as I learn more thanks for the pointer to Mr Gammons tutorial (should have thought about this!)

Thanks

Andy

When you say "power the ADCs" what do you mean?

If you mean enabling/disabling the ADC to save power - the ADC is left on by default in sleep, which burns about 270uA - you can turn it off either with the power library or via ADCSRA&=0x7F; (reenable with ADCSRA|=0x80;). After reenabling, I think you have to throw away the first result. But you can enable/disable this freely.

If you mean powering AVCC pin (which would make sense for the power problems you described in original post) - AVcc must be connected to Vcc; there's an internal protection diode, so it sort of works under some conditions without that connection, but at the risk of damage to the chip and unexpected resets. This does not impact power consumption - you can still get the power consumption down to almost nothing

Thanks to all that have posted!
I have started to read Mr Gammons post on the subject of low power and am slowly getting it to soak in. I now understand that AVCC should not be left floating as this can cause spurious problems,thanks @Dr Azzy,I have put the code that I cobbled together at the bottom (I will improve with time!) and I am getting the sort of numbers that Nick describes I am eager to learn more on this intriguing subject, it would appear that my chips are the “real deal” my numbers are:-

@2.8v and 16Mhz it draws 8.48mA that is with an led indicator which draws about 3 of those milliamps, this is a TQFP device on a breakout board with 0.1 uF cap close to device. On entering deep sleep I dont no what it reads as my Fluke 79 only has a milliamp range which reads 0.000 mA. I am waiting for a Digikey order to come and then I can finish of my build of Dave Jones Microcurrent Gold then I will no more. Would you have a look at my code and just see if I’m on the right track? also do you think maybe further savings?

Thanks to all for your time,

Andy

[code]
#include "avr/sleep.h"
#define wake_pin 3// AU chip pin 1
#define sleep_pin 4// AU chip pin 2
#define led 5// AU chip pin 9
int i = 0; // loop variable
int sleep = 0;
void setup()

{
  for (  i = 0; i < 13; i++); pinMode(i, INPUT); // set GPIO to input
  for (  i = 0; i < 13; i++); digitalWrite(i, LOW); //set GPIO to digital LOW (0v)
  pinMode(wake_pin, INPUT_PULLUP); // wake pin held high
  pinMode(sleep_pin, INPUT_PULLUP); // sleep pin held high
  pinMode(led, OUTPUT); // led pin set as output
  digitalWrite(led, HIGH); // led switched on 328's awake!
}

void loop()
{
  sleep = digitalRead(sleep_pin); // read sleep pin's state
  if (sleep == LOW)
  {
    digitalWrite(led, LOW); // time to sleep, switch off LED
    goto_sleep();
  }                     // else loop back and stay awake
}

void goto_sleep() // sleep function
{
  ADCSRA &= ~(1 << 7);// this swithes off bit 7 and the adc's
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  noInterrupts();// clears interupts or cli()
  attachInterrupt(digitalPinToInterrupt(wake_pin), sleep_wakeup, LOW); // this calls the wake up function when interupt pin "wake_pin" goes low
  MCUCR = bit (BODS) | bit (BODSE);// this stuff swithes off "brown out" detection
  MCUCR = bit (BODS);
  interrupts();// sets interupts or sei ();
  sleep_cpu();// cpu stops here until interupt sensed, then sleep_wakeup (ISR)
}

void sleep_wakeup()// ISR ( interupt service routine) wake up function
{
  sleep_disable();
  detachInterrupt(digitalPinToInterrupt(wake_pin));
  digitalWrite(led, HIGH); //time to wake up switch on LED
  ADCSRA |= (1 << 7); // switch ADC's back on
}

[/code]