Skip to content

Commit

Permalink
Add explicit support for arduino-nano
Browse files Browse the repository at this point in the history
1. Add the arduino-nano feature flag to arduino-hal.
2. Make the ADC6 and ADC7 pins only available for nano, not for uno.
3. Add an example crate for arduino-nano with just a blink and ADC example.
  • Loading branch information
drmorr0 committed Mar 25, 2021
1 parent 4b7262c commit 51d0b47
Show file tree
Hide file tree
Showing 12 changed files with 152 additions and 38 deletions.
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ members = [

# Examples
"examples/arduino-leonardo",
"examples/arduino-uno",
"examples/arduino-mega2560",
"examples/arduino-nano",
"examples/arduino-uno",
]
exclude = [
# The RAVEDUDE! Yeah!
Expand Down
3 changes: 2 additions & 1 deletion arduino-hal/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ rt = ["atmega-hal/rt"]

board-selected = []
mcu-atmega=[]
arduino-uno = ["mcu-atmega", "atmega-hal/atmega328p", "board-selected"]
arduino-leonardo = ["mcu-atmega", "atmega-hal/atmega32u4", "board-selected"]
arduino-mega2560 = ["mcu-atmega", "atmega-hal/atmega2560", "board-selected"]
arduino-nano = ["mcu-atmega", "atmega-hal/atmega328p", "board-selected"]
arduino-uno = ["mcu-atmega", "atmega-hal/atmega328p", "atmega-hal/disable-unused-adc", "board-selected"]

[dependencies]
cfg-if = "1"
Expand Down
11 changes: 6 additions & 5 deletions arduino-hal/src/clock.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
pub use avr_hal_generic::clock::*;

pub(crate) mod default {
#[cfg(feature = "arduino-uno")]
pub type DefaultClock = avr_hal_generic::clock::MHz16;
#[cfg(feature = "arduino-leonardo")]
pub type DefaultClock = avr_hal_generic::clock::MHz16;
#[cfg(feature = "arduino-mega2560")]
#[cfg(any(
feature = "arduino-leonardo",
feature = "arduino-mega2560",
feature = "arduino-nano",
feature = "arduino-uno",
))]
pub type DefaultClock = avr_hal_generic::clock::MHz16;
}
21 changes: 12 additions & 9 deletions arduino-hal/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ compile_error!(
Please select one of the following
* arduino-uno
* arduino-leonardo
* arduino-mega2560
* arduino-nano
* arduino-uno
"
);

