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 #include "pic24_all.h"
00031
00036
00037 #define CONFIG_STX() CONFIG_RB2_AS_DIG_OUTPUT()
00038 #define STX _LATB2 //STX state
00039 #define CONFIG_SRX() CONFIG_RB3_AS_DIG_INPUT()
00040 #define SRX _RB3 //SRX state
00041 #define DEFAULT_SOFT_BAUDRATE 19200
00042 uint16 u16_softBaudRate = DEFAULT_SOFT_BAUDRATE;
00043
00044 void doBitDelay (uint16 u16_baudRate) {
00045 if (u16_baudRate == 9600) {
00046 DELAY_US(106);
00047 } else if (u16_baudRate == 19200) DELAY_US(52);
00048 }
00049
00050 void doBitHalfDelay (uint16 u16_baudRate) {
00051 if (u16_baudRate == 9600) {
00052 DELAY_US(53);
00053 } else if (u16_baudRate == 19200) DELAY_US(26);
00054 }
00055
00056 void outCharSoft(uint8 u8_c) {
00057 uint8 u8_i;
00058 STX = 0;
00059 doBitDelay(u16_softBaudRate);
00060 for (u8_i=0;u8_i<8;u8_i++) {
00061 if (u8_c & 0x01)
00062 STX = 1;
00063 else STX = 0;
00064 doBitDelay(u16_softBaudRate);
00065 u8_c = u8_c >> 1;
00066 }
00067 STX = 1;
00068 doBitDelay(u16_softBaudRate);
00069 }
00070
00071 uint8 inCharSoft(void) {
00072 uint8 u8_i, u8_c;
00073
00074 u8_c = 0x00;
00075 while (SRX) doHeartbeat();
00076 doBitHalfDelay(u16_softBaudRate);
00077 for (u8_i=0;u8_i<8;u8_i++) {
00078 doBitDelay(u16_softBaudRate);
00079 if (SRX) u8_c = u8_c | 0x80;
00080 if (u8_i != 7) u8_c = u8_c >> 1;
00081 }
00082 doBitDelay(u16_softBaudRate);
00083 return(u8_c);
00084 }
00085
00086
00087
00088 int main (void) {
00089 uint8 u8_c;
00090
00091 configClock();
00092 configHeartbeat();
00094 CONFIG_STX();
00095 STX = 1;
00096 while (1) {
00097 u8_c = inCharSoft();
00098 u8_c++;
00099 outCharSoft(u8_c);
00100 doHeartbeat();
00101 }
00102
00103 return 0;
00104 }