| Line No. | Rev | Author | Line |
|---|---|---|---|
| 1 | 32 | kaklik | |
| 2 | /***************************************************************************** |
||
| 3 | * FileName: mTouchCap_Timers.c |
||
| 4 | * Dependencies: |
||
| 5 | * Processor: PIC18, PIC24 |
||
| 6 | * Compiler: C18, C30 |
||
| 7 | * Linker: MPLINK,MPLAB LINK30 |
||
| 8 | * Company: Microchip Technology Incorporated |
||
| 9 | * |
||
| 10 | * Software License Agreement |
||
| 11 | * |
||
| 12 | * Copyright © 2009 Microchip Technology Inc. |
||
| 13 | * Microchip licenses this software to you solely for use with Microchip products, according to the terms of the |
||
| 14 | * accompanying click-wrap software license. Microchip and its licensors retain all right, title and interest in |
||
| 15 | * and to the software. All rights reserved. This software and any accompanying information is for suggestion only. |
||
| 16 | * It shall not be deemed to modify Microchips standard warranty for its products. It is your responsibility to ensure |
||
| 17 | * that this software meets your requirements. |
||
| 18 | |||
| 19 | * SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, |
||
| 20 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT |
||
| 21 | * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP OR ITS LICENSORS BE LIABLE |
||
| 22 | * FOR ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO INCIDENTAL, |
||
| 23 | * SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, |
||
| 24 | * COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, OR ANY CLAIMS BY THIRD PARTIES |
||
| 25 | * (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. |
||
| 26 | * The aggregate and cumulative liability of Microchip and its licensors for damages related to the use of the software |
||
| 27 | * will in no event exceed $1000 or the amount you paid Microchip for the software, whichever is greater. |
||
| 28 | |||
| 29 | * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE TERMS AND |
||
| 30 | * THE TERMS OF THE ACCOMPANYING CLICK-WRAP SOFTWARE LICENSE. |
||
| 31 | * |
||
| 32 | * |
||
| 33 | * Author Date Comment |
||
| 34 | *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||
| 35 | * BDB 26-Jun-2008 First release |
||
| 36 | * Naveen. M 14 Apr 2009 Version 0.1 Initial Draft |
||
| 37 | * Nithin Kumar. M 14 May 2009 Version 0.2 Updates |
||
| 38 | * Sasha. M / Naveen. M 4 June 2009 Version 0.3 Updates |
||
| 39 | * Bruce Bohn 10 Nov 2009 Version 0.4 Updates |
||
| 40 | * Sasha. M / Naveen. M 11 Nov 2009 Version 1.0 Release |
||
| 41 | * Nithin Kumar 02 March 2010 Interfacing the mTouch Library to the mTouch GUI plug-in |
||
| 42 | * Sasha. M / Nithin. 10 April 2010 Version 1.20 Release |
||
| 43 | *****************************************************************************/ |
||
| 44 | |||
| 45 | /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 46 | /* ~~~~~~~~~~~~~~~~~~~~~ Includes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 47 | /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 48 | |||
| 49 | #include "mTouchCap_Timers.h" |
||
| 50 | |||
| 51 | |||
| 52 | /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 53 | /* ~~~~~~~~~~~~~~~~~~~~~ Variables ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 54 | /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 55 | SHORT T3counter; |
||
| 56 | SHORT tick; |
||
| 57 | SHORT tickCount =0; |
||
| 58 | WORD channelSelect = 0; |
||
| 59 | CHAR dataReadyCTMU = 0; |
||
| 60 | |||
| 61 | /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 62 | /* ~~~~~~~~~~~~~~~~~~~~~ Function Prototypes ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 63 | /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 64 | |||
| 65 | |||
| 66 | |||
| 67 | |||
| 68 | |||
| 69 | /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 70 | /* ~~~~~~~~~~~~~~~~~~~~~ Declarations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 71 | /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 72 | |||
| 73 | |||
| 74 | |||
| 75 | |||
| 76 | |||
| 77 | |||
| 78 | /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 79 | /* ~~~~~~~~~~~~~~~~~~~~~ Function Definitions ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 80 | /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |
||
| 81 | |||
| 82 | |||
| 83 | /****************************************************************************** |
||
| 84 | * Function: void Delayms(BYTE milliseconds) |
||
| 85 | * |
||
| 86 | * PreCondition: None |
||
| 87 | * |
||
| 88 | * Input: BYTE millisecons - Number of ms to delay |
||
| 89 | * |
||
| 90 | * Output: None |
||
| 91 | * |
||
| 92 | * Side Effects: None |
||
| 93 | * |
||
| 94 | * Overview: Delays the code- not necessairly accurate |
||
| 95 | * |
||
| 96 | * Note: None. |
||
| 97 | *****************************************************************************/ |
||
| 98 | |||
| 99 | |||
| 100 | void Delayms(BYTE milliseconds) |
||
| 101 | { |
||
| 102 | BYTE ms; |
||
| 103 | DWORD count; |
||
| 104 | |||
| 105 | ms = milliseconds; |
||
| 106 | while (ms--) |
||
| 107 | { |
||
| 108 | count = MILLISECDELAY; |
||
| 109 | |||
| 110 | while (count--) |
||
| 111 | { |
||
| 112 | ; |
||
| 113 | } |
||
| 114 | } |
||
| 115 | Nop(); |
||
| 116 | return; |
||
| 117 | } |
||
| 118 | |||
| 119 | |||
| 120 | #ifdef __PIC24F__ |
||
| 121 | |||
| 122 | #ifdef GUI_USB_INTERFACE |
||
| 123 | |||
| 124 | void T1Init( void ) |
||
| 125 | { |
||
| 126 | T1CON = TIMER1_T1CON_OFF; |
||
| 127 | } |
||
| 128 | |||
| 129 | /******************************************************************** |
||
| 130 | * Function : void mTouchCapPhy_Timer1Set( WORD time) |
||
| 131 | * |
||
| 132 | * PreCondition : None |
||
| 133 | * |
||
| 134 | * Input : The time period for loading the PR1 register of the timer1 |
||
| 135 | * |
||
| 136 | * Output : None |
||
| 137 | * |
||
| 138 | * Side Effects : None |
||
| 139 | * |
||
| 140 | * Overview : |
||
| 141 | * |
||
| 142 | * Note : |
||
| 143 | *******************************************************************/ |
||
| 144 | void mTouchCapPhy_Timer1Set( WORD time) |
||
| 145 | { |
||
| 146 | T1CON = TIMER1_T1CON_OFF; //turn off the timer 1 |
||
| 147 | PR1 = time; |
||
| 148 | TMR1 = 0; |
||
| 149 | TIMER1_IF = 0; |
||
| 150 | |||
| 151 | T1CON = TIMER1_T1CON_ON; //TIMER1_ON | TIMER1_CLK ;//TIMER1_T1CON_ON; |
||
| 152 | } |
||
| 153 | |||
| 154 | #endif //#ifdef GUI_USB_INTERFACE |
||
| 155 | |||
| 156 | /*****************************************************************************/ |
||
| 157 | /* PIC24F related timer initializations */ |
||
| 158 | /*****************************************************************************/ |
||
| 159 | /**************************************************************************** |
||
| 160 | Function: |
||
| 161 | void mTouchCapPhy_TickInit( void ) |
||
| 162 | |||
| 163 | Description: |
||
| 164 | This function sets up Timer 4 to generate an interrupt every 1 ms. This |
||
| 165 | is the basic timer tick for the system. The CTMU samples each channel |
||
| 166 | at a 1ms rate. This yields 16ms to sample all of the channels. This |
||
| 167 | timer is then disabled while the data gathered is updated by the main |
||
| 168 | program loop. |
||
| 169 | |||
| 170 | Precondition: |
||
| 171 | None |
||
| 172 | |||
| 173 | Parameters: |
||
| 174 | None |
||
| 175 | |||
| 176 | Returns: |
||
| 177 | None |
||
| 178 | |||
| 179 | Remarks: |
||
| 180 | The timer period and prescaler |
||
| 181 | values are dependent on the oscillator speed. |
||
| 182 | ***************************************************************************/ |
||
| 183 | |||
| 184 | void mTouchCapPhy_TickInit( void ) |
||
| 185 | { |
||
| 186 | TMR4 = 0; |
||
| 187 | PR4 = TIMER_PERIOD; |
||
| 188 | T4CON = TIMER_ON | TIMER_SOURCE_INTERNAL | GATED_TIME_DISABLED | TIMER_16BIT_MODE | TIMER4_PRESCALER; |
||
| 189 | |||
| 190 | Set_ScanTimer_IF_Bit_State(DISABLE); //Clear flag |
||
| 191 | Set_ScanTimer_IE_Bit_State(ENABLE); //Enable interrupt |
||
| 192 | Set_ScanTimer_ON_Bit_State(ENABLE) ; //Run timer |
||
| 193 | } |
||
| 194 | |||
| 195 | |||
| 196 | |||
| 197 | /**************************************************************************** |
||
| 198 | Function: |
||
| 199 | void __attribute__((interrupt, shadow, auto_psv)) _T4Interrupt(void) |
||
| 200 | |||
| 201 | Description: |
||
| 202 | This function calls ReadCTMU() to monitor the |
||
| 203 | touchpads. |
||
| 204 | |||
| 205 | Precondition: |
||
| 206 | Timer 4 and the Timer 4 interrupt must be enabled in order for |
||
| 207 | this function to execute. CTMUInit() must be called before |
||
| 208 | Timer 4 and the Timer 4 interrupt are enabled. The tickinit() function |
||
| 209 | is called to setup timer 4 |
||
| 210 | |||
| 211 | Parameters: |
||
| 212 | None |
||
| 213 | |||
| 214 | Returns: |
||
| 215 | None |
||
| 216 | |||
| 217 | Remarks: |
||
| 218 | None |
||
| 219 | ***************************************************************************/ |
||
| 220 | void __attribute__((interrupt, shadow, auto_psv)) _T4Interrupt(void) |
||
| 221 | { |
||
| 222 | /* Check the interrupt Flag */ |
||
| 223 | if (IFS1bits.T4IF == HIGH) |
||
| 224 | { |
||
| 225 | if(channelSelect >= ScanChannelIndex) |
||
| 226 | { |
||
| 227 | /* Count upto MAX ADC channel though the actual scan happen only for channels which are enabled. |
||
| 228 | This helps to maintain the same interval for any channel when enabled or disabled. */ |
||
| 229 | if(channelSelect>= MAX_ADC_CHANNELS) |
||
| 230 | { |
||
| 231 | channelSelect = 0; |
||
| 232 | dataReadyCTMU = 1; |
||
| 233 | } |
||
| 234 | else |
||
| 235 | { |
||
| 236 | channelSelect++; |
||
| 237 | } |
||
| 238 | } |
||
| 239 | else |
||
| 240 | { |
||
| 241 | /* Scans the CTMU channel for ADC voltage. It updates the "curRawData" and "actualValue" buffers. */ |
||
| 242 | mTouchCapPhy_ReadCTMU(ScanChannels[channelSelect]); //NK_DIRKEY |
||
| 243 | |||
| 244 | /* Periodically average the channel data based on User configuration. */ |
||
| 245 | mTouchCapPhy_AverageData(ScanChannels[channelSelect]); //NK_DIRKEY |
||
| 246 | |||
| 247 | /* Set the channel number for scanning */ |
||
| 248 | channelSelect++; |
||
| 249 | } |
||
| 250 | |||
| 251 | /* Clear the interrupt Flag */ |
||
| 252 | IFS1bits.T4IF = LOW; |
||
| 253 | } |
||
| 254 | } |
||
| 255 | |||
| 256 | /*****************************************************************************/ |
||
| 257 | /* PIC18F related timer initializations */ |
||
| 258 | /*****************************************************************************/ |
||
| 259 | #else //(__18CXX) |
||
| 260 | |||
| 261 | //#define TIMER_PRESCALER TIMER_PRESCALER_4 //divide by 8 |
||
| 262 | // #define TIMER_PERIOD 2000; //@ 8MHz clock with 4x PLL = 32MHz |
||
| 263 | // 8MHz instruction cycle 1/8000000 * 4x |
||
| 264 | // prescale * 2000 = 1mS |
||
| 265 | |||
| 266 | |||
| 267 | /**************************************************************************** |
||
| 268 | Function: |
||
| 269 | void mTouchCapPhy_TickInit( void ) |
||
| 270 | |||
| 271 | Description: |
||
| 272 | This function sets up Timer 4 to generate an interrupt every 1 ms. This |
||
| 273 | is the basic timer tick for the system. The CTMU samples each channel |
||
| 274 | at a 1ms rate. This yields 16ms to sample all of the channels. This |
||
| 275 | timer is then disabled while the data gathered is updated by the main |
||
| 276 | program loop. |
||
| 277 | |||
| 278 | Precondition: |
||
| 279 | None |
||
| 280 | |||
| 281 | Parameters: |
||
| 282 | None |
||
| 283 | |||
| 284 | Returns: |
||
| 285 | None |
||
| 286 | |||
| 287 | Remarks: |
||
| 288 | The timer period and prescaler |
||
| 289 | values are dependent on the oscillator speed. |
||
| 290 | ***************************************************************************/ |
||
| 291 | |||
| 292 | void mTouchCapPhy_TickInit( void ) |
||
| 293 | { |
||
| 294 | TMR2 = 0x00; |
||
| 295 | PR2 = TIMER_PERIOD; |
||
| 296 | T2CON = TIMER_ON | TIMER_PRESCALER_4 | TIMER_POSTSCALER; //about every 8 ms scan for Switch |
||
| 297 | |||
| 298 | INTCONbits.GIE = 1; //Enable Global Interrupt |
||
| 299 | INTCONbits.PEIE = 1; //Enable Peripheral Interrupt |
||
| 300 | PIR1bits.TMR2IF = 0; //Clear flag |
||
| 301 | PIE1bits.TMR2IE = 1; //Enable Timer2 interrupt // TMR2ON =1; |
||
| 302 | } |
||
| 303 | |||
| 304 | /******************************************************************************* |
||
| 305 | * Interrupt service routine for timer 2 |
||
| 306 | *******************************************************************************/ |
||
| 307 | |||
| 308 | |||
| 309 | #pragma code InterruptVectorHigh = 0x08 |
||
| 310 | void |
||
| 311 | InterruptVectorHigh (void) |
||
| 312 | { |
||
| 313 | _asm |
||
| 314 | goto InterruptHandlerHigh //jump to interrupt routine |
||
| 315 | _endasm |
||
| 316 | } //isr |
||
| 317 | |||
| 318 | |||
| 319 | |||
| 320 | /**************************************************************************** |
||
| 321 | Function: |
||
| 322 | void InterruptHandlerHigh () |
||
| 323 | Description: |
||
| 324 | This function calls ReadCTMU() to monitor the |
||
| 325 | touchpads. |
||
| 326 | |||
| 327 | Precondition: |
||
| 328 | Timer 2 and the Timer 2 interrupt must be enabled in order for |
||
| 329 | this function to execute. CTMUInit() must be called before |
||
| 330 | Timer 2 and the Timer 2 interrupt are enabled. The tickinit() function |
||
| 331 | is called to setup timer 2 |
||
| 332 | |||
| 333 | Parameters: |
||
| 334 | None |
||
| 335 | |||
| 336 | Returns: |
||
| 337 | None |
||
| 338 | |||
| 339 | Remarks: |
||
| 340 | None |
||
| 341 | ***************************************************************************/ |
||
| 342 | //---------------------------------------------------------------------------- |
||
| 343 | #pragma code |
||
| 344 | #pragma interrupt InterruptHandlerHigh |
||
| 345 | |||
| 346 | void InterruptHandlerHigh () |
||
| 347 | { |
||
| 348 | /* Check the interrupt Flag */ |
||
| 349 | if (PIR1bits.TMR2IF == HIGH) |
||
| 350 | { |
||
| 351 | if(channelSelect >= ScanChannelIndex) |
||
| 352 | { |
||
| 353 | /* Count upto MAX ADC channel though the actual scan happen only for channels which are enabled. |
||
| 354 | This helps to maintain the same interval for any channel when enabled or disabled. */ |
||
| 355 | if(channelSelect>= MAX_ADC_CHANNELS) |
||
| 356 | { |
||
| 357 | channelSelect = 0; |
||
| 358 | dataReadyCTMU = 1; |
||
| 359 | } |
||
| 360 | else |
||
| 361 | { |
||
| 362 | channelSelect++; |
||
| 363 | } |
||
| 364 | } |
||
| 365 | else |
||
| 366 | { |
||
| 367 | /* Scans the CTMU channel for ADC voltage. It updates the "curRawData" and "actualValue" buffers. */ |
||
| 368 | mTouchCapPhy_ReadCTMU(ScanChannels[channelSelect]); |
||
| 369 | |||
| 370 | /* Periodically average the channel data based on User configuration. */ |
||
| 371 | mTouchCapPhy_AverageData(ScanChannels[channelSelect]); |
||
| 372 | |||
| 373 | /* Set the channel number for scanning */ |
||
| 374 | channelSelect++; |
||
| 375 | } |
||
| 376 | |||
| 377 | /* Clear the interrupt Flag */ |
||
| 378 | PIR1bits.TMR2IF =LOW; |
||
| 379 | } |
||
| 380 | |||
| 381 | } |
||
| 382 | |||
| 383 | #ifdef GUI_USB_INTERFACE |
||
| 384 | void mTouchCapPhy_Timer1Set( WORD time) |
||
| 385 | { |
||
| 386 | T1CON = 0x00; //TIMER1_OFF ; //TIMER1_T1CON_OFF; |
||
| 387 | /* load the time to higher and lower byte of the timer register */ |
||
| 388 | TMR1L = mTouchCap_GUI_comm_tx_interval.byte.LB; |
||
| 389 | TMR1H = mTouchCap_GUI_comm_tx_interval.byte.HB; |
||
| 390 | //TMR1 = 0; |
||
| 391 | TIMER1_IF = 0; |
||
| 392 | T1CON = 0x01; //TIMER1_ON | TIMER1_CLK ;//TIMER1_T1CON_ON; |
||
| 393 | } |
||
| 394 | #endif //end of #ifdef GUI_USB_INTERFACE |
||
| 395 | |||
| 396 | #endif //end of #else //(__18CXX) |
||
| 397 | |||
| 398 | |||
| 399 | |||
| 400 | |||
| 401 | |||
| 402 |
Powered by WebSVN v2.8.3