00001
00002
00003
00004 #include <C8051F340.h>
00005 #include "CD_tools.h"
00006 #include "CD_Link.h"
00007 #include "CD_DigitalWave.h"
00008
00009 sbit linea_servo=P2^3;
00010
00011 unsigned int cuenta_desbordes;
00012 volatile unsigned int cp_cuenta_desbordes;
00013 volatile unsigned char cp_TH1,cp_TL1;
00014 volatile unsigned char lock_DIF;
00015
00016
00017 void CD_DigitalWave_Init (void)
00018 {
00019
00020
00021 TR0=0;
00022 TF0=0;
00023
00024 EA=0;
00025
00026
00027 CKCON &= 0xF8;
00028 CKCON |= 0x02;
00029
00030
00031 TR0=0;
00032 TF0=0;
00033 TMOD&=0xF0;
00034 TMOD|=0x01;
00035
00036
00037 ET0=1;
00038 EA=1;
00039
00040
00041
00042 EA = 0;
00043
00044 CKCON &= ~0x08;
00045
00046
00047 TR1=0;
00048 TF1=0;
00049
00050 TMOD &= 0x0F;
00051 TMOD |= 0x10;
00052 TH1=0;
00053 TL1=0;
00054
00055 cuenta_desbordes = 0;
00056
00057 ET1 = 1;
00058
00059
00060
00061 IT0 = 1;
00062 IE0 = 0;
00063
00064 IT01CF &= ~0x07;
00065 IT01CF |= 0x03;
00066
00067 EX0 = 1;
00068
00069
00070 EA = 1;
00071
00072 lock_DIF = 0;
00073
00074 TR1 = 1;
00075 }
00076
00077 volatile unsigned char high_h, high_l, low_h, low_l;
00078
00079 void CD_DOF (unsigned char *msg) large {
00080
00081 unsigned char subdevice;
00082 unsigned int val;
00083
00084
00085 if (CD_HexaStrTo_u8(msg, 2, &subdevice)) {
00086 CD_LinkMsgError(0x00);
00087 return;
00088 };
00089
00090
00091 if (CD_HexaStrTo_u16(msg+2, 4, &val)) {
00092 CD_LinkMsgError(0x00);
00093 return;
00094 };
00095
00096 val = 65536 - val;
00097 high_l = val & 0xFF;
00098 high_h = val >>8;
00099
00100
00101 if (CD_HexaStrTo_u16(msg+6, 4, &val)) {
00102 CD_LinkMsgError(0x00);
00103 return;
00104 };
00105
00106 val = 65536 - val;
00107 low_l = val & 0xFF;
00108 low_h = val >> 8;
00109
00110
00111
00112 linea_servo = 1;
00113 TL0=high_l;
00114 TH0=high_h;
00115 TR0=1;
00116
00117 CD_LinkMsgOK();
00118 }
00119
00120
00121 void CD_DIF (unsigned char *msg) large {
00122
00123 unsigned char subdevice;
00124 unsigned long val;
00125 unsigned char i;
00126
00127 char num[10];
00128
00129
00130 if (CD_HexaStrTo_u8(msg, 2, &subdevice)) {
00131 CD_LinkMsgError(0x00);
00132 return;
00133 };
00134
00135 lock_DIF = 1;
00136
00137 val = cp_cuenta_desbordes;
00138 val <<= 8;
00139 val |= cp_TH1;
00140 val <<= 8;
00141 val |= cp_TL1;
00142
00143 lock_DIF = 0;
00144
00145 if (val > 1000000L) {
00146 val = 1;
00147 } else {
00148 val = 1000000L/val;
00149 }
00150
00151
00152
00153
00154
00155 for (i=0;i<10;i++) {
00156 num[i]='0'+ val % 10;
00157 val /= 10;
00158 }
00159
00160 CD_LinkTXStr("#!");
00161 for (i=0;i<10;i++) {
00162 CD_LinkTXChar(num[9-i]);
00163 }
00164 CD_LinkTXChar('\x0D');
00165
00166 }
00167
00168
00169
00170 void Genera_cuenta_ISR (void) interrupt 1
00171 {
00172 if(linea_servo==1) {
00173
00174 linea_servo = 0;
00175 TR0=0;
00176
00177 TL0=low_l;
00178 TH0=low_h;
00179 TR0=1;
00180 } else {
00181
00182 linea_servo = 1;
00183
00184 TR0=0;
00185 TL0=high_l;
00186 TH0=high_h;
00187 TR0=1;
00188 }
00189 }
00190
00191
00192
00193
00194
00195 void timer1_ISR (void) interrupt 3 {
00196
00197 if (cuenta_desbordes != 65535) {
00198 cuenta_desbordes++;
00199 }
00200 }
00201
00202
00203 void int0_ISR (void) interrupt 0 {
00204
00205 TR1 = 0;
00206
00207 if (lock_DIF == 0) {
00208 cp_TH1 = TH1;
00209 cp_TL1 = TL1;
00210 cp_cuenta_desbordes = cuenta_desbordes;
00211 }
00212
00213 TH1 = 0;
00214 TL1 = 0;
00215 cuenta_desbordes = 0;
00216
00217 TR1 = 1;
00218 }
00219