From f60906a174a5973f0fd32a309e900765655651d5 Mon Sep 17 00:00:00 2001 From: Benjamin Koch <bbbsnowball@gmail.com> Date: Sun, 14 May 2023 03:49:58 +0200 Subject: [PATCH] add task for buzzer --- firmware/rust1/src/bin/heizung.rs | 33 ++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/firmware/rust1/src/bin/heizung.rs b/firmware/rust1/src/bin/heizung.rs index bb32d66..a472cdb 100644 --- a/firmware/rust1/src/bin/heizung.rs +++ b/firmware/rust1/src/bin/heizung.rs @@ -12,8 +12,10 @@ use embassy_rp::gpio::{Input, Level, Output, Pull, Flex}; use embassy_rp::i2c; use embassy_rp::interrupt; use embedded_hal_async::i2c::I2c; +use embassy_embedded_hal::SetConfig; use embassy_rp::peripherals::{UART0, I2C0}; use embassy_rp::uart::{self, UartRx, Parity}; +use embassy_rp::pwm::{self, Pwm}; use {defmt_rtt as _, panic_probe as _}; use heapless::String; @@ -232,6 +234,30 @@ async fn i2c_task(mut i2c_peri: embassy_rp::peripherals::I2C0, } } +#[embassy_executor::task] +async fn beeper_task(mut pwm_channel: embassy_rp::peripherals::PWM_CH3, mut beeper_pin: embassy_rp::peripherals::PIN_6) { + let mut c: pwm::Config = Default::default(); + c.top = 0x8000; + c.compare_a = 8; + c.divider = fixed::FixedU16::from_num(20); + let mut pwm = Pwm::new_output_a(pwm_channel, beeper_pin, c.clone()); + + let mut toggle = false; + loop { + info!("PWM: duty={}/32768, divider={}", c.compare_a, c.divider.to_bits()); + Timer::after(Duration::from_millis(200)).await; + //c.compare_a = c.compare_a.rotate_left(4); + c.compare_a = if toggle { c.top/2 } else { 0 }; + //toggle = !toggle; + c.divider -= fixed::FixedU16::from_num(0.1); + if c.divider < 1 { + c.divider = fixed::FixedU16::from_num(20); + } + toggle = true; + pwm.set_config(&c); + } +} + #[embassy_executor::main] async fn main(spawner: Spawner) { let p = embassy_rp::init(Default::default()); @@ -246,7 +272,7 @@ async fn main(spawner: Spawner) { let mut _en_measure_current = Output::new(p.PIN_3, Level::Low); let mut led_b = Output::new(p.PIN_4, Level::Low); let mut _led_g = Output::new(p.PIN_5, Level::Low); - let mut _led_r = Output::new(p.PIN_6, Level::Low); + let led_r = p.PIN_6; let _matrix_in1 = Input::new(p.PIN_7, Pull::Up); let _sbu1 = p.PIN_8; let _sbu2 = p.PIN_9; @@ -271,13 +297,12 @@ async fn main(spawner: Spawner) { let _current1 = p.PIN_28; let _measure_vcc = p.PIN_29; - info!("set up i2c"); let i2c_irq = interrupt::take!(I2C0_IRQ); let mut i2c_config = i2c::Config::default(); i2c_config.frequency = 400_000; unwrap!(spawner.spawn(i2c_task(p.I2C0, scl, sda, i2c_irq, i2c_config))); - // use 19200 baud in 8E1 mode - not great but Modbus default + // use 19200 baud in 8E1 mode - not great but it's the Modbus default let mut uart_config = uart::Config::default(); uart_config.baudrate = 19200; uart_config.parity = Parity::ParityEven; @@ -290,6 +315,8 @@ async fn main(spawner: Spawner) { ); unwrap!(spawner.spawn(reader(uart_rx))); + unwrap!(spawner.spawn(beeper_task(p.PWM_CH3, led_r))); + loop { info!("led on!"); led_b.set_high(); -- GitLab