投稿

ラベル(マイコン)が付いた投稿を表示しています

ARM用クロスコンパイラのビルド(Windows8.1+Cygwin+GCC5.2)

イメージ
以前の記事 から2年余り経過したのでゼロベースで最新環境にしてみた。 ◆ Cygwin のインストール setup.exeをダウンロードしてきて実行。 Default状態から以下のパッケージを追加でInstallします。 今回は②〜③についてもCygwinのインストールパッケージを使用。 ①Devel ②任意精度計算ライブラリ(GMP) ③浮動小数点演算ライブラリ(MPFR) ④複素数演算ライブラリ(MPC) Cygwinのインストールが完了。バージョン確認結果。 ◆クロスコンパイラ関連ソースを入手 /usr/local/srcフォルダにソースをダウンロード&展開します。 因みに、今回のツリーは以下の様にしていますがお好みです。 /usr/local/gnu                      ...gccインストール先               /src/gcc***             ...ソース                     /binutils***                     /newlib***                     /build/gcc        ...ビルド用フォルダ                         ...

久しぶりのPICマイコン

イメージ
長く触っていないうちにPICマイコンのプログラミング環境MPLABがメジャーバージョンアップされていました。 VISTAに入っている 旧環境 を使うのも面倒なので、Win8にXバージョンをセットアップしました。 ◆MPLABX IDE マイクロチップ社のサイト から所望のOSのインストーラをダウンロードしてきます。無償です。 Windows用の現バージョンは1.80でした。 インストーラを実行して、Nextを押していればインストールは完了します。 最後に表示されるウィンドウのチェックを入れたままにしておけば、 コンパイラのダウンロードページ が開きます。 ◆MPLAB XC 対象とするPICマイコンのCコンパイラをダウンロードします。無償です。 勿論、お仕事用ならPROやStandardの有償ライセンスを購入しましょう。 ※C++はPIC32のみ対応のようですね。 今回はPIC18が対象なのでXC8をダウンロード。現バージョンは1.12でした。 インストーラを実行して進めていくと、ライセンスキーを要求されますが、空白のままNextとします。 すると、フリーモードとするか、PROの評価モード(60日間のみPROとして機能する)とするか聞かれます。 お仕事でライセンス購入を予定しているなら勿論PROの評価版ですが・・・ お遊びモードの方はお好きなほうを。 ◆USBやLANを使用する場合は、必要に応じて無償の アプリケーションライブラリ もインストールしておきましょう。 ダウンロードしてきてインストーラを実行するだけです。 え?XC8サポートしてないの?8bit系チップを見捨てたのか? Cソースコードだから何とかなるかもと、とにかくインストール完了してReadmeを開いてみると、PIC16F、PIC18Fも対象って書いてある。ってことはXC8でビルドでしょ? 「やってみなくちゃ判らない・・・」 by 細野晴臣 「先週のRaspberryPiのデバドラはどうなった?」 by 誰かさん

RaspberryPiのデバイスドライバ(第1歩)

イメージ
以前、 RaspberryPi のGPIOレジスタを直接叩いてLEDを点灯 させてみましたが、ルート権限で実行させる必要があります。 そこで、まずはデバイスドライバのロード&アンロードを確認するだけのプログラムを試してみました。 ◆ VM上のEclipse を起動します。 ◆Eclipseが自動生成するMakefileでのビルドにチャレンジしましたがエラーが解決できなかった為、手入力したMakefileでビルドするように構成します。 Cプロジェクトの新規作成にて、Makefileプロジェクトの空のプロジェクト、他のツールチェインを選択します。 インクルードパスに Raspbian(Linux)のソース ツリーにあるIncludeディレクトリを追加 ※ビルドには無関係ですが、ソースコードの定義チェックなどが機能してくれるので定義しておきましょう。 ◆正常にビルド完了しました。 このEclipse(Ver3.8)では、printk()やmodule_init()、module_exit()でソースコードの構文解析でエラーがでてしまいますが、ビルドには支障はないようです。 ◆RaspberryPi上で動作確認します。 SCPで、main.koをRaspberryPiに転送。 SSHで、RaspberryPiにリモート接続。 insmodでmain.koをロードします。(特権ユーザーで) lsmodで、mainが正常にロードされた事が確認できました。 rmmodで、アンロード。 最後にdmesgで、ロード、アンロード時にKERN_ALARTに出力した文字列が残っているかチェックし、無事に実行された事が確認できました。 ---------------------------------- main.c #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> MODULE_DESCRIPTION("Hello driver"); MODULE_AUTHOR("777gunslinger"); MODUL...

