Bird
Raised Fist0
Arduinoprogramming~20 mins

How Arduino code maps to AVR hardware - Practice Exercises

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
AVR Hardware Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
What is the output on the LED connected to pin 13?

Consider this Arduino code snippet:

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

What happens to the LED connected to pin 13?

Arduino
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}
AThe LED blinks rapidly without delay.
BThe LED blinks on and off every second.
CThe LED stays off continuously.
DThe LED stays on continuously.
Attempts:
2 left
💡 Hint

Think about what digitalWrite and delay do in the loop.

🧠 Conceptual
intermediate
2:00remaining
How does Arduino's digitalWrite map to AVR registers?

Which AVR hardware register is directly affected when digitalWrite(13, HIGH) is called on an Arduino Uno?

APORTB register
BPORTD register
CPORTC register
DDDRB register
Attempts:
2 left
💡 Hint

Pin 13 on Arduino Uno corresponds to which AVR port?

🔧 Debug
advanced
2:00remaining
Why does this direct port manipulation code fail to blink the LED?

Look at this Arduino code that tries to blink the LED on pin 13 using direct AVR register manipulation:

void setup() {
  DDRB |= (1 << 5);
}

void loop() {
  PORTB ^= (1 << 5);
  delay(500);
}

But the LED does not blink. What is the most likely reason?

Arduino
void setup() {
  DDRB |= (1 << 5);
}

void loop() {
  PORTB ^= (1 << 5);
  delay(500);
}
AThe delay function is not working properly.
BThe DDRB register is not set correctly to output.
CPin 13 is not connected to PORTB5 on this Arduino board variant.
DThe XOR operation does not toggle the pin state.
Attempts:
2 left
💡 Hint

Check the board variant and pin mapping for pin 13.

📝 Syntax
advanced
2:00remaining
What error does this Arduino code produce?

Examine this Arduino code snippet:

void setup() {
  pinMode(13, OUTPUT)
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
}

What error will the compiler show?

Arduino
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
}
ARuntime error: pinMode not defined
BTypeError: pinMode expects 2 arguments
CNo error, code compiles fine
DSyntaxError: expected ';' before '}'
Attempts:
2 left
💡 Hint

Look carefully at the end of the pinMode line.

🚀 Application
expert
2:00remaining
How many bits are set in PORTD after this code runs?

Given this Arduino code snippet:

void setup() {
  DDRD = 0b00001111;
  PORTD = 0b10101010;
}

void loop() {}

How many bits are set to HIGH in the PORTD register after setup() runs?

Arduino
void setup() {
  DDRD = 0b00001111;
  PORTD = 0b10101010;
}

void loop() {}
A4
B6
C2
D8
Attempts:
2 left
💡 Hint

Count the bits set to 1 in PORTD after assignment.

Practice

(1/5)
1. What does the Arduino digitalWrite() function do in relation to the AVR hardware?
easy
A. It sets a specific pin on the AVR chip to HIGH or LOW voltage.
B. It reads the voltage level from a pin on the AVR chip.
C. It configures the clock speed of the AVR chip.
D. It resets the AVR chip to its initial state.

Solution

  1. Step 1: Understand the purpose of digitalWrite()

    The digitalWrite() function is used to control output pins on the Arduino board.
  2. Step 2: Map function to AVR hardware action

    It changes the voltage level on a specific pin of the AVR chip to either HIGH (5V) or LOW (0V).
  3. Final Answer:

    It sets a specific pin on the AVR chip to HIGH or LOW voltage. -> Option A
  4. Quick Check:

    digitalWrite() controls pin voltage = D [OK]
Hint: digitalWrite sets pin voltage HIGH or LOW [OK]
Common Mistakes:
  • Confusing digitalWrite() with digitalRead()
  • Thinking it resets the chip
  • Assuming it changes clock speed
2. Which of the following is the correct syntax to set pin 13 as an output in Arduino code?
easy
A. pinMode(OUTPUT, 13);
B. pinMode(13, OUTPUT);
C. digitalWrite(13, OUTPUT);
D. digitalRead(13, OUTPUT);

