From 92af9d1735aab816bca994f513314cdcc8b9bd66 Mon Sep 17 00:00:00 2001 From: Michael Buesch Date: Thu, 9 Oct 2008 20:57:51 +0200 Subject: Add pressure_control firmware skeleton. Signed-off-by: Michael Buesch --- pressure_control/firmware/util.c | 78 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 pressure_control/firmware/util.c (limited to 'pressure_control/firmware/util.c') diff --git a/pressure_control/firmware/util.c b/pressure_control/firmware/util.c new file mode 100644 index 0000000..3cecc46 --- /dev/null +++ b/pressure_control/firmware/util.c @@ -0,0 +1,78 @@ +/* + * Utility functions + * + * Copyright (C) 2008 Michael Buesch + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "util.h" +#include "calibration.h" + +#include +#include + + +void mdelay(uint16_t msecs) +{ + uint8_t timer, i; + + TCCR0 = DELAY_1MS_TIMERFREQ; + do { + /* Delay one millisecond */ + for (i = DELAY_1MS_LOOP_TIMES; i; i--) { + TCNT0 = 0; + do { + timer = TCNT0; + } while (timer < DELAY_1MS_LOOP); + } + } while (--msecs); + TCCR0 = 0; +} + +void udelay(uint16_t usecs) +{ + uint8_t tmp; + + __asm__ __volatile__( + "1: \n" + " ldi %1, %2 \n" + "2: \n" + " dec %1 \n" + " brne 2b \n" + " dec %A3 \n" + " brne 1b \n" + " cp %B3, __zero_reg__ \n" + " breq 3f \n" + " dec %B3 \n" + " ldi %A3, 0xFF \n" + " rjmp 1b \n" + "3: \n" + : "=d" (usecs), + "=d" (tmp) + : "M" (DELAY_1US_LOOP), + "0" (usecs) + ); +} + +void panic(const prog_char *msg) +{ +//TODO + infinite_sleep(); +} + +void infinite_sleep(void) +{ + cli(); + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + while (1) + sleep_mode(); +} -- cgit v1.2.3