Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions examples/arduino-uno/.cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[build]
target = "avr-atmega328p.json"

[target.'cfg(target_arch = "avr")']
runner = "./uno-runner.sh"

[unstable]
build-std = ["core"]
33 changes: 33 additions & 0 deletions examples/arduino-uno/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
[package]
name = "arduino-uno-hdd44780"
version = "0.1.0"
authors = ["Oliver Evans <[email protected]"]
edition = "2018"

[features]
no-std = []
default = ["no-std"]

[dependencies]
# A panic handler is needed. This is a crate with the most basic one.
# The `leonardo-panic` example shows a more elaborate version.
embedded-hal = "0.2.4"
numtoa = "0.2.3"
hd44780-driver = "0.4.0"
panic-halt = "0.2.0"

[dependencies.arduino-uno]
git = "https://github.com/Rahix/avr-hal"

# Configure the build for minimal size
[profile.dev]
panic = "abort"
lto = true
opt-level = "s"

[profile.release]
panic = "abort"
codegen-units = 1
debug = true
lto = true
opt-level = "s"
20 changes: 20 additions & 0 deletions examples/arduino-uno/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# hd44780 Example for the Arduino Uno

Based on `avr-hal` [arduino uno examples](https://github.com/Rahix/avr-hal/tree/master/boards/arduino-uno)

## Circuit

Based on Arduino LiquidCrystal [HelloWorld example](https://www.arduino.cc/en/Tutorial/HelloWorld?from=Tutorial.LiquidCrystal)

![circuit-diagram](https://www.arduino.cc/en/uploads/Tutorial/LCD_Base_bb_Fritz.png)

## Building
```
rustup override set nightly
cargo build
```

## Flashing
```
cargo run
```
31 changes: 31 additions & 0 deletions examples/arduino-uno/avr-atmega328p.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"llvm-target": "avr-unknown-unknown",
"cpu": "atmega328p",
"target-endian": "little",
"target-pointer-width": "16",
"target-c-int-width": "16",
"os": "unknown",
"target-env": "",
"target-vendor": "unknown",
"arch": "avr",
"data-layout": "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8",

"executables": true,

"linker": "avr-gcc",
"linker-flavor": "gcc",
"pre-link-args": {
"gcc": ["-Os", "-mmcu=atmega328p"]
},
"exe-suffix": ".elf",
"post-link-args": {
"gcc": ["-Wl,--gc-sections"]
},

"singlethread": false,
"no-builtins": true,

"no-default-libraries": false,

"eh-frame-header": false
}
56 changes: 56 additions & 0 deletions examples/arduino-uno/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#![no_std]
#![no_main]

extern crate panic_halt;
use arduino_uno::Delay;
use hd44780_driver::{Cursor, CursorBlink, Display, DisplayMode, HD44780};
use numtoa::NumToA;

// This seems to be a magic number
// https://docs.rs/hd44780-driver/0.4.0/hd44780_driver/struct.HD44780.html#method.set_cursor_pos
const LINE2_POSITION: u8 = 40;

#[arduino_uno::entry]
fn main() -> ! {
let dp = arduino_uno::Peripherals::take().unwrap();
let mut pins = arduino_uno::Pins::new(dp.PORTB, dp.PORTC, dp.PORTD);

let mut delay = Delay::new();
let d2 = pins.d2.into_output(&mut pins.ddr);
let d3 = pins.d3.into_output(&mut pins.ddr);
let d4 = pins.d4.into_output(&mut pins.ddr);
let d5 = pins.d5.into_output(&mut pins.ddr);
let d11 = pins.d11.into_output(&mut pins.ddr); // enable
let d12 = pins.d12.into_output(&mut pins.ddr); // rs

let display_mode = DisplayMode {
cursor_visibility: Cursor::Invisible,
cursor_blink: CursorBlink::Off,
display: Display::On,
};
let mut lcd = HD44780::new_4bit(d12, d11, d5, d4, d3, d2, &mut delay).unwrap();

// Configure LCD
lcd.reset(&mut delay).unwrap();
lcd.clear(&mut delay).unwrap();
lcd.set_display_mode(display_mode, &mut delay).unwrap();

// Write first line
lcd.set_cursor_pos(0, &mut delay).unwrap();
lcd.write_str("Hello, rust!", &mut delay).unwrap();
let mut seconds: u16 = 0;

// Buffer for second line
let mut buffer = [0u8; 16];

loop {
// Write second line
lcd.set_cursor_pos(LINE2_POSITION, &mut delay).unwrap();
let line2_bytes = seconds.numtoa(10, &mut buffer);
lcd.write_bytes(line2_bytes, &mut delay).unwrap();

// Sleep
arduino_uno::delay_ms(1000);
seconds += 1;
}
}
29 changes: 29 additions & 0 deletions examples/arduino-uno/uno-runner.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env sh
set -e

if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
echo "usage: $0 <application.elf>" >&2
exit 1
fi

if [ "$#" -lt 1 ]; then
echo "$0: no ELF file given" >&2
exit 1
fi

NAME="$(basename "$1")"
SIZE_TEXT="$(avr-size "$1" | tail -1 | cut -f1)"
SIZE_DATA="$(avr-size "$1" | tail -1 | cut -f2)"
SIZE_BSS="$(avr-size "$1" | tail -1 | cut -f3)"

printf "\n"
printf "Program: %s\n" "$NAME"
printf "Size:\n"
printf " .text %s (exact: %d)\n" "$(numfmt --to=si --padding=9 "$SIZE_TEXT")" "$SIZE_TEXT"
printf " .data %s (exact: %d)\n" "$(numfmt --to=si --padding=9 "$SIZE_DATA")" "$SIZE_DATA"
printf " .bss %s (exact: %d)\n" "$(numfmt --to=si --padding=9 "$SIZE_BSS")" "$SIZE_BSS"
printf "\n"
printf "Attempting to flash ...\n"
printf "\n"

avrdude -q -C/etc/avrdude.conf -patmega328p -carduino -P/dev/ttyACM0 -D "-Uflash:w:$1:e"