Go to the documentation of this file.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
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00054 #include "mTouch.h"
00055 #include "mComm.h"
00056
00057 #if defined(MCOMM_ENABLED)
00058
00059
00060
00061
00062 #if defined(MCOMM_TWO_WAY_ENABLED)
00063 mComm_OutputVector mComm_output;
00064 mComm_InputBuffer mComm_input;
00065 #endif
00066
00067 #if defined(MCOMM_ONE_WAY_ENABLED)
00068 #if (MCOMM_UART_1WAY_MODULE == MCOMM_UART_SOFTWARE_IMPLEMENTATION)
00069 bank0 uint8_t mComm_shiftReg;
00070 bank0 uint8_t mComm_bitCount;
00071 bank0 uint8_t mComm_delayCount;
00072 #endif
00073 #endif
00074
00075
00076
00077
00078 void mComm_Init (void);
00079
00080 #if defined(MCOMM_TWO_WAY_ENABLED)
00081 void mComm_Receive (void);
00082 void mComm_Process (uint8_t);
00083 #endif
00084
00085 #if defined(MCOMM_UART_IMPLEMENTED)
00086 void mComm_Service (void);
00087 void mComm_UART_PutChar (uint8_t);
00088 #if defined(MCOMM_ONE_WAY_ENABLED)
00089 void mComm_UART_Char2ASCII (uint8_t);
00090 void mComm_UART_Int2ASCII (uint16_t);
00091 #else
00092 void mComm_UART_SendACKorNACK(uint8_t);
00093 #endif
00094 #endif
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 void mComm_Init()
00109 {
00110
00111
00112
00113 #if defined(MCOMM_TWO_WAY_ENABLED)
00114 mComm_input.index = 0;
00115 mComm_input.counter = 0;
00116 mComm_input.checksum = 0;
00117 #if defined(MCOMM_UART_IMPLEMENTED) || defined(MCOMM_SPI_IMPLEMENTED)
00118 mComm_input.state = 0;
00119 #endif
00120 mComm_input.flags.all = 0x00;
00121
00122 for (int8_t i = MCOMM_INPUTBUFFER_SIZE-1; i >= 0; i--)
00123 {
00124 mComm_input.buffer[i] = 0;
00125 }
00126
00127 mComm_output.flags.all = 0x00;
00128 mComm_output.counter = 0;
00129 mComm_output.latch = 0;
00130 mComm_output.iterator = 0x0000;
00131 mComm_output.vector.pointer = 0x0000;
00132 mComm_output.vector.length = 0;
00133
00134
00135 #if defined(MCOMM_ENABLE_STREAM)
00136 #if defined(MCOMM_STREAM_EN_ON_POR)
00137 mComm_streamConfig.enabled = 1;
00138 #else // Initialize stream feature
00139 mComm_streamConfig.enabled = 0;
00140 #endif
00141 mComm_streamConfig.go = 0;
00142 mComm_streamConfig.index = 0;
00143 #endif
00144 #endif
00145
00146
00147
00148
00149 #if defined(MCOMM_UART_IMPLEMENTED)
00150
00151 #if (MCOMM_TYPE == MCOMM_UART_ONE_WAY) && (MCOMM_UART_1WAY_MODULE == MCOMM_UART_SOFTWARE_IMPLEMENTATION)
00152
00153
00154
00155
00156
00157 asm("BANKSEL " ___mkstr( __paste(_,MCOMM_UART_SOFT_TXPORT)));
00158 asm("bsf " ___mkstr(NOBANK(__paste(_,MCOMM_UART_SOFT_TXPORT))) ", " ___mkstr(MCOMM_UART_SOFT_TXPIN));
00159
00160 asm("BANKSEL " ___mkstr( __paste(_,MCOMM_UART_SOFT_TXTRIS)));
00161 asm("bcf " ___mkstr(NOBANK(__paste(_,MCOMM_UART_SOFT_TXTRIS))) ", " ___mkstr(MCOMM_UART_SOFT_TXPIN));
00162
00163 #else
00164
00165
00166
00167
00168
00169 MCOMM_UART_TXSTA = 0;
00170 MCOMM_UART_RCSTA = 0;
00171 MCOMM_UART_BAUDCON = 0;
00172
00173 MCOMM_UART_SPBRGL = MCOMM_UART_SPBRGL_VALUE;
00174 #if defined(MCOMM_UART_SPBRGH_AVAILABLE)
00175 MCOMM_UART_SPBRGH = MCOMM_UART_SPBRGH_VALUE;
00176 MCOMM_UART_BRG16 = MCOMM_UART_BRG16_VALUE;
00177 #endif
00178 MCOMM_UART_BRGH = MCOMM_UART_BRGH_VALUE;
00179
00180 MCOMM_UART_TXEN = 1;
00181 MCOMM_UART_SPEN = 1;
00182 #if (MCOMM_TYPE != MCOMM_UART_ONE_WAY)
00183 MCOMM_UART_CREN = 1;
00184 MCOMM_UART_RCIE = 1;
00185 #endif
00186 MCOMM_UART_PEIE = 1;
00187
00188 #endif
00189
00190 #elif defined(MCOMM_I2C_IMPLEMENTED)
00191
00192
00193
00194
00195
00196 MCOMM_I2C_SSPSTAT = 0b10000000;
00197
00198 MCOMM_I2C_SSPCON1 = 0b00110110;
00199
00200
00201
00202
00203 MCOMM_I2C_SSPCON2 = 0b00000001;
00204
00205 MCOMM_I2C_SSPCON3 = 0b00000011;
00206
00207
00208
00209
00210
00211
00212 MCOMM_I2C_SSPMSK = 0b11111110;
00213 MCOMM_I2C_SSPADD = MCOMM_I2C_ADDRESS;
00214
00215 MCOMM_I2C_SSPIE = 1;
00216 MCOMM_I2C_PEIE = 1;
00217
00218
00219
00220
00221
00222 #elif defined(MCOMM_SPI_IMPLEMENTED)
00223
00224 MCOMM_SPI_SSPSTAT = 0b00000000;
00225
00226
00227 MCOMM_SPI_SSPCON1 = 0b00100100;
00228
00229
00230
00231
00232 MCOMM_SPI_SSPCON3 = 0b00000000;
00233
00234 MCOMM_SPI_SSPIE = 1;
00235 MCOMM_SPI_PEIE = 1;
00236
00237
00238
00239
00240
00241
00242
00243 #endif
00244 }
00245
00246
00247
00248
00249 #if defined(MCOMM_TWO_WAY_ENABLED)
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 void mComm_Receive()
00265 {
00266 uint8_t data;
00267
00268
00269
00270 #if defined(MCOMM_UART_IMPLEMENTED)
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 data = MCOMM_UART_RCREG;
00282
00283 if ((data == 0x00) && (FERR == 1))
00284 {
00285
00286
00287
00288 mComm_input.state = MCOMM_START;
00289 return;
00290 }
00291
00292 if (MCOMM_UART_OERR)
00293 {
00294
00295
00296
00297
00298 MCOMM_UART_CREN = 0;
00299 asm("NOP");
00300 asm("NOP");
00301 MCOMM_UART_CREN = 1;
00302 mComm_input.state = MCOMM_IDLE;
00303 return;
00304 }
00305 else if (mComm_input.state == MCOMM_START)
00306 {
00307
00308
00309
00310
00311 mComm_input.counter = data;
00312 mComm_input.index = 0;
00313 mComm_input.checksum = 0;
00314 mComm_input.state = MCOMM_BUFFER;
00315 return;
00316 }
00317 else if (mComm_input.state == MCOMM_BUFFER)
00318 {
00319
00320
00321
00322
00323 mComm_input.buffer[mComm_input.index] = data;
00324
00325 if (--mComm_input.counter == 0)
00326 {
00327 mComm_input.state = MCOMM_PROCESS_DATA;
00328 }
00329 else
00330 {
00331 mComm_input.index++;
00332 }
00333 mComm_input.checksum ^= data;
00334 }
00335 else
00336 {
00337
00338
00339
00340 mComm_input.state = MCOMM_IDLE;
00341 return;
00342 }
00343
00344
00345 if (mComm_input.state == MCOMM_PROCESS_DATA)
00346 {
00347
00348
00349
00350
00351 if (mComm_input.checksum == 0)
00352 {
00353 mComm_input.flags.bits.full = 1;
00354 }
00355 else
00356 {
00357 mComm_input.flags.bits.invalid = 1;
00358 }
00359 mComm_input.state = MCOMM_IDLE;
00360 }
00361
00362
00363 #elif defined(MCOMM_I2C_IMPLEMENTED)
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375 MCOMM_I2C_SSPIF = 0;
00376
00377
00378 if (MCOMM_I2C_RnW)
00379 {
00380
00381 mComm_input.flags.bits.write = 0;
00382
00383 if (mComm_input.checksum == 0)
00384 {
00385
00386 if (!MCOMM_I2C_DnA)
00387 {
00388
00389
00390
00391
00392
00393
00394 mComm_output.checksum = 0;
00395 mComm_Process(mComm_input.buffer[0]);
00396 }
00397
00398
00399
00400
00401
00402
00403
00404 if (mComm_output.flags.bits.hasNext)
00405 {
00406 data = mComm_output.iterator();
00407 mComm_output.checksum ^= data;
00408 } else {
00409 data = mComm_output.checksum;
00410 }
00411
00412 do {
00413 MCOMM_I2C_WCOL = 0;
00414
00415
00416 if (!MCOMM_I2C_CKP)
00417 MCOMM_I2C_SSPBUF = data;
00418
00419 } while (MCOMM_I2C_WCOL);
00420
00421 MCOMM_I2C_SSPOV = 0;
00422 MCOMM_I2C_CKP = 1;
00423
00424
00425 }
00426 }
00427 else
00428 {
00429
00430 mComm_input.flags.bits.write = 1;
00431
00432 if (MCOMM_I2C_DnA)
00433 {
00434
00435
00436
00437
00438
00439
00440
00441 data = MCOMM_I2C_SSPBUF;
00442 mComm_input.buffer[mComm_input.index] = data;
00443 mComm_input.checksum ^= data;
00444 mComm_input.index++;
00445
00446 }
00447 else
00448 {
00449
00450
00451
00452
00453
00454 mComm_input.index = 0;
00455 mComm_input.checksum = 0;
00456 data = MCOMM_I2C_SSPBUF;
00457
00458 }
00459
00460 if (MCOMM_I2C_SSPOV)
00461 {
00462 MCOMM_I2C_SSPOV = 0;
00463 }
00464 }
00465
00466
00467 if (MCOMM_I2C_STOP && mComm_input.flags.bits.write)
00468 {
00469
00470
00471
00472
00473 if (mComm_input.checksum == 0)
00474 {
00475 MCOMM_I2C_SSPADD = MCOMM_I2C_ADDRESS_BUSY;
00476
00477 mComm_Process(mComm_input.buffer[0]);
00478 while (mComm_output.iterator());
00479
00480 MCOMM_I2C_SSPADD = MCOMM_I2C_ADDRESS;
00481 }
00482 }
00483
00484
00485 #elif defined(MCOMM_SPI_IMPLEMENTED)
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496 MCOMM_SPI_SSPIF = 0;
00497 data = MCOMM_SPI_SSPBUF;
00498
00499 if (mComm_input.state == MCOMM_SPI_START)
00500 {
00501
00502
00503
00504 if (data == MCOMM_SPI_ADDRESS) { mComm_input.state == MCOMM_SPI_PACKET_LENGTH; MCOMM_SPI_SSPBUF = MCOMM_OP_ACK; }
00505 else { mComm_input.state == MCOMM_SPI_IDLE; MCOMM_SPI_SSPBUF = data; }
00506 return;
00507 }
00508 else if (mComm_input.state == MCOMM_SPI_PACKET_LENGTH)
00509 {
00510
00511
00512
00513 mComm_input.state = MCOMM_SPI_BUFFER;
00514 mComm_input.counter = data;
00515 mComm_input.index = 0;
00516 mComm_input.checksum = 0;
00517 MCOMM_SPI_SSPBUF = 0x00;
00518 return;
00519 }
00520 else if (mComm_input.state == MCOMM_SPI_BUFFER)
00521 {
00522
00523
00524
00525
00526 mComm_input.buffer[mComm_input.index] = data;
00527
00528 if (--mComm_input.counter == 0)
00529 {
00530 mComm_input.state = MCOMM_SPI_PROCESS_DATA;
00531 }
00532 else
00533 {
00534 mComm_input.index++;
00535 }
00536 mComm_input.checksum ^= data;
00537 }
00538 else if (mComm_input.state == MCOMM_SPI_IDLE)
00539 {
00540
00541
00542
00543 MCOMM_SPI_SSPBUF = data;
00544 return;
00545 }
00546
00547
00548 if (mComm_input.state == MCOMM_SPI_PROCESS_DATA)
00549 {
00550
00551
00552
00553
00554 if (mComm_input.checksum == 0)
00555 {
00556 mComm_Process(mComm_input.buffer[0]);
00557
00558 if (!(mComm_input.buffer[0] & 0x01))
00559 {
00560 while (mComm_output.iterator());
00561 MCOMM_SPI_SSPBUF = MCOMM_OP_ACK;
00562 mComm_input.state = MCOMM_SPI_IDLE;
00563 return;
00564 }
00565 mComm_input.state = MCOMM_SPI_OUTPUT;
00566 }
00567 }
00568
00569 if (mComm_input.state == MCOMM_SPI_OUTPUT)
00570 {
00571
00572
00573
00574
00575
00576 if (mComm_output.flags.bits.hasNext)
00577 {
00578 data = mComm_output.iterator();
00579 mComm_output.checksum ^= data;
00580 } else {
00581 data = mComm_output.checksum;
00582 }
00583
00584 do {
00585 MCOMM_SPI_WCOL = 0;
00586 MCOMM_SPI_SSPBUF = data;
00587 } while (MCOMM_SPI_WCOL);
00588
00589 MCOMM_SPI_SSPOV = 0;
00590 return;
00591 }
00592
00593 MCOMM_SPI_SSPBUF = 0x00;
00594
00595 #endif // end - defined(MCOMM_SPI_IMPLEMENTED)
00596 }
00597
00598
00599 #if defined(MCOMM_SPI_IMPLEMENTED)
00600 void mComm_SPI_ServiceSS(void)
00601 {
00602 if (MCOMM_SPI_IOCIF)
00603 {
00604 MCOMM_SPI_IOCIF = 0;
00605 if (mComm_input.flags.bits.ssLatch != MCOMM_SPI_SS_PIN)
00606 {
00607 if (mComm_input.flags.bits.ssLatch == 1)
00608 mComm_input.state = MCOMM_SPI_START;
00609
00610 mComm_input.flags.bits.ssLatch = MCOMM_SPI_SS_PIN;
00611 }
00612 }
00613 }
00614 #endif // end - defined(MCOMM_SPI_IMPLEMENTED)
00615
00616 #endif // end - defined(MCOMM_TWO_WAY_ENABLED)
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633 #if defined(MCOMM_UART_IMPLEMENTED)
00634 void mComm_Service()
00635 {
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645 #if defined(MCOMM_TWO_WAY_ENABLED)
00646 union
00647 {
00648 uint8_t all;
00649
00650 struct
00651 {
00652 unsigned R_nW :1;
00653 unsigned processInput :1;
00654 unsigned invalidInput :1;
00655 unsigned run :1;
00656 #if defined(MCOMM_ENABLE_CUSTOM_OPCODE)
00657 unsigned processCustom :1;
00658 #endif
00659 } flags;
00660 } mode;
00661
00662
00663 uint8_t data;
00664 mode.all = 0;
00665
00666 if (mComm_input.flags.bits.invalid == 1)
00667 {
00668 mComm_input.flags.all = 0;
00669 mComm_UART_SendACKorNACK(MCOMM_OP_NACK);
00670 }
00671
00672 #if defined(MCOMM_ENABLE_STREAM)
00673 if (mComm_streamConfig.go && mComm_streamConfig.enabled)
00674 {
00675 mode.flags.run = 1;
00676 mode.flags.R_nW = 1;
00677 }
00678 #endif
00679
00680 #if defined(MCOMM_ENABLE_CUSTOM_OPCODE)
00681 if (MCOMM_CUSTOM_CALLBACK())
00682 {
00683 mode.flags.run = 1;
00684 mode.flags.R_nW = 1;
00685 mode.flags.processCustom = 1;
00686 }
00687 #endif
00688
00689 if (mComm_input.flags.bits.full)
00690 {
00691 mode.flags.run = 1;
00692 mode.flags.R_nW = mComm_input.buffer[0] & 0x01;
00693 mode.flags.processInput = 1;
00694 #if defined(MCOMM_ENABLE_CUSTOM_OPCODE)
00695 mode.flags.processCustom = 0;
00696 #endif
00697 }
00698
00699 if (mode.flags.run)
00700 {
00701
00702
00703
00704 #if defined(MCOMM_ENABLE_STREAM) || defined(MCOMM_ENABLE_CUSTOM_OPCODE)
00705 if (mode.flags.processInput)
00706 {
00707 #endif
00708 mComm_Process(mComm_input.buffer[0]);
00709 #if defined(MCOMM_ENABLE_STREAM) || defined(MCOMM_ENABLE_CUSTOM_OPCODE)
00710 }
00711 else
00712 {
00713 #if defined(MCOMM_ENABLE_STREAM) && defined(MCOMM_ENABLE_CUSTOM_OPCODE)
00714 if (mode.flags.processCustom)
00715 {
00716 mComm_Process(MCOMM_OP_CUSTOM_READ);
00717 } else {
00718 mComm_Process(MCOMM_OP_STREAM_READ);
00719 }
00720 #else
00721 #if defined(MCOMM_ENABLE_STREAM)
00722 mComm_Process(MCOMM_OP_STREAM_READ);
00723 #else
00724 mComm_Process(MCOMM_OP_CUSTOM_READ);
00725 #endif
00726 #endif
00727 }
00728 #endif
00729
00730
00731
00732
00733 if (mode.flags.R_nW)
00734 {
00735 mComm_output.checksum = 0;
00736
00737 if (mComm_output.flags.bits.hasNext)
00738 {
00739 TXSTAbits.SENDB = 1;
00740 TXREG = 0x00;
00741 while(TXSTAbits.SENDB);
00742 }
00743
00744 while (mComm_output.flags.bits.hasNext)
00745 {
00746 data = mComm_output.iterator();
00747 mComm_UART_PutChar(data);
00748 if (mComm_output.flags.bits.second == 0)
00749 {
00750 mComm_output.checksum ^= data;
00751 }
00752 }
00753 mComm_UART_PutChar(mComm_output.checksum);
00754 }
00755 else
00756 {
00757 while (mComm_output.iterator());
00758 mComm_UART_SendACKorNACK(MCOMM_OP_ACK);
00759 }
00760
00761
00762
00763
00764 #if defined(MCOMM_ENABLE_STREAM)
00765 if (mode.flags.processInput)
00766 {
00767 #endif
00768 mComm_input.flags.bits.full = 0;
00769 #if defined(MCOMM_ENABLE_STREAM)
00770 }
00771 else
00772 {
00773 #if defined(MCOMM_ENABLE_STREAM) && defined(MCOMM_ENABLE_CUSTOM_OPCODE)
00774 if (!mode.flags.processCustom)
00775 {
00776 mComm_streamConfig.go = 0;
00777 }
00778 #else
00779 #if defined(MCOMM_ENABLE_STREAM)
00780 mComm_streamConfig.go = 0;
00781 #endif
00782 #endif
00783 }
00784 #endif
00785 }
00786 #endif // end - defined(MCOMM_TWO_WAY_ENABLED)
00787
00788 #if defined(MCOMM_ONE_WAY_ENABLED)
00789
00790
00791
00792
00793
00794
00795
00796 #if defined(MCOMM_UART_1WAY_OUT_STATE)
00797 mComm_UART_Int2ASCII((uint16_t)mTouch_stateMask);
00798 #else
00799 mComm_UART_Int2ASCII(0);
00800 #endif
00801
00802 #if defined(MCOMM_UART_1WAY_OUT_TOGGLE) && defined(MTOUCH_TOGGLE_ENABLED)
00803 mComm_UART_Int2ASCII((uint16_t)mTouch_toggle);
00804 #else
00805 mComm_UART_Int2ASCII(0);
00806 #endif
00807
00808 #if defined(MCOMM_UART_1WAY_OUT_SLIDER) && defined(MTOUCH_NUMBER_OF_SLIDERS) && (MTOUCH_NUMBER_OF_SLIDERS > 0)
00809 mComm_UART_Char2ASCII(mTouch_slider[0]);
00810 #else
00811 mComm_UART_Char2ASCII(0);
00812 #endif
00813
00814 #if defined(MCOMM_UART_1WAY_OUT_MATRIX) && defined(MTOUCH_MATRIX_ENABLED)
00815 mComm_UART_PutChar('(');
00816 if (mTouch_Matrix_isPressed())
00817 {
00818 mComm_UART_PutChar((uint8_t)(mTouch_Matrix_getColumn()) + 0x30);
00819 mComm_UART_PutChar(':');
00820 mComm_UART_PutChar((uint8_t)(mTouch_Matrix_getRow()) + 0x30);
00821 }
00822 else
00823 {
00824 mComm_UART_PutChar('x');
00825 mComm_UART_PutChar(':');
00826 mComm_UART_PutChar('x');
00827 }
00828 mComm_UART_PutChar(')');
00829 mComm_UART_PutChar(MCOMM_UART_1WAY_DELIMITER);
00830 #endif
00831
00832 #if defined(MCOMM_UART_1WAY_OUT_READING) || defined(MCOMM_UART_1WAY_OUT_BASELINE)
00833 for (uint8_t i = 0; i < MTOUCH_NUMBER_SENSORS; i++)
00834 {
00835 #if defined(MCOMM_UART_1WAY_OUT_READING)
00836 mComm_UART_Int2ASCII(mTouch_GetSensor(i));
00837 #endif
00838 #if defined(MCOMM_UART_1WAY_OUT_BASELINE)
00839 mComm_UART_Int2ASCII(mTouch_GetAverage(i));
00840 #endif
00841 }
00842 #endif
00843
00844 mComm_UART_PutChar(0x0D);
00845 mComm_UART_PutChar(0x0A);
00846
00847 #endif
00848 }
00849 #endif // end - defined(MCOMM_UART_IMPLEMENTED)
00850
00851
00852 #if defined(MCOMM_TWO_WAY_ENABLED)
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867 void mComm_Process(uint8_t opcode)
00868 {
00869
00870
00871
00872 if (opcode < MCOMM_NUMBER_OPCODES)
00873 {
00874 mComm_output.flags.all = 0x00;
00875 mComm_output.flags.bits.first = 1;
00876 mComm_output.flags.bits.hasNext = 1;
00877
00878 mComm_output.counter = 0;
00879 mComm_output.latch = 0;
00880 mComm_output.opcode = opcode;
00881 mComm_output.iterator = mComm_opcode[opcode].iterator;
00882
00883 mComm_opcode[opcode].initialize();
00884 return;
00885 }
00886
00887
00888
00889
00890 mComm_output.iterator = &mComm_ErrorIterator;
00891 }
00892 #endif // end - defined(MCOMM_TWO_WAY_ENABLED)
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903 #if defined(MCOMM_UART_IMPLEMENTED)
00904
00905 #if defined(MCOMM_TWO_WAY_ENABLED)
00906 void mComm_UART_SendACKorNACK(uint8_t opcode)
00907 {
00908 while(MCOMM_UART_TXIF == 0);
00909 TXSTAbits.SENDB = 1;
00910 TXREG = 0x00;
00911 while(TXSTAbits.SENDB);
00912 mComm_UART_PutChar(0x02);
00913 mComm_UART_PutChar(opcode);
00914 mComm_UART_PutChar(opcode);
00915 }
00916 #endif
00917
00918
00919
00920
00921
00922 void mComm_UART_PutChar(uint8_t data)
00923 {
00924 #if defined(MCOMM_TWO_WAY_ENABLED) || (MCOMM_UART_1WAY_MODULE == MCOMM_UART_HARDWARE_MODULE)
00925
00926 while(MCOMM_UART_TXIF == 0);
00927 MCOMM_UART_TXREG = data;
00928
00929 #else
00930
00931 #pragma regsused mComm_UART_PutChar wreg status fsr0
00932
00933 mComm_shiftReg = data;
00934
00935 #if defined(_PIC14E) // Implementation if using an enhanced-core PIC16F1 device
00936 asm(" movlw LOW " ___mkstr(NOBANK(__paste(_,MCOMM_UART_SOFT_TXPORT))));
00937 asm(" movwf " ___mkstr(_FSR0L) );
00938 asm(" movlw HIGH " ___mkstr(NOBANK(__paste(_,MCOMM_UART_SOFT_TXPORT))));
00939 asm(" movwf " ___mkstr(_FSR0H) );
00940 asm(" BANKSEL _mComm_bitCount ");
00941 asm(" movlw 0x08 ");
00942 asm(" movwf _mComm_bitCount ");
00943 asm(" bcf " ___mkstr(_INDF0) ", " ___mkstr(MCOMM_UART_SOFT_TXPIN));
00944 asm(" fcall MCOMM_UART_BITDELAY ");
00945 asm(" ljmp $+1 ");
00946 asm(" nop ");
00947 asm("MCOMM_UART_TXNEXTBIT: ");
00948 asm(" rrf _mComm_shiftReg, F ");
00949 asm(" btfss " ___mkstr(NOBANK(_STATUS)) ", 0");
00950 asm(" ljmp MCOMM_UART_TXZERO ");
00951 asm("MCOMM_UART_TXONE: ");
00952 asm(" nop ");
00953 asm(" bsf " ___mkstr(_INDF0) ", " ___mkstr(MCOMM_UART_SOFT_TXPIN));
00954 asm(" fcall MCOMM_UART_BITDELAY ");
00955 asm(" decfsz _mComm_bitCount, F ");
00956 asm(" ljmp MCOMM_UART_TXNEXTBIT ");
00957 asm(" ljmp MCOMM_UART_TXSTOP ");
00958 asm("MCOMM_UART_TXZERO: ");
00959 asm(" bcf " ___mkstr(_INDF0) ", " ___mkstr(MCOMM_UART_SOFT_TXPIN));
00960 asm(" fcall MCOMM_UART_BITDELAY ");
00961 asm(" decfsz _mComm_bitCount, F ");
00962 asm(" ljmp MCOMM_UART_TXNEXTBIT ");
00963 asm(" ljmp MCOMM_UART_TXSTOP ");
00964 asm("MCOMM_UART_TXSTOP: ");
00965 asm(" ljmp $+1 ");
00966 asm(" nop ");
00967 asm(" bsf " ___mkstr(_INDF0) ", " ___mkstr(MCOMM_UART_SOFT_TXPIN));
00968 asm(" fcall MCOMM_UART_BITDELAY ");
00969 asm(" return ");
00970 asm("MCOMM_UART_BITDELAY: ");
00971 asm(" movlw 0x04 ");
00972 asm(" sublw " ___mkstr(MCOMM_UART_FWBRG_VALUE));
00973 asm(" movwf _mComm_delayCount ");
00974 asm("MCOMM_UART_BITWAITLOOP: ");
00975 asm(" nop ");
00976 asm("MCOMM_UART_BITWAIT: ");
00977 asm(" decfsz _mComm_delayCount, F ");
00978 asm(" ljmp MCOMM_UART_BITWAITLOOP ");
00979 asm(" ljmp $+1 ");
00980 asm(" return ");
00981 #elif defined(_PIC14) // Implementation if using a non-enhanced core PIC12/16F device
00982 asm(" movlw LOW " ___mkstr(NOBANK(__paste(_,MCOMM_UART_SOFT_TXPORT))));
00983 asm(" movwf " ___mkstr(_FSR) );
00984 asm(" BANKSEL _mComm_shiftReg ");
00985 asm(" movlw 8 ");
00986 asm(" movwf _mComm_bitCount ");
00987 asm(" bcf " ___mkstr(_INDF) ", " ___mkstr(MCOMM_UART_SOFT_TXPIN));
00988 asm(" fcall MCOMM_UART_BITDELAY ");
00989 asm(" ljmp $+1 ");
00990 asm(" nop ");
00991 asm("MCOMM_UART_TXNEXTBIT: ");
00992 asm(" rrf _mComm_shiftReg, F ");
00993 asm(" btfss " ___mkstr(NOBANK(_STATUS)) ", 0");
00994 asm(" ljmp MCOMM_UART_TXZERO ");
00995 asm("MCOMM_UART_TXONE: ");
00996 asm(" nop ");
00997 asm(" bsf " ___mkstr(_INDF) ", " ___mkstr(MCOMM_UART_SOFT_TXPIN));
00998 asm(" fcall MCOMM_UART_BITDELAY ");
00999 asm(" decfsz _mComm_bitCount, F ");
01000 asm(" ljmp MCOMM_UART_TXNEXTBIT ");
01001 asm(" ljmp MCOMM_UART_TXSTOP ");
01002 asm("MCOMM_UART_TXZERO: ");
01003 asm(" bcf " ___mkstr(_INDF) ", " ___mkstr(MCOMM_UART_SOFT_TXPIN));
01004 asm(" fcall MCOMM_UART_BITDELAY ");
01005 asm(" decfsz _mComm_bitCount, F ");
01006 asm(" ljmp MCOMM_UART_TXNEXTBIT ");
01007 asm(" ljmp MCOMM_UART_TXSTOP ");
01008 asm("MCOMM_UART_TXSTOP: ");
01009 asm(" ljmp $+1 ");
01010 asm(" nop ");
01011 asm(" bsf " ___mkstr(_INDF) ", " ___mkstr(MCOMM_UART_SOFT_TXPIN));
01012 asm(" fcall MCOMM_UART_BITDELAY ");
01013 asm(" return ");
01014 asm("MCOMM_UART_BITDELAY: ");
01015 asm(" movlw 4 ");
01016 asm(" sublw " ___mkstr(MCOMM_UART_FWBRG_VALUE) );
01017 asm(" movwf _mComm_delayCount ");
01018 asm("MCOMM_UART_BITWAITLOOP: ");
01019 asm(" nop ");
01020 asm("MCOMM_UART_BITWAIT: ");
01021 asm(" decfsz _mComm_delayCount, F ");
01022 asm(" ljmp MCOMM_UART_BITWAITLOOP ");
01023 asm(" ljmp $+1 ");
01024 asm(" return ");
01025 #endif
01026
01027 #endif
01028 }
01029
01030 #if (MCOMM_TYPE == MCOMM_UART_ONE_WAY)
01031
01032
01033
01034 void mComm_UART_Char2ASCII(uint8_t output)
01035 {
01036 #if (MCOMM_UART_1WAY_OUTPUT == MCOMM_UART_1WAY_HEX)
01037
01038 uint8_t nibble;
01039
01040 #define MCOMM_UART_OUTPUT_NIBBLE(value, shift) \
01041 nibble = (uint8_t) value >> shift; \
01042 if (nibble <= 9) { nibble += 0x30; } else { nibble += 0x37; } \
01043 mComm_UART_PutChar(nibble);
01044
01045 MCOMM_UART_OUTPUT_NIBBLE(output, 4);
01046 MCOMM_UART_OUTPUT_NIBBLE(output, 0);
01047
01048 #undef MCOMM_UART_OUTPUT_NIBBLE
01049
01050 #else
01051
01052 uint8_t digit = 0;
01053 while (output >= 100) { output -= 100; digit++; } mComm_UART_PutChar(digit + 0x30); digit = 0;
01054 while (output >= 10) { output -= 10; digit++; } mComm_UART_PutChar(digit + 0x30); digit = 0;
01055 while (output >= 1) { output -= 1; digit++; } mComm_UART_PutChar(digit + 0x30);
01056
01057 #endif
01058
01059 #if defined(MCOMM_UART_1WAY_OUT_GUIv1_1)
01060 mComm_UART_PutChar(',');
01061 #else
01062 mComm_UART_PutChar(MCOMM_UART_1WAY_DELIMITER);
01063 #endif
01064 }
01065
01066
01067
01068
01069
01070 void mComm_UART_Int2ASCII(uint16_t output)
01071 {
01072
01073 #if (MCOMM_UART_1WAY_OUTPUT == MCOMM_UART_1WAY_HEX)
01074
01075 uint8_t nibble;
01076
01077 #define MCOMM_UART_OUTPUT_NIBBLE(value, shift) \
01078 nibble = (uint8_t) value >> shift; \
01079 if (nibble <= 9) { nibble += 0x30; } else { nibble += 0x37; } \
01080 mComm_UART_PutChar(nibble);
01081
01082 MCOMM_UART_OUTPUT_NIBBLE(output, 12);
01083 MCOMM_UART_OUTPUT_NIBBLE(output, 8);
01084 MCOMM_UART_OUTPUT_NIBBLE(output, 4);
01085 MCOMM_UART_OUTPUT_NIBBLE(output, 0);
01086
01087 #undef MCOMM_UART_OUTPUT_NIBBLE
01088
01089 #else
01090
01091 uint8_t digit = 0;
01092 while (output >= 10000) { output -= 10000; digit++; } mComm_UART_PutChar(digit + 0x30); digit = 0;
01093 while (output >= 1000) { output -= 1000; digit++; } mComm_UART_PutChar(digit + 0x30); digit = 0;
01094 while (output >= 100) { output -= 100; digit++; } mComm_UART_PutChar(digit + 0x30); digit = 0;
01095 while (output >= 10) { output -= 10; digit++; } mComm_UART_PutChar(digit + 0x30); digit = 0;
01096 while (output >= 1) { output -= 1; digit++; } mComm_UART_PutChar(digit + 0x30);
01097
01098 #endif
01099
01100 mComm_UART_PutChar(MCOMM_UART_1WAY_DELIMITER);
01101 }
01102
01103 #endif
01104
01105
01106 #endif
01107
01108 #endif