Simple revolution counter with custom IRQ handler and IO macros
Dependencies: TextLCD mbed SimpleIOMacros
main.cpp
- Committer:
- tlunzer
- Date:
- 2011-06-01
- Revision:
- 0:2352ac8d6438
File content as of revision 0:2352ac8d6438:
/* Simple revolution counter, works stable for 1 - 50000 rpm's Uses 1 pulse/revolution at pin 10 */ #include "mbed.h" #include "TextLCD.h" #include "IOMacros.h" Ticker timer; Timer t; DigitalOut led(LED1); volatile float count,oldcount, revf; int rev; TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x1); // Function prototype/forward declaration for ISR. void atint(); /** EINT3_IRQHandler */ extern "C" void EINT3_IRQHandler (void) { // The "event" is connected to pin p10 which is LPC1768 P0_1 // so lets trap that and ignore all other GPIO interrupts. // Test for IRQ on Port0. if (LPC_GPIOINT->IntStatus & 0x1) { // If P0_1/p10 rises, call atint() if (LPC_GPIOINT->IO0IntStatR & (1 << 1)) atint(); } // Clear this and all other possible GPIO generated interrupts as they don't concern us. LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF); LPC_GPIOINT->IO0IntClr = (LPC_GPIOINT->IO0IntStatR | LPC_GPIOINT->IO0IntStatF); } void event_irq_init(void) { // Use macro to set p10 as an input. p10_AS_INPUT; // Enable P0_1/p10 for rising edge interrupt generation. LPC_GPIOINT->IO0IntEnR |= (1UL << 1); // Enable the interrupt. NVIC_EnableIRQ(EINT3_IRQn); } void atint() { count = t.read(); t.reset(); } void attim() { LED1_TOGGLE; // Use macro instead of led =!led; if (count!=oldcount) { oldcount = count; rev= (60/count); if (rev >= 15000) // Reduce resolution to 100 rpm rev = (rev/100)*100; else if (rev >= 1000) // Reduce resolution to 10 rpm rev = (rev/10)*10; lcd.cls(); lcd.printf("U/m %5d ",rev); } } int main() { count = 0; lcd.printf("Revolution counter",rev); wait(0.5); lcd.cls(); timer.attach(&attim,1); event_irq_init(); t.start(); while (1) { } }