arduino programmeer manual A. Kompanje V1.0 april 2009 Op internet vind je dit document ook met als naam: arduino programming notebook geschreven in het engels. Dit document is herschreven naar het Nederlands en aangepast met flowcharts en ander bruikbaar materiaal.
Arduino Programmeer manual De informatie is onder andere verkregen door: http://www.arduino.cc http://www.arduino.nu http://www.wiring.org.co http://www.antratek.nl Aan deze tutorial is ook geschreven door:: Brian W. Evans Paul Badger Massimo Banzi Hernando Barragán David Cuartielles Tom Igoe Daniel Jolliffe Todd Kurt David Mellis and others Uitgegeven: april 2009 Deze tutorial valt onder de licentie: Creative Commons Attribution-Share Alike 2.5.
inhoud structuur structuur setup() loop() functies {} accolades ; puntkomma /*… */ blok commentaar // regel commentaar 6 6 6 7 7 8 8 8 variabelen variabelen variabelen declareren variable bereik 9 9 10 datatypes byte int long float arrays 11 11 11 11 12 rekenen rekenen samengestelde opdrachten vergelijken van getallen logische berekeningen 13 13 14 14 constantes constantes true/false high/low input/output 15 15 15 15 De Arduino microcontroller Pagina 3
vergelijkingen if if… else for while do… while 16 17 18 19 19 digitale i/o pinMode(pin, mode) digitalRead(pin) digitalWrite(pin, value) 20 21 21 analoge i/o analogRead(pin) analogWrite(pin, value) 22 22 timer delay(ms) millis() 23 23 rekenen min(x, y) max(x, y) 23 23 random randomSeed(seed) random(min, max) 24 24 seriëel serial.begin(rate) Serial.
voorwoord Dit document beschrijft de Arduino microcontroller met een gemakkelijk te leren commandostructuur. Om de start simpel te maken worden een aantal ingewikkelde begrippen en commando’s niet besproken, zodat we hier kunnen spreken over een echte beginners manual. Wil je meer weten en heb je diepgang nodig koop dan een boek over de taal C of verdiep je in materiaal dat diverse websites aanbieden.
structuur De basisstructuur van de Arduino programmeertaal is erg simpel. Het bestaat uit minstens twee gedeeltes (blokken). Deze twee gedeeltes (blokken), of functies vormen een aantal statements (programma commando’s). Voorbeeld: void setup() { statements; } void loop() { statements; } Waarbij setup() de voorbereiding is en loop() de uitvoering. Beide functies zijn nodig om een programma te kunnen laten werken.
functies Een functie is een blok met code dat een naam heeft gekregen en waarin instructies staan die uitgevoerd moeten worden wanneer de functie aangeroepen wordt. De functies void setup() en void loop() zijn al genoemd, maar andere functies kunnen ook. Er zijn ook op maat gemaakte functies die de het aantal opdrachten in een programma reduceren, waardoor het geheel overzichtelijker is. Functies moeten eerst gedeclareerd worden in hun type.
; puntkomma Een puntkomma moet gebruikt worden na elke ingevoerde opdracht. Net zoals de gekrulde haakjes zal bij het ontbreken van een puntkomma een error verschijnen. Voorbeeld: int x = 13; // declareer variable 'x' as the integer 13 Opmerking: Vaak is het zo dat het ontbreken van een puntkomma er voor zorgt dat de Arduino software niet wil compileren en een error aangeeft op een andere plek dan waar de puntkomma vergeten is. Dat wordt dus lastig zoeken.
Variabelen Een variabele is een manier om een numerieke waarde te bewaren voor later gebruik in het programma. Zoals de naam variabele al aangeeft kan de waarde van een variabele ook regelmatig veranderen. Er bestaan ook zogenaamde constantes. Dat zijn variabelen die constant het zelfde blijven en dus nooit van waarde veranderen. Een variabele moet op een juiste manier gedeclareerd worden.
Variable bereik Een variabele kan gedeclareerd worden in het begin van het programma voor void setup(). Soms heb je door omstandigheden een variabele in een programma niet nodig. Daarom kun je ook een variabele later in het programma wel of niet aanmaken al naar gelang hij nodig is. De vaste variabele heet een globale variabele. Een globale variabele is dus een variabele die in een heel programma kunt oproepen. Deze variabele declareer je boven void setup().
byte Byte bewaart een 8-bit numerieke waarde zonder een decimale punt met een bereik van 0-255. byte Button1 = 180; // declareert 'Button1' als een byte type int Integers zijn primaire datatypes om getallen te bewaren zonder een decimale punt een 16-bit waarde met een bereik van 32767 tot -32768. int Count4 = 1500; // declareert ‘Count4' als een integer type Opmerking: Een integer variabele kan niet groter zijn dan 32767. Verhoog je 32767 met 1 dan wordt het een negatief getal: -32768.
Arrays Een array is a verzameling van verschillende waardes die benaderd kunnen worden door een indexnummer. Je kunt er elke waarde in kwijt en je kunt het oproepen door de naam van de variabele en de indexnummers. Arrays zijn standaard met nullen gevuld en het eerste indexnummer van een array begint ook met een 0. int myArray[] = {waarde0, waarde1, waarde2...
Rekenen Rekenkundige bewerkingen zijn bijvoorbeeld optellen, aftrekken, vermenigvuldigen en delen. Het is altijd een resultaat van twee getallen (operands). Voorbeelden: y x i r = = = = y x j r + * / 3; 7; 6; 5; De berekening wordt uitgevoerd afhankelijk van het gekozen datatype. Als er gekozen is voor een integer dan zal het resultaat 9 / 4 = 2 zijn in plaats van 2.25. Pas ook op bij rekekundige bewerkingen dat er een “overflow” error kan komen bij te grote getallen.
Vergelijken van getallen Variabelen worden vaak met elkaar vergeleken. Op basis daarvan worden er dan beslissingen genomen. Op deze en de volgende pagina’s staan daar veel voorbeelden van. x x x x x x == != < > <= >= y y y y y y // x is gelijk aan y // x is niet gelijk aan y // x is kleiner dan y // x is groter dan y // x is kleiner of gelijk aan y // x is groter of gelijk aan y Logische berekeningen Logische berekeningen zijn vergelijkingen die als uitkomst hebben waar of niet waar (TRUE of FALSE).
Constantes De Arduino taal heeft een aantal voorgedefinieerde waardes, die ook wel constantes worden genoemd. Ze worden gebruikt om een programma makkelijker te kunnen lezen of schrijven. Constantes zitten ook in verschillende groepen. true/false Dit zijn Boolean constantes die een logisch niveau vaststellen. False wordt gedefinieerd als een 0, terwijl true wordt gedefinieerd als een 1 of iedere andere waarde anders dan een 0. In Boolean is -1, 2 en -900 gedefinieerd als true.
if De if opdracht test of bepaalde condities bereikt zijn. Denk bijvoorbeeld aan een analoog signaal dat een bepaalde waarde bereikt waarbij ingegrepen moet worden. In dat geval moet er iets gebeuren. Die actie moet dan plaats vinden binnen de haakjes (zie het voorbeeld hier onder). Wordt er niet aan de voorwaarde voldaan dan wordt de actie tussen de haakjes overgeslagen.
if… else De if… else opdracht maakt het mogelijk hoe dan ook een beslissing te laten nemen. Bijvoorbeeld je meet dat een digitale input pin hoog is in dat geval wil je dat actie_A start. Is de pin echter laag dan moet actie_B starten Dat zou er als volgt uit kunnen zien:. if (inputPin == HIGH) { Voer aktie_A uit; } else { Voer aktie_B uit; } Else kan ook een andere procedure zijn zodat je meerdere testen in dezelfde lus kunt verwerken.
for Het for commando wordt gebruikt om een aantal commando’s een bekend aantal keren te laten herhalen. Via een teller wordt bijgehouden hoe vaak de lus zich moet herhalen. Het commando ziet er als volgt uit: for (variabele; conditie; expressie) { doeiets; } Dat lijkt lastig, maar het is een makkelijke en vaak gebruikte opdracht.
while De while loop heeft wel wat weg van de for loop. Hij is gemakkelijk uit te leggen met: Zolang je aan die voorwaarde voldoet moet je dat doen. Die voorwaarde zou bijvoorbeeld het testen van een sensor kunnen zijn. De loop stopt pas als hij niet meer aan de voorwaarde voldoet. Een voorbeeld: while (someVariable ?? value) { doe iets; } Het volgende voorbeeld test of de someVariabele kleiner is dan 200. Als dat waar is blijft de lus zich herhalen totdat someVariabele niet langer kleiner is dan 200.
pinMode(pin, mode) Wordt gebruikt in de void setup() om een specifieke pin te configureren als een INPUT of een OUTPUT. pinMode(pin, OUTPUT); // sets ‘pin’ to output Arduino’s digitale pinnen zijn standaard geconfigureerd als inputs. Je hoeft ze dus niet per sé te declareren als inputs met pinMode(). Pinnen die geconfigureerd zijn als INPUT bevinden zich in een hoogohmige toestand.
digitalRead(pin) Leest de waarde uit van een specifieke pin met als resultaat HIGH of LOW. De pin is gespecificeerd al een variabele of een constante (0-13). Value = digitalRead(Pin); // maak 'value' gelijk aan // de input pin digitalWrite(pin, value) Schrijf de waarde naar een specifieke pin met als niveau HIGH of LOW. De pin is gespecificeerd als een variabele of een constante (0-13).
analogRead(pin) Leest de waarde van een specifieke analoge pin in een 10 bit resolutie. Deze functie werkt alleen op pin 0 t/m 6 (Geldt natuurlijk niet voor de Arduino mega). De uitkomst is een integer waarde tussen 0 to 1023. waarde = analogRead(pin); // maak van ‘waarde' wat gelezen // wordt op de 'pin' Opmerking: Analoge pinnen hoeven niet te worden gedeclareerd als INPUT of OUTPUT. Het zijn automatisch al digitale inputs.
delay(ms) Wachtlus (pauze) weergegeven in milliseconden, waarbij de waarde 1000 gelijk staat aan 1 seconde. delay(1000); // wacht een seconde millis() Laat zien hoeveel milliseconde het Arduino board in werking is na de start van het lopende programma. De weergave is een long variabele. Looptijd = millis(); // looptijd wordt gevuld met millis() Note: Het weer te geven getal zal na verloop van tijd een overflow veroorzaken. (Een reset naar nul), na ongeveer 9 uur.
randomSeed(seed) Maak een willekeurige waarde aan (random). randomSeed(value); De Arduino kan uit zichzelf geen random nummer creëren. Daarvoor is een commando dat wel een “willekeurige” random waarde kan aanmaken. Let wel: Er is nooit sprake van een absolute willekeurige waarde. Het is een functie om te helpen om één of meerdere “willekeurige” waardes aan te maken.
Serial.begin(rate) Open een seriële poort, zet de juiste baudrate om seriële data te kunnen verzenden. Een baudrate van 9600 wordt veel gebruikt maar andere snelheden zijn ook mogelijk. void setup() { Serial.begin(9600); } // open een seriele port // met een baudrate van 9600 bps Opmerking: Wanneer gebruik wordt gemaakt van seriële communicatie op pin 0 (Rx) en pin1 (Tx) let er dan op dat deze niet tegelijkertijd gebruikt kunnen worden. Serial.
Bijlage Een simpel programma is het laten knipperen van een LED. Dat gaat bij de Arduino erg gemakkelijk omdat op de digitale ingangen op pin 13 al een LED is aangesloten. Simpelweg een USB-kabel aansluiten en het onderstaande programma invoeren en de LED knippert.
Schakelaar Met een schakelaar (drukknop) wordt de LED uitgezet die is aangesloten op poort 13 van de Arduino. Het schema: Zoals je ziet is pin2 via een weerstand van 100 K verbonden aan de massa. Dat is gedaan omdat, als de schakelaar niet gesloten is, je niet weet welke spanning er op pin twee staat. Nu is dat in ieder geval 0 Volt. R1 noem je ook wel een pulldown-weerstand.
Het bijbehorende programma: Zoals je ziet zie je hier een if - then - else commando. Daar staat dus: Als (if) val hoog is zet dan (then) de LED uit en anders (else) zet de LED aan.
Analoge ingangen Op het Arduino bordje zitten 6 analoge ingangen. Let op geen analoge uitgangen!! Op één analoge ingang gaan we de spanning variëren. We zorgen er voor dat het programma deze waarde uitleest en we laten een LED knipperen al naar gelang de hoogte van de spanning. Het schema: Let goed op, want A0 is niet de pin 0, maar A0 van de Analoge inputs. Een LED wordt niet aangesloten, we maken gebruik van de LED die in serie met een weerstand aangesloten is op pin13.
Het gebruik van Relais met de Arduino De Arduino kan per (digitale) poort een maximale stroom leveren van 40 mA. Dat is voor een microcontroller redelijk veel. er zijn ook types die maar 5 mA kunnen leveren per poort. Wanneer je een lamp, motor of andere elektrische grootgebruiker wilt aansturen die meer stroom nodig heeft dan 40 mA dan moet je zoeken naar een andere oplossing. Die vind je meestal in een relais.
Externe voeding: Wordt er gebruik gemaakt van een externe voeding hanteer dan het volgende schema: In het voorbeeld is gebruik gemaakt van een externe voeding van 12 V. Deze waarde kan anders zijn. Alle onderdelen zijn identiek aan de hier beschreven onderdelen behalve dat natuurlijk het relais een 12 V type is. Let op: De massa van de Arduino moet ALTIJD verbonden zijn aan de massa van de externe voeding.
De Arduino en I2C I2c is een protocol dat is uitgevonden door Philips in de jaren 80. Het was oorspronkelijk bedoeld als bussysteem in bijvoorbeeld in een videorecorder. Je kunt over twee draden data verzenden en ontvangen. Met een IC, de PCF8574, kun je via i2c totaal 8 uitgangen aansturen. We hebben daarvoor het volgende schema gebouwd: De Arduino communiceert via de analoge poorten 4 en 5 serieel met de I/O expander PCF8574 met respectievelijk SDA en SCL op pen 15 en 14 op het IC zelf.
Het programma: De Arduino microcontroller Pagina 33
Een servo-motor met de Arduino Met de Arduino kun je gemakkelijk Servo's aansturen. In het hier getoonde voorbeeld krijg een servomotor zijn positie doorgegeven via een potentiometer. De Arduino leest deze potentiometer uit en geeft dat vervolgens door aan de servomotor. De servomotor zet zichzelf vervolgens in de juiste positie. Wij maken gebruik van de RS-2 servomotor van de firma Conrad. Dit is een goedkope servo waar wij prima ervaringen mee hebben. Je kunt hem maximaal 180 graden laten draaien.
Nu nog de Arduino programmeren en de servo werkt. Het programma (de sketch) is simpel. Iedere keer wordt de stand van de potmeter uitgelezen en wordt de gelezen waarde overgezet naar de servo.
De servo krijgt na elke correctie 15 mS de tijd om zichzelf in te stellen (lees naar de juiste positie te komen. Pen9 van de digitale output is natuurlijk een PWM pen. Let op: Een gemodificeerde servo zal de stand van de potmeter niet meenemen. In dat geval zal de servo voor of achteruit draaien.
Seriële communicatie naar de MAC/PC Soms kan het handig zijn om directe communicatie vanuit de Arduino direct terug te koppelen naar de PC. Bij de Arduino kan dit alleen door serieel data te verzenden naar de PC. Kijk maar eens naar het volgende voorbeeld: In het voorbeeld wordt de tafel van 7 geprint. Niet op papier, maar op het scherm. In de void setup() wordt eerst een seriële poort op 9600 bps gezet met het commando Serial.
De uitkomst van de tafel van 7 zie je hier onder. Dit is de weergave van de data die de Arduino naar de PC of MAC gestuurd heeft. Deze functie kun je ook gebruiken als een programma niet goed werkt. Het is dan mogelijk om tussentijds verschillende variabelen te testen op wat er verwacht werd en vervolgens de verschillen te analyseren.
Het aansluiten van een LCD display Het aansluiten van een LCD display was vroeger erg ingewikkeld, maar tegenwoordig is dat een fluitje van een cent. De Arduino software kent een flink aantal libarys (bibliotheken) die al het moeilijke werk uit handen nemen. Kijk maar eens naar het onderstaande programma. Je ziet in het programma bovenin het commando #include
Bekijk ook het schema hier onder hoe je het moet aansluiten: Als je alles goed hebt aangesloten dan krijg je het volgende te zien: Kijk eens goed naar het display, dan zie je dat deze 16 aansluitpennen heeft. Er zijn ook displays met 14 aansluitpennen. Dat zijn displays waarin geen licht (backlight) in zit, zodat pin 15 en pin 16 niet nodig zijn en dus ook niet op het display zitten. Displays met een backlight zijn doorgaans iets dikker dan een display zonder een backlight.
Features • High Performance, Low Power AVR® 8-Bit Microcontroller • Advanced RISC Architecture • • • • • • • • – 131 Powerful Instructions – Most Single Clock Cycle Execution – 32 x 8 General Purpose Working Registers – Fully Static Operation – Up to 20 MIPS Throughput at 20 MHz – On-chip 2-cycle Multiplier High Endurance Non-volatile Memory Segments – 4/8/16/32K Bytes of In-System Self-Programmable Flash progam memory (ATmega48P/88P/168P/328P) – 256/512/512/1K Bytes EEPROM (ATmega48P/88P/168P/328P)
ATmega48P/88P/168P/328P 1. Pin Configurations Figure 1-1.
ATmega48P/88P/168P/328P 1.1 1.1.1 Pin Descriptions VCC Digital supply voltage. 1.1.2 GND Ground. 1.1.3 Port B (PB7:0) XTAL1/XTAL2/TOSC1/TOSC2 Port B is an 8-bit bi-directional I/O port with internal pull-up resistors (selected for each bit). The Port B output buffers have symmetrical drive characteristics with both high sink and source capability. As inputs, Port B pins that are externally pulled low will source current if the pull-up resistors are activated.
ATmega48P/88P/168P/328P The various special features of Port D are elaborated in ”Alternate Functions of Port D” on page 88. 1.1.7 AVCC AVCC is the supply voltage pin for the A/D Converter, PC3:0, and ADC7:6. It should be externally connected to VCC, even if the ADC is not used. If the ADC is used, it should be connected to VCC through a low-pass filter. Note that PC6..4 use digital supply voltage, VCC. 1.1.8 AREF AREF is the analog reference pin for the A/D Converter. 1.1.
ATmega48P/88P/168P/328P Block Diagram Block Diagram GND Figure 2-1. VCC 2.1 Watchdog Timer Watchdog Oscillator Oscillator Circuits / Clock Generation Power Supervision POR / BOD & RESET debugWIRE Flash SRAM PROGRAM LOGIC CPU EEPROM AVCC AREF DATABUS GND 8bit T/C 0 16bit T/C 1 A/D Conv. 8bit T/C 2 Analog Comp. Internal Bandgap USART 0 SPI TWI PORT D (8) PORT B (8) PORT C (7) 2 6 RESET XTAL[1..2] PD[0..7] PB[0..7] PC[0..6] ADC[6..
ATmega48P/88P/168P/328P Watchdog Timer with internal Oscillator, and five software selectable power saving modes. The Idle mode stops the CPU while allowing the SRAM, Timer/Counters, USART, 2-wire Serial Interface, SPI port, and interrupt system to continue functioning. The Power-down mode saves the register contents but freezes the Oscillator, disabling all other chip functions until the next interrupt or hardware reset.
ATmega48P/88P/168P/328P 3. About 3.1 Disclaimer Typical values contained in this datasheet are based on simulations and characterization of other AVR microcontrollers manufactured on the same process technology. Min and Max values will be available after the device is characterized. 3.2 Resources A comprehensive set of development tools, application notes and datasheets are available for download on http://www.atmel.com/avr. Note: 3.3 1.
ATmega48P/88P/168P/328P 4.
ATmega48P/88P/168P/328P Address Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Page (0xC1) UCSR0B RXCIE0 TXCIE0 UDRIE0 RXEN0 TXEN0 UCSZ02 RXB80 TXB80 196 (0xC0) UCSR0A RXC0 TXC0 UDRE0 FE0 DOR0 UPE0 U2X0 MPCM0 195 (0xBF) Reserved – – – – – – – – – (0xBE) Reserved – – – – – – – (0xBD) TWAMR TWAM6 TWAM5 TWAM4 TWAM3 TWAM2 TWAM1 TWAM0 – 244 (0xBC) TWCR TWINT TWEA TWSTA TWSTO TWWC TWEN – TWIE 241 (0xBB) TWDR (0xBA) TWAR TWA6 TWA5
ATmega48P/88P/168P/328P Address Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 (0x7F) DIDR1 – – – – – – AIN1D AIN0D Page 249 (0x7E) DIDR0 – – ADC5D ADC4D ADC3D ADC2D ADC1D ADC0D 266 (0x7D) Reserved – – – – – – – – (0x7C) ADMUX REFS1 REFS0 ADLAR – MUX3 MUX2 MUX1 MUX0 262 (0x7B) ADCSRB – ACME – – – ADTS2 ADTS1 ADTS0 265 (0x7A) ADCSRA ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 263 (0x79) ADCH ADC Data Register High byte (0x78)
ATmega48P/88P/168P/328P Address Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 0x1D (0x3D) EIMSK – – – – – – INT1 INT0 Page 72 0x1C (0x3C) EIFR – – – – – – INTF1 INTF0 72 0x1B (0x3B) PCIFR – – – – – PCIF2 PCIF1 PCIF0 0x1A (0x3A) Reserved – – – – – – – – 0x19 (0x39) Reserved – – – – – – – – 0x18 (0x38) Reserved – – – – – – – – 0x17 (0x37) TIFR2 – – – – – OCF2B OCF2A TOV2 163 0x16 (0x36) TIFR1 – – ICF1 – – OCF1B O
ATmega48P/88P/168P/328P 5.
ATmega48P/88P/168P/328P Mnemonics Operands Description Operation Flags #Clocks BRIE k Branch if Interrupt Enabled if ( I = 1) then PC " PC + k + 1 None 1/2 BRID k Branch if Interrupt Disabled if ( I = 0) then PC " PC + k + 1 None 1/2 BIT AND BIT-TEST INSTRUCTIONS SBI P,b Set Bit in I/O Register I/O(P,b) " 1 None 2 CBI P,b Clear Bit in I/O Register I/O(P,b) " 0 None 2 LSL Rd Logical Shift Left Rd(n+1) " Rd(n), Rd(0) " 0 Z,C,N,V 1 LSR Rd Logical Shift Right Rd(n) " Rd(n+
ATmega48P/88P/168P/328P Mnemonics POP Operands Rd Description Pop Register from Stack Operation Rd " STACK Flags #Clocks None 2 MCU CONTROL INSTRUCTIONS NOP No Operation None 1 SLEEP Sleep (see specific descr. for Sleep function) None 1 WDR BREAK Watchdog Reset Break (see specific descr. for WDR/timer) For On-chip Debug Only None None 1 N/A Note: 1. These instructions are only available in ATmega168P and ATmega328P.
ATmega48P/88P/168P/328P 6. Ordering Information 6.1 ATmega48P Speed (MHz) 10(3) 20(3) Note: Ordering Code(2) Package(1) 1.8 - 5.5 ATmega48PV-10AU ATmega48PV-10MMU ATmega48PV-10MU ATmega48PV-10PU 32A 28M1 32M1-A 28P3 Industrial (-40!C to 85!C) 2.7 - 5.5 ATmega48P-20AU ATmega48P-20MMU ATmega48P-20MU ATmega48P-20PU 32A 28M1 32M1-A 28P3 Industrial (-40!C to 85!C) Power Supply Operational Range 1. This device can also be supplied in wafer form.
ATmega48P/88P/168P/328P 6.2 ATmega88P Speed (MHz) 10(3) (3) 20 Note: Ordering Code(2) Package(1) 1.8 - 5.5 ATmega88PV-10AU ATmega88PV-10MU ATmega88PV-10PU 32A 32M1-A 28P3 Industrial (-40!C to 85!C) 2.7 - 5.5 ATmega88P-20AU ATmega88P-20MU ATmega88P-20PU 32A 32M1-A 28P3 Industrial (-40!C to 85!C) Power Supply Operational Range 1. This device can also be supplied in wafer form. Please contact your local Atmel sales office for detailed ordering information and minimum quantities. 2.
ATmega48P/88P/168P/328P 6.3 ATmega168P Speed (MHz)(3) 10 20 Note: Ordering Code(2) Package(1) 1.8 - 5.5 ATmega168PV-10AU ATmega168PV-10MU ATmega168PV-10PU 32A 32M1-A 28P3 Industrial (-40!C to 85!C) 2.7 - 5.5 ATmega168P-20AU ATmega168P-20MU ATmega168P-20PU 32A 32M1-A 28P3 Industrial (-40!C to 85!C) Power Supply Operational Range 1. This device can also be supplied in wafer form. Please contact your local Atmel sales office for detailed ordering information and minimum quantities. 2.
ATmega48P/88P/168P/328P 6.4 ATmega328P Speed (MHz) 20(3) Note: Power Supply Ordering Code(2) Package(1) 1.8 - 5.5 ATmega328P- AU ATmega328P- MU ATmega328P- PU 32A 32M1-A 28P3 Operational Range Industrial (-40!C to 85!C) 1. This device can also be supplied in wafer form. Please contact your local Atmel sales office for detailed ordering information and minimum quantities. 2. Pb-free packaging complies to the European Directive for Restriction of Hazardous Substances (RoHS directive).
ATmega48P/88P/168P/328P 7. Packaging Information 7.1 32A PIN 1 B PIN 1 IDENTIFIER E1 e E D1 D C 0˚~7˚ A1 A2 A L COMMON DIMENSIONS (Unit of Measure = mm) MIN NOM MAX A – – 1.20 A1 0.05 – 0.15 SYMBOL Notes: 1. This package conforms to JEDEC reference MS-026, Variation ABA. 2. Dimensions D1 and E1 do not include mold protrusion. Allowable protrusion is 0.25 mm per side. Dimensions D1 and E1 are maximum plastic body size dimensions including mold mismatch. 3. Lead coplanarity is 0.
ATmega48P/88P/168P/328P 7.2 28M1 D C 1 2 Pin 1 ID 3 SIDE VIEW E A1 TOP VIEW A y D2 K 1 0.45 2 R 0.20 3 E2 b SYMBOL MIN NOM MAX A 0.80 0.90 1.00 A1 0.00 0.02 0.05 b 0.17 0.22 0.27 C L e 0.4 Ref (4x) Note: COMMON DIMENSIONS (Unit of Measure = mm) 0.20 REF D 3.95 4.00 4.05 D2 2.35 2.40 2.45 E 3.95 4.00 4.05 E2 2.35 2.40 2.45 e BOTTOM VIEW The terminal #1 ID is a Laser-marked Feature. NOTE 0.45 L 0.35 0.40 0.45 y 0.00 – 0.08 K 0.
ATmega48P/88P/168P/328P 7.3 32M1-A D D1 1 2 3 0 Pin 1 ID E1 SIDE VIEW E TOP VIEW A2 A3 A1 A K 0.08 C P D2 1 2 3 P Pin #1 Notch (0.20 R) K e SYMBOL MIN NOM MAX A 0.80 0.90 1.00 A1 – 0.02 0.05 A2 – 0.65 1.00 A3 E2 b COMMON DIMENSIONS (Unit of Measure = mm) L BOTTOM VIEW 0.20 REF b 0.18 0.23 0.30 D 4.90 5.00 5.10 D1 4.70 4.75 4.80 D2 2.95 3.10 3.25 E 4.90 5.00 5.10 E1 4.70 4.75 4.80 E2 2.95 3.10 3.25 e Note: JEDEC Standard MO-220, Fig.
ATmega48P/88P/168P/328P 7.4 28P3 D PIN 1 E1 A SEATING PLANE L B2 B1 B A1 (4 PLACES) e E 0º ~ 15º C COMMON DIMENSIONS (Unit of Measure = mm) REF SYMBOL eB Note: 1. Dimensions D and E1 do not include mold Flash or Protrusion. Mold Flash or Protrusion shall not exceed 0.25 mm (0.010"). MIN NOM MAX A – – 4.5724 A1 0.508 – – D 34.544 – 34.798 E 7.620 – 8.255 E1 7.112 – 7.493 B 0.381 – 0.533 B1 1.143 – 1.397 B2 0.762 – 1.143 L 3.175 – 3.429 C 0.203 – 0.
ATmega48P/88P/168P/328P 8. Errata 8.1 Errata ATmega48P The revision letter in this section refers to the revision of the ATmega48P device. 8.1.1 Rev. C No known errata. 8.1.2 Rev. B No known errata. 8.1.3 Rev. A Not Sampled. 8.2 Errata ATmega88P The revision letter in this section refers to the revision of the ATmega88P device. 8.2.1 Rev. C Not sampled. 8.2.2 Rev. B No known errata. 8.2.3 Rev. A No known errata. 8.
ATmega48P/88P/168P/328P Problem Fix/ Workaround None 8.4.3 Rev A • Unstable 32 kHz Oscillator 1. Unstable 32 kHz Oscillator The 32 kHz oscillator does not work as system clock. The 32 kHz oscillator used as asynchronous timer is inaccurate.
ATmega48P/88P/168P/328P 9. Datasheet Revision History Please note that the referring page numbers in this section are referred to this document. The referring revision in this section are referring to the document revision. 9.1 Rev. 2545I-02/09 1. 9.2 Rev. 2545H-02/09 1. 2. 3. 4. 5. 9.3 Removed “preliminary” from ATmega48P/88P/168P. Added Power-save Maximum values and footnote to ”ATmega48P DC Characteristics” on page 314.
ATmega48P/88P/168P/328P 9.4 Rev. 2545F-08/08 1. 2. 9.5 Rev. 2545E-08/08 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 9.6 Updated description of ”Stack Pointer” on page 12. Updated description of use of external capacitors in ”Low Frequency Crystal Oscillator” on page 32. Updated Table 6-9 in ”Low Frequency Crystal Oscillator” on page 32. Added note to ”Address Match Unit” on page 222. Added section ”Reading the Signature Row from Software” on page 285.
ATmega48P/88P/168P/328P 9.8 Rev. 2545B-01/08 1. Updated ”Features” on page 1. 2. Added ”Data Retention” on page 7. 3. Updated Table 6-2 on page 28. 4. 5. Removed “Low-frequency Crystal Oscillator Internal Load Capacitance“ table from”Low Frequency Crystal Oscillator” on page 32. Removed JTD bit from ”MCUCR – MCU Control Register” on page 44. 8.
Headquarters International Atmel Corporation 2325 Orchard Parkway San Jose, CA 95131 USA Tel: 1(408) 441-0311 Fax: 1(408) 487-2600 Atmel Asia Unit 1-5 & 16, 19/F BEA Tower, Millennium City 5 418 Kwun Tong Road Kwun Tong, Kowloon Hong Kong Tel: (852) 2245-6100 Fax: (852) 2722-1369 Atmel Europe Le Krebs 8, Rue Jean-Pierre Timbaud BP 309 78054 Saint-Quentin-enYvelines Cedex France Tel: (33) 1-30-60-70-00 Fax: (33) 1-30-60-71-11 Atmel Japan 9F, Tonetsu Shinkawa Bldg.