ARM用クロスコンパイラのビルド(Windows8+Cygwin)

イメージ
更新版はコチラへ ARM用のGCCを Windows8 上でビルドしてみたので備忘録として。 ◆ Cygwin のインストール setup.exeをダウンロードしてきて実行。 ドライブ直下が吉ですのでディフォルトのままで。 適当なフォルダを指定 通常のブロードバンド環境ならディフォルトでOK わざわざ海外サーバを選ぶ必要はないでしょ。 Devel以下を一括でインストールしてしまいます。 GCCのビルドには不要なものもインストールされてしまいますが、何が必須なのか良く分からないもので・・・ あとは「次へ」だけで無事にインストール完了 ◆関連ソースを入手 ① GCCコンパイラ ② binutils(アセンブラやリンカーなど) ③ Newlib(組み込み向け標準ライブラリ) GCC4.5以降は以下の演算ライブラリが必要らしいので入手。 ④ 任意精度計算ライブラリ(GMP) ⑤ 浮動小数点演算ライブラリ(MPFR) ⑥ 複素数演算ライブラリ(MPC) 今回入手したファイル(バージョン)は以下の通りです。 ダウンロードしたソースを展開します。(何処へ展開するかはご自由に) $ mkdir -p /usr/local/src/gnu $ cd /usr/local/src/gnu $ tar zxvf ~/Download/gcc-4.7.3.tar.gz  : $ tar vxvf ~/Download/gmp-5.1.2.tar.bz2 ◆ビルド $export LANG=C この定義が無いとエラーが発生しました。 $export TARGET=arm-eabi $export PREFIX=/usr/local/gnu ①binutilsのビルド $ mkdir -p ~/tools/build-binutils-2.23.2 $ cd ~/tools/build-binutils-2.23.2 $ /usr/local/src/gnu/build-binutils-2.23.2/configure --target=$TARGET --prefix=$PREFIX --enable-interwork --enable-multilib ...

Raspberry Pi のsleep時間測定

イメージ
RaspberryPiのGPIO出力波形にてsleep処理時間を測定してみました。 ◆sleep() while(1){     *(gpio_regs + 0x7) = (0x1 << portnum);     sleep(n);     *(gpio_regs + 0x0A) = (0x1 << portnum);     sleep(n); } n = 1 1秒から程遠い結果でした。原因は?? ◆usleep() while(1){     *(gpio_regs + 0x7) = (0x1 << portnum);     usleep(n);     *(gpio_regs + 0x0A) = (0x1 << portnum);     usleep(n); } n = 1 n = 10 n = 100 n = 1000 凡そ80μsecのディレイが発生するようです。 ------------------------------------------------------------------ 追加測定 ◆nanosleep() nano.tv_nsec = n; nano.tv_sec = 0; while(1){     *(gpio_regs + 0x7) = (0x1 << portnum);     nanosleep(&nano,NULL);     *(gpio_regs + 0x0A) = (0x1 << portnum);     nanosleep(&nano,NULL); } n=1~1000 n=10000 n=100000 nano.tv_nsec = 0; nano.tv_sec = 1; usleepと同様に約80use...

Raspberry Pi のGPIO信号波形

