RIT (Repetitive Interrupt Timer) Demo.
Dependencies: mbed RIT FastAnalogIn
rit_demo.cpp
- Committer:
- wvd_vegt
- Date:
- 2022-01-18
- Revision:
- 1:508cd706654a
- Parent:
- 0:faa449765bcc
File content as of revision 1:508cd706654a:
/* mbed Repetitive Interrupt Timer Library * Copyright (c) 2011 wvd_vegt * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include "mbed.h" #include "RIT.h" #include "FastAnalogIn.h" //We'll be using the Usb Serial port Serial serial(USBTX, USBRX); //tx, rx DigitalOut rit_led(LED3); FastAnalogIn a1(p19,true); //Ain1 - Peel Force FastAnalogIn a2(p20,true); //Ain2 - Seal Force #define SAMPLE_BUFFER_LENGTH 1000 volatile uint32_t rithits = 0; //timer1 stops when timer1hits==imer1loop volatile bool done = false; volatile short flip = 1; Timer rit_timing; static short adc1[SAMPLE_BUFFER_LENGTH] __attribute__ ((aligned (64))); static short adc2[SAMPLE_BUFFER_LENGTH] __attribute__ ((aligned (64))); static int Timing01[SAMPLE_BUFFER_LENGTH]; void RIT_IRQHandler(void) { if (!done) { Timing01[rithits] = rit_timing.read_us(); if (flip%2) { adc1[rithits]=a1.read_u16(); } else { adc2[rithits]=a2.read_u16(); //Count Hits. rithits++; } flip ++; //Flash Led. //rit_led=!rit_led; done = rithits==SAMPLE_BUFFER_LENGTH; } } /* LPC_TIM1->IR = 0x1UL; // Re-enabled Timing01[timer1hits] = adc_stamper.read_us(); //TODO Toggle Channel Mask (01 to 01 in ADCR). // Take twice the number of samples at half the sampling time // So 2000 samples (1000+1000) at 0.5ms -> 1000 pairs in 1 sec. switch (LPC_ADC->ADSTAT & (t_ch0|t_ch1)) { case t_ch0: Samples0[timer1hits] = LPC_ADC->ADDR4; break; } } */ //https://developer.mbed.org/forum/mbed/topic/370/ RIT rit(1000); //https://developer.mbed.org/handbook/Ticker //Ticker ticker; //void tock() //{ // Timing01[rithits] = rit_timing.read_us(); //} int main() { // Set the Baudrate. serial.baud(115200); rit.setup_us(10); rit.append(RIT_IRQHandler); rit.enable(); rit_timing.start(); while (!done) { // wait(0.001); } rit_timing.stop(); rit.disable(); rit.unappend(); for (int i=0; i<SAMPLE_BUFFER_LENGTH; i++) { serial.printf("%3d %6.3f - %6d - %6d\r\n",i, Timing01[i]/1000.0f, adc1[i], adc2[i]); } serial.printf("%3d %6.3f - %6d - %6d\r\n",0, Timing01[0]/1000.0f, adc1[0], adc2[0]); printf("COMPVAL=%d\r\n", LPC_RIT->RICOMPVAL); // 959 (960-1) printf("COUNTER=%d\r\n", LPC_RIT->RICOUNTER); // 807? printf("HITS=%d\r\n", rithits); printf("ELAPSED=%0.3f ms\r\n", rit_timing.read_us()/1000.0f); printf("ELAPSED=%0.3f ms\r\n", (Timing01[SAMPLE_BUFFER_LENGTH-1]-Timing01[0])/1000.0f); /* // printf("Requested max sample rate is %u, actual max sample rate is %u.\r\n", SAMPLE_RATE, adc.actual_sample_rate()); adc.startmode(0,0); adc.burst(1); adc.setup(p15,1); adc.setup(p16,1); //For burst mode, only one interrupt is required //which can be on any enabled pin. We have enabled all //of them here. adc.interrupt_state(p15,1); adc_timing.reset(); adc_timing.start(); //10 ms sample time. rit.setup_ms(10); //Clear ADC Storage stuff... adchits = 0; memset(Samples0, 0,sizeof(Samples0)); memset(Samples1, 0,sizeof(Samples1)); rit.append(Adc_IRQHandler); rit_timing.reset(); rit_timing.start(); rit.enable(); //To be sure... while (adchits!=MAX_SAMPLES) { wait(0.01); } rit.disable(); rit_timing.stop(); rit.unappend(); for (int i=0; i < MAX_SAMPLES; i++) { printf("%04d=%04d | %04d @ %08d\r\n", i, Samples0[i], Samples1[i], Timing01[i]); } printf("ELAPSED=%0.2f ms\r\n", rit_timing.read_us()/1000); printf("HITS=%d\r\n", adchits); adc.burst(0); adc.setup(p15,0); adc.setup(p16,0); adc.interrupt_state(p15,0); adc_timing.stop(); */ }