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行めでエラー出てしまいます。?
返信削除コメントありがとうございます。
返信削除コード修正しました。
ご迷惑をおかけしました。
修正ありがとうございました。
返信削除大切に、使わせて頂きます。
ありがとうございます。励みになります。
返信削除