Mercurial > templog
changeset 307:e50091063890
Some counter2 bits
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Mon, 07 May 2012 00:14:53 +0800 |
parents | 848b0fe159d2 |
children | e36ee3e156c1 |
files | main.c |
diffstat | 1 files changed, 52 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/main.c Sun May 06 23:13:14 2012 +0800 +++ b/main.c Mon May 07 00:14:53 2012 +0800 @@ -4,9 +4,11 @@ * License: <insert your license reference here> */ -#include <avr/io.h> #include <stdio.h> #include <string.h> +#include <avr/io.h> +#include <avr/interrupt.h> +#include <avr/sleep.h> #include <util/crc16.h> // configuration params @@ -15,6 +17,10 @@ // - bluetooth params // - number of sensors (and range?) +// 1 second. we have 1024 prescaler, 32768 crystal. +static const uint8_t CNT2_COMPARE = 32; +static const int SECONDS_WAKE = 60; + static int uart_putchar(char c, FILE *stream); static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); @@ -22,9 +28,13 @@ static uint8_t n_measurements; static uint8_t measurements[500]; +static uint8_t need_measurement; + static uint8_t readpos; static char readbuf[30]; +static uint8_t sec_count; + static void uart_init(unsigned int baud) { @@ -54,9 +64,9 @@ for (i = 0; i < n_measurements; i++) { printf("%3d : %d\n", i, measurements[i]); - crc = _crc_ccitt_updatec(crc, measurements[i]); + crc = _crc_ccitt_update(crc, measurements[i]); } - printf("CRC : %d\n", i, measurements[i]); + printf("CRC : %d\n", crc); } static void @@ -90,7 +100,7 @@ } } -ISR(UART_RX_vect) +ISR(USART_RXC_vect) { char c = UDR; if (c == '\n') @@ -110,16 +120,53 @@ } } +ISR(TIMER2_COMP_vect) +{ + sec_count ++; + if (sec_count == SECONDS_WAKE) + { + sec_count = 0; + need_measurement = 1; + } +} + +static void +deep_sleep() +{ + // p119 of manual + OCR2 = CNT2_COMPARE; + loop_until_bit_is_clear(ASSR, OCR2UB); + + set_sleep_mode(SLEEP_MODE_PWR_SAVE); + sleep_mode(); +} + +static void +do_measurement() +{ + need_measurement = 0; +} + int main(void) { uart_init(9600); fprintf(&mystdout, "hello %d\n", 12); - // get current time + // set up counter2. + // COM21 COM20 Set OC2 on Compare Match (p116) + // WGM21 Clear counter on compare + // CS22 CS21 CS20 clk/1024 + TCCR2 = _BV(COM21) | _BV(COM20) | _BV(WGM21) | _BV(CS22) | _BV(CS21) | _BV(CS20); + // set async mode + ASSR |= _BV(AS2); for(;;){ /* insert your main loop code here */ + if (need_measurement) + { + do_measurement(); + } } return 0; /* never reached */ }