#![feature(llvm_asm)]
#![no_std]
#![crate_name = "avr_delay"]
pub fn delay(count: u32) {
let outer_count = count / 65536;
let last_count = ((count % 65536)+1) as u16;
for _ in 0..outer_count {
unsafe {llvm_asm!("1: sbiw $0,1
brne 1b"
:
: "w" (0)
:
:)}
}
unsafe {llvm_asm!("1: sbiw $0,1
brne 1b"
:
: "w" (last_count)
:
:)}
}
pub fn delay_ms(ms: u32) {
let us = ms * 1000;
delay_us(us);
}
pub fn delay_us(us: u32) {
let ps = us * 1000;
let ps_lp = 1000000000 / (avr_config::CPU_FREQUENCY_HZ / 4);
let loops = (ps / ps_lp) as u32;
delay(loops);
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}