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
Fork of Monitor0 by
main.cpp@1:be04a186a221, 2012-07-29 (annotated)
- 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?
User | Revision | Line number | New 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 // �������� 2 |
AndrewK | 0:72d0d2736b7f | 161 | } else { |
AndrewK | 0:72d0d2736b7f | 162 | if (dif12 < dif02) |
AndrewK | 0:72d0d2736b7f | 163 | dadc0 = dadc2; // �������� 0 |
AndrewK | 0:72d0d2736b7f | 164 | else |
AndrewK | 0:72d0d2736b7f | 165 | dadc1 = dadc2; // �������� 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 | } |