changeset 8:c55321727d02

deep sleep works
author Matt Johnston <matt@ucc.asn.au>
date Fri, 18 May 2012 20:38:40 +0800
parents 52cb08a01171
children 7da9a3f23592
files main.c
diffstat 1 files changed, 39 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/main.c	Fri May 18 19:15:40 2012 +0800
+++ b/main.c	Fri May 18 20:38:40 2012 +0800
@@ -56,11 +56,16 @@
 static uint8_t measure_count = 0;
 static uint16_t comms_count = 0;
 
+#define DEBUG(str) printf_P(PSTR(str))
+
 static void deep_sleep();
 
 static void 
 uart_on()
 {
+    // Power reduction register
+    //PRR &= ~_BV(PRUSART0);
+ 
     // baud rate
     UBRR0H = (unsigned char)(UBRR >> 8);
     UBRR0L = (unsigned char)UBRR;
@@ -69,29 +74,6 @@
     UCSR0B = _BV(RXCIE0) | _BV(RXEN0) | _BV(TXEN0);
     //8N1
     UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
-
-    // Power reduction register
-    //PRR &= ~_BV(PRUSART0);
-}
-
-static void
-uart_test()
-{
-
-    UDR0 = 'n';
-    _delay_ms(50);
-    UDR0 = 'f';
-    _delay_ms(50);
-    while ( !( UCSR0A & (1<<UDRE0)) );
-    UDR0 = 'x';
-    loop_until_bit_is_set(UCSR0A, UDRE0);
-    UDR0 = 'a';
-    loop_until_bit_is_set(UCSR0A, UDRE0);
-    UDR0 = 'b';
-    loop_until_bit_is_set(UCSR0A, UDRE0);
-    UDR0 = 'c';
-    loop_until_bit_is_set(UCSR0A, UDRE0);
-    UDR0 = '\n';
 }
 
 static void 
@@ -101,12 +83,16 @@
     UCSR0B = 0;
 
     // Power reduction register
-    PRR |= _BV(PRUSART0);
+    //PRR |= _BV(PRUSART0);
 }
 
 static int 
 uart_putchar(char c, FILE *stream)
 {
+    if (c == '\n')
+    {
+        uart_putchar('\r', stream);
+    }
     // XXX should sleep in the loop for power.
     loop_until_bit_is_set(UCSR0A, UDRE0);
     UDR0 = c;
@@ -166,6 +152,7 @@
 ISR(USART_RX_vect)
 {
     char c = UDR0;
+    printf_P(PSTR("wake up '%c'\n"), c);
     if (c == '\n')
     {
         readbuf[readpos] = '\0';
@@ -185,6 +172,7 @@
 
 ISR(TIMER2_COMPA_vect)
 {
+    DEBUG("wake up\n");
     measure_count ++;
 	comms_count ++;
     if (measure_count == MEASURE_WAKE)
@@ -210,11 +198,15 @@
 static void
 deep_sleep()
 {
+    DEBUG("deep sleep\n");
     // p119 of manual
     OCR2A = SLEEP_COMPARE;
     loop_until_bit_is_clear(ASSR, OCR2AUB);
 
+    DEBUG("really about to\n");
+
     set_sleep_mode(SLEEP_MODE_PWR_SAVE);
+    DEBUG("done.\n");
     sleep_mode();
 }
 
@@ -228,7 +220,7 @@
 static void 
 do_adc_335()
 {
-    PRR &= ~_BV(PRADC);
+    //PRR &= ~_BV(PRADC);
 
     ADMUX = _BV(ADLAR);
 
@@ -275,7 +267,7 @@
             n_measurements, temp, internal_temp, f_11);
 
     n_measurements++;
-    PRR |= _BV(PRADC);
+    //PRR |= _BV(PRADC);
 }
 
 static void
@@ -336,46 +328,46 @@
     }
 }
 
+ISR(BADISR_vect)
+{
+    uart_on();
+    printf_P(PSTR("Bad interrupt\n"));
+}
+
 int main(void)
 {
     DDR_LED |= _BV(PIN_LED);
+    blink();
 
-    blink();
-    long_delay(1000);
-    blink();
-    long_delay(500);
     stdout = &mystdout;
     uart_on();
-    blink();
-    long_delay(200);
-    blink();
-    long_delay(200);
-    uart_test();
-
-    PORT_LED &= ~_BV(PIN_LED);
-    for (int i = 0; i < 10; i++)
-        _delay_ms(100);
-    PORT_LED |= _BV(PIN_LED);
 
     fprintf_P(&mystdout, PSTR("hello %d\n"), 12);
-    //uart_off();
+    uart_off();
 
     // turn off everything except timer2
-    PRR = _BV(PRTWI) | _BV(PRTIM0) | _BV(PRTIM1) | _BV(PRSPI) | _BV(PRUSART0) | _BV(PRADC);
+    //PRR = _BV(PRTWI) | _BV(PRTIM0) | _BV(PRTIM1) | _BV(PRSPI) | _BV(PRUSART0) | _BV(PRADC);
+
+    // for testing
+    uart_on();
+
+    DEBUG("power off\n");
+    sei();
+    DEBUG("sei done\n");
+
 
     // set up counter2. 
     // COM21 COM20 Set OC2 on Compare Match (p116)
     // WGM21 Clear counter on compare
+    TCCR2A = _BV(COM2A1) | _BV(COM2A0) | _BV(WGM21);
     // CS22 CS21 CS20  clk/1024
-    TCCR2A = _BV(COM2A1) | _BV(COM2A0) | _BV(WGM21);
     TCCR2B = _BV(CS22) | _BV(CS21) | _BV(CS20);
     // set async mode
     ASSR |= _BV(AS2);
+    // interrupt
+    TIMSK2 = _BV(OCIE2A);
 
-    DDR_LED |= _BV(PIN_LED);
-    PORT_LED &= ~_BV(PIN_LED);
-    _delay_ms(100);
-    PORT_LED |= _BV(PIN_LED);
+    DEBUG("async setup\n");
 
 #ifdef TEST_MODE
     for (;;)