Explain the general architecture of a microcontroller
List the key features of the ATmega328 microcontroller
Explain the features and elements of the Arduino and Spartronics Experimenter Shield (SES)
Explain the concepts of microcontroller pins as inputs and outputs
Convert between binary and hexadecimal digits

注脚

展开查看详情

1. Learning Objectives • Explain the general architecture of a microcontroller • List the key features of the ATmega328 microcontroller • Explain the features and elements of the Arduino and Spartronics Experimenter Shield (SES) • Explain the concepts of microcontroller pins as inputs and outputs • Convert between binary and hexadecimal digits

2.Mechatronics Concept Map ME 106 User ME 120 Interface Power Source Controller ME 106 ME 190 (Hardware & Software) ME 187 ME 106 Power Interface INTEGRATION Signal ME 106 Conditioning ME 120 ME 106 ME 154 Actuator ME 157 ME 195 Sensor ME 120 ME 297A System to Control ME 110 ME 182 ME 136 ME 189 ME 154 ME 195 BJ Furman 22JAN11 ME 157

3.What is a Microcontroller? ANALOG INPUTS What is the difference between a ‘Digital Input’ and an ‘Analog Input’? http://www.freescale.com/files/microcontrollers/doc/ref_manual/M68HC05TB.pdf

4.ATmega328 Internal Architecture ATmega328 data sheet pp. 2, 5 http://www.adafruit.com/index.php?

5. ATmega328 Features ATmega328 data sheet p. 1 http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller -ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet.p df

6. Arduino Duemilanove http://www.arduino.cc/en/Main/ArduinoBoardDuemilanove See the handout: Arduino_ATmega328_pin_mapping_and_schematic Pin 13 LED Digital pins header USB connector Reset button ATmega328 MCU Barrel jack Analog pins header Power-ground header http://arduino.cc/en/uploads/Main/ArduinoDuemilanove.jpg

7. Arduino Uno R3 ATmega16u2 replaces FT232RL for USB-serial communication http://www.adafruit.com/index.php? main_page=popup_image&pID=50 See: http://learn.adafruit.com/arduino-tips-tricks-and-techniques/arduino-uno-faq

8.Arduino Due Note: 3.3 V !! Atmel SAM3X8E processor (32 bit ARM Cortex M3 architecture, 84MHz) http://www.adafruit.com/index.php?main_page=popup_image&pID=1076 See: http://arduino.cc/en/Main/ArduinoBoardDue

9.Arduino Duemilanove/Uno Features Microcontroller ATmega168/328 Operating Voltage 5V Input Voltage (recommended) 7-12V Input Voltage (limits) 6-20V Digital I/O Pins 14 (of which 6 provide PWM output) Analog Input Pins 6 DC Current per I/O Pin 40 mA DC Current for 3.3V Pin 50 mA 16 KB (ATmega168) or 32 KB (ATmega328) of which 2 KB Flash Memory used by bootloader SRAM 1 KB (ATmega168) or 2 KB (ATmega328) EEPROM 512 bytes (ATmega168) or 1 KB (ATmega328) Clock Speed 16 MHz http://www.arduino.cc/en/Main/ArduinoBoardDuemilanove

10.http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf

11.ATmega328 Microcontroller Pin number Pin name Special function Note the limitations! p. 316 Source:http://www.atmel.com/dyn/products/product_card.asp?PN=ATmega328P

12.Absolute Maximums ATmega328 data sheet p. 316

13.Microcontroller Ports and Pins  The communication channels through which information flows C into or out of the microcontroller  Ex. PORTB  Pins PB0 – PB7  May not be contiguous  Often bi-directional See next slides!

14.Port Pin Data Directionality • Input • When you want to take information from the external world (sensors) into the MCU • Output • 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

15.ATmega328 Block Diagram Input Output

16.M68HC11 microcontroller

17. 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…

18.Pin Voltages • Microcontrollers are fundamentally digital devices. For digital IO pins: • 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)

19. Pin Used as an Output • Turn on an LED, which is connected to pin Arduino pin 0 (PD0) (note the ATmega328 resistor!) • What should the data direction be for pin 0 (PD0)? Arduino • pinMode(____, ____); pin 0 • Turn on the LED (PD0) • digitalWrite(PIN_LED,HIGH); • Turn off the LED • digitalWrite(PIN_LED,LOW);

