arduino-tnc

git clone https://git.bradleygannon.com/arduino-tnc.git
Log | Files | Refs

commit 6b1a3bda0c8db9f7bb0d256df9db5f4f356465f8
parent d1831cc56fa8cc9ebccf7e7db34e0d218a0fd130
Author: Bradley Gannon <bradley@bradleygannon.com>
Date:   Sun,  8 Feb 2026 20:37:14 -0500

Add symbol timer and letter B transmit demo

Diffstat:
Msrc/main.rs | 38+++++++++++++++++++++++++++++++-------
1 file changed, 31 insertions(+), 7 deletions(-)

diff --git a/src/main.rs b/src/main.rs @@ -8,6 +8,7 @@ use core::{ }; use embedded_hal::digital::OutputPin; +use heapless::Vec; use panic_halt as _; static COUNTER: AtomicU16 = AtomicU16::new(0); @@ -17,9 +18,10 @@ static SINE_TABLE: [u8; 32] = [ 1, 2, 4, 7, 9, 12, ]; static mut UPDATE_DAC: bool = false; +static mut NEXT_SYMBOL: bool = false; -const _MARK_INCREMENT: u16 = 2048; -const SPACE_INCREMENT: u16 = 3755; +const MARK_INCREMENT: u16 = 2100; +const SPACE_INCREMENT: u16 = 3838; #[avr_device::interrupt(atmega328p)] fn TIMER0_COMPA() { @@ -33,6 +35,11 @@ fn TIMER0_COMPA() { COUNTER.store(new_counter, Ordering::SeqCst); } +#[avr_device::interrupt(atmega328p)] +fn TIMER1_COMPA() { + unsafe { NEXT_SYMBOL = true }; +} + #[arduino_hal::entry] fn main() -> ! { unsafe { avr_device::interrupt::enable() }; @@ -47,11 +54,8 @@ fn main() -> ! { dac_timer.tccr0b().write(|w| w.cs0().prescale_8()); // 52 * 8 = 416 cycles; at 16 MHz this gives a period of 26 µs (about 38460 Hz) dac_timer.ocr0a().write(|w| w.set(52)); - // enable interrupt for output compare match A dac_timer.timsk0().write(|w| w.ocie0a().set_bit()); - INCREMENT.store(SPACE_INCREMENT, Ordering::SeqCst); - let mut dac_0 = pins.d2.into_output(); let mut dac_1 = pins.d3.into_output(); let mut dac_2 = pins.d4.into_output(); @@ -59,6 +63,20 @@ fn main() -> ! { let mut dac_4 = pins.d6.into_output(); let mut led = pins.d13.into_output(); + let symbol_timer = dp.TC1; + symbol_timer + .tccr1b() + .write(|w| w.wgm1().set(0b01).cs1().prescale_256()); + // 52 * 256 = 13_312 cycles; at 16 MHz this gives a period of 832 µs (about 1202 Hz) + symbol_timer.ocr1a().write(|w| w.set(52)); + symbol_timer.timsk1().write(|w| w.ocie1a().set_bit()); + + // ASCII letter B with three idle bits, one start bit, eight data bits, and one stop bit (8N1) + let message: Vec<bool, 13> = Vec::from_array([ + true, true, true, false, false, true, false, false, false, false, true, false, true, + ]); + let mut message_index = 0; + loop { if unsafe { read_volatile(&raw const UPDATE_DAC) } { let sine_index = @@ -71,9 +89,15 @@ fn main() -> ! { let _ = dac_4.set_state((sine_value & 0b00001 != 0).into()); } led.toggle(); - unsafe { - write_volatile(&raw mut UPDATE_DAC, false); + unsafe { write_volatile(&raw mut UPDATE_DAC, false) }; + } + if unsafe { read_volatile(&raw const NEXT_SYMBOL) } { + match message.get(message_index).unwrap() { + true => INCREMENT.store(MARK_INCREMENT, Ordering::SeqCst), + false => INCREMENT.store(SPACE_INCREMENT, Ordering::SeqCst), } + message_index = (message_index + 1) % message.len(); + unsafe { write_volatile(&raw mut NEXT_SYMBOL, false) }; } } }