Skip to content
Snippets Groups Projects
Commit f60906a1 authored by Benjamin Koch's avatar Benjamin Koch
Browse files

add task for buzzer

parent 4081ee02
No related branches found
No related tags found
No related merge requests found
......@@ -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();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment