00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "pic24_all.h"
00030 #include <stdio.h>
00031
00041 typedef enum {
00042 STATE_WAIT_FOR_FALL_EDGE = 0,
00043 STATE_WAIT_FOR_RISE_EDGE,
00044 } INT1STATE;
00045
00046 INT1STATE e_isrINT1State = STATE_WAIT_FOR_FALL_EDGE;
00047 volatile uint8 u8_captureFlag = 0;
00048 volatile union32 u32_lastCapture;
00049 volatile union32 u32_thisCapture;
00050 volatile int32 u32_delta;
00051 volatile int32 u32_pulseWidth;
00052
00053
00054 void _ISRFAST _INT1Interrupt (void) {
00055 _INT1IF = 0;
00056 switch (e_isrINT1State) {
00057 case STATE_WAIT_FOR_FALL_EDGE:
00058 if (u8_captureFlag == 0) {
00059 u32_lastCapture.u16.ls16 = TMR2;
00060 u32_lastCapture.u16.ms16 = TMR3HLD;
00061 _INT1EP = 0;
00062 e_isrINT1State = STATE_WAIT_FOR_RISE_EDGE;
00063 }
00064 break;
00065 case STATE_WAIT_FOR_RISE_EDGE:
00066 u32_thisCapture.u16.ls16 = TMR2;
00067 u32_thisCapture.u16.ms16 = TMR3HLD;
00068 u32_delta = u32_thisCapture.u32 - u32_lastCapture.u32;
00069 u32_pulseWidth = ticksToUs(u32_delta, getTimerPrescale(T2CONbits));
00070 u8_captureFlag = 1;
00071 _INT1EP = 1;
00072 e_isrINT1State = STATE_WAIT_FOR_FALL_EDGE;
00073 break;
00074 default:
00075 e_isrINT1State= STATE_WAIT_FOR_FALL_EDGE;
00076 }
00077 }
00078
00080 inline void CONFIG_SW1() {
00081 CONFIG_RB13_AS_DIG_INPUT();
00082 ENABLE_RB13_PULLUP();
00083 CONFIG_INT1_TO_RP(13);
00084 DELAY_US(1);
00086 _INT1IF = 0;
00087 _INT1IP = 1;
00088 _INT1EP = 1;
00089 _INT1IE = 1;
00090 }
00091
00092
00093
00094 void configTimer23(void) {
00095 T2CON = T2_OFF | T2_IDLE_CON | T2_GATE_OFF
00096 | T2_32BIT_MODE_ON
00097 | T2_SOURCE_INT
00098 | T2_PS_1_1 ;
00099 PR2 = 0xFFFF;
00100 PR3 = 0xFFFF;
00101 TMR3HLD = 0;
00102 TMR2 = 0;
00103 _T3IF = 0;
00104 T2CONbits.TON = 1;
00105 }
00106
00107
00108 int main (void) {
00109 configBasic(HELLO_MSG);
00110 CONFIG_SW1();
00111 configTimer23();
00112 while (1) {
00113 outString("Press button...");
00114 while (!u8_captureFlag) doHeartbeat();
00115 printf(" %ld us\n",u32_pulseWidth);
00116 u8_captureFlag = 0;
00117 }
00118 }
00119