Pages: [1]   Go Down
Author Topic: ATMEGA328-PU vs. ATMEGA328P-PU  (Read 6090 times)
0 Members and 2 Guests are viewing this topic.
Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I could not find a difference in the data sheet
I just found a big difference in price and slighly different description at mouser.com (one being a "new" product)
The case size seems different, altough both are 28pin DIL

Any more relevant differences ? 
What does the first P in ATMEGA328P-PU  stand for ? ( I noticed other MCU also come in those two flavors ? ) 
Logged

Brisbane, Australia
Offline Offline
Edison Member
*
Karma: 29
Posts: 1071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

According to this page on Atmel's naming convention, the additional P indicates it's the picoPower version of the chip.

Quote from: the original article
So many things are going wireless, and so many devices are becoming battery powered, that power consumption is a very important thing. AVR has a new marketing term called picoPower. PicoPower is a new thing from AVR, and it leverages all the previous technology we have in lower power, and adds to it. One of the big differences with picoPower versus the other AVRs was the power save mode. It has gone and completely redesigned the 32 KHz oscillator to have a zero-power 32 KHz oscillator. That's allowing 0.6uA in power save with that oscillator running. Finally, in full run mode, it can do as low as 220uA per MIP in full active mode. These devices run from 1.8-5.5V. The 1.8V device is a true 1.8V device. That means that everything works at 1.8V. The designers can write to Flash, SRAM and EEPROM.

Looks like Element14 prefers to stock that version too, having far deeper inventory compared to the non-P (though that might be a function of the P having a pricing premium...so being a more attractive sale).

Cheers ! Geoff
Logged

"There is no problem so bad you can't make it worse"
- retired astronaut Chris Hadfield

Dallas, Texas
Offline Offline
God Member
*****
Karma: 3
Posts: 717
Old, decrepit curmugeon
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

It would be worth reviewing the errata for both devices.  Since the P is a newer version (I believe), it may well be that it has fewer bugs that could affect performance.
Logged

New true random number library available at: http://code.google.com/p/avr-hardware-random-number-generation/

Current version 0.7.2

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks,
minimal power asleep is not my concern.

I understand for a simple "wall-wart via 7805" driven device on a breadboard and later on a soldered protoboard , I could try use the non-P version as well.
First of all, I hope the burn bootloader / upload sketch via ArduinoISP description (http://arduino.cc/en/Tutorial/ArduinoISP) is applicable.

Re Errata: I understand these are the same for both 328 and 328P ( as well as for others like 48, 88, 168 etc ) and it depends just on the Revision A ... D
Instead of googling and probably digging deep into AVR details myself: How can I read the Hardware Revision Info of my actual controllers ?

( I've got an original Arduino UNO Rev3 (ATMEGA328P-PU) with preinstalled bootloader
  and ordered 2 additional bare ATMEGA328-PU from a very suspectable (cheaper than 3 €) source. )   

« Last Edit: June 05, 2012, 07:15:29 am by michael_x » Logged

Denmark
Offline Offline
Edison Member
*
Karma: 35
Posts: 1029
Happy Hobbyist
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

the have a differnt device signatur
ATmega328   0x1E 0x95 0x14
ATmega328P 0x1E 0x95 0x0F

See this thread for a solution

http://arduino.cc/forum/index.php/topic,98956.0.html
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks Erni !

Quote
Easiest fix, IMO, is to add another signature entry into avrdude.conf and boards.txt.) 
Once it has your bootloader on it, it acts exactly like an Uno.
... sounds promising.

Now let's hope my new source does deliver.
Logged

South Texas
Offline Offline
Edison Member
*
Karma: 8
Posts: 1023
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have used both - bought the 328 because it was a few pennies cheaper than the 328P. I modified a couple files - avrdude.conf and boards.txt in Arduino.

In the Boards.txt I copied the uno section and changed it to uno328. Change was this line - uno.build.mcu=atmega328p to uno328.build.mcu=atmega328

##############################################################
uno328.name=Arduino328
uno328.upload.protocol=arduino
uno328.upload.maximum_size=32256
uno328.upload.speed=115200
uno328.bootloader.low_fuses=0xff
uno328.bootloader.high_fuses=0xde
uno328.bootloader.extended_fuses=0x05
uno328.bootloader.path=optiboot
uno328.bootloader.file=optiboot_atmega328.hex
uno328.bootloader.unlock_bits=0x3F
uno328.bootloader.lock_bits=0x0F
uno328.build.mcu=atmega328
uno328.build.f_cpu=16000000L
uno328.build.core=arduino
uno328.build.variant=standard
for AVRDude.conf i copied the ATMega329P section and modified the name and the signature lines.
#------------------------------------------------------------
# ATmega328
#------------------------------------------------------------

