ultrasonic

Dependencies:   EthernetNetIf HTTPServer TextLCD mbed

Fork of ethernet_test_http by Yasushi TAUCHI

Committer:
twinkling
Date:
Tue Sep 08 06:22:48 2015 +0000
Revision:
1:1cda1fafd448
:;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
twinkling 1:1cda1fafd448 1 /* mbed Library - ADC
twinkling 1:1cda1fafd448 2 * Copyright (c) 2010, sblandford
twinkling 1:1cda1fafd448 3 * released under MIT license http://mbed.org/licence/mit
twinkling 1:1cda1fafd448 4 */
twinkling 1:1cda1fafd448 5 #include "mbed.h"
twinkling 1:1cda1fafd448 6 #include "adc.h"
twinkling 1:1cda1fafd448 7
twinkling 1:1cda1fafd448 8
twinkling 1:1cda1fafd448 9 ADC *ADC::instance;
twinkling 1:1cda1fafd448 10
twinkling 1:1cda1fafd448 11 ADC::ADC(int sample_rate, int cclk_div)
twinkling 1:1cda1fafd448 12 {
twinkling 1:1cda1fafd448 13
twinkling 1:1cda1fafd448 14 int i, adc_clk_freq, pclk, clock_div, max_div=1;
twinkling 1:1cda1fafd448 15
twinkling 1:1cda1fafd448 16 //Work out CCLK
twinkling 1:1cda1fafd448 17 adc_clk_freq=CLKS_PER_SAMPLE*sample_rate;
twinkling 1:1cda1fafd448 18 int m = (LPC_SC->PLL0CFG & 0xFFFF) + 1;
twinkling 1:1cda1fafd448 19 int n = (LPC_SC->PLL0CFG >> 16) + 1;
twinkling 1:1cda1fafd448 20 int cclkdiv = LPC_SC->CCLKCFG + 1;
twinkling 1:1cda1fafd448 21 int Fcco = (2 * m * XTAL_FREQ) / n;
twinkling 1:1cda1fafd448 22 int cclk = Fcco / cclkdiv;
twinkling 1:1cda1fafd448 23
twinkling 1:1cda1fafd448 24 //Power up the ADC
twinkling 1:1cda1fafd448 25 LPC_SC->PCONP |= (1 << 12);
twinkling 1:1cda1fafd448 26 //Set clock at cclk / 1.
twinkling 1:1cda1fafd448 27 LPC_SC->PCLKSEL0 &= ~(0x3 << 24);
twinkling 1:1cda1fafd448 28 switch (cclk_div) {
twinkling 1:1cda1fafd448 29 case 1:
twinkling 1:1cda1fafd448 30 LPC_SC->PCLKSEL0 |= 0x1 << 24;
twinkling 1:1cda1fafd448 31 break;
twinkling 1:1cda1fafd448 32 case 2:
twinkling 1:1cda1fafd448 33 LPC_SC->PCLKSEL0 |= 0x2 << 24;
twinkling 1:1cda1fafd448 34 break;
twinkling 1:1cda1fafd448 35 case 4:
twinkling 1:1cda1fafd448 36 LPC_SC->PCLKSEL0 |= 0x0 << 24;
twinkling 1:1cda1fafd448 37 break;
twinkling 1:1cda1fafd448 38 case 8:
twinkling 1:1cda1fafd448 39 LPC_SC->PCLKSEL0 |= 0x3 << 24;
twinkling 1:1cda1fafd448 40 break;
twinkling 1:1cda1fafd448 41 default:
twinkling 1:1cda1fafd448 42 fprintf(stderr, "Warning: ADC CCLK clock divider must be 1, 2, 4 or 8. %u supplied.\n",
twinkling 1:1cda1fafd448 43 cclk_div);
twinkling 1:1cda1fafd448 44 fprintf(stderr, "Defaulting to 1.\n");
twinkling 1:1cda1fafd448 45 LPC_SC->PCLKSEL0 |= 0x1 << 24;
twinkling 1:1cda1fafd448 46 break;
twinkling 1:1cda1fafd448 47 }
twinkling 1:1cda1fafd448 48 pclk = cclk / cclk_div;
twinkling 1:1cda1fafd448 49 clock_div=pclk / adc_clk_freq;
twinkling 1:1cda1fafd448 50
twinkling 1:1cda1fafd448 51 if (clock_div > 0xFF) {
twinkling 1:1cda1fafd448 52 fprintf(stderr, "Warning: Clock division is %u which is above 255 limit. Re-Setting at limit.\n",
twinkling 1:1cda1fafd448 53 clock_div);
twinkling 1:1cda1fafd448 54 clock_div=0xFF;
twinkling 1:1cda1fafd448 55 }
twinkling 1:1cda1fafd448 56 if (clock_div == 0) {
twinkling 1:1cda1fafd448 57 fprintf(stderr, "Warning: Clock division is 0. Re-Setting to 1.\n");
twinkling 1:1cda1fafd448 58 clock_div=1;
twinkling 1:1cda1fafd448 59 }
twinkling 1:1cda1fafd448 60
twinkling 1:1cda1fafd448 61 _adc_clk_freq=pclk / clock_div;
twinkling 1:1cda1fafd448 62 if (_adc_clk_freq > MAX_ADC_CLOCK) {
twinkling 1:1cda1fafd448 63 fprintf(stderr, "Warning: Actual ADC sample rate of %u which is above %u limit\n",
twinkling 1:1cda1fafd448 64 _adc_clk_freq / CLKS_PER_SAMPLE, MAX_ADC_CLOCK / CLKS_PER_SAMPLE);
twinkling 1:1cda1fafd448 65 while ((pclk / max_div) > MAX_ADC_CLOCK) max_div++;
twinkling 1:1cda1fafd448 66 fprintf(stderr, "Maximum recommended sample rate is %u\n", (pclk / max_div) / CLKS_PER_SAMPLE);
twinkling 1:1cda1fafd448 67 }
twinkling 1:1cda1fafd448 68
twinkling 1:1cda1fafd448 69 LPC_ADC->ADCR =
twinkling 1:1cda1fafd448 70 ((clock_div - 1 ) << 8 ) | //Clkdiv
twinkling 1:1cda1fafd448 71 ( 1 << 21 ); //A/D operational
twinkling 1:1cda1fafd448 72
twinkling 1:1cda1fafd448 73 //Default no channels enabled
twinkling 1:1cda1fafd448 74 LPC_ADC->ADCR &= ~0xFF;
twinkling 1:1cda1fafd448 75 //Default NULL global custom isr
twinkling 1:1cda1fafd448 76 _adc_g_isr = NULL;
twinkling 1:1cda1fafd448 77 //Initialize arrays
twinkling 1:1cda1fafd448 78 for (i=7; i>=0; i--) {
twinkling 1:1cda1fafd448 79 _adc_data[i] = 0;
twinkling 1:1cda1fafd448 80 _adc_isr[i] = NULL;
twinkling 1:1cda1fafd448 81 }
twinkling 1:1cda1fafd448 82
twinkling 1:1cda1fafd448 83
twinkling 1:1cda1fafd448 84 //* Attach IRQ
twinkling 1:1cda1fafd448 85 instance = this;
twinkling 1:1cda1fafd448 86 NVIC_SetVector(ADC_IRQn, (uint32_t)&_adcisr);
twinkling 1:1cda1fafd448 87
twinkling 1:1cda1fafd448 88 //Disable global interrupt
twinkling 1:1cda1fafd448 89 LPC_ADC->ADINTEN &= ~0x100;
twinkling 1:1cda1fafd448 90
twinkling 1:1cda1fafd448 91 };
twinkling 1:1cda1fafd448 92
twinkling 1:1cda1fafd448 93 void ADC::_adcisr(void)
twinkling 1:1cda1fafd448 94 {
twinkling 1:1cda1fafd448 95 instance->adcisr();
twinkling 1:1cda1fafd448 96 }
twinkling 1:1cda1fafd448 97
twinkling 1:1cda1fafd448 98
twinkling 1:1cda1fafd448 99 void ADC::adcisr(void)
twinkling 1:1cda1fafd448 100 {
twinkling 1:1cda1fafd448 101 uint32_t stat;
twinkling 1:1cda1fafd448 102 int chan;
twinkling 1:1cda1fafd448 103
twinkling 1:1cda1fafd448 104 // Read status
twinkling 1:1cda1fafd448 105 stat = LPC_ADC->ADSTAT;
twinkling 1:1cda1fafd448 106 //Scan channels for over-run or done and update array
twinkling 1:1cda1fafd448 107 if (stat & 0x0101) _adc_data[0] = LPC_ADC->ADDR0;
twinkling 1:1cda1fafd448 108 if (stat & 0x0202) _adc_data[1] = LPC_ADC->ADDR1;
twinkling 1:1cda1fafd448 109 if (stat & 0x0404) _adc_data[2] = LPC_ADC->ADDR2;
twinkling 1:1cda1fafd448 110 if (stat & 0x0808) _adc_data[3] = LPC_ADC->ADDR3;
twinkling 1:1cda1fafd448 111 if (stat & 0x1010) _adc_data[4] = LPC_ADC->ADDR4;
twinkling 1:1cda1fafd448 112 if (stat & 0x2020) _adc_data[5] = LPC_ADC->ADDR5;
twinkling 1:1cda1fafd448 113 if (stat & 0x4040) _adc_data[6] = LPC_ADC->ADDR6;
twinkling 1:1cda1fafd448 114 if (stat & 0x8080) _adc_data[7] = LPC_ADC->ADDR7;
twinkling 1:1cda1fafd448 115
twinkling 1:1cda1fafd448 116 // Channel that triggered interrupt
twinkling 1:1cda1fafd448 117 chan = (LPC_ADC->ADGDR >> 24) & 0x07;
twinkling 1:1cda1fafd448 118 //User defined interrupt handlers
twinkling 1:1cda1fafd448 119 if (_adc_isr[chan] != NULL)
twinkling 1:1cda1fafd448 120 _adc_isr[chan](_adc_data[chan]);
twinkling 1:1cda1fafd448 121 if (_adc_g_isr != NULL)
twinkling 1:1cda1fafd448 122 _adc_g_isr(chan, _adc_data[chan]);
twinkling 1:1cda1fafd448 123 return;
twinkling 1:1cda1fafd448 124 }
twinkling 1:1cda1fafd448 125
twinkling 1:1cda1fafd448 126 int ADC::_pin_to_channel(PinName pin) {
twinkling 1:1cda1fafd448 127 int chan;
twinkling 1:1cda1fafd448 128 switch (pin) {
twinkling 1:1cda1fafd448 129 case p15://=p0.23 of LPC1768
twinkling 1:1cda1fafd448 130 default:
twinkling 1:1cda1fafd448 131 chan=0;
twinkling 1:1cda1fafd448 132 break;
twinkling 1:1cda1fafd448 133 case p16://=p0.24 of LPC1768
twinkling 1:1cda1fafd448 134 chan=1;
twinkling 1:1cda1fafd448 135 break;
twinkling 1:1cda1fafd448 136 case p17://=p0.25 of LPC1768
twinkling 1:1cda1fafd448 137 chan=2;
twinkling 1:1cda1fafd448 138 break;
twinkling 1:1cda1fafd448 139 case p18://=p0.26 of LPC1768
twinkling 1:1cda1fafd448 140 chan=3;
twinkling 1:1cda1fafd448 141 break;
twinkling 1:1cda1fafd448 142 case p19://=p1.30 of LPC1768
twinkling 1:1cda1fafd448 143 chan=4;
twinkling 1:1cda1fafd448 144 break;
twinkling 1:1cda1fafd448 145 case p20://=p1.31 of LPC1768
twinkling 1:1cda1fafd448 146 chan=5;
twinkling 1:1cda1fafd448 147 break;
twinkling 1:1cda1fafd448 148 }
twinkling 1:1cda1fafd448 149 return(chan);
twinkling 1:1cda1fafd448 150 }
twinkling 1:1cda1fafd448 151
twinkling 1:1cda1fafd448 152 PinName ADC::channel_to_pin(int chan) {
twinkling 1:1cda1fafd448 153 const PinName pin[8]={p15, p16, p17, p18, p19, p20, p15, p15};
twinkling 1:1cda1fafd448 154
twinkling 1:1cda1fafd448 155 if ((chan < 0) || (chan > 5))
twinkling 1:1cda1fafd448 156 fprintf(stderr, "ADC channel %u is outside range available to MBED pins.\n", chan);
twinkling 1:1cda1fafd448 157 return(pin[chan & 0x07]);
twinkling 1:1cda1fafd448 158 }
twinkling 1:1cda1fafd448 159
twinkling 1:1cda1fafd448 160
twinkling 1:1cda1fafd448 161 int ADC::channel_to_pin_number(int chan) {
twinkling 1:1cda1fafd448 162 const int pin[8]={15, 16, 17, 18, 19, 20, 0, 0};
twinkling 1:1cda1fafd448 163
twinkling 1:1cda1fafd448 164 if ((chan < 0) || (chan > 5))
twinkling 1:1cda1fafd448 165 fprintf(stderr, "ADC channel %u is outside range available to MBED pins.\n", chan);
twinkling 1:1cda1fafd448 166 return(pin[chan & 0x07]);
twinkling 1:1cda1fafd448 167 }
twinkling 1:1cda1fafd448 168
twinkling 1:1cda1fafd448 169
twinkling 1:1cda1fafd448 170 uint32_t ADC::_data_of_pin(PinName pin) {
twinkling 1:1cda1fafd448 171 //If in burst mode and at least one interrupt enabled then
twinkling 1:1cda1fafd448 172 //take all values from _adc_data
twinkling 1:1cda1fafd448 173 if (burst() && (LPC_ADC->ADINTEN & 0x3F)) {
twinkling 1:1cda1fafd448 174 return(_adc_data[_pin_to_channel(pin)]);
twinkling 1:1cda1fafd448 175 } else {
twinkling 1:1cda1fafd448 176 //Return current register value or last value from interrupt
twinkling 1:1cda1fafd448 177 switch (pin) {
twinkling 1:1cda1fafd448 178 case p15://=p0.23 of LPC1768
twinkling 1:1cda1fafd448 179 default:
twinkling 1:1cda1fafd448 180 return(LPC_ADC->ADINTEN & 0x01?_adc_data[0]:LPC_ADC->ADDR0);
twinkling 1:1cda1fafd448 181 case p16://=p0.24 of LPC1768
twinkling 1:1cda1fafd448 182 return(LPC_ADC->ADINTEN & 0x02?_adc_data[1]:LPC_ADC->ADDR1);
twinkling 1:1cda1fafd448 183 case p17://=p0.25 of LPC1768
twinkling 1:1cda1fafd448 184 return(LPC_ADC->ADINTEN & 0x04?_adc_data[2]:LPC_ADC->ADDR2);
twinkling 1:1cda1fafd448 185 case p18://=p0.26 of LPC1768:
twinkling 1:1cda1fafd448 186 return(LPC_ADC->ADINTEN & 0x08?_adc_data[3]:LPC_ADC->ADDR3);
twinkling 1:1cda1fafd448 187 case p19://=p1.30 of LPC1768
twinkling 1:1cda1fafd448 188 return(LPC_ADC->ADINTEN & 0x10?_adc_data[4]:LPC_ADC->ADDR4);
twinkling 1:1cda1fafd448 189 case p20://=p1.31 of LPC1768
twinkling 1:1cda1fafd448 190 return(LPC_ADC->ADINTEN & 0x20?_adc_data[5]:LPC_ADC->ADDR5);
twinkling 1:1cda1fafd448 191 }
twinkling 1:1cda1fafd448 192 }
twinkling 1:1cda1fafd448 193 }
twinkling 1:1cda1fafd448 194
twinkling 1:1cda1fafd448 195 //Enable or disable an ADC pin
twinkling 1:1cda1fafd448 196 void ADC::setup(PinName pin, int state) {
twinkling 1:1cda1fafd448 197 int chan;
twinkling 1:1cda1fafd448 198 chan=_pin_to_channel(pin);
twinkling 1:1cda1fafd448 199 if ((state & 1) == 1) {
twinkling 1:1cda1fafd448 200 switch(pin) {
twinkling 1:1cda1fafd448 201 case p15://=p0.23 of LPC1768
twinkling 1:1cda1fafd448 202 default:
twinkling 1:1cda1fafd448 203 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 14);
twinkling 1:1cda1fafd448 204 LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 14;
twinkling 1:1cda1fafd448 205 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 14);
twinkling 1:1cda1fafd448 206 LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 14;
twinkling 1:1cda1fafd448 207 break;
twinkling 1:1cda1fafd448 208 case p16://=p0.24 of LPC1768
twinkling 1:1cda1fafd448 209 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 16);
twinkling 1:1cda1fafd448 210 LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 16;
twinkling 1:1cda1fafd448 211 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 16);
twinkling 1:1cda1fafd448 212 LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 16;
twinkling 1:1cda1fafd448 213 break;
twinkling 1:1cda1fafd448 214 case p17://=p0.25 of LPC1768
twinkling 1:1cda1fafd448 215 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 18);
twinkling 1:1cda1fafd448 216 LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 18;
twinkling 1:1cda1fafd448 217 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 18);
twinkling 1:1cda1fafd448 218 LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 18;
twinkling 1:1cda1fafd448 219 break;
twinkling 1:1cda1fafd448 220 case p18://=p0.26 of LPC1768:
twinkling 1:1cda1fafd448 221 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 20);
twinkling 1:1cda1fafd448 222 LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 20;
twinkling 1:1cda1fafd448 223 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 20);
twinkling 1:1cda1fafd448 224 LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 20;
twinkling 1:1cda1fafd448 225 break;
twinkling 1:1cda1fafd448 226 case p19://=p1.30 of LPC1768
twinkling 1:1cda1fafd448 227 LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 28);
twinkling 1:1cda1fafd448 228 LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 28;
twinkling 1:1cda1fafd448 229 LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 28);
twinkling 1:1cda1fafd448 230 LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 28;
twinkling 1:1cda1fafd448 231 break;
twinkling 1:1cda1fafd448 232 case p20://=p1.31 of LPC1768
twinkling 1:1cda1fafd448 233 LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30);
twinkling 1:1cda1fafd448 234 LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 30;
twinkling 1:1cda1fafd448 235 LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 30);
twinkling 1:1cda1fafd448 236 LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 30;
twinkling 1:1cda1fafd448 237 break;
twinkling 1:1cda1fafd448 238 }
twinkling 1:1cda1fafd448 239 //Only one channel can be selected at a time if not in burst mode
twinkling 1:1cda1fafd448 240 if (!burst()) LPC_ADC->ADCR &= ~0xFF;
twinkling 1:1cda1fafd448 241 //Select channel
twinkling 1:1cda1fafd448 242 LPC_ADC->ADCR |= (1 << chan);
twinkling 1:1cda1fafd448 243 }
twinkling 1:1cda1fafd448 244 else {
twinkling 1:1cda1fafd448 245 switch(pin) {
twinkling 1:1cda1fafd448 246 case p15://=p0.23 of LPC1768
twinkling 1:1cda1fafd448 247 default:
twinkling 1:1cda1fafd448 248 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 14);
twinkling 1:1cda1fafd448 249 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 14);
twinkling 1:1cda1fafd448 250 break;
twinkling 1:1cda1fafd448 251 case p16://=p0.24 of LPC1768
twinkling 1:1cda1fafd448 252 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 16);
twinkling 1:1cda1fafd448 253 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 16);
twinkling 1:1cda1fafd448 254 break;
twinkling 1:1cda1fafd448 255 case p17://=p0.25 of LPC1768
twinkling 1:1cda1fafd448 256 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 18);
twinkling 1:1cda1fafd448 257 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 18);
twinkling 1:1cda1fafd448 258 break;
twinkling 1:1cda1fafd448 259 case p18://=p0.26 of LPC1768:
twinkling 1:1cda1fafd448 260 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 20);
twinkling 1:1cda1fafd448 261 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 20);
twinkling 1:1cda1fafd448 262 break;
twinkling 1:1cda1fafd448 263 case p19://=p1.30 of LPC1768
twinkling 1:1cda1fafd448 264 LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 28);
twinkling 1:1cda1fafd448 265 LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 28);
twinkling 1:1cda1fafd448 266 break;
twinkling 1:1cda1fafd448 267 case p20://=p1.31 of LPC1768
twinkling 1:1cda1fafd448 268 LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30);
twinkling 1:1cda1fafd448 269 LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 30);
twinkling 1:1cda1fafd448 270 break;
twinkling 1:1cda1fafd448 271 }
twinkling 1:1cda1fafd448 272 LPC_ADC->ADCR &= ~(1 << chan);
twinkling 1:1cda1fafd448 273 }
twinkling 1:1cda1fafd448 274 }
twinkling 1:1cda1fafd448 275 //Return channel enabled/disabled state
twinkling 1:1cda1fafd448 276 int ADC::setup(PinName pin) {
twinkling 1:1cda1fafd448 277 int chan;
twinkling 1:1cda1fafd448 278
twinkling 1:1cda1fafd448 279 chan = _pin_to_channel(pin);
twinkling 1:1cda1fafd448 280 return((LPC_ADC->ADCR & (1 << chan)) >> chan);
twinkling 1:1cda1fafd448 281 }
twinkling 1:1cda1fafd448 282
twinkling 1:1cda1fafd448 283 //Select channel already setup
twinkling 1:1cda1fafd448 284 void ADC::select(PinName pin) {
twinkling 1:1cda1fafd448 285 int chan;
twinkling 1:1cda1fafd448 286
twinkling 1:1cda1fafd448 287 //Only one channel can be selected at a time if not in burst mode
twinkling 1:1cda1fafd448 288 if (!burst()) LPC_ADC->ADCR &= ~0xFF;
twinkling 1:1cda1fafd448 289 //Select channel
twinkling 1:1cda1fafd448 290 chan = _pin_to_channel(pin);
twinkling 1:1cda1fafd448 291 LPC_ADC->ADCR |= (1 << chan);
twinkling 1:1cda1fafd448 292 }
twinkling 1:1cda1fafd448 293
twinkling 1:1cda1fafd448 294 //Enable or disable burst mode
twinkling 1:1cda1fafd448 295 void ADC::burst(int state) {
twinkling 1:1cda1fafd448 296 if ((state & 1) == 1) {
twinkling 1:1cda1fafd448 297 if (startmode(0) != 0)
twinkling 1:1cda1fafd448 298 fprintf(stderr, "Warning. startmode is %u. Must be 0 for burst mode.\n", startmode(0));
twinkling 1:1cda1fafd448 299 LPC_ADC->ADCR |= (1 << 16);
twinkling 1:1cda1fafd448 300 }
twinkling 1:1cda1fafd448 301 else
twinkling 1:1cda1fafd448 302 LPC_ADC->ADCR &= ~(1 << 16);
twinkling 1:1cda1fafd448 303 }
twinkling 1:1cda1fafd448 304 //Return burst mode state
twinkling 1:1cda1fafd448 305 int ADC::burst(void) {
twinkling 1:1cda1fafd448 306 return((LPC_ADC->ADCR & (1 << 16)) >> 16);
twinkling 1:1cda1fafd448 307 }
twinkling 1:1cda1fafd448 308
twinkling 1:1cda1fafd448 309 //Set startmode and edge
twinkling 1:1cda1fafd448 310 void ADC::startmode(int mode, int edge) {
twinkling 1:1cda1fafd448 311 int lpc_adc_temp;
twinkling 1:1cda1fafd448 312
twinkling 1:1cda1fafd448 313 //Reset start mode and edge bit,
twinkling 1:1cda1fafd448 314 lpc_adc_temp = LPC_ADC->ADCR & ~(0x0F << 24);
twinkling 1:1cda1fafd448 315 //Write with new values
twinkling 1:1cda1fafd448 316 lpc_adc_temp |= ((mode & 7) << 24) | ((edge & 1) << 27);
twinkling 1:1cda1fafd448 317 LPC_ADC->ADCR = lpc_adc_temp;
twinkling 1:1cda1fafd448 318 }
twinkling 1:1cda1fafd448 319
twinkling 1:1cda1fafd448 320 //Return startmode state according to mode_edge=0: mode and mode_edge=1: edge
twinkling 1:1cda1fafd448 321 int ADC::startmode(int mode_edge){
twinkling 1:1cda1fafd448 322 switch (mode_edge) {
twinkling 1:1cda1fafd448 323 case 0:
twinkling 1:1cda1fafd448 324 default:
twinkling 1:1cda1fafd448 325 return((LPC_ADC->ADCR >> 24) & 0x07);
twinkling 1:1cda1fafd448 326 case 1:
twinkling 1:1cda1fafd448 327 return((LPC_ADC->ADCR >> 27) & 0x01);
twinkling 1:1cda1fafd448 328 }
twinkling 1:1cda1fafd448 329 }
twinkling 1:1cda1fafd448 330
twinkling 1:1cda1fafd448 331 //Start ADC conversion
twinkling 1:1cda1fafd448 332 void ADC::start(void) {
twinkling 1:1cda1fafd448 333 startmode(1,0);
twinkling 1:1cda1fafd448 334 }
twinkling 1:1cda1fafd448 335
twinkling 1:1cda1fafd448 336
twinkling 1:1cda1fafd448 337 //Set interrupt enable/disable for pin to state
twinkling 1:1cda1fafd448 338 void ADC::interrupt_state(PinName pin, int state) {
twinkling 1:1cda1fafd448 339 int chan;
twinkling 1:1cda1fafd448 340
twinkling 1:1cda1fafd448 341 chan = _pin_to_channel(pin);
twinkling 1:1cda1fafd448 342 if (state == 1) {
twinkling 1:1cda1fafd448 343 LPC_ADC->ADINTEN &= ~0x100;
twinkling 1:1cda1fafd448 344 LPC_ADC->ADINTEN |= 1 << chan;
twinkling 1:1cda1fafd448 345 /* Enable the ADC Interrupt */
twinkling 1:1cda1fafd448 346 NVIC_EnableIRQ(ADC_IRQn);
twinkling 1:1cda1fafd448 347 } else {
twinkling 1:1cda1fafd448 348 LPC_ADC->ADINTEN &= ~( 1 << chan );
twinkling 1:1cda1fafd448 349 //Disable interrrupt if no active pins left
twinkling 1:1cda1fafd448 350 if ((LPC_ADC->ADINTEN & 0xFF) == 0)
twinkling 1:1cda1fafd448 351 NVIC_DisableIRQ(ADC_IRQn);
twinkling 1:1cda1fafd448 352 }
twinkling 1:1cda1fafd448 353 }
twinkling 1:1cda1fafd448 354
twinkling 1:1cda1fafd448 355 //Return enable/disable state of interrupt for pin
twinkling 1:1cda1fafd448 356 int ADC::interrupt_state(PinName pin) {
twinkling 1:1cda1fafd448 357 int chan;
twinkling 1:1cda1fafd448 358
twinkling 1:1cda1fafd448 359 chan = _pin_to_channel(pin);
twinkling 1:1cda1fafd448 360 return((LPC_ADC->ADINTEN >> chan) & 0x01);
twinkling 1:1cda1fafd448 361 }
twinkling 1:1cda1fafd448 362
twinkling 1:1cda1fafd448 363
twinkling 1:1cda1fafd448 364 //Attach custom interrupt handler replacing default
twinkling 1:1cda1fafd448 365 void ADC::attach(void(*fptr)(void)) {
twinkling 1:1cda1fafd448 366 //* Attach IRQ
twinkling 1:1cda1fafd448 367 NVIC_SetVector(ADC_IRQn, (uint32_t)fptr);
twinkling 1:1cda1fafd448 368 }
twinkling 1:1cda1fafd448 369
twinkling 1:1cda1fafd448 370 //Restore default interrupt handler
twinkling 1:1cda1fafd448 371 void ADC::detach(void) {
twinkling 1:1cda1fafd448 372 //* Attach IRQ
twinkling 1:1cda1fafd448 373 instance = this;
twinkling 1:1cda1fafd448 374 NVIC_SetVector(ADC_IRQn, (uint32_t)&_adcisr);
twinkling 1:1cda1fafd448 375 }
twinkling 1:1cda1fafd448 376
twinkling 1:1cda1fafd448 377
twinkling 1:1cda1fafd448 378 //Append interrupt handler for pin to function isr
twinkling 1:1cda1fafd448 379 void ADC::append(PinName pin, void(*fptr)(uint32_t value)) {
twinkling 1:1cda1fafd448 380 int chan;
twinkling 1:1cda1fafd448 381
twinkling 1:1cda1fafd448 382 chan = _pin_to_channel(pin);
twinkling 1:1cda1fafd448 383 _adc_isr[chan] = fptr;
twinkling 1:1cda1fafd448 384 }
twinkling 1:1cda1fafd448 385
twinkling 1:1cda1fafd448 386 //Append interrupt handler for pin to function isr
twinkling 1:1cda1fafd448 387 void ADC::unappend(PinName pin) {
twinkling 1:1cda1fafd448 388 int chan;
twinkling 1:1cda1fafd448 389
twinkling 1:1cda1fafd448 390 chan = _pin_to_channel(pin);
twinkling 1:1cda1fafd448 391 _adc_isr[chan] = NULL;
twinkling 1:1cda1fafd448 392 }
twinkling 1:1cda1fafd448 393
twinkling 1:1cda1fafd448 394 //Unappend global interrupt handler to function isr
twinkling 1:1cda1fafd448 395 void ADC::append(void(*fptr)(int chan, uint32_t value)) {
twinkling 1:1cda1fafd448 396 _adc_g_isr = fptr;
twinkling 1:1cda1fafd448 397 }
twinkling 1:1cda1fafd448 398
twinkling 1:1cda1fafd448 399 //Detach global interrupt handler to function isr
twinkling 1:1cda1fafd448 400 void ADC::unappend() {
twinkling 1:1cda1fafd448 401 _adc_g_isr = NULL;
twinkling 1:1cda1fafd448 402 }
twinkling 1:1cda1fafd448 403
twinkling 1:1cda1fafd448 404 //Set ADC offset
twinkling 1:1cda1fafd448 405 void offset(int offset) {
twinkling 1:1cda1fafd448 406 LPC_ADC->ADTRM &= ~(0x07 << 4);
twinkling 1:1cda1fafd448 407 LPC_ADC->ADTRM |= (offset & 0x07) << 4;
twinkling 1:1cda1fafd448 408 }
twinkling 1:1cda1fafd448 409
twinkling 1:1cda1fafd448 410 //Return current ADC offset
twinkling 1:1cda1fafd448 411 int offset(void) {
twinkling 1:1cda1fafd448 412 return((LPC_ADC->ADTRM >> 4) & 0x07);
twinkling 1:1cda1fafd448 413 }
twinkling 1:1cda1fafd448 414
twinkling 1:1cda1fafd448 415 //Return value of ADC on pin
twinkling 1:1cda1fafd448 416 int ADC::read(PinName pin) {
twinkling 1:1cda1fafd448 417 //Reset DONE and OVERRUN flags of interrupt handled ADC data
twinkling 1:1cda1fafd448 418 _adc_data[_pin_to_channel(pin)] &= ~(((uint32_t)0x01 << 31) | ((uint32_t)0x01 << 30));
twinkling 1:1cda1fafd448 419 //Return value
twinkling 1:1cda1fafd448 420 return((_data_of_pin(pin) >> 4) & 0xFFF);
twinkling 1:1cda1fafd448 421 }
twinkling 1:1cda1fafd448 422
twinkling 1:1cda1fafd448 423 //Return DONE flag of ADC on pin
twinkling 1:1cda1fafd448 424 int ADC::done(PinName pin) {
twinkling 1:1cda1fafd448 425 return((_data_of_pin(pin) >> 31) & 0x01);
twinkling 1:1cda1fafd448 426 }
twinkling 1:1cda1fafd448 427
twinkling 1:1cda1fafd448 428 //Return OVERRUN flag of ADC on pin
twinkling 1:1cda1fafd448 429 int ADC::overrun(PinName pin) {
twinkling 1:1cda1fafd448 430 return((_data_of_pin(pin) >> 30) & 0x01);
twinkling 1:1cda1fafd448 431 }
twinkling 1:1cda1fafd448 432
twinkling 1:1cda1fafd448 433 int ADC::actual_adc_clock(void) {
twinkling 1:1cda1fafd448 434 return(_adc_clk_freq);
twinkling 1:1cda1fafd448 435 }
twinkling 1:1cda1fafd448 436
twinkling 1:1cda1fafd448 437 int ADC::actual_sample_rate(void) {
twinkling 1:1cda1fafd448 438 return(_adc_clk_freq / CLKS_PER_SAMPLE);
twinkling 1:1cda1fafd448 439 }