Andrew Kuznetsov / Mbed 2 deprecated 2_7controller2

Dependencies:   EthernetNetIf mbed

Fork of Monitor0 by Andrew Kuznetsov

Committer:
AndrewK
Date:
Sun Jul 29 15:27:18 2012 +0000
Revision:
1:be04a186a221
Parent:
0:72d0d2736b7f
Child:
2:0ea44fca1a81
Version for interrupt ADC

Who changed what in which revision?

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