Compare commits

..

2 commits

Author SHA1 Message Date
Gabe Venberg 910010ba22 rtic heartbeat 2023-12-01 16:23:48 -06:00
Gabe Venberg eb0bda3300 made all types, broke out some functionality. 2023-12-01 16:01:16 -06:00
2 changed files with 244 additions and 124 deletions

View file

@ -7,7 +7,10 @@ license = "MIT OR Apache-2.0"
[dependencies] [dependencies]
cortex-m = {version = "0.7"} cortex-m = {version = "0.7"}
cortex-m-rt = "0.7" cortex-m-rt = "0.7"
cortex-m-rtic = "1.1.4"
embedded-hal = { version = "0.2.5", features = ["unproven"] } embedded-hal = { version = "0.2.5", features = ["unproven"] }
embedded-alloc = "0.5.1"
rp2040-monotonic = "1.3.0"
defmt = "0.3" defmt = "0.3"
defmt-rtt = "0.4" defmt-rtt = "0.4"
@ -17,7 +20,6 @@ panic-probe = { version = "0.3", features = ["print-defmt"] }
rp-pico = "0.8" rp-pico = "0.8"
max31855 = "0.1.0" max31855 = "0.1.0"
hd44780-driver = "0.4.0" hd44780-driver = "0.4.0"
embedded-alloc = "0.5.1"
# cargo build/run # cargo build/run
[profile.dev] [profile.dev]

View file

