ATmega328 Features
ATmega328 data sheet p. 1
http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-MicrocontrollerATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet.pdf
Microcontroller Ports and Pins
The communication channels
through which information
flows into or out of the
microcontroller
Ex. PORTB
Pins PB0 PB7
May not be contiguous
See next slides!
Often bi-directional
Port Pin Data Directionality
Input
Output
When you want to take information from the external
world (sensors) into the MCU
When you want to change the state of something
outside the MCU (turn a motor on or off, etc.)
Pins default to input direction on power-up or
reset
Your program can set or change the
directionality of a pin at any time
ATmega328
Block Diagram
Input
Output
Setting the Pin Data Direction
Arduino
pinMode(pin_no., dir)
Ex. Make Arduino pin 3 (PD3) an output
pinMode(3, OUTPUT)
pinMode(PIN_D3, OUTPUT) // with me106.h
Note: one pin at a time
Suppose you wanted Arduino pins 3, 5, and 7
(PD3, PD5, and PD7) to be outputs?
Is there a way to make them all outputs at the
same time?
Yes! Answer coming later
Pin Used as an Output
Turn on an LED, which is
connected to pin Arduino pin 0
(PD0) (note the resistor!)
What should the data
direction be for pin 0 (PD0)?
Turn on the LED
pinMode(____, ____);
digitalWrite(0,HIGH);
Turn off the LED
digitalWrite(0,LOW);
ATmega328
Arduino
pin 0
(PD0)
Pin Voltages
Microcontrollers are fundamentally digital
devices
Information is coded in two discrete states:
HIGH or LOW (logic: 1 or 0)
Voltages
TTL
5 V (for HIGH)
0 V (for LOW)
3.3 V CMOS
3.3 V (for HIGH)
0 V (for LOW)
Pins as Inputs and Pull-up Resistors - 1
Using a switch as a sensor
Ex. Seat belt sensor
Detect the switch state
What should the data direction
be for Arduino pin 3 (PD3)?
pinMode(____, ____);
What will the voltage be on
PD3 when the switch is closed?
What will the voltage be on
PD3 when the switch is open?
Indeterminate!
ATmega328
Arduino
pin 3
(PD3)
Pins as Inputs and Pull-up Resistors - 2
Switch as a sensor, cont.
Make the voltage on the pin
determinate by turning on
the pull-up resistor for PD3
Assuming PD3 is an input:
What will the voltage on PD3
be when the switch is open?
digitalWrite(3,HIGH); turns
on the pull-up resistor
VTG
What will the voltage on PD3
be when the switch is closed?
ATmega328
VTG= +5V
PD3
0
Pins as Inputs and Pull-up Resistors - 3
Switch as a sensor, cont.
To turn off the pull-up
resistor
Assuming PD3 is an input:
digitalWrite(3,LOW); turns
the pull-up resistor off
ATmega328
VTG= +5V
PD3
0
Pins as Inputs and Pull-up Resistors - 4
Possibility of weak drive
Pin set as an input with a
pull-up resistor turned on
can source a small current
Remember this!
ATmega328
VTG= +5V
iweak
1
PD3
0
Spartronics Experimenter Shield
RC servo header
Digital pins header
RGB LED
Red-RGB jumper
Tact switches
Red LEDs
Piezo
speaker
Pwr-gnd header
Reset button
Temperature sensor
Photoresistor
Analog pins header
Potentiometer
Binary and Hexadecimal Numbers - 1
Microcontrollers are fundamentally digital
(as opposed to analog) and use binary
logic
Two states: high and low, 1 or 0, on or off
Often 5V or 0V
One binary digit is called a bit
It can take on two possible states: 1 or 0
Eight binary digits are called a byte
Four binary digits are called a nibble
Binary and Hexadecimal Numbers - 2
Byte and bits
Bit No.
Upper nibble
(4 bits)
Lower nibble
(4 bits)
MSB
LSB
(Most Significant Bit)
(Least Significant Bit)
Binary and Hexadecimal Numbers - 3
Place Value
1 1 3 8
(Base 10 or decimal number)
1 103 1 10 2 3 101 8 100
1000 100 30
8
1138
Bit No.
(Base 10)
(Base 2 or binary number )
1 23 1 2 2 0 21 1 20
8
4
0
1 13
(Base 10)
What range of decimal values can 4 bits represent?
How many values in total can 4 bits represent? 16
0 to 15
Binary and Hexadecimal Numbers - 4
HEX
Binary
0
Why is hex important?
One hex digit can be
used as shorthand to
represent four binary
digits
Two hex digits can be
used as shorthand to
represent eight
binary digits or one
byte
Using Hex Values
Practice
0b11000111 in hex (0b is C notation that says,
interpret what follows as a binary number)
0b10011001 in hex
0b10011001 as a base 10 number
0x5A in binary (use 8 bits)
0b11111111 in hex and as a base 10 number
(37)10 in binary and hex
the prefix '0x' is C notation that means that the digits which follow are hex digits
the prefix '0b' means that the digits which follow are binary digits
Back to PORT details
Solution
1100 0111 in hex = 0xC7
1001 1001 in hex = 0x99
1001 1001 in base 10 = 153
0x5A in binary = 0b0101 1010
0b1111 1111 = 0xFF or 255
(37) = 0b0010 0101 or 0x25
So What?
Recall the question:
All the work of MCU happens through registers
(special memory locations)
Is there a way change the data direction for a set of
pins all at the same time?
Registers on the Atmega328 are 8-bits wide
The data direction register (DDRx) handles the
data directions for pins in PORTx
Source:http://www.atmel.com/dyn/products/product_card.asp?PN=ATmega328P p. 93
Data Direction Register
If the bit is zero -> pin will be an input
If the bit is one -> pin will be an output
Making a bit to be zero == clearing the bit
Making a bit to be one == setting the bit
To change the data direction for a set of pins
belonging to PORTx at the same time:
1.
2.
Determine which bits need to be set and cleared in
DDRx
Store the binary number or its equivalent (in an
alternate base, such as hex) into DDRx
PORT Pin and
register details
ATmega328 datasheet, pp. 76-94
Jump to bits
ATmega328 Port Pin Details
See the ATmega328 data sheet, pp. 76-94
Port pin functionality is controlled by three
register (special memory location) bits:
DDRx
PORTxn
Data Direction bit in DDRx register (read/write)
PORTxn bit in PORTx data register (read/write)
PINxn
PINxn bit in PINx register (read only)
Example 1
Make Arduino pins 3, 5, and 7 (PD3, PD5, and
PD7) to be outputs
Arduino approach
Alternate approach
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(7, OUTPUT);
Or if me106.h is used:
pinMode(PIN_D3, OUTPUT);
pinMode(PIN_D5, OUTPUT);
pinMode(PIN_D7, OUTPUT);
DDRD = 0b10101000;
or
DDRD = 0xA8;
or
DDRD | = 1<<PD7 | 1<<PD5 | 1<<PD3;
More on this next lecture!
Example 2
Make pins Arduino pins 0 and 1 (PD0 and PD1)
inputs, and turn on pull-up resistors
Arduino approach
pinMode(0, INPUT);
pinMode(1, INPUT);
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
Or if me106.h is used:
pinMode(PIN_D0, INPUT);
pinMode(PIN_D1, INPUT);
digitalWrite(PIN_D0, HIGH);
digitalWrite(PIN_D1, HIGH);
Alternate approach
DDRD = 0; // all PORTD pins inputs
PORTD = 0b00000011;
or
PORTD = 0x03;
or better yet:
DDRD & = ~(1<<PD1 | 1<<PD0);
PORTD | = (1<<PD1 | 1<<PD0);
More on this next lecture!
Structure of an Arduino Program
An arduino program == sketch
Must have:
setup()
setup()
loop()
configures pin modes and
registers
loop()
runs the main body of the
program forever
like while(1) {}
Where is main() ?
Arduino simplifies things
Does things for you
/* Blink - turns on an LED for DELAY_ON msec,
then off for DELAY_OFF msec, and repeats
BJ Furman rev. 1.1 Last rev: 22JAN2011
*/
#define LED_PIN 13 // LED on digital pin 13
#define DELAY_ON 1000
#define DELAY_OFF 1000
void setup()
{
// initialize the digital pin as an output:
pinMode(LED_PIN, OUTPUT);
}
// loop() method runs forever,
// as long as the Arduino has power
void loop()
{
digitalWrite(LED_PIN, HIGH); // set the LED on
delay(DELAY_ON); // wait for DELAY_ON msec
digitalWrite(LED_PIN, LOW); // set the LED off
delay(DELAY_OFF); // wait for DELAY_OFF msec
}
Digital IO Practice 1
Reading a pin
Write some lines of C code for the
Arduino to determine a course of
action if the seat belt has been
latched (switch closed).
If latched, the ignition should be
enabled through a call to a function
ig_enable().
If not latched, the ignition should be
disabled through a call to a function
ig_disable()
Write pseudocode first
ATmega328
PD3
Digital IO Practice 1 Solution
Reading a pin
Pseudocode:
Read voltage on Arduino pin 3 (PIN_D3)
IF PIN_D3 voltage is LOW (latched), THEN
call function ig_enable()
ELSE
call function ig_disable()
C code snippet (not full program):
#include me106.h
#define LATCHED LOW
pinMode(PIN_D3,INPUT);
digitalWrite(PIN_D3,HIGH);
belt_state = digitalRead(PIN_D3);
if (belt_state == LATCHED)
{ ig_enable(); }
else
{ ig_disabled(); }
ATmega328
VTG= +5V
PD3
0
Digital IO Practice 2 Pseudocode
Pseudocode:
Set up data direction of pins
Make PD0 and PD1 inputs
Turn on pull up resistors for PD0 and PD1
Make PD2 and PD3 outputs
Loop forever
IF key is in ignition THEN
ATmega328
PD3
PD2
VTG= +5V
PD0, PD1
IF belt is latched, THEN
Turn off buzzer
Turn off lamp
ELSE
Turn on lamp
Turn on buzzer
ELSE
Turn off buzzer
Turn off lamp
Summary
Data direction
Input is default, but okay to set explictly
Output
Arduino style: pinMode(pin_no, mode)
Alternate: Set bits in DDRx
Pull-up resistors
Pin must be an input
Arduino style: digitalWrite(pin_no, state)
Alternate style: Set bits in PORTx
Summary, cont.
Read digital state of a pin
Arduino style: digitalRead(pin_no)
Alternate: next lecture
Write to a pin (assuming it is an output)
Arduino style: digitalWrite(pin_no, state)
Alternate: next lecture