Lynx-EyEDの電音鍵盤 新館のeXodusinoを利用させていただいております。
ところが、【analogRead()】が実装されておりません (;_;)
・・・
そこでやっつけで実装をしてみました(笑
某arduino風「NeXtPino」はITショップ「えとせとら」にて販売中です。限定CPU付き!!
追加変更するファイルは
eXodusino-->src-->core 内の
analogio.h
analogio.cpp
の2つになります。
////---------アナログ入力追加分--------- #define AD0 0 #define AD1 1 #define AD2 2 #define AD3 3 #define AD4 4 #define AD5 5 #define ADC_OFFSET 0x10 #define ADC_INDEX 4 #define ADC_DONE 0x80000000 #define ADC_OVERRUN 0x40000000 #define ADC_ADINT 0x00010000 #define ADC_CLK 2400000 /* set to 2.4MHz */ #define ADC_MAX_PINS 6 void ADCInit( int ADC_Clk ); int analogRead(int pinnum); ////--------------------------------
////---------アナログ入力追加分--------- int ADCValue[ADC_MAX_PINS]; void ADCInit( int ADC_Clk ) { int i; /* Disable Power down bit to the ADC block. */ LPC_SYSCON->PDRUNCFG &= ~(0x1<<4); /* Enable AHB clock to the ADC. */ LPC_SYSCON->SYSAHBCLKCTRL |= (1<<13); for ( i = 0; i < ADC_MAX_PINS; i++ ) { ADCValue[i] = 0x0; } /* Unlike some other pings, for ADC test, all the pins need to set to analog mode. Bit 7 needs to be cleared according to design team. */ /* ADC I/O config */ LPC_IOCON->R_PIO0_11 &= ~0x8F; /* ADC IN0 */ LPC_IOCON->R_PIO0_11 |= 0x02; LPC_IOCON->R_PIO1_0 &= ~0x8F; /* ADC IN1 */ LPC_IOCON->R_PIO1_0 |= 0x02; LPC_IOCON->R_PIO1_1 &= ~0x8F; /* ADC IN2 */ LPC_IOCON->R_PIO1_1 |= 0x02; LPC_IOCON->R_PIO1_2 &= ~0x8F; /* ADC IN3 */ LPC_IOCON->R_PIO1_2 |= 0x02; /*注:SWDデバッグのときはコメントアウトする。*/ LPC_IOCON->SWDIO_PIO1_3 &= ~0x8F;/* ADC IN4 */ LPC_IOCON->SWDIO_PIO1_3 |= 0x02; LPC_IOCON-> PIO1_4 &= ~0x8F; /* ADC IN5 */ LPC_IOCON-> PIO1_4 |= 0x01; LPC_ADC->CR = ( 0x01 << 0 ) | /* select AD0 on PIO0_11. SEL=1,select channel 0~7 on ADC0 */ ( ( SystemCoreClock / ADC_Clk - 1 ) << 8 ) | /* CLKDIV = Fpclk / 1000000 - 1 */ ( 0 << 16 ) | /* BURST = 0, no BURST, software controlled */ ( 0 << 17 ) | /* CLKS = 0, 11 clocks/10 bits */ ( 1 << 21 ) | /* PDN = 1, normal operation */ ( 0 << 22 ) | /* TEST1:0 = 00 */ ( 0 << 24 ) | /* START = 0 A/D conversion stops */ ( 0 << 27 ); /* EDGE = 0 (CAP/MAT singal falling,trigger A/D conversion) */ return; } int analogRead(int pinnum) { int ADC_DATA,regVal; if ( pinnum >= ADC_MAX_PINS ) { pinnum = 0; /* reset channel number to 0 */ } LPC_ADC->CR &= 0xFFFFFF00; LPC_ADC->CR |= (1 << 24) | (1 << pinnum); while ( 1 ){ /* wait until end of A/D convert */ regVal = *(volatile unsigned long *)(LPC_ADC_BASE + ADC_OFFSET + ADC_INDEX * pinnum); /* read result of A/D conversion */ if ( regVal & ADC_DONE ){ break; } } LPC_ADC->CR &= 0xF8FFFFFF; /* stop ADC now */ if ( regVal & ADC_OVERRUN ){ /* save data when it's not overrun, otherwise, return zero */ return ( 0 ); } ADC_DATA = ( regVal >> 6 ) & 0x3FF; return ADC_DATA; } ////--------------------------------
最後にuser_application.cppを記述します。
#include <libmary.h> int ledPin = P1_5; // LEDをデジタルP1.5(14ピン)に接続 int analogPin = AD0; // ポテンショメータのワイプ(中央の端子)に // 両端はグランドと+5Vに接続 int val = 0; // 読み取った値を格納する変数 int threshold = 512; // 閾値 void setup() { pinMode(ledPin, OUTPUT); // ピン14を出力に設定 Serial.begin(9600); // シリアル通信の初期化 ADCInit( ADC_CLK ); // ADC初期化 } void loop() { val = analogRead(analogPin); // アナログピンを読み取る Serial.println(val,DEC); // デバッグ用に送信 if (val >= threshold) { digitalWrite(ledPin, LOW); // LEDをオンに } else { digitalWrite(ledPin,HIGH); // LEDをオフに } }BuildProject をして、マイコンに書き込みます。 ボリュームを配線して動作確認をしてみます。 おしまい
【ご紹介など】
・工作と小物のがらくた部屋 NeXtPino と eXodusino (LPC1114)
・なんでも独り言 NeXtPinoとeXodusino
analogio.cpp 8行めでエラー出てしまいます。?
返信削除コメントありがとうございます。
返信削除コード修正しました。
ご迷惑をおかけしました。
修正ありがとうございました。
返信削除大切に、使わせて頂きます。
ありがとうございます。励みになります。
返信削除