@ -1,153 +1,271 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
extern crate alloc; #[rtic::app(
use alloc::format; device = rp_pico::hal::pac,
use bsp::{ dispatchers = [TIMER_IRQ_1]
entry, )]
hal::{ mod app {
gpio, extern crate alloc;
uart::{UartConfig, UartPeripheral}, use alloc::format;
}, use core::fmt::Write;
}; use cortex_m::delay::Delay;
use core::fmt::Write; use defmt_rtt as _;
use cortex_m::delay::Delay; use embedded_alloc::Heap;
use defmt_rtt as _; use embedded_hal::{
use embedded_alloc::Heap; digital::v2::{OutputPin, ToggleableOutputPin},
use embedded_hal::digital::v2::OutputPin; spi::MODE_0,
use embedded_hal::spi::MODE_0; };
use panic_probe as _; use hd44780::{bus::FourBitBus, HD44780};
use panic_probe as _;
// Provide an alias for our BSP so we can switch targets quickly. use rp2040_monotonic::{fugit::Duration, Rp2040Monotonic};
// Uncomment the BSP you included in Cargo.toml, the rest of the code does not need to change.
use rp_pico as bsp;
use bsp::hal::{ use rp_pico::{
clocks::{init_clocks_and_plls, Clock}, hal::{
fugit::RateExtU32, clocks::{init_clocks_and_plls, Clock},
pac, fugit::RateExtU32,
sio::Sio, gpio::{
spi::Spi, self,
watchdog::Watchdog, bank0::{
}; Gpio0, Gpio1, Gpio14, Gpio16, Gpio17, Gpio18, Gpio19, Gpio2, Gpio20, Gpio21,
Gpio25, Gpio3, Gpio4, Gpio5,
},
FunctionSio, FunctionSpi, FunctionUart, Pin, PullDown, SioOutput,
},
sio::Sio,
spi::{self, Spi},
uart::{self, UartConfig, UartPeripheral},
watchdog::Watchdog,
},
pac::{SPI0, UART0},
Pins,
};
use hd44780_driver as hd44780; use hd44780_driver as hd44780;
use max31855::{Max31855, Unit}; use max31855::{Max31855, Unit};
#[global_allocator] #[global_allocator]
static HEAP: Heap = Heap::empty(); static HEAP: Heap = Heap::empty();
fn write_lcd<T: hd44780_driver::bus::DataBus>( const MONO_NUM: u32 = 1;
lcd: &mut hd44780::HD44780<T>, const MONO_DENOM: u32 = 1000000;
delay: &mut Delay, const ONE_SEC_TICKS: u64 = 1000000;
string: &str,
) {
lcd.reset(delay).unwrap();
lcd.clear(delay).unwrap();
lcd.write_str(string, delay).unwrap();
}
#[entry] type Uart = UartPeripheral<
fn main() -> ! { uart::Enabled,
let mut pac = pac::Peripherals::take().unwrap(); UART0,
let core = pac::CorePeripherals::take().unwrap(); (
let mut watchdog = Watchdog::new(pac.WATCHDOG); Pin<Gpio0, FunctionUart, PullDown>,
let sio = Sio::new(pac.SIO); Pin<Gpio1, FunctionUart, PullDown>,
),
>;
// External high-speed crystal on the pico board is 12Mhz type Led = Pin<Gpio25, FunctionSio<SioOutput>, PullDown>;
let external_xtal_freq_hz = 12_000_000u32;
let clocks = init_clocks_and_plls(
external_xtal_freq_hz,
pac.XOSC,
pac.CLOCKS,
pac.PLL_SYS,
pac.PLL_USB,
&mut pac.RESETS,
&mut watchdog,
)
.ok()
.unwrap();
//initalize the heap type ExternalLed = Pin<Gpio14, FunctionSio<SioOutput>, PullDown>;
{
use core::mem::MaybeUninit; type ThermocoupleSpi = Spi<
const HEAP_SIZE: usize = 1024; spi::Enabled,
static mut HEAP_MEM: [MaybeUninit<u8>; HEAP_SIZE] = [MaybeUninit::uninit(); HEAP_SIZE]; SPI0,
unsafe { HEAP.init(HEAP_MEM.as_ptr() as usize, HEAP_SIZE) } (
Pin<Gpio3, FunctionSpi, PullDown>,
Pin<Gpio4, FunctionSpi, PullDown>,
Pin<Gpio2, FunctionSpi, PullDown>,
),
>;
type Lcd = HD44780<
FourBitBus<
Pin<Gpio16, FunctionSio<SioOutput>, PullDown>,
Pin<Gpio17, FunctionSio<SioOutput>, PullDown>,
Pin<Gpio18, FunctionSio<SioOutput>, PullDown>,
Pin<Gpio19, FunctionSio<SioOutput>, PullDown>,
Pin<Gpio20, FunctionSio<SioOutput>, PullDown>,
Pin<Gpio21, FunctionSio<SioOutput>, PullDown>,
>,
>;
#[monotonic(binds = TIMER_IRQ_0, default = true)]
type Rp2040Mono = Rp2040Monotonic;
struct Thermocouple {
cs: Pin<Gpio5, FunctionSio<SioOutput>, PullDown>,
spi: ThermocoupleSpi,
} }
let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().to_Hz()); impl Thermocouple {
fn read_temp(
&mut self,
) -> Result<f32, max31855::Error<core::convert::Infallible, core::convert::Infallible>>
{
self.spi.read_thermocouple(&mut self.cs, Unit::Celsius)
}
}
let pins = bsp::Pins::new( fn write_lcd(lcd: &mut Lcd, delay: &mut Delay, string: &str) {
pac.IO_BANK0, lcd.reset(delay).unwrap();
pac.PADS_BANK0, lcd.clear(delay).unwrap();
sio.gpio_bank0, lcd.write_str(string, delay).unwrap();
&mut pac.RESETS, }
);
let uart_pins = (pins.gpio0.into_function(), pins.gpio1.into_function()); #[shared]
let mut uart = UartPeripheral::new(pac.UART0, uart_pins, &mut pac.RESETS) struct Shared {
delay: Delay,
}
#[local]
struct Local {
led: Led,
thermocouple: Thermocouple,
lcd: Lcd,
external_led: ExternalLed,
}
#[init]
fn init(mut ctx: init::Context) -> (Shared, Local, init::Monotonics) {
let mut watchdog = Watchdog::new(ctx.device.WATCHDOG);
let sio = Sio::new(ctx.device.SIO);
// External high-speed crystal on the pico board is 12Mhz
let external_xtal_freq_hz = 12_000_000u32;
let clocks = init_clocks_and_plls(
external_xtal_freq_hz,
ctx.device.XOSC,
ctx.device.CLOCKS,
ctx.device.PLL_SYS,
ctx.device.PLL_USB,
&mut ctx.device.RESETS,
&mut watchdog,
)
.ok()
.unwrap();
//initalize the heap
{
use core::mem::MaybeUninit;
const HEAP_SIZE: usize = 1024;
static mut HEAP_MEM: [MaybeUninit<u8>; HEAP_SIZE] = [MaybeUninit::uninit(); HEAP_SIZE];
unsafe { HEAP.init(HEAP_MEM.as_ptr() as usize, HEAP_SIZE) }
}
let mut delay =
cortex_m::delay::Delay::new(ctx.core.SYST, clocks.system_clock.freq().to_Hz());
let pins = Pins::new(
ctx.device.IO_BANK0,
ctx.device.PADS_BANK0,
sio.gpio_bank0,
&mut ctx.device.RESETS,
);
let mut uart: Uart = UartPeripheral::new(
ctx.device.UART0,
(pins.gpio0.into_function(), pins.gpio1.into_function()),
&mut ctx.device.RESETS,
)
.enable( .enable(
UartConfig::new( UartConfig::new(
9600u32.Hz(), 9600u32.Hz(),
bsp::hal::uart::DataBits::Eight, rp_pico::hal::uart::DataBits::Eight,
None, None,
bsp::hal::uart::StopBits::One, rp_pico::hal::uart::StopBits::One,
), ),
clocks.peripheral_clock.freq(), clocks.peripheral_clock.freq(),
) )
.unwrap(); .unwrap();
defmt::info!("Program start"); defmt::info!("Program start");
writeln!(uart, "Program start\r",).unwrap(); writeln!(uart, "Program start\r",).unwrap();
let mut led_pin = pins.led.into_push_pull_output(); let mut led_pin: Led = pins.led.into_push_pull_output();
let mut external_led_pin = pins.gpio14.into_push_pull_output(); let mut external_led_pin: ExternalLed = pins.gpio14.into_push_pull_output();
//clk
let thermometer_spi_sck = pins.gpio2.into_function::<gpio::FunctionSpi>();
//MOSI, I think unused?
let thermometer_spi_tx = pins.gpio3.into_function::<gpio::FunctionSpi>();
//do, or MISO.
let thermometer_spi_rx = pins.gpio4.into_function::<gpio::FunctionSpi>();
//cs
let mut thermometer_spi_csn = pins
.gpio5
.into_push_pull_output_in_state(gpio::PinState::Low);
let thermometer_spi_device = pac.SPI0; //cs
let spi_pin_layout = (thermometer_spi_tx, thermometer_spi_rx, thermometer_spi_sck); let thermometer_spi_device = ctx.device.SPI0;
let mut spi = Spi::<_, _, _, 8>::new(thermometer_spi_device, spi_pin_layout).init( let thermocouple = Thermocouple {
&mut pac.RESETS, cs: pins
125_000_000u32.Hz(), .gpio5
4u32.MHz(), .into_push_pull_output_in_state(gpio::PinState::Low),
MODE_0,
);
let mut lcd = hd44780::HD44780::new_4bit( spi: Spi::<_, _, _, 8>::new(
pins.gpio16.into_push_pull_output(), //rs thermometer_spi_device,
pins.gpio17.into_push_pull_output(), //enable (
pins.gpio18.into_push_pull_output(), //d4 //mosi
pins.gpio19.into_push_pull_output(), //d5 pins.gpio3.into_function::<gpio::FunctionSpi>(),
pins.gpio20.into_push_pull_output(), //d6 //miso/do
pins.gpio21.into_push_pull_output(), //d6 pins.gpio4.into_function::<gpio::FunctionSpi>(),
&mut delay, //clk
) pins.gpio2.into_function::<gpio::FunctionSpi>(),
.unwrap(); ),
)
write_lcd(&mut lcd, &mut delay, "Starting"); .init(
loop { &mut ctx.device.RESETS,
led_pin.set_high().unwrap(); 125_000_000u32.Hz(),
external_led_pin.set_low().unwrap(); 4u32.MHz(),
delay.delay_ms(500); MODE_0,
led_pin.set_low().unwrap(); ),
external_led_pin.set_high().unwrap();
delay.delay_ms(500);
match spi.read_thermocouple(&mut thermometer_spi_csn, Unit::Celsius) {
Ok(v) => {
writeln!(uart, "Current: {} \r", v).unwrap();
write_lcd(&mut lcd, &mut delay, &format!("{:02.2} C", v))
}
Err(e) => defmt::error!("error reading temp {}", defmt::Debug2Format(&e)),
}; };
let mut lcd: Lcd = hd44780::HD44780::new_4bit(
pins.gpio16.into_push_pull_output(), //rs
pins.gpio17.into_push_pull_output(), //enable
pins.gpio18.into_push_pull_output(), //d4
pins.gpio19.into_push_pull_output(), //d5
pins.gpio20.into_push_pull_output(), //d6
pins.gpio21.into_push_pull_output(), //d6
&mut delay,
)
.unwrap();
let mono = Rp2040Mono::new(ctx.device.TIMER);
write_lcd(&mut lcd, &mut delay, "Starting");
(
Shared { delay },
Local {
led: led_pin,
thermocouple,
lcd,
external_led: external_led_pin,
},
init::Monotonics(mono),
)
// loop {
// led_pin.set_high().unwrap();
// external_led_pin.set_low().unwrap();
// delay.delay_ms(500);
// led_pin.set_low().unwrap();
// external_led_pin.set_high().unwrap();
// delay.delay_ms(500);
// match thermocouple.read_temp() {
// Ok(v) => {
// writeln!(uart, "Current: {} \r", v).unwrap();
// write_lcd(&mut lcd, &mut delay, &format!("{:02.2} C", v))
// }
// Err(e) => defmt::error!("error reading temp {}", defmt::Debug2Format(&e)),
// };
// }
}
#[task(local = [led])]
fn heartbeat(ctx: heartbeat::Context) {
// Flicker the built-in LED
ctx.local.led.toggle().unwrap();
// Re-spawn this task after 1 second
let one_second = Duration::<u64, MONO_NUM, MONO_DENOM>::from_ticks(ONE_SEC_TICKS);
heartbeat::spawn_after(one_second).unwrap();
}
#[task(local = [external_led])]
fn second_heartbeat(ctx: second_heartbeat::Context) {
// Flicker the built-in LED
ctx.local.external_led.toggle().unwrap();
// Re-spawn this task after 1 second
let one_and_one_half_second =
Duration::<u64, MONO_NUM, MONO_DENOM>::from_ticks((ONE_SEC_TICKS as f32 * 1.5) as u64);
heartbeat::spawn_after(one_and_one_half_second).unwrap();
} }
} }