Skip to content

9. Embedded programming

Assignment

individual assignment:
read a microcontroller data sheet
program your board to do something,
with as many different programming languages
and programming environments as possible

group assignment:

compare the performance and development workflows
for other architectures

Learning outcomes

Identify relevant information in a microcontroller data sheet.
Implement programming protocols

Have you?

Documented what you learned from reading a microcontroller datasheet.
What questions do you have? What would you like to learn more about?
Programmed your board
Described the programming process/es you used
Included your code

What we have done

FabAcademy2019-FabLab Kannai lab site

What I have done

Read ATTiny 44 datasheet

This week’s first assignment was to read a microcontroller data sheet. I choose ATTiny44 for my board, so I read about it.

ATTiny 44 datasheet

- ATTiny 44 is working in 8bits
- Rewritable for 10000 times
- There are two PWM Channels, Each
- Operating Voltage:1.8 – 5.5V. This means I can use this with at least 2 AAA battery.
- PIN assignment

Here’s pin assignment. This is very useful because pin number is defferent beween microcontroller and Arduino.

There was the explanation about how each pins work. Before I read it I knew only about which pin was used for PWM, etc from the image above.
In this, there were explanation about more low-level mechanizm.

Each port pin consists of three register bits: DDxn, PORTxn, and PINxn.
DDxn control the directions: 1 means output, 0 means input.
PORTxn manages pull-up activation: 1 means activated, 0 means not activated
PINxn turns PORTxn to opposite when it has 1. For example, when PORTxn has 1 and PINxn has 1, PORTxn turns to 0.

Here’s default value of each pins

Writing C code

This time I wrote C code intended to make LED on the board blink regularly.

I added this in hello.ftdi.44.echo.c.make

#define led_pin (1<<PA7)
#define led_port PORTA
#define led_direction DDRA

void blink(){
    set(led_port, led_pin);
    _delay_ms(100);
    clear(led_port, led_pin);
    _delay_ms(100);
}
blink();

Saved it as “hello.ftdi.44.echo.blink.c” and rewrote line 1 in make file as following.
PROJECT=hello.ftdi.44.echo.blink

And wrote it with FabISP.

I run the codes below on Terminal.

make -f hello.ftdi.44.echo.blink.c.make

sudo make -f hello.ftdi.44.echo.blink.c.make program-usbtiny-fuses

sudo make -f hello.ftdi.44.echo.blink.c.make program-usbtiny

Run term.py and type several charactors.
python term.py /dev/cu.usbserial-A105MN36 115200

However, LED on the board never blinked. From my experience, I suspected delay length was too short. So I changed it from 100ms to 1000ms and repeat the writing procedure above.

#define led_pin (1<<PA7)
#define led_port PORTA
#define led_direction DDRA

void blink(){
    set(led_port, led_pin);
    _delay_ms(1000);
    clear(led_port, led_pin);
    _delay_ms(1000);
}

Now it’s working. During I run term.py, when I type something on keyboard, LED on the board blinks.

Writing Arduino code

Then I wrote code with Arduino. This code intended to turn on LED when you push button on the board.

And I write it on the board through Arduino ISP
You can set it up from Tools > Programmer > Arduino ISP

Writing with Arduino

Arduino pins should be connected attiny pins as follows

Arduino ATtiny44
GND GND
13 SCK
12 MISO
11 MOSI
10 RST
5V VCC

Here’s the code I wrote on Arduino.

const int LED = 7;     
const int Button = 8;    

void setup() {     
  // put your setup code here, to run once:     
pinMode(LED,OUTPUT);     
pinMode(Button,INPUT);    
}    

void loop() {    
  int button;     

  button = digitalRead(Button);    

  if(button == LOW){ 
    digitalWrite(LED, HIGH);    
    }    
  else{    
    digitalWrite(LED, LOW);    
    }    
}

Files

Arduino file hello.ftdi.44.echo.blink.c hello.ftdi.44.echo.blink.c.make