Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetNetIf mbed
main.cpp@0:013005f626db, 2012-06-26 (annotated)
- Committer:
- AndrewK
- Date:
- Tue Jun 26 06:23:18 2012 +0000
- Revision:
- 0:013005f626db
Who changed what in which revision?
User | Revision | Line number | New 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 // �������� 2 |
AndrewK | 0:013005f626db | 108 | } else { |
AndrewK | 0:013005f626db | 109 | if (dif12 < dif02) |
AndrewK | 0:013005f626db | 110 | dadc0 = dadc2; // �������� 0 |
AndrewK | 0:013005f626db | 111 | else |
AndrewK | 0:013005f626db | 112 | dadc1 = dadc2; // �������� 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 | } |