diff --git a/software/main.c b/software/main.c index 49e249ee3c78b476b713f14e7457851dff02effe..b7f1f761975d7c8304f95fd572e180a27f411d80 100644 --- a/software/main.c +++ b/software/main.c @@ -37,7 +37,7 @@ #include "at86rf2xx.h" #include "at86rf2xx_params.h" -#define ENABLE_DEBUG (1) +#define ENABLE_DEBUG (0) #include "debug.h" #define SEND_INTERVAL (1) @@ -53,11 +53,11 @@ /// 512 required for samr21-xpro, 256 sufficient for INGA and telosb #ifdef BOARD_SAMR21_XPRO -char dump_thread_stack[1024+256]; -char send_thread_stack[1024+256]; + char dump_thread_stack[1024+256]; + char send_thread_stack[1024+256]; #else -char dump_thread_stack[512+256]; -char send_thread_stack[512+256]; + char dump_thread_stack[512+256]; + char send_thread_stack[512+256]; #endif #ifdef BOARD_TELOSB @@ -78,7 +78,7 @@ char send_thread_stack[512+256]; //#define CLOCK_CALIB_WAIT() _delay_us(1) #define CLOCK_CALIB_FRQ_XTAL 32768UL - #define CLOCK_CALIB_FRQ_REF_CNT (uint16_t)((CLOCK_CORECLOCK / CLOCK_CALIB_FRQ_XTAL) * 100) + #define CLOCK_CALIB_FRQ_REF_CNT (uint16_t)(( (CLOCK_CORECLOCK) / CLOCK_CALIB_FRQ_XTAL) * 100) #define CALIBRATION_SLEEP_TIME 1 char calib_thread_stack[512+256]; @@ -700,7 +700,7 @@ void *send_thread(void *arg) cli(); at86rf233_disable_irq(&at86rf2xx_dev); - uint8_t tries = 50; + uint8_t tries = 10; uint8_t bak_timsk2, bak_tccr2b, bak_tccr2a, bak_tccr1b, bak_assr, bak_ddrd, bak_portd; //uint16_t min = 0xFFFF; //uint8_t min_osccal = 0; @@ -709,7 +709,11 @@ void *send_thread(void *arg) /* backup timer register */ bak_timsk2 = TIMSK2; TIMSK2 = 0x00; + /* backup timer register */ + bak_tccr2b = TCCR2B; + bak_tccr2a = TCCR2A; + bak_tccr1b = TCCR1B; bak_assr = ASSR; ASSR = 0x00; ASSR |= (1 << AS2); //CLK_SRC für TIMER2 ist externer Quarz @@ -717,112 +721,84 @@ void *send_thread(void *arg) while (ASSR & ((1 << TCN2UB)|(1 << OCR2AUB)|(1 << TCR2AUB)|(1<< TCR2BUB))){ ; } - /* backup timer register */ - bak_tccr2b = TCCR2B; - TCCR2B = 0x00; - bak_tccr2a = TCCR2A; + + TCCR2B = 0x00; TCCR2A = 0x00; //set OC2B off - bak_tccr1b = TCCR1B; TCCR1B = 0x00; TCCR1B |= 1 << ICES1; //Activate Input Capture on positive/rising edge TCCR1B |= 1 << ICNC1; //Activate Noise Canceler - OCR2B = 100; - //set D6 to output and set on 0. Save D6 + OCR2B = 100; /*Trigger Compare Match at 100 Ticks*/ + + /* set D6 to output and set on 0. Save D6 */ bak_ddrd = DDRD; bak_portd = PORTD; + DDRD |= 1 << PD6; PORTD &= ~(1 << PD6); - TCCR1B |= 1 << CS10; //No Prescaler - - DEBUG("PIND init: %d\n", PIND); do { - //clear Flag for ICF1 + /* clear Flag for ICF1 */ if(TIFR1 & (1 << ICF1)) { - TIFR1 |= 1 << ICF1; + TIFR1 |= (1 << ICF1 | 1 << OCF1B | 1 << OCF1A | 1 << TOV1); } - //clear Flag for OCR2B + /* clear Flag for OCR2B */ if(TIFR2 & (1 << OCF2B)){ - TIFR2 |= 1 << OCF2B; + TIFR2 |= (1 << OCF2B | 1 << OCF2B | 1 << TOV2); } PORTD &= (~(1 << PD6)); /*Set pin D6 back to 0 */ - //DEBUG("Entering while, %d %d\n", TIFR2, TIFR1); - //DEBUG("PIND before: %d\n", PIND); - - TCCR2A = 0x30; //set OC2B on Compare Match - - TCNT2 = 0; - //DEBUG("PIND before while: %d\n", PIND); - //Turn on Timer - //TCCR1B |= 1 << CS10; //No Prescaler + /* Turn on Timer and reset Counter Regs */ TCNT1 = 0; - TCCR2B |= 1 << CS20; //No Prescaler - - while ((!(TIFR2 & (1 << OCF2B))) || (!(TIFR1 & (1 << ICF1)))); /* Check for both flags */ - /** - DEBUG("Reg T2 Val: %d\n", TIFR2); - DEBUG("Reg T1 Val: %d\n", TIFR1); - DEBUG("DDRD: %d\n", DDRD); - DEBUG("PIND: %d\n", PIND); - DEBUG("TCCR1A: %d\n", TCCR1A); - DEBUG("TCCR1B: %d\n", TCCR1B); - DEBUG("TCCR2A: %d\n", TCCR2A); - DEBUG("TCCR2B: %d\n", TCCR2B); - DEBUG("-------->\n"); - **/ - ticks = ICR1; - TCCR2B &= 0b11111000; //Off - //TCCR1B &= 0b11111000; //Off - //DEBUG("Count: %d\n", TCNT2); - //DEBUG("PIND before: %d\n", PIND); - TCCR2A = 0x00; //set OC2B into Port-Mode - //DEBUG("Reg T2 Val after flag2: %d\n", TIFR2); - //DEBUG("Reg T1 Val after flag2: %d\n", TIFR1); - //DEBUG("PIND after: %d\n", PIND); + TCNT2 = 0; + TCCR2B |= 1 << CS20; /* No Prescaler */ + while (ASSR & ((1 << TCN2UB)|(1 << OCR2AUB)|(1 << TCR2AUB)|(1<< TCR2BUB))){ /*Wait until new Settings have been transferred*/ + ; + } + TCCR1B |= 1 << CS10; /* No Prescaler */ + + while ( (!(TIFR2 & (1 << OCF2B))) ); /*wait for Compare Match */ + PORTD |= (1 << PD6); //set OC2B and trigger input capture + + while((!(TIFR1 & (1 << ICF1)))); /*wait for input capture*/ + + ticks = ICR1; /* Transfer captured ticks */ + TCCR2B &= 0b11111000; /*Turn Timer 2 off */ + TCCR1B &= 0b11111000; /*Turn Timer 1 off */ + + while (ASSR & ((1 << TCN2UB)|(1 << OCR2AUB)|(1 << TCR2AUB)|(1<< TCR2BUB))){ /*Wait until new Settings have been transferred*/ + ; + } + + DEBUG("Count: %d\n", TCNT2); + DEBUG("PIND before: %d\n", PIND); + DEBUG("Reg T1 Val after flag2: %d\n", TIFR1); + DEBUG("Reg T2 Val after flag2: %d\n", TIFR2); + DEBUG("PIND after: %d\n", PIND); DEBUG("Counted Ticks: %ul\n", ticks); DEBUG("----->\n"); /*CLOCK_CALIB_FRQ_REF_CNT = 24400*/ if (ticks > CLOCK_CALIB_FRQ_REF_CNT) { - /** - if((ticks - CLOCK_CALIB_FRQ_REF_CNT) < min){ - min_osccal = OSCCAL; + if(OSCCAL != 0) + { + OSCCAL--; } - **/ - //OSCCAL--; + } else if (ticks < CLOCK_CALIB_FRQ_REF_CNT) { - /** - if((CLOCK_CALIB_FRQ_REF_CNT - ticks) < min){ - min_osccal = OSCCAL; + if(OSCCAL != 255) + { + OSCCAL++; } - **/ - //OSCCAL++; } else if (ticks == CLOCK_CALIB_FRQ_REF_CNT) { tries = 1; - //min_osccal = OSCCAL; - } - /** - for (unsigned int i = 0xFFFF; i > 0; i--) { - __asm__("nop"); - } - for (unsigned int i = 0xFFFF; i > 0; i--) { - __asm__("nop"); } - **/ }while (--tries); + DEBUG("Final OSCCAl Value %d\n", OSCCAL); + DEBUG("====================\n"); - //OSCCAL = min_osccal; - DEBUG("Setting OSCCAl to Value %d\n", OSCCAL); - - for (unsigned int i = 0xFF; i > 0; i--) { - __asm__("nop"); - } - DEBUG("Counted Ticks: %ul\n", ticks); - /* restore registers */ ASSR = bak_assr; TIMSK2 = bak_timsk2; @@ -832,9 +808,6 @@ void *send_thread(void *arg) DDRD = bak_ddrd; PORTD = bak_portd; - for (unsigned int i = 0xFFFF; i > 0; i--) { /* Delay for XTAL to settle */ - __asm__("nop"); - } sei(); at86rf233_enable_irq(&at86rf2xx_dev); }