08_embedded_programming.md 1.83 KB
Newer Older
Erik Strand's avatar
Erik Strand committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
+++
title = "Embedded Programming"
date = "2018-10-19"
menu = "main"
weight = 9
+++

## Embedded Programming

Files: [blink.c](/designs/07_blink.c)

This week we need to take a board we've made and give it some new functionality. No more flashing with pre-written code.

Two weeks ago I added an LED and a button to Neil's [hello world](http://academy.cba.mit.edu/classes/embedded_programming/index.html#echo) board, so I'll start by making the LED turn on. I attached my LED to port PB2, and my switch to port PA7. To turn on the LED, we only need to do two things: enable PB2 as an output, and set it high. Here's code that does just that.

```
#include <avr/io.h>

#define led_pin (1 << PB2)

int main(void) {
    // Configure led_pin as an output.
    DDRB |= led_pin;

    // Set led_pin high.
    PORTB |= led_pin;

    // Nothing left to do, so just spin.
    while (1) {}

    return 0;
}
```

Next let's use the button. The easiest approach is to use the button as a contact switch, turning on the LED only for the duration of the button press. To do this we'll need to configure pin PA7 as an input. I didn't add a pullup resistor on my board, so I also have to enable PA7's internal one. This will ensure that PA7 reads high when the button isn't pressed.

```
#include <avr/io.h>

#define led_pin (1 << PB2)
#define switch_pin (1 << PA7)

int main(void) {
    // Configure led_pin as an output.
    DDRB |= led_pin;

    // Configure switch_pin as an input.
    DDRA |= switch_pin;

    // Activate switch_pin's pullup resistor.
    PORTA |= switch_pin;

    while (1) {
        // Turn on the LED when the button is pressed.
        if (PINA & switch_pin) {
            // Turn off the LED.
            PORTB &= ~led_pin;
        } else {
            // Turn on the LED.
            PORTB |= led_pin;
        }
    }

    return 0;
}
```

![](/img/05_print_3.jpg#c)