2013年1月14日月曜日

NeXtPinoにアナログ入力を!




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

4 件のコメント:

  1. analogio.cpp 8行めでエラー出てしまいます。?

    返信削除
  2. コメントありがとうございます。
    コード修正しました。
    ご迷惑をおかけしました。

    返信削除
  3. 修正ありがとうございました。
    大切に、使わせて頂きます。

    返信削除
  4. ありがとうございます。励みになります。

    返信削除