part
   id         = "m328";
   desc      = "ATMEGA328";
    has_debugwire   = yes;
    flash_instr      = 0xB6, 0x01, 0x11;
    eeprom_instr   = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
           0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
           0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode   = 0x86;
    # avr910_devcode   = 0x;
   signature      = 0x1e 0x95 0x14;
    pagel      = 0xd7;
    bs2         = 0xc2;
    chip_erase_delay   = 9000;
    pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1",
       "x x x x x x x x x x x x x x x x";

    chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x",
       "x x x x x x x x x x x x x x x x";

    timeout   = 200;
    stabdelay   = 100;
    cmdexedelay   = 25;
    synchloops   = 32;
    bytedelay   = 0;
    pollindex   = 3;
    pollvalue   = 0x53;
    predelay   = 1;
    postdelay   = 1;
    pollmethod   = 1;

    pp_controlstack =
   0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
   0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
   0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
   0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay   = 100;
    progmodedelay   = 0;
    latchcycles      = 5;
    togglevtg      = 1;
    poweroffdelay   = 15;
    resetdelayms   = 1;
    resetdelayus   = 0;
    hvleavestabdelay   = 15;
    resetdelay      = 15;
    chiperasepulsewidth   = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

    memory "eeprom"
   paged      = no;
   page_size   = 4;
   size      = 1024;
   min_write_delay = 3600;
   max_write_delay = 3600;
   readback_p1   = 0xff;
   readback_p2   = 0xff;
   read = " 1 0 1 0 0 0 0 0",
          " 0 0 0 x x x a9 a8",
          " a7 a6 a5 a4 a3 a2 a1 a0",
          " o o o o o o o o";

   write = " 1 1 0 0 0 0 0 0",
            " 0 0 0 x x x a9 a8",
      " a7 a6 a5 a4 a3 a2 a1 a0",
      " i i i i i i i i";

   loadpage_lo = " 1 1 0 0 0 0 0 1",
            " 0 0 0 0 0 0 0 0",
            " 0 0 0 0 0 0 a1 a0",
            " i i i i i i i i";

   writepage = " 1 1 0 0 0 0 1 0",
          " 0 0 x x x x a9 a8",
          " a7 a6 a5 a4 a3 a2 0 0",
          " x x x x x x x x";

   mode      = 0x41;
   delay      = 20;
   blocksize   = 4;
   readsize   = 256;
    ;

    memory "flash"
   paged      = yes;
   size      = 32768;
   page_size   = 128;
   num_pages   = 256;
   min_write_delay = 4500;
   max_write_delay = 4500;
   readback_p1   = 0xff;
   readback_p2   = 0xff;
   read_lo = " 0 0 1 0 0 0 0 0",
        " 0 0 a13 a12 a11 a10 a9 a8",
        " a7 a6 a5 a4 a3 a2 a1 a0",
        " o o o o o o o o";

   read_hi = " 0 0 1 0 1 0 0 0",
        " 0 0 a13 a12 a11 a10 a9 a8",
        " a7 a6 a5 a4 a3 a2 a1 a0",
        " o o o o o o o o";

   loadpage_lo = " 0 1 0 0 0 0 0 0",
            " 0 0 0 x x x x x",
            " x x a5 a4 a3 a2 a1 a0",
            " i i i i i i i i";

   loadpage_hi = " 0 1 0 0 1 0 0 0",
            " 0 0 0 x x x x x",
            " x x a5 a4 a3 a2 a1 a0",
            " i i i i i i i i";

   writepage = " 0 1 0 0 1 1 0 0",
          " 0 0 a13 a12 a11 a10 a9 a8",
          " a7 a6 x x x x x x",
          " x x x x x x x x";

   mode      = 0x41;
   delay      = 6;
   blocksize   = 128;
   readsize   = 256;

    ;

    memory "lfuse"
   size = 1;
   min_write_delay = 4500;
   max_write_delay = 4500;
   read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0",
          "x x x x x x x x o o o o o o o o";

   write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0",
            "x x x x x x x x i i i i i i i i";
    ;

    memory "hfuse"
   size = 1;
   min_write_delay = 4500;
   max_write_delay = 4500;
   read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0",
          "x x x x x x x x o o o o o o o o";

   write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0",
            "x x x x x x x x i i i i i i i i";
    ;

    memory "efuse"
   size = 1;
   min_write_delay = 4500;
   max_write_delay = 4500;
   read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
          "x x x x x x x x x x x x x o o o";

   write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
            "x x x x x x x x x x x x x i i i";
    ;

    memory "lock"
   size = 1;
   min_write_delay = 4500;
   max_write_delay = 4500;
   read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0",
          "x x x x x x x x x x o o o o o o";

   write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x",
            "x x x x x x x x 1 1 i i i i i i";
    ;

    memory "calibration"
   size = 1;
   read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x",
          "0 0 0 0 0 0 0 0 o o o o o o o o";
    ;

    memory "signature"
   size = 3;
   read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x",
          "x x x x x x a1 a0 o o o o o o o o";
    ;
;

If you make those additions then Arduino can use the ArduinoISP to load without having to change the files back and forth to load them the next time. It also allows you to use AVRDude to load programs directly if you wish.

Color codes don't work inside code blocks...
« Last Edit: June 06, 2012, 12:05:23 pm by kf2qd » Logged

Global Moderator
Boston area, metrowest
Offline Offline
Brattain Member
*****
Karma: 439
Posts: 23759
Author of "Arduino for Teens". Available for Design & Build services. Now with Unlimited Eagle board sizes!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

"Since the P is a newer version (I believe), it may well be that it has fewer bugs that could affect performance."
Faulty logic.
The P is Picopower as noted.

You have to read the datasheet to see the differences between non-P and P, such as Para 10.2:

Note: 1. BOD disable only available in picoPower devices ATmega48PA/88PA/168PA/328P

Or 10.11.2 (same note found in several places):

Note: 1. BODS and BODSE only available for picoPower devices ATmega48PA/88PA/168PA/328P

So a subtle difference, probably not used my most folks, but  a difference none the less.
Logged

Designing & building electrical circuits for over 25 years. Check out the ATMega1284P based Bobuino and other '328P & '1284P creations & offerings at  www.crossroadsfencing.com/BobuinoRev17.
Arduino for Teens available at Amazon.com.

Pages: [1]   Go Up
Jump to: