if (led & LED_RED2)\r
LED_D_OFF();\r
}\r
- \r
+\r
\r
// Determine if a button is double clicked, single clicked,\r
// not clicked, or held down (for ms || 1sec)\r
PWM_CH_MODE(0) = PWM_CH_MODE_PRESCALER(10);\r
PWM_CH_DUTY_CYCLE(0) = 0;\r
PWM_CH_PERIOD(0) = 0xffff;\r
- \r
+\r
WORD start = (WORD)PWM_CH_COUNTER(0);\r
- \r
+\r
int letoff = 0;\r
for(;;)\r
{\r
WORD now = (WORD)PWM_CH_COUNTER(0);\r
- \r
+\r
// We haven't let off the button yet\r
if (!letoff)\r
{\r
// If we're not even pressed, forget about it!\r
if (!BUTTON_PRESS())\r
return BUTTON_NO_CLICK;\r
- \r
+\r
// Borrow a PWM unit for my real-time clock\r
PWM_ENABLE = PWM_CHANNEL(0);\r
// 48 MHz / 1024 gives 46.875 kHz\r
PWM_CH_MODE(0) = PWM_CH_MODE_PRESCALER(10);\r
PWM_CH_DUTY_CYCLE(0) = 0;\r
PWM_CH_PERIOD(0) = 0xffff;\r
- \r
+\r
WORD start = (WORD)PWM_CH_COUNTER(0);\r
- \r
+\r
for(;;)\r
{\r
WORD now = (WORD)PWM_CH_COUNTER(0);\r
- \r
+\r
// As soon as our button let go, we didn't hold long enough\r
if (!BUTTON_PRESS())\r
return BUTTON_SINGLE_CLICK;\r
else\r
if (now == (WORD)(start + ticks))\r
return BUTTON_HOLD;\r
- \r
+\r
WDT_HIT();\r
}\r
\r
return BUTTON_ERROR;\r
}\r
\r
+// attempt at high resolution microsecond timer\r
+// beware: timer counts in 21.3uS increments (1024/48Mhz)\r
void SpinDelayUs(int us)\r
{\r
int ticks = (48*us) >> 10;\r
- \r
- // Borrow a PWM unit for my real-time clock\r
- PWM_ENABLE = PWM_CHANNEL(0);\r
- // 48 MHz / 1024 gives 46.875 kHz\r
- PWM_CH_MODE(0) = PWM_CH_MODE_PRESCALER(10);\r
- PWM_CH_DUTY_CYCLE(0) = 0;\r
- PWM_CH_PERIOD(0) = 0xffff;\r
- \r
- WORD start = (WORD)PWM_CH_COUNTER(0);\r
- \r
- for(;;) {\r
- WORD now = (WORD)PWM_CH_COUNTER(0);\r
- if(now == (WORD)(start + ticks)) {\r
- return;\r
- }\r
- WDT_HIT();\r
- }\r
-}\r
-\r
-void SpinDelay(int ms)\r
-{\r
- int ticks = (48000*ms) >> 10;\r
\r
// Borrow a PWM unit for my real-time clock\r
PWM_ENABLE = PWM_CHANNEL(0);\r
\r
WORD start = (WORD)PWM_CH_COUNTER(0);\r
\r
- for(;;)\r
- {\r
+ for(;;) {\r
WORD now = (WORD)PWM_CH_COUNTER(0);\r
if (now == (WORD)(start + ticks))\r
return;\r
WDT_HIT();\r
}\r
}\r
+\r
+void SpinDelay(int ms)\r
+{\r
+ // convert to uS and call microsecond delay function\r
+ SpinDelayUs(ms*1000);\r
+}\r