イメージ
RaspberryPiのGPIOにキャラクタLCDモジュールを接続します。 そこで、Cプログラムでインターフェイスタイミング信号を生成する為に、出力信号波形を観測してみました。 以前作成した LED点滅プログラム を以下の様にsleep関数をコメントアウトして観測 ※お安いPCオシロですので精度はあまり良くないですm(--)m while(1){     *(gpio_regs + 0x7) = (0x1 << portnum); //    sleep(1);     *(gpio_regs + 0x0A) = (0x1 << portnum); //    sleep(1); } CH1:電源電圧(テスターでの測定値は3.30Vでした) CH2:GPIO25(P22)

PIC18F4550と18F2550用HIDBootloaderの改造

今夜は、USBコントローラ内蔵のPICマイコン用HIDブートローダーのお話 USB経由でアプリを書き換えられるという便利なファームウェアがMicrochip社からソースコード付きで公開されているのですが、純正評価ボード用なので、オリジナルボードで使うには手を入れる必要が出てきます。 以下の内容は、 18F4550と18F2550 でしか確認していませんので、それ以外のチップの場合は参考レベルとしてください。 ブートローダーは、以前にも紹介したMicrochip社提供のライブラリ集(microchip-application-libraries)に含まれています。 PICマイコンに書き込むファームウェアのソースコード一式は以下のパスにインストールされます。 C:\Microchip Solutions v2012-02-15\USB\Device - Bootloaders\HID\Firmware - PIC18 Non-J 1.問題となるのは、18F4550用評価ボード(PICDEM FS USB Demo Board)にはLEDが搭載されており、ブートローダーがこのLEDを点灯させる記述がある事です。 もし、自作基板においてこのLEDポートに信号を入力していた場合、衝突によって最悪は故障してしまいますので、回避できる様に改版が必要です。 ファームウェア改版1 io_cfg.h 'LED_NOT_USED' 定義でLED出力可否を切り替えできる様に改版します。 #define LED_NOT_USED // Avoid a collision of an output port. ファームウェア 改版2  BootPIC18NonJ.c mintAllLEDs()にてポートをLED用に出力モードに初期化しているので、スルーさせます。 void UserInit(void) { //change! see io_cfg.h  #if !defined(LED_NOT_USED)     mInitAllLEDs(); //Init them off. #endif ファームウェア 改版3  main...

2.4GHz版プロポ作製-PPM信号制御編(改)

イメージ
送信モジュールTx1-Jのジョイスティックは実装不良の様で正常動作しませんでしたが、PPM信号を入力する事で無事に、受信モジュールRx31を制御できるになりました。 ※回転ボリュームがスロットル。スライドボリュームがステアリング。 イロイロと嵌った事柄があるのですが、PPM信号出力プログラムの改良点についてカキコします。 まずは、Txに入力するPPM信号のポラリティです。 当初はHパルスでしたが正常に動作せず、悩んだ挙句に反転したらあっさり動きました。 ラジコンの世界では常識なのかも? 次に、USBの通信でPPM信号が乱される問題。 USBケーブルでPCに繋いで、PC側からPPMの各チャンネルのパルス幅を制御してみたり、PICに繋いだボリューム値をPCでモニターしていると、PPMのパルス幅が時々乱れる。 で、受信モジュールに繋いだサーボも微妙に右へ左へとブレて止まらない。 PIC側のUSB処理を停止して、PCからのバスパワー供給だけならPPM信号も安定してる。 やはり、PCから常時死活チェックが飛んでくる為、PPM信号を生成している割り込み処理が遅れるのが問題の様です。 そこで、USB処理を低位優先割り込みに、PPM生成用のCCP割り込みを高位優先の割り込みに書き換え。 ●割り込み関数のUSBDeviceTasks()とPPM_int()を入れ替え。 //These are your actual interrupt handling routines. #pragma interrupt YourHighPriorityISRCode void YourHighPriorityISRCode() { //        USBDeviceTasks(); PPM_int(); } //This return will be a "retfie fast", since this is in a #pragma interrupt section #pragma interruptlow YourLowPriorityISRCode void YourLowPriorityISRCode() {    ...

2.4GHz版プロポ作製-PPM信号制御編

イメージ
プロポ用のPPM信号出力が可能になりました。 1.動作仕様 ボリューム1の値をAN0で読み出してCH1のパルス幅に反映。 ボリューム2の値をAN1で読み出してCH2のパルス幅に反映。 USB経由でPCへAN0、AN1の読み出し値と、CH1、CH2のパルス幅値を送信。 PPM信号仕様   チャンネル数 7チャンネル   フレーム周期 22msec   各チャンネルのスタートパルス幅 300usec          2.動作波形 下波形はTimer割り込みで生成しているフレーム周期出力 上波形はCCPモジュールのコンペア割り込みで生成してるPPM信号出力 3.プログラムの概要 PICに搭載されていたCCPモジュールのコンペア機能のおかげでフローは非常にシンプルです。(プログラムはSimple is Best!) 1)PPMのフレーム周期でTimer1割り込みをグルグル回しておく。 2)PIC18シリーズの割り込みは2レベルしか無い(買ってから判ったので仕方ない・・・)ので、Timer1割り込みとはズレたタイミングから、PPM信号のフレーム開始位置を定義。 3)Timer1のカウント値とCCP1のコンペア値がマッチしたら割り込みを発生させる様にする。 4)CCP1割り込みの度に、ポート出力と次のCCP1割り込みの発生タイミングを書き換える。 これだけ! メインループ PPM信号のシンク期間中に処理時間が食われるADC変換とUSBへの送信を済ませるようにしています。 我ながら良く出来ました(笑)     while(1)     {         #if defined(USB_INTERRUPT) // See HardwareProfile.h             if(USB_BUS_SENSE && (USBGetDeviceState() == DETACHED_STATE))     ...

2.4GHz版プロポ作製-ADCテスト編

イメージ
アクセルとステアリング用のVRの読み出しに使うADCのテストを実施。 マイコンの電源(USBパワー)-GND間にVRを2個繋いで、AN0とAN1に入力しました。 1.概要 2つのVR値(電圧)をAD変換を通して読み出しては、USBを通じてPCへ送り続けるアプリです。 PIC18F4550は、AD入力は10チャンネルほどありますが、変換は1チャンネルずつしかできないので、AN0とAN1の入力を切り替えては変換して読み出すという手順となります。 2.メインルーチン部 void main(void) { int ADread0,ADread1;     InitializeSystem();     while(1)     {         #if defined(USB_INTERRUPT) // See HardwareProfile.h             if(USB_BUS_SENSE && (USBGetDeviceState() == DETACHED_STATE))             {                 USBDeviceAttach();             }         #endif     SetChanADC(ADC_CH0); ConvertADC(); //AD変換開始         while( BusyADC());          //AD変換待ち         ADread0 = ReadADC();   ...

2.4GHz版プロポ作製-USBブートローダ編

イメージ
Microchip Solutions内にブートローダを発見したので動作を確認 1.マイコンにブートローダを書き込む。 所在:C:\Microchip Solutions v2011-12-05\USB\Device - Bootloaders ブートローダは2種類ありましたが、推奨のHID Bootloaderを使用しました。 使用しているマイコン(PIC18F4550)用のhexファイルをライターで書き込みます。 これで、以降はUSBケーブル経由でプログラムの書き込みが可能になります。 注)ブートローダーが約1KB消費するので、プログラムは残容量に制限されます。 2.アプリをブートローダ対応にする。 ベクター類のアドレスを変更する必要がありますが、BasicDemoのmain.c内「VECTOR REMAPPING」に定義が記述済みです。 注)下記の様に、ブートローダの種類、使用/未使用の定義がusb_config.h内に有る様に書かれていますが、これはガセで、HardwareProfile.h内に記述されていました。   //the USB bootloader.  If no bootloader is used, edit the //usb_config.h file and comment out the following defines:   //#define PROGRAMMABLE_WITH_USB_HID_BOOTLOADER   //#define PROGRAMMABLE_WITH_USB_LEGACY_CUSTOM_CLASS_BOOTLOADER アプリをビルドしてhexファイルが作成されれば完了です。 3.USB経由でアプリを書き込む。 PC用のローダーを実行します。 Vistaマシンでは正常動作しました。 VC++のプロジェクトファイルも入っていたので必要ならカスタマイズも可能です。 実行すると、 マイコンボードの電源ON又はUSBケーブルを繋ぐ(バスパワー時)と、 フォル...