//#include //#include #include #include #include "com.h" unsigned int bufferOffset = 0; volatile unsigned int buffer[510]; // DCT buffer to fill SD card volatile int iflag = 0; volatile FIL fil; volatile FRESULT rc; volatile FATFS fatfs; // File system object volatile WORD bw; void sampleADC ( void ) { ADC10CTL0 &= ~ENC; // Disable ADC Conversion while (ADC10CTL1 & BUSY); // Wait if ADC10 core is active ADC10CTL0 |= ENC | ADC10SC; // Enable + start conversion } void die ( FRESULT rc ) { int i; TXString("Died..."); TXInt(rc); for(;;){ while(i < 0xFFFF) i++; // TODO: Use TIMER to blink light P3OUT ^= BIT6; // Toggle red light } } void FAT_init(){ // Mount the volume TXString("Mount Volume\r\n"); rc = f_mount(&fatfs, "", 1); if (rc) die(rc); TXString("After mount\r\n"); TXString("Open DATA.BIN\r\n"); rc = f_open(&fil, "DATA.BIN", FA_OPEN_ALWAYS | FA_WRITE); if (rc) die(rc); rc = f_lseek(&fil, f_size(&fil)); if (rc) die(rc); //rc = f_sync(&fil); // Flush cached info to disk //if (rc) die(rc); } void FAT_close() { f_close(&fil); TXString("After close...\r\n"); } void write_ADC_to_SD() { //TXString("call f_write\r\n"); FAT_init(); rc = f_write(&fil, buffer, 510, &bw); if (rc) die(rc); FAT_close(); //rc = f_sync(&fil); // Flush cached info to disk ////if (rc) die(rc); } void handleInterrupt( void ) { if((iflag & BIT0) != 0){ // Timer A interrupt iflag &= ~BIT0; // clear BIT0 flag P3OUT ^= BIT6; // Toggle GRN LED sampleADC(); //TXString("Timer A Interrupt\r\n"); } if((iflag & BIT1) != 0){ // ADC interrupt ADC10CTL0 &= ~ENC; // Disable ADC Conversion iflag &= ~BIT1; // clear BIT1 flag if(bufferOffset >= 510){ // If our buffer is full... write_ADC_to_SD(); // Write buffer to SD card bufferOffset = 0; // Reset memory offset } ADC10SA = (int)buffer + bufferOffset; // Write data buffer start address (re-enables DTC) bufferOffset += (sizeof(int) * 3); // Move forward 3 'int's in memory P3OUT ^= BIT7; // Toggle RED LED //TXString("ADC interrupt\r\n"); } } void main( void ) { WDTCTL = WDTPW + WDTHOLD; __bis_SR_register(GIE); // General Interupt enable // Setup our clocks BCSCTL1 = CALBC1_16MHZ; BCSCTL1 |= XT2OFF; DCOCTL = CALDCO_16MHZ; BCSCTL3 |= LFXT1S_2; // Select VLOCLK as source for ACLK // LEDs Setup P3DIR |= BIT6 | BIT7; // BIT6 = Green, BIT7 = Red COM_init(); // Timer A setup TACCTL0 = CCIE; // TACCR0 interrupt enabled TACCR0 = 299; // 12KHz clock / 300 == about 40 samples/second //TACCR0 = 3000; TACTL |= TASSEL_1 | MC_1; // Select ACLK, count up // ADC10 Setup ADC10CTL0 = ADC10SHT_2 // 16 cycle S&H | ADC10IE // Interupt Enable | MSC // Multiple samples | ADC10ON; // ADC10 Core: ON ADC10CTL1 = INCH_2 | CONSEQ_1; // A2/A1/A0, single sequence ADC10DTC1 = 3; // 3 conversions for DTC before raising interupt ADC10AE0 |= BIT0 | BIT1 | BIT2; // P2.2,1,0 ADC10 option select ADC10SA = (int)buffer; // Data buffer start address while(1){ handleInterrupt(); __bis_SR_register(CPUOFF + GIE); // LPM0 + General Interupt } } // ADC10 interrupt service routine __attribute__((__interrupt__(ADC10_VECTOR))) ADC10_ISR(void) { iflag |= BIT1; // toggle BIT1 flag __bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR) } __attribute__((interrupt(TIMER0_A0_VECTOR))) void Timer_A (void) { iflag |= BIT0; // toggle BIT0 flag __bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR) }