Solution

  1. Step 1: Identify correct function and parameters for pin mode

    The function to set pin mode is pinMode(), which takes the pin number first, then the mode.
  2. Step 2: Match correct parameter order

    The correct order is pinMode(pin, mode); so pinMode(13, OUTPUT); is correct.
  3. Final Answer:

    pinMode(13, OUTPUT); -> Option B
  4. Quick Check:

    pinMode(pin, mode) sets pin direction = A [OK]
Hint: pinMode(pin, OUTPUT) sets pin as output [OK]
Common Mistakes:
  • Swapping parameters in pinMode()
  • Using digitalWrite() to set pin mode
  • Using digitalRead() incorrectly
3. Consider this Arduino code snippet:
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
int val = digitalRead(8);

What will be the value of val after running this code?
medium
A. Undefined behavior
B. 0
C. 1
D. Compilation error

Solution

  1. Step 1: Analyze pin mode and write operations

    Pin 8 is set as OUTPUT and then set to HIGH voltage.
  2. Step 2: Understand digitalRead() on an OUTPUT pin

    Reading a pin set as OUTPUT returns the value last set by digitalWrite() since PIN register reflects the output pin voltage, which is HIGH (1).
  3. Final Answer:

    1 -> Option C
  4. Quick Check:

    digitalRead() on OUTPUT pin returns 1 = A [OK]
Hint: digitalRead on OUTPUT pin returns the written value (1) [OK]
Common Mistakes:
  • Assuming digitalRead returns 0 on output pin
  • Thinking digitalRead cannot read output pins
  • Thinking code causes error
4. This Arduino code is intended to blink an LED on pin 13, but it doesn't work:
void setup() {
  digitalWrite(13, HIGH);
  pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, LOW);
  delay(1000);
  digitalWrite(13, HIGH);
  delay(1000);
}

What is the main problem?
medium
A. digitalWrite() cannot be used on pin 13
B. delay() cannot be used in loop()
C. setup() function is missing
D. pinMode() must be called before digitalWrite() in setup()

Solution

  1. Step 1: Check order of pin setup in setup()

    Pin mode must be set before writing to the pin to ensure proper hardware configuration.
  2. Step 2: Identify incorrect sequence

    The code calls digitalWrite(13, HIGH); before pinMode(13, OUTPUT);, which can cause the pin not to behave as expected.
  3. Final Answer:

    pinMode() must be called before digitalWrite() in setup() -> Option D
  4. Quick Check:

    Set pinMode before digitalWrite = C [OK]
Hint: Always set pinMode before digitalWrite [OK]
Common Mistakes:
  • Calling digitalWrite before pinMode
  • Thinking delay() is invalid
  • Assuming pin 13 is special and can't be used
5. You want to toggle an LED connected to pin 7 every 500ms using direct AVR port manipulation for speed. Which code snippet correctly maps Arduino pin 7 to AVR PORTD and toggles it?
hard
A. DDRD |= (1 << DDD6); PORTD ^= (1 << PORTD6);
B. DDRB |= (1 << DDB7); PORTB ^= (1 << PORTB7);
C. DDRC |= (1 << DDC7); PORTC ^= (1 << PORTC7);
D. DDRD |= (1 << DDD7); PORTD ^= (1 << PD7);

Solution

  1. Step 1: Identify Arduino pin 7 AVR port and bit

    On Arduino Uno, pin 7 maps to PORTD bit 6 (PD6), not bit 7.
  2. Step 2: Set pin 7 as output and toggle it

    Setting DDRD bit 6 to 1 configures pin 7 as output. Toggling PORTD bit 6 flips the pin state.
  3. Final Answer:

    DDRD |= (1 << DDD6); PORTD ^= (1 << PORTD6); -> Option A
  4. Quick Check:

    Pin 7 = PD6 toggle = D [OK]
Hint: Pin 7 is PD6; set DDRD and toggle PORTD bit 6 [OK]
Common Mistakes:
  • Using wrong port (PORTB or PORTC) for pin 7
  • Setting wrong bit number
  • Confusing DDRx and PORTx registers