new1
ATmega328P Architecture and Pinout
The ATmega328P is an 8-bit AVR microcontroller manufactured by Microchip.
It contains:
• 8-bit AVR CPU
• Flash program memory
• SRAM
• EEPROM
• GPIO ports
• ADC
• Timers/counters
• PWM outputs
• USART
• SPI
• I²C-compatible TWI
• Interrupt system
Main memory
| Memory | Function |
|---|---|
| Flash | Stores program |
| SRAM | Stores temporary variables |
| EEPROM | Stores data that must remain after power is removed |
ATmega328P DIP-28 pinout
IMAGE
Building the Standalone ATmega328P
You can build the circuit on a breadboard without an Arduino board.
USBasp and ISP Programming
USBasp is an ISP programmer.
ISP = In-System Programming.
It allows you to program the ATmega328P directly.
USBasp → ATmega328P
| USBasp | ATmega328P |
|---|---|
| MOSI | PB3 / Pin 17 |
| MISO | PB4 / Pin 18 |
| SCK | PB5 / Pin 19td> |
| RESET | PC6 / Pin 1 |
| VCC | Pin 7 |
| GND | Pin 8/22 |
The programming path is:
Computer → USB → USBasp → ISP → ATmega328P
Installing AVR-GCC and AVRDude
You need two important tools.
AVR-GCC
Used to compile C source code.
main.c → avr-gcc → main.elf
AVR-Objcopy
Converts the ELF file into HEX.
main.elf → avr-objcopy → main.hex
AVRDude
Transfers the HEX file to the ATmega.
main.hex → avrdude → USBasp → ATmega328P
ATmega C Program
#include
#include
#define F_CPU 16000000UL
int main(void)
{
DDRB |= (1 << PB5);
while (1)
{
PORTB |= (1 << PB5);
_delay_ms(1000);
PORTB &= ~(1 << PB5);
_delay_ms(1000);
}
return 0;
}
This makes PB5 HIGH and LOW repeatedly.
LED Control
Program:
#include
#include
#define F_CPU 16000000UL
int main(void)
{
DDRB |= (1 << PB5);
while (1)
{
PORTB |= (1 << PB5);
_delay_ms(500);
PORTB &= ~(1 << PB5);
_delay_ms(500);
}
}
Push Button Input
Connect a button to PD2.
A convenient method is using the internal pull-up resistor.
#include
#include
#define F_CPU 16000000UL
int main(void)
{
DDRB |= (1 << PB5);
DDRD &= ~(1 << PD2);
PORTD |= (1 << PD2);
while (1)
{
if (!(PIND & (1 << PD2)))
{
PORTB |= (1 << PB5);
}
else
{
PORTB &= ~(1 << PB5);
}
}
}
7-Segment Display
program :
#define F_CPU 16000000UL
#include
#include
const unsigned char digit[10] =
{
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
void display_digit(unsigned char number)
{
if (number <= 9)
{
PORTD = digit[number];
}
}
int main(void)
{
// PD0-PD6 as outputs
DDRD = 0x7F;
while (1)
{
display_digit(0);
_delay_ms(1000);
display_digit(1);
_delay_ms(1000);
display_digit(2);
_delay_ms(1000);
display_digit(3);
_delay_ms(1000);
display_digit(4);
_delay_ms(1000);
display_digit(5);
_delay_ms(1000);
display_digit(6);
_delay_ms(1000);
display_digit(7);
_delay_ms(1000);
display_digit(8);
_delay_ms(1000);
display_digit(9);
_delay_ms(1000);
}
}
USING ARDUINO UNO
// Arduino Uno + Common Cathode 7-Segment Display
// Segment pins
int a = 2;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 7;
int g = 8;
void setup()
{
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
}
void displayDigit(int number)
{
// Turn all segments OFF first
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
if (number == 0)
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
}
else if (number == 1)
{
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
}
else if (number == 2)
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(g, HIGH);
digitalWrite(e, HIGH);
digitalWrite(d, HIGH);
}
else if (number == 3)
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(g, HIGH);
}
else if (number == 4)
{
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
}
else if (number == 5)
{
digitalWrite(a, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
}
else if (number == 6)
{
digitalWrite(a, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(e, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
}
else if (number == 7)
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
}
else if (number == 8)
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
else if (number == 9)
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
}
void loop()
{
// Count from 0 to 9
for (int number = 0; number <= 9; number++)
{
displayDigit(number);
delay(1000);
}
}


