Andrew Kuznetsov / Monitor

Dependencies:   EthernetNetIf mbed

Committer:
AndrewK
Date:
Tue Jun 26 06:23:18 2012 +0000
Revision:
0:013005f626db

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndrewK 0:013005f626db 1
AndrewK 0:013005f626db 2 #define SAMPLE_RATE 150000
AndrewK 0:013005f626db 3 #include "mbed.h"
AndrewK 0:013005f626db 4 #include "adc.h"
AndrewK 0:013005f626db 5 #include "EthernetNetIf.h"
AndrewK 0:013005f626db 6 #include "UDPSocket.h"
AndrewK 0:013005f626db 7
AndrewK 0:013005f626db 8 EthernetNetIf eth( IpAddr(192,168,1,5), //IP Address
AndrewK 0:013005f626db 9 IpAddr(255,255,255,0), //Network Mask
AndrewK 0:013005f626db 10 IpAddr(192,168,1,254), //Gateway
AndrewK 0:013005f626db 11 IpAddr(192,168,1,254) //DNS
AndrewK 0:013005f626db 12 );
AndrewK 0:013005f626db 13 //EthernetNetIf eth;
AndrewK 0:013005f626db 14 UDPSocket udp;
AndrewK 0:013005f626db 15
AndrewK 0:013005f626db 16 DigitalOut int_led(LED1);
AndrewK 0:013005f626db 17 DigitalOut P15(p15);
AndrewK 0:013005f626db 18 Serial pc(USBTX,USBRX);
AndrewK 0:013005f626db 19 Host multicast(IpAddr(192,168,1,10),27200, NULL); //Target IP and port
AndrewK 0:013005f626db 20 ADC adc(SAMPLE_RATE, 1);
AndrewK 0:013005f626db 21 Ticker flipper;
AndrewK 0:013005f626db 22 unsigned short s1,s2,s3;
AndrewK 0:013005f626db 23 unsigned short i1,i2,i3;
AndrewK 0:013005f626db 24 unsigned short a1,a2,a3;
AndrewK 0:013005f626db 25 unsigned short sm1, sm2, sm3;
AndrewK 0:013005f626db 26 unsigned short im1, im2, im3;
AndrewK 0:013005f626db 27 unsigned short am1;
AndrewK 0:013005f626db 28 unsigned short smag, imag;
AndrewK 0:013005f626db 29 float s0;
AndrewK 0:013005f626db 30 //int k=0;
AndrewK 0:013005f626db 31 //Timer tmr;
AndrewK 0:013005f626db 32 Timeout timeout;
AndrewK 0:013005f626db 33 char str[50];
AndrewK 0:013005f626db 34 unsigned char buf[10];
AndrewK 0:013005f626db 35 int count_puls;
AndrewK 0:013005f626db 36 int led1_on = 0;
AndrewK 0:013005f626db 37 void Timer_Handler()
AndrewK 0:013005f626db 38 {
AndrewK 0:013005f626db 39 if(count_puls) {
AndrewK 0:013005f626db 40 printf("cp %d\n", count_puls);
AndrewK 0:013005f626db 41 count_puls--;
AndrewK 0:013005f626db 42 led1_on = !led1_on;
AndrewK 0:013005f626db 43 int_led = led1_on;
AndrewK 0:013005f626db 44 P15 = !led1_on;
AndrewK 0:013005f626db 45 timeout.attach_us(Timer_Handler, 100);
AndrewK 0:013005f626db 46 } else
AndrewK 0:013005f626db 47 timeout.detach();
AndrewK 0:013005f626db 48 }
AndrewK 0:013005f626db 49
AndrewK 0:013005f626db 50 void onUDPSocketEvent(UDPSocketEvent e) { //Incoming UDP packet processing
AndrewK 0:013005f626db 51 switch (e) {
AndrewK 0:013005f626db 52 case UDPSOCKET_READABLE: //The only event for now
AndrewK 0:013005f626db 53 char buf[64] = {0};
AndrewK 0:013005f626db 54 Host host;
AndrewK 0:013005f626db 55 while ( int len = udp.recvfrom( buf, 63, &host ) ) {
AndrewK 0:013005f626db 56 if ( len <= 0 )
AndrewK 0:013005f626db 57 break;
AndrewK 0:013005f626db 58 printf("From %d.%d.%d.%d: %s\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], buf);
AndrewK 0:013005f626db 59 }
AndrewK 0:013005f626db 60 switch(buf[0]) {
AndrewK 0:013005f626db 61 case '1':
AndrewK 0:013005f626db 62 count_puls = 8;
AndrewK 0:013005f626db 63 break;
AndrewK 0:013005f626db 64 case '2':
AndrewK 0:013005f626db 65 count_puls = 4;
AndrewK 0:013005f626db 66 break;
AndrewK 0:013005f626db 67 case '3':
AndrewK 0:013005f626db 68 count_puls = 6;
AndrewK 0:013005f626db 69 break;
AndrewK 0:013005f626db 70 case '4':
AndrewK 0:013005f626db 71 count_puls = 2;
AndrewK 0:013005f626db 72 break;
AndrewK 0:013005f626db 73 case '5':
AndrewK 0:013005f626db 74 count_puls = 10;
AndrewK 0:013005f626db 75 break;
AndrewK 0:013005f626db 76 default:
AndrewK 0:013005f626db 77 count_puls = 0;
AndrewK 0:013005f626db 78 }
AndrewK 0:013005f626db 79 timeout.attach_us(Timer_Handler, 100);
AndrewK 0:013005f626db 80 break;
AndrewK 0:013005f626db 81 }
AndrewK 0:013005f626db 82 }
AndrewK 0:013005f626db 83 /*
AndrewK 0:013005f626db 84 void adc_comlete(uint32_t value) {
AndrewK 0:013005f626db 85 samples1 = adc.read(p20);
AndrewK 0:013005f626db 86 Net::poll(); //Do network stuff
AndrewK 0:013005f626db 87 sprintf(str, "1=%4u\0", samples1);
AndrewK 0:013005f626db 88 printf("%d\n", samples1);
AndrewK 0:013005f626db 89 udp.sendto( str, strlen(str)+1, &multicast );
AndrewK 0:013005f626db 90
AndrewK 0:013005f626db 91 }
AndrewK 0:013005f626db 92 */
AndrewK 0:013005f626db 93 unsigned short Major(unsigned short dadc2, unsigned short dadc0, unsigned short dadc1)
AndrewK 0:013005f626db 94 {
AndrewK 0:013005f626db 95 //printf("%d %d %d\n", dadc2, dadc0, dadc1);
AndrewK 0:013005f626db 96 unsigned short rez;
AndrewK 0:013005f626db 97 int dif01, dif02, dif12;
AndrewK 0:013005f626db 98 dif01 = dadc0 - dadc1;
AndrewK 0:013005f626db 99 dif02 = dadc0 - dadc2;
AndrewK 0:013005f626db 100 dif12 = dadc1 - dadc2;
AndrewK 0:013005f626db 101 if (dif01 < 0) dif01 = -dif01;
AndrewK 0:013005f626db 102 if (dif02 < 0) dif02 = -dif02;
AndrewK 0:013005f626db 103 if (dif12 < 0) dif12 = -dif12;
AndrewK 0:013005f626db 104 if (dif01 < dif02) {
AndrewK 0:013005f626db 105 if (dif12 < dif01)
AndrewK 0:013005f626db 106 dadc0 = dadc2;
AndrewK 0:013005f626db 107 //else // &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 2
AndrewK 0:013005f626db 108 } else {
AndrewK 0:013005f626db 109 if (dif12 < dif02)
AndrewK 0:013005f626db 110 dadc0 = dadc2; // &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 0
AndrewK 0:013005f626db 111 else
AndrewK 0:013005f626db 112 dadc1 = dadc2; // &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 1
AndrewK 0:013005f626db 113 }
AndrewK 0:013005f626db 114 rez = dadc0 + dadc1;
AndrewK 0:013005f626db 115 rez >>= 1;
AndrewK 0:013005f626db 116 return rez;
AndrewK 0:013005f626db 117 }
AndrewK 0:013005f626db 118 int delta;
AndrewK 0:013005f626db 119 float err;
AndrewK 0:013005f626db 120 static int number = 0;
AndrewK 0:013005f626db 121
AndrewK 0:013005f626db 122 void flip() { // interrupt function: measurement and sending a UDP packet
AndrewK 0:013005f626db 123 switch(number) {
AndrewK 0:013005f626db 124 case 0:
AndrewK 0:013005f626db 125 s1 = adc.read(p20);
AndrewK 0:013005f626db 126 number++;
AndrewK 0:013005f626db 127 break;
AndrewK 0:013005f626db 128 case 3:
AndrewK 0:013005f626db 129 s2 = adc.read(p20);
AndrewK 0:013005f626db 130 number++;
AndrewK 0:013005f626db 131 break;
AndrewK 0:013005f626db 132 case 6:
AndrewK 0:013005f626db 133 s3 = adc.read(p20);
AndrewK 0:013005f626db 134 number++;
AndrewK 0:013005f626db 135 sm1 = Major(s1, s2, s3);
AndrewK 0:013005f626db 136 // sprintf(str, "1=%4u\0",sm1);
AndrewK 0:013005f626db 137 // Net::poll(); //Do network stuff
AndrewK 0:013005f626db 138 // udp.sendto( str, strlen(str)+1, &multicast );
AndrewK 0:013005f626db 139 break;
AndrewK 0:013005f626db 140 case 1:
AndrewK 0:013005f626db 141 number++;
AndrewK 0:013005f626db 142 i1 = adc.read(p19);
AndrewK 0:013005f626db 143 break;
AndrewK 0:013005f626db 144 case 4:
AndrewK 0:013005f626db 145 number++;
AndrewK 0:013005f626db 146 i2 = adc.read(p19);
AndrewK 0:013005f626db 147 break;
AndrewK 0:013005f626db 148 case 7:
AndrewK 0:013005f626db 149 number++;
AndrewK 0:013005f626db 150 i3 = adc.read(p19);
AndrewK 0:013005f626db 151 im1 = Major(i1, i2, i3);
AndrewK 0:013005f626db 152 // sprintf(str, "2=%4u %4u\0",sm1, im1);
AndrewK 0:013005f626db 153 // Net::poll(); //Do network stuff
AndrewK 0:013005f626db 154 // udp.sendto( str, strlen(str)+1, &multicast );
AndrewK 0:013005f626db 155 break;
AndrewK 0:013005f626db 156 case 2:
AndrewK 0:013005f626db 157 number++;
AndrewK 0:013005f626db 158 a1 = adc.read(p17);
AndrewK 0:013005f626db 159 break;
AndrewK 0:013005f626db 160 case 5:
AndrewK 0:013005f626db 161 number++;
AndrewK 0:013005f626db 162 a2 = adc.read(p17);
AndrewK 0:013005f626db 163 break;
AndrewK 0:013005f626db 164 case 8:
AndrewK 0:013005f626db 165 number=0;
AndrewK 0:013005f626db 166 a3 = adc.read(p17);
AndrewK 0:013005f626db 167 am1 = Major(a1, a2, a3);
AndrewK 0:013005f626db 168 sprintf(str, "2=%4u %4u %4u\0",sm1, im1, am1);
AndrewK 0:013005f626db 169 Net::poll(); //Do network stuff
AndrewK 0:013005f626db 170 udp.sendto( str, strlen(str)+1, &multicast );
AndrewK 0:013005f626db 171 break;
AndrewK 0:013005f626db 172 }
AndrewK 0:013005f626db 173 }
AndrewK 0:013005f626db 174 /*
AndrewK 0:013005f626db 175 void flip() { // interrupt function: measurement and sending a UDP packet
AndrewK 0:013005f626db 176 // int_led = !int_led;
AndrewK 0:013005f626db 177 // adc.select(p19);
AndrewK 0:013005f626db 178 // adc.burst(1);
AndrewK 0:013005f626db 179 // adc.start();
AndrewK 0:013005f626db 180 // wait_us(500);
AndrewK 0:013005f626db 181 //if(adc.done(p20)) {
AndrewK 0:013005f626db 182 switch(number) {
AndrewK 0:013005f626db 183 case 0:
AndrewK 0:013005f626db 184 number++;
AndrewK 0:013005f626db 185 s1 = adc.read(p20);
AndrewK 0:013005f626db 186 break;
AndrewK 0:013005f626db 187 case 1:
AndrewK 0:013005f626db 188 number++;
AndrewK 0:013005f626db 189 s2 = adc.read(p20);
AndrewK 0:013005f626db 190 break;
AndrewK 0:013005f626db 191 case 2:
AndrewK 0:013005f626db 192 number++;
AndrewK 0:013005f626db 193 s3 = adc.read(p20);
AndrewK 0:013005f626db 194 m1 = Major(s1, s2, s3);
AndrewK 0:013005f626db 195 break;
AndrewK 0:013005f626db 196 case 3:
AndrewK 0:013005f626db 197 number++;
AndrewK 0:013005f626db 198 s1 = adc.read(p20);
AndrewK 0:013005f626db 199 break;
AndrewK 0:013005f626db 200 case 4:
AndrewK 0:013005f626db 201 number++;
AndrewK 0:013005f626db 202 s2 = adc.read(p20);
AndrewK 0:013005f626db 203 break;
AndrewK 0:013005f626db 204 case 5:
AndrewK 0:013005f626db 205 number++;
AndrewK 0:013005f626db 206 s3 = adc.read(p20);
AndrewK 0:013005f626db 207 m2 = Major(s1, s2, s3);
AndrewK 0:013005f626db 208 break;
AndrewK 0:013005f626db 209 case 6:
AndrewK 0:013005f626db 210 number++;
AndrewK 0:013005f626db 211 s1 = adc.read(p20);
AndrewK 0:013005f626db 212 break;
AndrewK 0:013005f626db 213 case 7:
AndrewK 0:013005f626db 214 number++;
AndrewK 0:013005f626db 215 s2 = adc.read(p20);
AndrewK 0:013005f626db 216 break;
AndrewK 0:013005f626db 217 case 8:
AndrewK 0:013005f626db 218 number=0;
AndrewK 0:013005f626db 219 s3 = adc.read(p20);
AndrewK 0:013005f626db 220 m3 = Major(s1, s2, s3);
AndrewK 0:013005f626db 221 mag = Major(m1, m2, m3);
AndrewK 0:013005f626db 222 Net::poll(); //Do network stuff
AndrewK 0:013005f626db 223 sprintf(str, "1=%4u\0", mag);
AndrewK 0:013005f626db 224 // printf("%d\n", samples4);
AndrewK 0:013005f626db 225 udp.sendto( str, strlen(str)+1, &multicast );
AndrewK 0:013005f626db 226 break;
AndrewK 0:013005f626db 227 }
AndrewK 0:013005f626db 228 }
AndrewK 0:013005f626db 229 */
AndrewK 0:013005f626db 230 #define MASK 0xC700000C
AndrewK 0:013005f626db 231 //#define MASK 0x00000000
AndrewK 0:013005f626db 232
AndrewK 0:013005f626db 233 int main() {
AndrewK 0:013005f626db 234 pc.baud(57600);
AndrewK 0:013005f626db 235 //Ethernet initializing, Serial Interface - 57600 kbit/s
AndrewK 0:013005f626db 236 printf("Setting up...\n");
AndrewK 0:013005f626db 237 P15 = 1;
AndrewK 0:013005f626db 238 EthernetErr ethErr = eth.setup();
AndrewK 0:013005f626db 239 if (ethErr) {
AndrewK 0:013005f626db 240 // printf("Error %d in setup.\n", ethErr);
AndrewK 0:013005f626db 241 return -1;
AndrewK 0:013005f626db 242 }
AndrewK 0:013005f626db 243 // printf("Setup OK\n");
AndrewK 0:013005f626db 244 // Host multicast(IpAddr(239, 192, 1, 100), 50000, NULL); //Join multicast group on port 50000
AndrewK 0:013005f626db 245 AnalogIn in0(p20);
AndrewK 0:013005f626db 246 AnalogIn in1(p19);
AndrewK 0:013005f626db 247 // AnalogIn in2(p18);
AndrewK 0:013005f626db 248 AnalogIn in3(p17);
AndrewK 0:013005f626db 249 // AnalogIn in4(p16);
AndrewK 0:013005f626db 250 // AnalogIn in5(p15);
AndrewK 0:013005f626db 251 // PortOut(Port0, MASK);
AndrewK 0:013005f626db 252 // DigitalOut P19(p19);
AndrewK 0:013005f626db 253 AnalogOut tri(p18);
AndrewK 0:013005f626db 254 // DigitalOut P17(p17);
AndrewK 0:013005f626db 255 DigitalOut P16(p16);
AndrewK 0:013005f626db 256 P16 = 0; // P17 = 0;// = P19 = 0;
AndrewK 0:013005f626db 257
AndrewK 0:013005f626db 258 udp.setOnEvent(&onUDPSocketEvent);
AndrewK 0:013005f626db 259 udp.bind(multicast);
AndrewK 0:013005f626db 260
AndrewK 0:013005f626db 261 Net::poll();
AndrewK 0:013005f626db 262
AndrewK 0:013005f626db 263 // tmr.start();
AndrewK 0:013005f626db 264
AndrewK 0:013005f626db 265 //Turning ON Burst-mode ADC on pins 17,18,19,20 note: connect not used ADC ping to ground
AndrewK 0:013005f626db 266 // adc.startmode(0,0);
AndrewK 0:013005f626db 267 adc.burst(1);
AndrewK 0:013005f626db 268 adc.setup(p20,1);
AndrewK 0:013005f626db 269 adc.setup(p19,1);
AndrewK 0:013005f626db 270 // adc.select(p20);
AndrewK 0:013005f626db 271 // adc.start();
AndrewK 0:013005f626db 272 // adc.setup(p18,1);
AndrewK 0:013005f626db 273 adc.setup(p17,1);
AndrewK 0:013005f626db 274 // printf("start\n");
AndrewK 0:013005f626db 275 // printf("%d\n", adc.channel_to_pin_number(0));
AndrewK 0:013005f626db 276
AndrewK 0:013005f626db 277 flipper.attach_us(&flip, 83); // Interrupt Turn ON (100 - 10kHz; 1000 - 1 kHz)
AndrewK 0:013005f626db 278 tri = 0;
AndrewK 0:013005f626db 279 while(1) {
AndrewK 0:013005f626db 280 tri = tri + 0.001;
AndrewK 0:013005f626db 281 wait_us(100);
AndrewK 0:013005f626db 282 if(tri >= 0.06) {
AndrewK 0:013005f626db 283 tri = 0;
AndrewK 0:013005f626db 284 }
AndrewK 0:013005f626db 285 }
AndrewK 0:013005f626db 286 }