JJ1UBA_nisiの手作りブログ

オーディオアンプ、スピーカ、マイコンを中心に色々なものを手作りしています。
2019年からアマチュア無線も始めました。

LPC1114FN28でロータリーエンコーダ制御

2013-09-27 16:09:14 | プログラミング
Si4735ラジオモジュールをLPC1114FN28で制御しようとしてWebを検索して
いると、LPC1114FN28に限らず、ロータリーエンコーダ制御で苦労しておら
れるようです

ロータリーエンコーダ処理を割込処理で実現しましたので、概要を公開します
ロータリーエンコーダは、秋月のRE-160Fを使用しています



処理概要:

  • ロータリーエンコーダのパルスの立下りで割込みを受け付けています
  •      
  • ロータリーエンコーダの割込ハンドラーは、ロータリーエンコーダが
    回転するとmain()処理と非同期で起動され、フラグ:Flg_encorderが
    AP_INT_OKの場合は、ロータリーエンコーダが接続されているGPIO
    の状態を読み取り、グローバル変数に保存するとともに、Flg_encorder
    AP_INT状態に設定します
  •      
  • main()のwhileループで、Flg_encorderのフラグを常時監視し、AP_INT
    状態に遷移した場合は、Flg_encorderをAP_INT_WAIT状態にします
         
    (ロータリーエンコーダの割込みンドラーは、Flg_encorderがAP_INT_WAIT
    状態の時は、
    main()処理に割込みを通知しません)

  • main()でロータリーエンコーダが右回転した場合や、左回転した場合の
    処理を実行中は、Flg_encorderをAP_INT_WAIT状態を維持します

  • ロータリーエンコーダは、チャタリングを起こす場合があるので、しばらく
    waitしてから、Flg_encorderをAP_INT_OKに遷移させ、次の割込が処理
    可能になったことを割込ハンドラーに通知します。

  • Flg_encorderのフラグ状態

  • AP_INT_OKmain処理が割込みを受付可能状態
    AP_INT_WAITmain処理が割込みに伴う処理を実行中
    AP_INT割込みハンドラーからの割込通知  



ソースコード: 赤字部分がミソです



Si4735(DSPラジオモジュール)をLPC1114FN28でコントロール

2013-09-27 09:56:09 | プログラミング

BitTrandOneのSi4735(DSPラジオモジュール)をLPC1114FN28でコントロールすることが出来ました。

LPC1114FN2はトランジスタ技術(2012年10月、12月号)で詳しく紹介されてとはいえ
使いこなしに苦労したので、苦労内容を紹介します。
Si4735(DSPラジオモジュール)は、次のバンドが受信できるラジオモジュールです。
FM:64-108MHz
AM:520-1710KHz
SW:2.3-26.1MHz
LW:153-279KHz

LPC1114FN28は、低消費電力の32bitマイコンです。
Si4735のコントロールでは、8bitマイコンで十分なのですが、
LPC1114FN28がトランジスタ技術(2012年10月、12月号)で詳しく紹介されていたのと、
LPC1114FN28の足(端子)がDIPピッチで工作しやすい。
かつ安価(110円)なので、このマイコンでコントロールしてみました。



開発環境
OS:windows7
ビルド:LPCXpresso Ver5.2.6
マイコンへの書込:Flash Magic
デバッグ:UART+Flash Magicのターミナルウィンドへのprintfデバッグ



目 次


1.ビルド(リンク)エラー 「not fit in region `MFlash32'」

事象:   
  ビルド中にコンパイル工程が終了し、リンク工程で次のメッセージが表示され、ビルドが停止してしまう

   ld.exe: XXX.axf section `.data' will not fit in region `MFlash32'
  または、
   ld.exe: XXX.axf section `.txt' will not fit in region `MFlash32'

原因:
LPCXpressをActivacionしていないため、ソースコードのDebug limit: 8kを超過したのが原因
次の手順でActivationするとDebug limitが128kに拡張されます

  • http://www.lpcware.com/を開きユーザ登録を済ませておく
       
  • LPCXpress画面から「Help -> Product activacion -> display licence tyepe... 」の順でウィンドを開きLicence typeを確認

  • 同様に、「Help -> Product activacion -> Create serial number and activate... 」の順でウィンドを開きserial numberを表示させ、serial numberをクリップボードにコピーしておく
       
  • http://lpcware.com/lpcxpresso/activate ページを開きログオンするすると、
    「LPCXpresso Key Activation」画面が開く
       
  • 「LPCXpresso Key Activation」画面の「serial number」欄にクリップボードからserial numberをペーストし、「Register LPCXpresso」ボタンをクリックする

  • 「LPCXpresso Key Activation」画面の「LPCXpresso Activation key;」にActivation keyが表示されるので、Activation keyをクリップボードにコピーしておく

  • 同様に、「Help -> Product activacion -> Product infomation  -> Enter Activation」の順でウィンドを開き、クリップボードからActivation Keyをペーストし、登録する



2.UARTで通信速度が正しく設定できない

事象:
プログラムで通信速度を9600bit/sに指定し、PCからLPC1114FN28に送られた文字をPCに送り返すプログラムを作成し、Flash Magicのターミナルウィンドで通信速度を9600bit/sに指定しプログラムを実行したときに次の事象が発生
  • PC -> LPC1114FN28へは、9600bit/sで通信できている。
  • LPC1114FN28 -> PCへの通信が文字化けする。
    ただし、Flash Magicのターミナルウィンドで通信速度を9600bit/s以上に設定すると双方向とも通信が文字化けせず成功する

原因:
今回作成したモジュールは、あまり高精度を要しないので、LPC1114FN28の内部クロックで動作させた
LPCXpressでインポートしたCMSISv2p00_LPC11xxライブラリは、LPC1114FN28が外部クロックで動作する設定になっており、内部クロックで動作するように、CMSISv2p00_LPC11xxライブラリを変更する必要がある
手順は次のとおり

  • LPCXpressでインポートしたプロジェクト「CMSISv2p00_LPC11xx」を開く

  • 「src」 ->  「system_LPC11xx.c」を開く

  • 128行目ぐらいの定義を変更
      旧:#define SYSPLLCLKSEL_Val 0x00000001
      新:#define SYSPLLCLKSEL_Val 0x00000000

  • 再ビルド
参考URL:Juggler You日記さん


3.ビルド(リンク)エラー「no CRP_WORD provided within application」

事象:
ビルドのリンク工程で次のメッセージが表示され、ビルドが停止してしまう

Linker CRP Enabled, but no CRP_WORD provided within application
 
原因:
色々とwebで原因を探してみたのですが、よくわからない
次の一行を何れかのソースコードに追加すれば解決されます
複数のソースコードに追加するとエラーになるので注意が必要

__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;