From 9735acb03f93d456985c2414449a76777cec54b5 Mon Sep 17 00:00:00 2001 From: barner Date: Fri, 22 Dec 2006 17:04:38 +0000 Subject: [PATCH] - Re-implementation of timing facility using timer0 and the internal clock source. Using an external clock source (esp. the real-time clock) did not work. This might as well be a local problem (e.g. hardware). - Provide some dummy implementations in order to fix the build. --- cpu/avr/dev/clock.c | 120 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 99 insertions(+), 21 deletions(-) diff --git a/cpu/avr/dev/clock.c b/cpu/avr/dev/clock.c index e5f9bc13a..2be477c38 100644 --- a/cpu/avr/dev/clock.c +++ b/cpu/avr/dev/clock.c @@ -5,46 +5,90 @@ #include #include -// Hack to see if this sets the blue led... -/* #include "hal_emwinet_demoboard.h" */ - -static unsigned short count; - +static clock_time_t count; /*---------------------------------------------------------------------------*/ SIGNAL(SIG_OUTPUT_COMPARE0) { -/* if ((count % 10) > 5) SET_BLUE_LED(); */ -/* else CLEAR_BLUE_LED(); */ - ++count; if(etimer_pending()) { etimer_request_poll(); } } + +/* External clock source does not work ? */ +#if 0 +void +clock_init(void) +{ + cli (); + TIMSK &= ((unsigned char)~(1 << (TOIE0))); + TIMSK &= ((unsigned char)~(1 << (OCIE0))); + /* Disable TC0 interrupt */ + + /** + * set Timer/Counter0 to be asynchronous + * from the CPU clock with a second external + * clock(32,768kHz)driving it + */ + ASSR |= (1 << (AS0)); + TCCR0 = _BV (CS02) | _BV (CS01) | _BV (WGM1); + + TCNT0 = 0; + OCR0 = 128; + + TIMSK |= (1 << (OCIE0)); + TIMSK |= (1 << (TOIE0)); + sei (); +} +#endif + /*---------------------------------------------------------------------------*/ void clock_init(void) { -#if 0 -#if __AVR_ENHANCED__ - outp(_BV(CS00) | _BV(CS02) | _BV(WGM01), TCCR0); -#else - outp(_BV(CS00) | _BV(CS02) | _BV(CTC0), TCCR0); -#endif - outp(0, TCNT0); - outp((NUT_CPU_FREQ / (128L * CLOCK_CONF_SECOND) + 0.5/*round*/), OCR0); - sbi(TIMSK, OCIE0); -#endif /* 0 */ + cli (); + /* Select internal clock */ + ASSR = 0x00; - TCCR0 = _BV(CS00) | _BV(CS02) | _BV(WGM01); + /* Set counter to zero */ TCNT0 = 0; - /* OCR0 = AVR_CLK_COUNT;*/ - TIMSK |= _BV(OCIE0); + /* + * Set comparison register: + * Crystal freq. is 16000000, + * pre-scale factor is 1024, i.e. we have 125 "ticks" / sec: + * 16000000 = 1024 * 125 * 125 + */ + OCR0 = 125; + + /* + * Set timer control register: + * - prescale: 1024 (CS00 - CS02) + * - counter reset via comparison register (WGM01) + */ + TCCR0 = _BV(CS00) | _BV(CS01) | _BV(CS02) | _BV(WGM01); + + /* Clear interrupt flag register */ + TIFR = 0x00; + + /* + * Raise interrupt when value in OCR0 is reached. Note that the + * counter value in TCNT0 is cleared automatically. + */ + TIMSK = _BV (OCIE0); + + /* + * Counts the number of ticks. Since clock_time_t is an unsigned + * 16 bit data type, time intervals of up to 524 seconds can be + * measured. + */ count = 0; + + sei (); } + /*---------------------------------------------------------------------------*/ clock_time_t clock_time(void) @@ -52,3 +96,37 @@ clock_time(void) return count; } /*---------------------------------------------------------------------------*/ +/** + * Delay the CPU for a multiple of TODO + */ +void +clock_delay(unsigned int i) +{ + // TODO +} + +/*---------------------------------------------------------------------------*/ +/** + * Wait for a multiple of 1 / 125 sec = 0.008 ms. + * + */ +void +clock_wait(int i) +{ + clock_time_t start; + + start = clock_time(); + while(clock_time() - start < (clock_time_t)i); +} +/*---------------------------------------------------------------------------*/ +void +clock_set_seconds(unsigned long sec) +{ + // TODO +} + +unsigned long +clock_seconds(void) +{ + return count / CLOCK_SECOND; +}