Expand Down Expand Up @@ -74,7 +75,7 @@ pub use usart::Usart;
#[cfg(feature = "board-selected")]
pub mod prelude {
cfg_if::cfg_if! {
if #[cfg(feature = "arduino-uno")] {
if #[cfg(any(feature = "arduino-mega2560", feature = "arduino-uno"))] {
pub use crate::hal::usart::BaudrateArduinoExt as _;
} else {
pub use crate::hal::usart::BaudrateExt as _;
Expand All @@ -94,31 +95,33 @@ macro_rules! pins {
};
}

#[cfg(any(feature = "arduino-uno"))]
#[cfg(any(feature = "arduino-leonardo"))]
#[macro_export]
macro_rules! default_serial {
($p:expr, $pins:expr, $baud:expr) => {
$crate::Usart::new(
$p.USART0,
$p.USART1,
$pins.d0,
$pins.d1.into_output(),
$crate::hal::usart::BaudrateArduinoExt::into_baudrate($baud),
$crate::hal::usart::BaudrateExt::into_baudrate($baud),
)
};
}
#[cfg(any(feature = "arduino-leonardo"))]
// See comment in avr-hal-generic/src/usart.rs for why these boards use
// the BaudrateArduinoExt trait instead of BaudrateExt
#[cfg(any(feature = "arduino-mega2560", feature = "arduino-uno"))]
#[macro_export]
macro_rules! default_serial {
($p:expr, $pins:expr, $baud:expr) => {
$crate::Usart::new(
$p.USART1,
$p.USART0,
$pins.d0,
$pins.d1.into_output(),
$crate::hal::usart::BaudrateExt::into_baudrate($baud),
$crate::hal::usart::BaudrateArduinoExt::into_baudrate($baud),
)
};
}
#[cfg(any(feature = "arduino-mega2560"))]
#[cfg(feature = "arduino-nano")]
#[macro_export]
macro_rules! default_serial {
($p:expr, $pins:expr, $baud:expr) => {
Expand Down
8 changes: 4 additions & 4 deletions arduino-hal/src/port/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
mod leonardo;
#[cfg(feature = "arduino-leonardo")]
pub use leonardo::*;
#[cfg(feature = "arduino-uno")]
mod uno;
#[cfg(feature = "arduino-uno")]
pub use uno::*;
#[cfg(feature = "arduino-mega2560")]
mod mega2560;
#[cfg(feature = "arduino-mega2560")]
pub use mega2560::*;
#[cfg(any(feature = "arduino-nano", feature = "arduino-uno"))]
mod uno;
#[cfg(any(feature = "arduino-nano", feature = "arduino-uno"))]
pub use uno::*;
8 changes: 8 additions & 0 deletions examples/arduino-nano/.cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[build]
target = "../../avr-specs/avr-atmega328p.json"

[target.'cfg(target_arch = "avr")']
runner = "ravedude uno -cb 57600"

[unstable]
build-std = ["core"]
16 changes: 16 additions & 0 deletions examples/arduino-nano/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[package]
name = "arduino-nano-examples"
version = "0.0.0"
authors = ["David R. Morrison <[email protected]>"]
edition = "2018"
publish = false

[dependencies]
panic-halt = "0.2.0"
ufmt = "0.1.0"
nb = "0.1.2"
embedded-hal = "0.2.3"

[dependencies.arduino-hal]
path = "../../arduino-hal/"
features = ["arduino-nano"]
58 changes: 58 additions & 0 deletions examples/arduino-nano/src/bin/nano-adc.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#![no_std]
#![no_main]

use arduino_hal::prelude::*;
use panic_halt as _;

use arduino_hal::adc;

#[arduino_hal::entry]
fn main() -> ! {
let dp = arduino_hal::Peripherals::take().unwrap();
let pins = arduino_hal::pins!(dp);
let mut serial = arduino_hal::default_serial!(dp, pins, 57600);

let mut adc = arduino_hal::Adc::new(dp.ADC, Default::default());

let (vbg, gnd, tmp) = (
adc.read_blocking(&adc::channel::Vbg),
adc.read_blocking(&adc::channel::Gnd),
adc.read_blocking(&adc::channel::Temperature),
);
ufmt::uwriteln!(&mut serial, "Vbandgap: {}", vbg).void_unwrap();
ufmt::uwriteln!(&mut serial, "Ground: {}", gnd).void_unwrap();
ufmt::uwriteln!(&mut serial, "Temperature: {}", tmp).void_unwrap();

let a0 = pins.a0.into_analog_input(&mut adc);
let a1 = pins.a1.into_analog_input(&mut adc);
let a2 = pins.a2.into_analog_input(&mut adc);
let a3 = pins.a3.into_analog_input(&mut adc);
let a4 = pins.a4.into_analog_input(&mut adc);
let a5 = pins.a5.into_analog_input(&mut adc);

loop {
let values = [
a0.analog_read(&mut adc),
a1.analog_read(&mut adc),
a2.analog_read(&mut adc),
a3.analog_read(&mut adc),
a4.analog_read(&mut adc),
a5.analog_read(&mut adc),
];

for (i, v) in values.iter().enumerate() {
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).void_unwrap();
}

// Arduino Nano has two more ADC pins A6 and A7. Accessing them works a bit different from
// the other pins as they are not normal IO pins. The code below shows how it works.
let (a6, a7) = (
adc.read_blocking(&adc::channel::ADC6),
adc.read_blocking(&adc::channel::ADC7),
);
ufmt::uwrite!(&mut serial, "A6: {} A7: {}", a6, a7).void_unwrap();

ufmt::uwriteln!(&mut serial, "").void_unwrap();
arduino_hal::delay_ms(1000);
}
}
25 changes: 25 additions & 0 deletions examples/arduino-nano/src/bin/nano-blink.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#![no_std]
#![no_main]

use panic_halt as _;

#[arduino_hal::entry]
fn main() -> ! {
let dp = arduino_hal::Peripherals::take().unwrap();
let pins = arduino_hal::pins!(dp);

// Digital pin 13 is also connected to an onboard LED marked "L"
let mut led = pins.d13.into_output();
led.set_high();

loop {
led.toggle();
arduino_hal::delay_ms(100);
led.toggle();
arduino_hal::delay_ms(100);
led.toggle();
arduino_hal::delay_ms(100);
led.toggle();
arduino_hal::delay_ms(800);
}
}
8 changes: 0 additions & 8 deletions examples/arduino-uno/src/bin/uno-adc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,6 @@ fn main() -> ! {
ufmt::uwrite!(&mut serial, "A{}: {} ", i, v).void_unwrap();
}

// Arduino Nano has two more ADC pins A6 and A7. Accessing them works a bit different from
// the other pins as they are not normal IO pins. The code below shows how it works.
let (a6, a7) = (
adc.read_blocking(&adc::channel::ADC6),
adc.read_blocking(&adc::channel::ADC7),
);
ufmt::uwrite!(&mut serial, "A6: {} A7: {}", a6, a7).void_unwrap();

ufmt::uwriteln!(&mut serial, "").void_unwrap();
arduino_hal::delay_ms(1000);
}
Expand Down
1 change: 1 addition & 0 deletions mcu/atmega-hal/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ edition = "2018"
[features]
rt = ["avr-device/rt"]
device-selected = []
disable-unused-adc = []
atmega48p = ["avr-device/atmega48p", "device-selected"]
atmega168 = ["avr-device/atmega168", "device-selected"]
atmega328p = ["avr-device/atmega328p", "device-selected"]
Expand Down
28 changes: 18 additions & 10 deletions mcu/atmega-hal/src/adc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,24 @@ pub type Channel = avr_hal_generic::adc::Channel<crate::Atmega, crate::pac::ADC>
/// let value = adc.read_blocking(&channel::Vbg);
/// ```
pub mod channel {
#[cfg(any(
feature = "atmega168",
feature = "atmega328p",
feature = "atmega328pb",
feature = "atmega48p"
#[cfg(all(
any(
feature = "atmega168",
feature = "atmega328p",
feature = "atmega328pb",
feature = "atmega48p",
),
not(feature = "disable-unused-adc"),
))]
pub struct ADC6;
#[cfg(any(
feature = "atmega168",
feature = "atmega328p",
feature = "atmega328pb",
feature = "atmega48p"
#[cfg(all(
any(
feature = "atmega168",
feature = "atmega328p",
feature = "atmega328pb",
feature = "atmega48p"
),
not(feature = "disable-unused-adc"),
))]
pub struct ADC7;
#[cfg(any(
Expand Down Expand Up @@ -87,7 +93,9 @@ avr_hal_generic::impl_adc! {
port::PC5: (crate::pac::adc::admux::MUX_A::ADC5, didr0::adc5d),
},
channels: {
#[cfg(not(feature = "disable-unused-adc"))]
channel::ADC6: crate::pac::adc::admux::MUX_A::ADC6,
#[cfg(not(feature = "disable-unused-adc"))]
channel::ADC7: crate::pac::adc::admux::MUX_A::ADC7,
channel::Vbg: crate::pac::adc::admux::MUX_A::ADC_VBG,
channel::Gnd: crate::pac::adc::admux::MUX_A::ADC_GND,
Expand Down

0 comments on commit 51d0b47

Please sign in to comment.