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
Revision 0:013005f626db, committed 2012-06-26
- Comitter:
- AndrewK
- Date:
- Tue Jun 26 06:23:18 2012 +0000
- Commit message:
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ADC_full/adc.cpp Tue Jun 26 06:23:18 2012 +0000
@@ -0,0 +1,439 @@
+/* mbed Library - ADC
+ * Copyright (c) 2010, sblandford
+ * released under MIT license http://mbed.org/licence/mit
+ */
+#include "mbed.h"
+#include "adc.h"
+
+
+ADC *ADC::instance;
+
+ADC::ADC(int sample_rate, int cclk_div)
+ {
+
+ int i, adc_clk_freq, pclk, clock_div, max_div=1;
+
+ //Work out CCLK
+ adc_clk_freq=CLKS_PER_SAMPLE*sample_rate;
+ int m = (LPC_SC->PLL0CFG & 0xFFFF) + 1;
+ int n = (LPC_SC->PLL0CFG >> 16) + 1;
+ int cclkdiv = LPC_SC->CCLKCFG + 1;
+ int Fcco = (2 * m * XTAL_FREQ) / n;
+ int cclk = Fcco / cclkdiv;
+
+ //Power up the ADC
+ LPC_SC->PCONP |= (1 << 12);
+ //Set clock at cclk / 1.
+ LPC_SC->PCLKSEL0 &= ~(0x3 << 24);
+ switch (cclk_div) {
+ case 1:
+ LPC_SC->PCLKSEL0 |= 0x1 << 24;
+ break;
+ case 2:
+ LPC_SC->PCLKSEL0 |= 0x2 << 24;
+ break;
+ case 4:
+ LPC_SC->PCLKSEL0 |= 0x0 << 24;
+ break;
+ case 8:
+ LPC_SC->PCLKSEL0 |= 0x3 << 24;
+ break;
+ default:
+ fprintf(stderr, "Warning: ADC CCLK clock divider must be 1, 2, 4 or 8. %u supplied.\n",
+ cclk_div);
+ fprintf(stderr, "Defaulting to 1.\n");
+ LPC_SC->PCLKSEL0 |= 0x1 << 24;
+ break;
+ }
+ pclk = cclk / cclk_div;
+ clock_div=pclk / adc_clk_freq;
+
+ if (clock_div > 0xFF) {
+ fprintf(stderr, "Warning: Clock division is %u which is above 255 limit. Re-Setting at limit.\n",
+ clock_div);
+ clock_div=0xFF;
+ }
+ if (clock_div == 0) {
+ fprintf(stderr, "Warning: Clock division is 0. Re-Setting to 1.\n");
+ clock_div=1;
+ }
+
+ _adc_clk_freq=pclk / clock_div;
+ if (_adc_clk_freq > MAX_ADC_CLOCK) {
+ fprintf(stderr, "Warning: Actual ADC sample rate of %u which is above %u limit\n",
+ _adc_clk_freq / CLKS_PER_SAMPLE, MAX_ADC_CLOCK / CLKS_PER_SAMPLE);
+ while ((pclk / max_div) > MAX_ADC_CLOCK) max_div++;
+ fprintf(stderr, "Maximum recommended sample rate is %u\n", (pclk / max_div) / CLKS_PER_SAMPLE);
+ }
+
+ LPC_ADC->ADCR =
+ ((clock_div - 1 ) << 8 ) | //Clkdiv
+ ( 1 << 21 ); //A/D operational
+
+ //Default no channels enabled
+ LPC_ADC->ADCR &= ~0xFF;
+ //Default NULL global custom isr
+ _adc_g_isr = NULL;
+ //Initialize arrays
+ for (i=7; i>=0; i--) {
+ _adc_data[i] = 0;
+ _adc_isr[i] = NULL;
+ }
+
+
+ //* Attach IRQ
+ instance = this;
+ NVIC_SetVector(ADC_IRQn, (uint32_t)&_adcisr);
+
+ //Disable global interrupt
+ LPC_ADC->ADINTEN &= ~0x100;
+
+};
+
+void ADC::_adcisr(void)
+{
+ instance->adcisr();
+}
+
+
+void ADC::adcisr(void)
+{
+ uint32_t stat;
+ int chan;
+
+ // Read status
+ stat = LPC_ADC->ADSTAT;
+ //Scan channels for over-run or done and update array
+ if (stat & 0x0101) _adc_data[0] = LPC_ADC->ADDR0;
+ if (stat & 0x0202) _adc_data[1] = LPC_ADC->ADDR1;
+ if (stat & 0x0404) _adc_data[2] = LPC_ADC->ADDR2;
+ if (stat & 0x0808) _adc_data[3] = LPC_ADC->ADDR3;
+ if (stat & 0x1010) _adc_data[4] = LPC_ADC->ADDR4;
+ if (stat & 0x2020) _adc_data[5] = LPC_ADC->ADDR5;
+ if (stat & 0x4040) _adc_data[6] = LPC_ADC->ADDR6;
+ if (stat & 0x8080) _adc_data[7] = LPC_ADC->ADDR7;
+
+ // Channel that triggered interrupt
+ chan = (LPC_ADC->ADGDR >> 24) & 0x07;
+ //User defined interrupt handlers
+ if (_adc_isr[chan] != NULL)
+ _adc_isr[chan](_adc_data[chan]);
+ if (_adc_g_isr != NULL)
+ _adc_g_isr(chan, _adc_data[chan]);
+ return;
+}
+
+int ADC::_pin_to_channel(PinName pin) {
+ int chan;
+ switch (pin) {
+ case p15://=p0.23 of LPC1768
+ default:
+ chan=0;
+ break;
+ case p16://=p0.24 of LPC1768
+ chan=1;
+ break;
+ case p17://=p0.25 of LPC1768
+ chan=2;
+ break;
+ case p18://=p0.26 of LPC1768
+ chan=3;
+ break;
+ case p19://=p1.30 of LPC1768
+ chan=4;
+ break;
+ case p20://=p1.31 of LPC1768
+ chan=5;
+ break;
+ }
+ return(chan);
+}
+
+PinName ADC::channel_to_pin(int chan) {
+ const PinName pin[8]={p15, p16, p17, p18, p19, p20, p15, p15};
+
+ if ((chan < 0) || (chan > 5))
+ fprintf(stderr, "ADC channel %u is outside range available to MBED pins.\n", chan);
+ return(pin[chan & 0x07]);
+}
+
+
+int ADC::channel_to_pin_number(int chan) {
+ const int pin[8]={15, 16, 17, 18, 19, 20, 0, 0};
+
+ if ((chan < 0) || (chan > 5))
+ fprintf(stderr, "ADC channel %u is outside range available to MBED pins.\n", chan);
+ return(pin[chan & 0x07]);
+}
+
+
+uint32_t ADC::_data_of_pin(PinName pin) {
+ //If in burst mode and at least one interrupt enabled then
+ //take all values from _adc_data
+ if (burst() && (LPC_ADC->ADINTEN & 0x3F)) {
+ return(_adc_data[_pin_to_channel(pin)]);
+ } else {
+ //Return current register value or last value from interrupt
+ switch (pin) {
+ case p15://=p0.23 of LPC1768
+ default:
+ return(LPC_ADC->ADINTEN & 0x01?_adc_data[0]:LPC_ADC->ADDR0);
+ case p16://=p0.24 of LPC1768
+ return(LPC_ADC->ADINTEN & 0x02?_adc_data[1]:LPC_ADC->ADDR1);
+ case p17://=p0.25 of LPC1768
+ return(LPC_ADC->ADINTEN & 0x04?_adc_data[2]:LPC_ADC->ADDR2);
+ case p18://=p0.26 of LPC1768:
+ return(LPC_ADC->ADINTEN & 0x08?_adc_data[3]:LPC_ADC->ADDR3);
+ case p19://=p1.30 of LPC1768
+ return(LPC_ADC->ADINTEN & 0x10?_adc_data[4]:LPC_ADC->ADDR4);
+ case p20://=p1.31 of LPC1768
+ return(LPC_ADC->ADINTEN & 0x20?_adc_data[5]:LPC_ADC->ADDR5);
+ }
+ }
+}
+
+//Enable or disable an ADC pin
+void ADC::setup(PinName pin, int state) {
+ int chan;
+ chan=_pin_to_channel(pin);
+ if ((state & 1) == 1) {
+ switch(pin) {
+ case p15://=p0.23 of LPC1768
+ default:
+ LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 14);
+ LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 14;
+ LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 14);
+ LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 14;
+ break;
+ case p16://=p0.24 of LPC1768
+ LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 16);
+ LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 16;
+ LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 16);
+ LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 16;
+ break;
+ case p17://=p0.25 of LPC1768
+ LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 18);
+ LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 18;
+ LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 18);
+ LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 18;
+ break;
+ case p18://=p0.26 of LPC1768:
+ LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 20);
+ LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 20;
+ LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 20);
+ LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 20;
+ break;
+ case p19://=p1.30 of LPC1768
+ LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 28);
+ LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 28;
+ LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 28);
+ LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 28;
+ break;
+ case p20://=p1.31 of LPC1768
+ LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30);
+ LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 30;
+ LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 30);
+ LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 30;
+ break;
+ }
+ //Only one channel can be selected at a time if not in burst mode
+ if (!burst()) LPC_ADC->ADCR &= ~0xFF;
+ //Select channel
+ LPC_ADC->ADCR |= (1 << chan);
+ }
+ else {
+ switch(pin) {
+ case p15://=p0.23 of LPC1768
+ default:
+ LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 14);
+ LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 14);
+ break;
+ case p16://=p0.24 of LPC1768
+ LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 16);
+ LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 16);
+ break;
+ case p17://=p0.25 of LPC1768
+ LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 18);
+ LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 18);
+ break;
+ case p18://=p0.26 of LPC1768:
+ LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 20);
+ LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 20);
+ break;
+ case p19://=p1.30 of LPC1768
+ LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 28);
+ LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 28);
+ break;
+ case p20://=p1.31 of LPC1768
+ LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30);
+ LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 30);
+ break;
+ }
+ LPC_ADC->ADCR &= ~(1 << chan);
+ }
+}
+//Return channel enabled/disabled state
+int ADC::setup(PinName pin) {
+ int chan;
+
+ chan = _pin_to_channel(pin);
+ return((LPC_ADC->ADCR & (1 << chan)) >> chan);
+}
+
+//Select channel already setup
+void ADC::select(PinName pin) {
+ int chan;
+
+ //Only one channel can be selected at a time if not in burst mode
+ if (!burst()) LPC_ADC->ADCR &= ~0xFF;
+ //Select channel
+ chan = _pin_to_channel(pin);
+ LPC_ADC->ADCR |= (1 << chan);
+}
+
+//Enable or disable burst mode
+void ADC::burst(int state) {
+ if ((state & 1) == 1) {
+ if (startmode(0) != 0)
+ fprintf(stderr, "Warning. startmode is %u. Must be 0 for burst mode.\n", startmode(0));
+ LPC_ADC->ADCR |= (1 << 16);
+ }
+ else
+ LPC_ADC->ADCR &= ~(1 << 16);
+}
+//Return burst mode state
+int ADC::burst(void) {
+ return((LPC_ADC->ADCR & (1 << 16)) >> 16);
+}
+
+//Set startmode and edge
+void ADC::startmode(int mode, int edge) {
+ int lpc_adc_temp;
+
+ //Reset start mode and edge bit,
+ lpc_adc_temp = LPC_ADC->ADCR & ~(0x0F << 24);
+ //Write with new values
+ lpc_adc_temp |= ((mode & 7) << 24) | ((edge & 1) << 27);
+ LPC_ADC->ADCR = lpc_adc_temp;
+}
+
+//Return startmode state according to mode_edge=0: mode and mode_edge=1: edge
+int ADC::startmode(int mode_edge){
+ switch (mode_edge) {
+ case 0:
+ default:
+ return((LPC_ADC->ADCR >> 24) & 0x07);
+ case 1:
+ return((LPC_ADC->ADCR >> 27) & 0x01);
+ }
+}
+
+//Start ADC conversion
+void ADC::start(void) {
+ startmode(1,0);
+}
+
+
+//Set interrupt enable/disable for pin to state
+void ADC::interrupt_state(PinName pin, int state) {
+ int chan;
+
+ chan = _pin_to_channel(pin);
+ if (state == 1) {
+ LPC_ADC->ADINTEN &= ~0x100;
+ LPC_ADC->ADINTEN |= 1 << chan;
+ /* Enable the ADC Interrupt */
+ NVIC_EnableIRQ(ADC_IRQn);
+ } else {
+ LPC_ADC->ADINTEN &= ~( 1 << chan );
+ //Disable interrrupt if no active pins left
+ if ((LPC_ADC->ADINTEN & 0xFF) == 0)
+ NVIC_DisableIRQ(ADC_IRQn);
+ }
+}
+
+//Return enable/disable state of interrupt for pin
+int ADC::interrupt_state(PinName pin) {
+ int chan;
+
+ chan = _pin_to_channel(pin);
+ return((LPC_ADC->ADINTEN >> chan) & 0x01);
+}
+
+
+//Attach custom interrupt handler replacing default
+void ADC::attach(void(*fptr)(void)) {
+ //* Attach IRQ
+ NVIC_SetVector(ADC_IRQn, (uint32_t)fptr);
+}
+
+//Restore default interrupt handler
+void ADC::detach(void) {
+ //* Attach IRQ
+ instance = this;
+ NVIC_SetVector(ADC_IRQn, (uint32_t)&_adcisr);
+}
+
+
+//Append interrupt handler for pin to function isr
+void ADC::append(PinName pin, void(*fptr)(uint32_t value)) {
+ int chan;
+
+ chan = _pin_to_channel(pin);
+ _adc_isr[chan] = fptr;
+}
+
+//Append interrupt handler for pin to function isr
+void ADC::unappend(PinName pin) {
+ int chan;
+
+ chan = _pin_to_channel(pin);
+ _adc_isr[chan] = NULL;
+}
+
+//Unappend global interrupt handler to function isr
+void ADC::append(void(*fptr)(int chan, uint32_t value)) {
+ _adc_g_isr = fptr;
+}
+
+//Detach global interrupt handler to function isr
+void ADC::unappend() {
+ _adc_g_isr = NULL;
+}
+
+//Set ADC offset
+void offset(int offset) {
+ LPC_ADC->ADTRM &= ~(0x07 << 4);
+ LPC_ADC->ADTRM |= (offset & 0x07) << 4;
+}
+
+//Return current ADC offset
+int offset(void) {
+ return((LPC_ADC->ADTRM >> 4) & 0x07);
+}
+
+//Return value of ADC on pin
+int ADC::read(PinName pin) {
+ //Reset DONE and OVERRUN flags of interrupt handled ADC data
+ _adc_data[_pin_to_channel(pin)] &= ~(((uint32_t)0x01 << 31) | ((uint32_t)0x01 << 30));
+ //Return value
+ return((_data_of_pin(pin) >> 4) & 0xFFF);
+}
+
+//Return DONE flag of ADC on pin
+int ADC::done(PinName pin) {
+ return((_data_of_pin(pin) >> 31) & 0x01);
+}
+
+//Return OVERRUN flag of ADC on pin
+int ADC::overrun(PinName pin) {
+ return((_data_of_pin(pin) >> 30) & 0x01);
+}
+
+int ADC::actual_adc_clock(void) {
+ return(_adc_clk_freq);
+}
+
+int ADC::actual_sample_rate(void) {
+ return(_adc_clk_freq / CLKS_PER_SAMPLE);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ADC_full/adc.h Tue Jun 26 06:23:18 2012 +0000
@@ -0,0 +1,131 @@
+/* mbed Library - ADC
+ * Copyright (c) 2010, sblandford
+ * released under MIT license http://mbed.org/licence/mit
+ */
+
+#ifndef MBED_ADC_H
+#define MBED_ADC_H
+
+#include "mbed.h"
+#define XTAL_FREQ 12000000
+#define MAX_ADC_CLOCK 13000000
+#define CLKS_PER_SAMPLE 64
+
+class ADC {
+public:
+
+ //Initialize ADC with ADC maximum sample rate of
+ //sample_rate and system clock divider of cclk_div
+ //Maximum recommened sample rate is 184000
+ ADC(int sample_rate, int cclk_div);
+
+ //Enable/disable ADC on pin according to state
+ //and also select/de-select for next conversion
+ void setup(PinName pin, int state);
+
+ //Return enabled/disabled state of ADC on pin
+ int setup(PinName pin);
+
+ //Enable/disable burst mode according to state
+ void burst(int state);
+
+ //Select channel already setup
+ void select(PinName pin);
+
+ //Return burst mode enabled/disabled
+ int burst(void);
+
+ /*Set start condition and edge according to mode:
+ 0 - No start (this value should be used when clearing PDN to 0).
+ 1 - Start conversion now.
+ 2 - Start conversion when the edge selected by bit 27 occurs on the P2.10 / EINT0 / NMI pin.
+ 3 - Start conversion when the edge selected by bit 27 occurs on the P1.27 / CLKOUT /
+ USB_OVRCRn / CAP0.1 pin.
+ 4 - Start conversion when the edge selected by bit 27 occurs on MAT0.1. Note that this does
+ not require that the MAT0.1 function appear on a device pin.
+ 5 - Start conversion when the edge selected by bit 27 occurs on MAT0.3. Note that it is not
+ possible to cause the MAT0.3 function to appear on a device pin.
+ 6 - Start conversion when the edge selected by bit 27 occurs on MAT1.0. Note that this does
+ not require that the MAT1.0 function appear on a device pin.
+ 7 - Start conversion when the edge selected by bit 27 occurs on MAT1.1. Note that this does
+ not require that the MAT1.1 function appear on a device pin.
+ When mode >= 2, conversion is triggered by edge:
+ 0 - Rising edge
+ 1 - Falling edge
+ */
+ void startmode(int mode, int edge);
+
+ //Return startmode state according to mode_edge=0: mode and mode_edge=1: edge
+ int startmode(int mode_edge);
+
+ //Start ADC conversion
+ void start(void);
+
+ //Set interrupt enable/disable for pin to state
+ void interrupt_state(PinName pin, int state);
+
+ //Return enable/disable state of interrupt for pin
+ int interrupt_state(PinName pin);
+
+ //Attach custom interrupt handler replacing default
+ void attach(void(*fptr)(void));
+
+ //Restore default interrupt handler
+ void detach(void);
+
+ //Append custom interrupt handler for pin
+ void append(PinName pin, void(*fptr)(uint32_t value));
+
+ //Unappend custom interrupt handler for pin
+ void unappend(PinName pin);
+
+ //Append custom global interrupt handler
+ void append(void(*fptr)(int chan, uint32_t value));
+
+ //Unappend custom global interrupt handler
+ void unappend(void);
+
+ //Set ADC offset to a value 0-7
+ void offset(int offset);
+
+ //Return current ADC offset
+ int offset(void);
+
+ //Return value of ADC on pin
+ int read(PinName pin);
+
+ //Return DONE flag of ADC on pin
+ int done(PinName pin);
+
+ //Return OVERRUN flag of ADC on pin
+ int overrun(PinName pin);
+
+ //Return actual ADC clock
+ int actual_adc_clock(void);
+
+ //Return actual maximum sample rate
+ int actual_sample_rate(void);
+
+ //Return pin ID of ADC channel
+ PinName channel_to_pin(int chan);
+
+ //Return pin number of ADC channel
+ int channel_to_pin_number(int chan);
+
+
+private:
+ int _pin_to_channel(PinName pin);
+ uint32_t _data_of_pin(PinName pin);
+
+ int _adc_clk_freq;
+ void adcisr(void);
+ static void _adcisr(void);
+ static ADC *instance;
+
+ uint32_t _adc_data[8];
+ void(*_adc_isr[8])(uint32_t value);
+ void(*_adc_g_isr)(int chan, uint32_t value);
+ void(*_adc_m_isr)(void);
+};
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EthernetNetIf.lib Tue Jun 26 06:23:18 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/donatien/code/EthernetNetIf/#bc7df6da7589
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/export.bld Tue Jun 26 06:23:18 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/737756e0b479
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Jun 26 06:23:18 2012 +0000
@@ -0,0 +1,286 @@
+
+#define SAMPLE_RATE 150000
+#include "mbed.h"
+#include "adc.h"
+#include "EthernetNetIf.h"
+#include "UDPSocket.h"
+
+EthernetNetIf eth( IpAddr(192,168,1,5), //IP Address
+ IpAddr(255,255,255,0), //Network Mask
+ IpAddr(192,168,1,254), //Gateway
+ IpAddr(192,168,1,254) //DNS
+ );
+//EthernetNetIf eth;
+UDPSocket udp;
+
+DigitalOut int_led(LED1);
+DigitalOut P15(p15);
+Serial pc(USBTX,USBRX);
+Host multicast(IpAddr(192,168,1,10),27200, NULL); //Target IP and port
+ADC adc(SAMPLE_RATE, 1);
+Ticker flipper;
+unsigned short s1,s2,s3;
+unsigned short i1,i2,i3;
+unsigned short a1,a2,a3;
+unsigned short sm1, sm2, sm3;
+unsigned short im1, im2, im3;
+unsigned short am1;
+unsigned short smag, imag;
+float s0;
+//int k=0;
+//Timer tmr;
+Timeout timeout;
+char str[50];
+unsigned char buf[10];
+int count_puls;
+int led1_on = 0;
+void Timer_Handler()
+{
+ if(count_puls) {
+ printf("cp %d\n", count_puls);
+ count_puls--;
+ led1_on = !led1_on;
+ int_led = led1_on;
+ P15 = !led1_on;
+ timeout.attach_us(Timer_Handler, 100);
+ } else
+ timeout.detach();
+}
+
+void onUDPSocketEvent(UDPSocketEvent e) { //Incoming UDP packet processing
+ switch (e) {
+ case UDPSOCKET_READABLE: //The only event for now
+ char buf[64] = {0};
+ Host host;
+ while ( int len = udp.recvfrom( buf, 63, &host ) ) {
+ if ( len <= 0 )
+ break;
+ printf("From %d.%d.%d.%d: %s\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], buf);
+ }
+ switch(buf[0]) {
+ case '1':
+ count_puls = 8;
+ break;
+ case '2':
+ count_puls = 4;
+ break;
+ case '3':
+ count_puls = 6;
+ break;
+ case '4':
+ count_puls = 2;
+ break;
+ case '5':
+ count_puls = 10;
+ break;
+ default:
+ count_puls = 0;
+ }
+ timeout.attach_us(Timer_Handler, 100);
+ break;
+ }
+}
+/*
+ void adc_comlete(uint32_t value) {
+ samples1 = adc.read(p20);
+ Net::poll(); //Do network stuff
+ sprintf(str, "1=%4u\0", samples1);
+ printf("%d\n", samples1);
+ udp.sendto( str, strlen(str)+1, &multicast );
+
+ }
+*/
+unsigned short Major(unsigned short dadc2, unsigned short dadc0, unsigned short dadc1)
+{
+//printf("%d %d %d\n", dadc2, dadc0, dadc1);
+ unsigned short rez;
+ int dif01, dif02, dif12;
+ dif01 = dadc0 - dadc1;
+ dif02 = dadc0 - dadc2;
+ dif12 = dadc1 - dadc2;
+ if (dif01 < 0) dif01 = -dif01;
+ if (dif02 < 0) dif02 = -dif02;
+ if (dif12 < 0) dif12 = -dif12;
+ if (dif01 < dif02) {
+ if (dif12 < dif01)
+ dadc0 = dadc2;
+ //else // �������� 2
+ } else {
+ if (dif12 < dif02)
+ dadc0 = dadc2; // �������� 0
+ else
+ dadc1 = dadc2; // �������� 1
+ }
+ rez = dadc0 + dadc1;
+ rez >>= 1;
+ return rez;
+}
+int delta;
+float err;
+static int number = 0;
+
+void flip() { // interrupt function: measurement and sending a UDP packet
+ switch(number) {
+ case 0:
+ s1 = adc.read(p20);
+ number++;
+ break;
+ case 3:
+ s2 = adc.read(p20);
+ number++;
+ break;
+ case 6:
+ s3 = adc.read(p20);
+ number++;
+ sm1 = Major(s1, s2, s3);
+// sprintf(str, "1=%4u\0",sm1);
+// Net::poll(); //Do network stuff
+// udp.sendto( str, strlen(str)+1, &multicast );
+ break;
+ case 1:
+ number++;
+ i1 = adc.read(p19);
+ break;
+ case 4:
+ number++;
+ i2 = adc.read(p19);
+ break;
+ case 7:
+ number++;
+ i3 = adc.read(p19);
+ im1 = Major(i1, i2, i3);
+// sprintf(str, "2=%4u %4u\0",sm1, im1);
+// Net::poll(); //Do network stuff
+// udp.sendto( str, strlen(str)+1, &multicast );
+ break;
+ case 2:
+ number++;
+ a1 = adc.read(p17);
+ break;
+ case 5:
+ number++;
+ a2 = adc.read(p17);
+ break;
+ case 8:
+ number=0;
+ a3 = adc.read(p17);
+ am1 = Major(a1, a2, a3);
+ sprintf(str, "2=%4u %4u %4u\0",sm1, im1, am1);
+ Net::poll(); //Do network stuff
+ udp.sendto( str, strlen(str)+1, &multicast );
+ break;
+ }
+}
+/*
+void flip() { // interrupt function: measurement and sending a UDP packet
+// int_led = !int_led;
+// adc.select(p19);
+// adc.burst(1);
+// adc.start();
+// wait_us(500);
+//if(adc.done(p20)) {
+ switch(number) {
+ case 0:
+ number++;
+ s1 = adc.read(p20);
+ break;
+ case 1:
+ number++;
+ s2 = adc.read(p20);
+ break;
+ case 2:
+ number++;
+ s3 = adc.read(p20);
+ m1 = Major(s1, s2, s3);
+ break;
+ case 3:
+ number++;
+ s1 = adc.read(p20);
+ break;
+ case 4:
+ number++;
+ s2 = adc.read(p20);
+ break;
+ case 5:
+ number++;
+ s3 = adc.read(p20);
+ m2 = Major(s1, s2, s3);
+ break;
+ case 6:
+ number++;
+ s1 = adc.read(p20);
+ break;
+ case 7:
+ number++;
+ s2 = adc.read(p20);
+ break;
+ case 8:
+ number=0;
+ s3 = adc.read(p20);
+ m3 = Major(s1, s2, s3);
+ mag = Major(m1, m2, m3);
+ Net::poll(); //Do network stuff
+ sprintf(str, "1=%4u\0", mag);
+// printf("%d\n", samples4);
+ udp.sendto( str, strlen(str)+1, &multicast );
+ break;
+ }
+}
+*/
+#define MASK 0xC700000C
+//#define MASK 0x00000000
+
+int main() {
+ pc.baud(57600);
+ //Ethernet initializing, Serial Interface - 57600 kbit/s
+ printf("Setting up...\n");
+ P15 = 1;
+ EthernetErr ethErr = eth.setup();
+ if (ethErr) {
+// printf("Error %d in setup.\n", ethErr);
+ return -1;
+ }
+// printf("Setup OK\n");
+ // Host multicast(IpAddr(239, 192, 1, 100), 50000, NULL); //Join multicast group on port 50000
+ AnalogIn in0(p20);
+ AnalogIn in1(p19);
+// AnalogIn in2(p18);
+ AnalogIn in3(p17);
+// AnalogIn in4(p16);
+// AnalogIn in5(p15);
+// PortOut(Port0, MASK);
+// DigitalOut P19(p19);
+ AnalogOut tri(p18);
+// DigitalOut P17(p17);
+ DigitalOut P16(p16);
+ P16 = 0; // P17 = 0;// = P19 = 0;
+
+ udp.setOnEvent(&onUDPSocketEvent);
+ udp.bind(multicast);
+
+ Net::poll();
+
+// tmr.start();
+
+ //Turning ON Burst-mode ADC on pins 17,18,19,20 note: connect not used ADC ping to ground
+// adc.startmode(0,0);
+ adc.burst(1);
+ adc.setup(p20,1);
+ adc.setup(p19,1);
+// adc.select(p20);
+// adc.start();
+// adc.setup(p18,1);
+ adc.setup(p17,1);
+// printf("start\n");
+// printf("%d\n", adc.channel_to_pin_number(0));
+
+ flipper.attach_us(&flip, 83); // Interrupt Turn ON (100 - 10kHz; 1000 - 1 kHz)
+ tri = 0;
+ while(1) {
+ tri = tri + 0.001;
+ wait_us(100);
+ if(tri >= 0.06) {
+ tri = 0;
+ }
+ }
+}
\ No newline at end of file