20. Pins as Inputs and Pull-up Resistors - 1 • Using a switch as a sensor • Ex. Seat belt sensor ATmega328 • Detect the switch state • What should the data direction be for Arduino pin 3 (PD3)? • pinMode(____, ____); Arduino • What will the voltage be on PD3 when the switch is closed? pin 3 • What will the voltage be on PD3 when the switch is open? (PD3) • Indeterminate! SPST momentary

21. Pins as Inputs and Pull-up Resistors - 2 • Switch as a sensor, cont. • Make the voltage on the pin ATmega328 determinate by turning on the pull-up VTG= +5V resistor for PD3 • Assuming PD3 is an input: • digitalWrite(PIN_SWITCH,HIGH); 1 PD3 turns on the “pull-up” resistor 0 • pinMode(PIN_SWITCH,INPUT_PULLUP); • What will the voltage on PD3 be when the switch is open? • VTG • What will the voltage on PD3 be when the switch is closed?

22. Pins as Inputs and Pull-up Resistors - 3 • Switch as a sensor, cont. • To turn off the pull-up resistor ATmega328 • Assuming PD3 is an input: digitalWrite(PIN_SWITCH,LOW); VTG= +5V turns the “pull-up” resistor off 1 PD3 0

23. Pins as Inputs and Pull-up Resistors - 4 • Possibility of ‘weak drive’ when pull-up resistor is turned on ATmega328 • Pin set as an input with a pull-up resistor turned on can source a small current VTG= +5V • Remember this! iweak 1 PD3 0

24. Spartronics Experimenter Shield Digital pins header RC servo header RGB LED Red-RGB jumper Tact switches Red LEDs Pwr-gnd header Piezo speaker Reset button Temperature Photoresistor Potentiometer sensor Analog pins header

25.Handling the Arduino - How NOT to Do It! Improper Handling - NEVER!!!

26.Handling the Arduino - The Proper Way Proper Handling - by the edges!!!

27. Spartronics Experimenter LED Pinout  Pin and LED map  11 - LED0 (red)  9 - LED1 (red) or RGB (green)  6 - LED2 (red) or RGB (blue)  3 - LED3 (red) or RGB (red)  13 - LED on Arduino Jumper determines whether pins map to red LEDs or the RGB 11 9 6 3

28.Spartronics Experimenter Digital Pin Assignments 13 12 11 10 9 8 7 6 5 4 3 2 1 0 SCK MISO MOSI SS OC1 ICP AIN1 AIN0 T1 T0 INT1 INT0 TXD RXD LED LED LED pwm pwm pwm pwm pwm pwm LED0 LED1 LED2 LED3 green blue red piezo servo SW0 SW1 SW2 SW3 See the Introduction to the Arduino Microcontroller laboratory exercise

29.Spartronics Experimenter Analog Pin Assignments 7 6 5 4 3 2 1 0 photocell POT temp sensor See the Introduction to the Arduino Microcontroller laboratory exercise

30.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

31. Binary and Hexadecimal • Numbers - 2 Byte and bits 1 1 0 0 1 1 0 1 Bit No. 7 6 5 4 3 2 1 0 Upper nibble Lower nibble (4 bits) (4 bits) MSB LSB (Most Significant Bit) (Least Significant Bit)

32.Binary and Hexadecimal Numbers - 3 Place Value 1 1 3 8 (Base 10 or decimal number) 1 103  1 102  3 101  8 100 1000  100  30 8 1138 (Base 10) Bit No. 3 2 1 0 1 1 0 1 (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? 0 to 15 • How many values in total can 4 bits represent? 16

33.Binary and Hexadecimal Numbers Binary - 4 HEX 0 0 0 0 0 Why is hex important? 0 0 0 1 1 0 0 1 0 2 0 0 1 1 3 One hex digit can be used as shorthand to 0 1 0 0 4 represent four binary 0 1 0 1 5 digits 0 1 1 0 6 0 1 1 1 7 Two hex digits can be 1 0 0 0 8 used as shorthand to 1 0 0 1 9 represent eight 1 0 1 0 A binary digits or one 1 0 1 1 B byte 1 1 0 0 C 1 1 0 1 D 1 1 1 0 E 1 1 1 1 F

34.Using Hex Values

35. 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

36.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

37.So What? • Recall the question: • Is there a way change the data direction for a set of pins all at the same time? • All the work of MCU happens through registers (special memory locations) • 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

38.Data Direction Register • If the bit is zero -> pin will be an input • Making a bit to be zero == ‘clearing the bit’ • If the bit is one -> pin will be an output • 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.Determine which bits need to be set and cleared in DDRx 2.Store the binary number or its equivalent (in an alternate base, such as hex) into DDRx

39.ATmega328 Registers of Interest • See the ATmega328 data sheet, pp. 76-94 • For digital IO, the important registers are: • DDRx • Data Direction bit in DDRx register (read/write) • PORTx • PORTx data register (read/write) • PINx • PINx register (read only)

40.PORT Pin and register details ATmega328 datasheet, pp. 76-94 Jump to bits

41. Example 1  Make Arduino pins 3, 5, and 7 (PD3, PD5, and PD7) to be outputs • Arduino approach • Alternate approach pinMode(3, OUTPUT); DDRD = 0b10101000; pinMode(5, OUTPUT); pinMode(7, OUTPUT); or Or if me106.h is used: DDRD = 0xA8; pinMode(PIN_D3, OUTPUT); pinMode(PIN_D5, OUTPUT); or pinMode(PIN_D7, OUTPUT); DDRD | = 1<<PD7 | 1<<PD5 | 1<<PD3; More on this coming soon!

42. Example 2  Make pins Arduino pins 0 and 1 (PD0 and PD1) inputs, and turn on pull-up resistors • Arduino approach • Alternate approach pinMode(0, INPUT); DDRD = 0; // all PORTD pins inputs pinMode(1, INPUT); PORTD = 0b00000011; digitalWrite(0, HIGH); or digitalWrite(1, HIGH); PORTD = 0x03; Or if me106.h is used: or better yet: pinMode(PIN_D0, INPUT); DDRD & = ~(1<<PD1 | 1<<PD0); pinMode(PIN_D1, INPUT); PORTD | = (1<<PD1 | 1<<PD0); digitalWrite(PIN_D0, HIGH); digitalWrite(PIN_D1, HIGH); More on this coming soon!

43.Structure of an Arduino Program /* Blink - turns on an LED for DELAY_ON msec, then off for DELAY_OFF msec, and repeats • An arduino program == ‘sketch’ BJ Furman rev. 1.1 Last rev: 22JAN2011 • Must have: */ #define LED_PIN 13 // LED on digital pin 13 • setup() #define DELAY_ON 1000 • loop() #define DELAY_OFF 1000 • setup() void setup() • configures pin modes and { registers // initialize the digital pin as an output: pinMode(LED_PIN, OUTPUT); • loop() } • runs the main body of the program forever // loop() method runs forever, • like while(1) {…} // as long as the Arduino has power • Where is main() ? void loop() • Arduino simplifies things { digitalWrite(LED_PIN, HIGH); // set the LED on • Does things for you delay(DELAY_ON); // wait for DELAY_ON msec digitalWrite(LED_PIN, LOW); // set the LED off delay(DELAY_OFF); // wait for DELAY_OFF msec }

44. Digital IO – Practice 1 • ‘Reading a pin’ • Write some lines of C code for the ATmega328 Arduino to determine a course of action if the seat belt has been latched (switch closed). • If latched, the ignition should be enabled PD3 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

45. Digital IO – Practice 1 Pseudocode • ‘Reading a pin’ • Pseudocode: ATmega328 Set up PD3 as an input VTG= +5V Turn on PD3 pull-up resistor Read voltage on Arduino pin 3 (PIN_D3) IF PIN_D3 voltage is LOW (latched), THEN 1 call function ig_enable() PD3 ELSE 0 call function ig_disable()

46. Digital IO – Practice 1 Code • ‘Reading a pin’ ATmega328 • Pseudocode: VTG= +5V Set up PD3 as an input Turn on PD3 pull-up resistor Read voltage on Arduino pin 3 (PIN_D3) 1 IF PIN_D3 voltage is LOW (latched), THEN PD3 call function ig_enable() 0 ELSE call function ig_disable() One way  #define PIN_SWITCH 3 (snippet, not full program) #define LATCHED LOW pinMode(PIN_SWITCH,INPUT_PULLUP); belt_state = digitalRead(PIN_SWITCH); if (belt_state == LATCHED) { ig_enable(); } else { ig_disabled(); }

47. Digital IO – Practice 2 • ‘Reading from and writing to a pin’ ATmega328 • Write some lines of C code for the PD3 Arduino to turn on a lamp (PD2) and PD2 buzzer (PD3) if the key is in the ignition (PD0 closed), but seat belt is not latched (PD1 open) • (diagram shows only one of the two switches, but both are similar) PD0, PD1 • Pseudocode first

48. Digital IO – Practice 2 Pseudocode • Pseudocode: Set up data direction of pins ATmega328 Make PD0 and PD1 inputs Turn on pull up resistors for PD0 and PD1 PD3 Make PD2 and PD3 outputs Loop forever IF key is in ignition THEN PD2 IF belt is latched, THEN Turn off buzzer Turn off lamp VTG= +5V ELSE Turn on lamp Turn on buzzer ELSE 1 Turn off buzzer PD0, PD1 Turn off lamp 0

49.Digital IO – Practice 2 (Arduino style code) #define PIN_IGNITION 0 #define PIN_SEATBELT 1 #define PIN_LED 2 ATmega328 #define PIN_BUZZER 3 #define SEATBELT_LATCHED LOW PD3 #define KEY_IN_IGNITION LOW #define LED_ON HIGH PD2 #define LED_OFF LOW #define BUZZER_ON HIGH VTG= +5V #define BUZZER_OFF LOW void setup() { pinMode(PIN_IGNITION, INPUT_PULLUP); // key switch 1 PD0, PD1 pinMode(PIN_SEATBELT, INPUT_PULLUP); // belt latch switch pinMode(PIN_LED, OUTPUT); // lamp 0 pinMode(PIN_BUZZER, OUTPUT); // buzzer } void loop() { /* see next page for code */}

50.Digital IO – Practice 2 (Arduino style code) /* see previous page for code before loop() */ void loop() { ATmega328 int key_state = digitalRead(PIN_IGNITION); int belt_state = digitalRead(PIN_SEATBELT); PD3 if (key_state == KEY_IN_IGNITION) { PD2 if (belt_state == SEATBELT_LATCHED) { VTG= +5V digitalWrite(PIN_BUZZER, BUZZER_OFF); digitalWrite(PIN_LED, LED_OFF); } else // key is in ignition, but seatbelt NOT latched 1 PD0, PD1 { digitalWrite(PIN_BUZZER, BUZZER_ON); 0 digitalWrite(PIN_LED, LED_ON); } else // key is NOT in ignition { digitalWrite(PIN_BUZZER, BUZZER_OFF); digitalWrite(PIN_LED, LED_OFF); } } }

51.Digital IO – Practice 3 (Register style code) /* NOTE: #defines use predefined PORT pin numbers for ATmega328 */ #define PIN_IGNITION PD0 ATmega328 #define PIN_SEATBELT PD1 PD3 #define PIN_LED PD2 #define PIN_BUZZER PD3 #define SEATBELT_LATCHED LOW PD2 #define KEY_IN_IGNITION LOW #define LED_ON HIGH VTG= +5V #define LED_OFF LOW #define BUZZER_ON HIGH #define BUZZER_OFF LOW 1 PD0, PD1 #define _BIT_MASK( bit ) ( 1 << (bit) ) // same as _BV( bit) 0 void setup() { PORTD = 0; // all PORTD pullups off DDRD = _BIT_MASK(PIN_LED) | _BIT_MASK(PIN_BUZZER); // LED and buzzer PORTD | = _BV(PIN_IGNITION) | _BV(PIN_SEATBELT); // pullups for switches } /* See next page for loop() code */

52.Digital IO – Practice 3 (Register style code) /* see previous page for setup() code */ void loop() { ATmega328 uint8_t current_PORTD_state, key_state, belt_state; current_PORTD_state = PIND; // snapshot of PORTD pins PD3 key_state = current_PORTD_state & _BV(PIN_IGNITION); belt_state = current_PORTD_state & _BV(PIN_SEATBELT); PD2 if (key_state == KEY_IN_IGNITION) { VTG= +5V if (belt_state == SEATBELT_LATCHED) { PORTD & = ~( _BV(PIN_LED) | _BV(PIN_BUZZER) ); 1 } PD0, PD1 else 0 { PORTD | = ( _BV(PIN_LED) | _BV(PIN_BUZZER) ); } } else { PORTD & = ~( _BV(PIN_LED) | _BV(PIN_BUZZER) ); } }

53.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

54.Summary, cont. • Read digital state of a pin • Arduino style: digitalRead(pin_no) • ‘Register-style’: need to form a bit mask and use it to ‘single-out’ the bit of interest • Write to a pin (assuming it is an output) • Arduino style: digitalWrite(pin_no, state) • ‘Register-style’: use a bit mask and bit manipulation techniques to set or clear only the bits of interest

55.Digital Input

56.Microcontroller Fundamentals B. Furman 23FEB2016