にほんブログ村 その他趣味ブログ 電子工作へ

2010年04月06日

これで最後のロボデザイナー探求 ?

モッパーです。
 
ロボデザイナー探求終了を宣言しておきながら何度もすみませんが、
MC908QB8 である JRT-104 を MC908QC16 に置換してメモリー容量を倍増出来る可能性に気付いてしまいました。
MC908QC16 は DIP パッケージでは供給されてませんので、TSSOP パッケージ等からの変換基板が必要となります。
MC908QC16 は MC908QB8 とかなり互換性が高いですが、Ticolla CDE で制御するのは多分無理ですね。Code Warrier に乗り換えれば出来ることはほぼ確実ですが、そんなことまでするなら別のプラットフォームに乗り換えたほうが早そうです。
一番良いのはジャパンロボテックさんから CPU ドータボードと Ticolla CDE のバージョンアップ版が発売されることなのですが... 出してくれないかな ?
posted by モッパー at 21:57| Comment(5) | TrackBack(0) | ロボデザイナー

2010年03月14日

電源について

モッパーです。
 
ロボデザイナ探検の最後として、コントローラボードが耐えられる電力と対策について書いておきます。
ロボデザイナのコントローラボードには 78DL05AF がメインの三端子レギュレータとして搭載されていますので、コントローラボード内とセンサ類を含めた電力出力は 5V 250mA が最大のようです。このため、PSD センサや超音波センサのような高消費電力のセンサを複数付けると、コントローラの電力が足りなくなり不安定となります。
78DL05AF を他の高出力な 5V 出力の三端子レギュレータに取り替えるという手段もありますが、置換するのは実装上かなり難しいと思います。そのため、高消費電力のセンサを複数接続するためには他の手段で 電源を追加することが必須となります。
posted by モッパー at 23:38| Comment(6) | TrackBack(0) | ロボデザイナー

2009年06月26日

非同期タイマーの実現


モッパーです。

Ticolla CDE でモータドライバを定義せずに(ロボデザイナのPWMモーター制御を使用せずに)、非同期タイマーを実現する手法が分かりました。これで CN7-CN10 がモーター制御から開放された状態(= モーター以外のセンサー等が接続出来る状態)で割り込みによる非同期タイマーを実現出来ます。
ただし、本当は Ticolla CDE の PWM 初期化を流用していて、ネイティブなタイマー定義をしているわけではないので、ちょっとズルです。私の知力の限界なのでこんなくらいで許して下さい。
モータの PWM 制御をしながら非同期タイマー実現するなら、こちらの記事に書かれている手法のほうが有効です。
また、TCH2 と TCH3 (JRT104 で追加されているタイマーチャネル 2 と 3 ) の活用についても調べましたが、TCH2 と TCH3 が I2C 通信を行っているポートと重複しますので、I2C 通信をしながら TCH2 と TCH3 を併用することは無理だというのが私の結論です。


main.c では以下のような感じ。このブログのエディタは TAB を無視するんでインデント無くなってますけど、我慢して修復して下さい(笑)。


/*--------------------------------------------------------------------------------*/
/* Variable declaration                                                           */       
/*--------------------------------------------------------------------------------*/

extern byte count0;
extern byte second0;

/*--------------------------------------------------------------------------------*/
/* Prototype declaration                                                          */       
/*--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*/
/*  main                                                                          */
/*--------------------------------------------------------------------------------*/

void main(void) {
 init();  //Initialization
 PWM2_INIT();

 INTERRUPT_INIT();
 
 CH0IE = 1;

 while(1){
  LED_OUT(second0);
  COPCTL = 0; 
 }
}

interrupt.c は以下のような感じ。

/*--------------------------------------------------------------------------------*/
/* Variable declaration                                                           */       
/*--------------------------------------------------------------------------------*/

byte count0 = 0;
byte second0 = 0;

/*--------------------------------------------------------------------------------*/
/* Prototype declaration                                                          */       
/*--------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------*/
/* ADC_Interrupt - ADC Conversion Complete Interrupt                              */       
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _ADC_Interrupt(void) {
 __DI();
 

 __EI();
}


/*--------------------------------------------------------------------------------*/
/* KBD_Interrupt - Keyboard Wakeup                                                */
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _KBD_Interrupt(void) {
 __DI();
 

 __EI();
}


/*--------------------------------------------------------------------------------*/
/* timer_overflow_isr - The timer rolls over every 256T counts                    */
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _TOF_Interrupt(void) {
 __DI();
 

 __EI();
}


/*--------------------------------------------------------------------------------*/
/* Timer Channel 0 - Timer Channel 0 Interrupt                                    */
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _TCH0_Interrupt(void) {
 __DI();
 
 CH0F = 0;
 count0++;
 if ( count0 >= 48 ) {
  second0++;
  count0 = 0;
 }

 __EI();
}


/*--------------------------------------------------------------------------------*/
/* Timer Channel 1 - Timer Channel 1 Interrup                                    */
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _TCH1_Interrupt(void) {
 __DI();
 

 __EI();
}


/*--------------------------------------------------------------------------------*/
/* IRQ interrupt                                                                  */
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _IRQ_Interrupt(void) {
 __DI();
 

 __EI();
}

上記の処理で、約 1/48 秒単位で割り込みがかかりますので、count0 は 0〜47 までを 約 1/48 秒単位で周期的にカウントアップし、second0 は約一秒単位でカウントアップしていきます。
そろそろ私自身の趣味の範囲内での、ロボデザイナ+Ticolla CDE をしゃぶりつくす旅は終わりにしたいと思います。いやいやロボデザイナは本当に美味しかったです。私が小中学生だった頃の 8bit ワンボードマイコンの回路やBIOS解析そのまんまの世界に加えて C言語 + Java + I2C といった最近の技術を学べました。ごちそうさまでした。H/W としては、電源弱いようなのでそこだけはおしゃぶりポイントはまだ残るかも。
次は PSoC あたりで遊ぶかな ? それとも積年の夢だった FPGA に逝くか ? Arduino も良いですね。
posted by モッパー at 20:59| Comment(0) | TrackBack(0) | ロボデザイナー

2009年05月24日

I2C って...

今日は K 君がたまたま来たので、N 君と一緒に前回と引き続き木工やってもらいました。
放っておいてもそこそこの精度が出せるようになってきたようなので、私のアマチュア家具職人のプライドもどこかに行ってしまい、バリ取りなし・研磨なしでも「いいんじゃないのー」の放置モードに...(笑)


その代わり私はアマチュア電子工作職人の血が疼いてしまい、届いていたダイセンのモータードライバボードを使って、I2C バスのノイズ解析という個人的趣味モードに...(笑)。最近もデジタルオシロで自作オーディオとか簡単なデジタル回路のチェックとかはしていましたが、こんな応用問題にトライするのは 25 年振りくらいなので、そもそもオシロの高度な使用方法がよく思い出せません。xx才の手習いはきついです...でもとりあえず I2C バスのノイズの解析に挑戦!!!
(1) ロボデザイナ側の I2C コネクタ
(2) (1) から 20cm くらいのケーブルで接続したモータードライバ側のI2Cコネクタ(モーター回転なし)
(3) (2) にさらにサージ予防のコンデンサなしの DC モーターを接続・回転させた場合
について SCL クロックの波形について調べて見ましたが、シングルトリガで捕捉した SCL クロックの波形はどのパターンもほとんど変わりません。以下の通り、綺麗なもんです。

SCL.jpg

でも、DC モータのサージの周波数成分なんて I2C のクロックとは全く違うだろうし SCL クロックは定常波じゃないので、オシロで定常的に見ることなんて出来ないし... と今書きながら分かってきました。そうだ、サージ電圧はもっと高いはずなのでそれでトラップ出来るだろうし、擬似的に定常的な SCL クロック発生してしまえば良いんだ...やっと感覚が戻ってきましたが、今日はここまで。
でも、I2C バスって複雑で再現性の低い問題が発生した時に外部的な監視手段で本気モード(≒仕事モード)で解析しようとすると I2C バスアナライザみたいな専用機ないと難しいのかもしれませんね。デジタルオシロでも超ロングメモリないと無理だな。やっと世の中に I2C バスアナライザが存在する理由が分かりました。思っていたより手強い相手を選択しつつあることに今更ながら気付いてしまいました。

I2C バスラインのノイズ対策の手法についても大体分かりました。こちらに書いてあるように SCL と SDA を Vss(グランド) とツイストするなり、シールドしてしまうなりすりゃ良いのね。3線でフラットに接続する場合も SCL/Vss/SDA と Vss を中心にすりゃ良いって。そりゃそうだ、考えてみれば当たり前です。ロボデザイナのコネクタのピンアサインよろしくないな。まあケーブル短いと大差ないでしょうが。
トラブルシューティングとかきちんと I2C ドライバを実装するためには、こちらあたりのレベルは読んで理解しないといけないようです。なになに、複数のマスタを想定したアービトレーションとか、スレーブが間に合わない時にスレーブ側が強制的に SCL クロックを LOW にして引き伸ばすなんてありなの ??? 結構ソフトウェアでフルサポートしようとすると難しいですね、このプロトコル。TicollaLib がフルサポート出来ているとは思えないな。それが公開されていない理由かな ?
結論として、今日ロボデザイナの I2C ライブラリについて分かったことは、100Kbps の場合の SCL クロックの "H" の時間の MIN 4.7μs、立ち上がり 1μS の基準を満たしていること、400kbps は絶対無理なこと、26 Khz という超遅い SCL クロックは遅いスレーブの強制的 SCL LOW にまともに対処せずにクロック落として対応しようとした結果じゃないの ??? という憶測だけ。
posted by モッパー at 23:39| Comment(2) | TrackBack(0) | ロボデザイナー

2009年03月13日

Ticolla CDE の隠し関数

TiCollaLib にはいくつかの隠し関数が入っています。
これらはマニュアルには書かれていませんし、私もまだテストしてませんので仕様もよく分かりません。このため以下は憶測でしかありません。でも、特に I2C 関連は I2C センサ の接続に使える可能性があり有用のように思います。これらの関数は TicollaLib.h ではプロトタイプ宣言されてませんので、自分でプロトタイプ宣言が必要です。


void GET_CAPTUR(byte _side, word *Value)

タイマーカウンタの値(TCH0かTCH1?)を Value に返す。_side はPWM_SIDE_CN11かPWM_SIDE_CN6を指定して TCH0 か TCH1 を選択するようです。
byte EI2C1_SendSelectSlave(byte SlaveAddr, byte _Mode)
byte EI2C1_SendAddress(word Address)
byte EI2C1_SendData(byte Chr)
byte EI2C1_SendStop(void)

I2C のハンドリング関数群のようです。I2Cメモリ関数(I2C_READとか) から呼ばれていますが、I2C 通信の全ての機能を使えるものかどうかは良く分かりません。I2C センサつけてみて検証したいと思います。
 

JAPAN ROBOTECH さんが、vectors.h や TiCollaLib.c のソースコード公開してくれれば、もっと色々出来そうなんですが... なんとかなりませんかね ?

2010.9.3  更新

結局はつないでみた I2C デバイスは皆問題なく動作しました。30kbps 程度と遅いクロックが幸いするのか、Arduino 等だとディレーが必要なデバイスもディレーがなくても大丈夫です。
ただしそれは反面レスポンスが悪いということなので、ロボデザイナで I2C デバイスを複数接続すると、高度な RCJ サッカーロボットではボトルネックとなる遅延が発生します。
ちなみに TiCollaLib のソースコードは PC に大きな負荷をかけた状態でコンパイルをして、プロジェクトの内容を捕捉すると get 出来ます。あまり詳細を書くとライセンス条項にひっかかりそうなので、以下自粛。
posted by モッパー at 21:29| Comment(1) | TrackBack(0) | ロボデザイナー

2009年03月11日

10bit A/D の実現

ロボカップジュニアとはほとんど関係ない世界で、JRT-104 をしゃぶりつくすための旅が続いています(笑)。
以下、A/D コンバータを 10 bit 化するためのソースコードです。

#define AD_CN7          6                       // CN7  AD port channel
#define AD_CN8          7                       // CN7  AD port channel
#define AD_CN9          8                       // CN7  AD port channel
#define AD_CN10         9                       // CN7  AD port channel
#define AD_CN1         10                       // CN7  AD port channel
#define AD_CN2         11                       // CN7  AD port channel
VOLDATA UINT8 at 0x3d ADRH;     /* ADC Data Register */

extern void AD_GETDATA10(byte port, word *data);

void AD_GETDATA10(byte Port, word *Data){
 ADICLK = 0x56;

 switch (Port){
  case AD_CN6:  Port = 0 ; break;
  case AD_CN11: Port = 1 ; break;
  case AD_CN3:  Port = 2 ; break;
  case AD_CN4:  Port = 3 ; break;
  case AD_CN7:  Port = 4 ; break;
  case AD_CN8:  Port = 5 ; break;
  case AD_CN9:  Port = 6 ; break;
  case AD_CN10: Port = 7 ; break;
  case AD_CN1:  Port = 16+8 ; break;
  case AD_CN2:  Port = 16+9 ; break;
  default : return; break;
 }
 ADSCR = Port;
 for(;;){
  if (ADSCR_COCO == 1) break;
 }
 *Data = (ADRH<<8) | ADR;
 ADSCR = 0x1F;
 return;
}

全ポートのテストなんかしてませんので、あしからず。
ちょっと光センサでテストして見ましたが、センサの S/N 比がそもそも 60dB (10bit) 無いような感じもありますし、電源とか伝送路のノイズもあるようなのでトータルの分解能として向上した感じはありません。
それじゃ意味がない ???  いやいや、こういう地道な努力が日本を救うのです(爆)。
posted by モッパー at 23:09| Comment(0) | TrackBack(0) | ロボデザイナー

2009年02月15日

PWMとタイマー割り込みの両立

Ticolla CDE には非同期的なタイマー(DELAY_SEC なんかとは違って、プログラム実行中もカウントしてくれるタイマー)がなく、自分で割り込みルーチンを書いてタイマーを作る必要があります。ただし、Ticolla CDE がモーターのPWM制御でタイマーを使ってしまっているため、PWM を使うとタイマー割り込みがかかりません。
なんとかPWM とタイマー割り込みの両立が出来ないか模索していましたがやっと出来るようになりました。
(1) INTERRUPT_INIT();の後でCH0IE = 1;とやると TCH0 の割り込み(_TCH0_Interrupt)がかかるようになります。大体 24hz 程度で割り込みが入るようです。(H/W 定義で PWM が指定されている必要があります)
(2) ただし、MOTOR_SETSPDやMOTOR_SPD を呼ぶとタイマーをリセットするので割り込みがかからなくなります。このため、MOTOR_SETSPDやMOTOR_SPDのあとで CH0IE = 1; します。そうすると割り込みが再開します。タイマーがリセットされているので正確なタイマーを作ることは出来ませんが、ないよりはましでしょう。また、MOTOR_SETSPDやMOTOR_SPDのあとで割り込みがかかるまえにMOTOR_SETSPDやMOTOR_SPDすると当然割り込みはかかりません。
(3) CN11 の PWM が TCH1, CH6 の PWM が TCH0 使っているので、割り込み周期の変更は出来ないと思います。
(4) JRT-104 は TCH0 と TCH1 以外に TCH2 と TCH3 の2本のタイマーが使えますが、割り込み処理のためには Vectors.h や TicollaLib.c に手を入れないと無理なので現実的ではありません。割り込みではなく、TCH2 と TCH3 のタイマーカウンタを読み取ることも出来そうに思いますが、まだやってません。
PWM 使わないと、結構好き勝手に TCH0 と TCH1 使えそうですが、現在の使用方法では PWM 使えないと意味のない局面が多いので、これもやってみてません。
posted by モッパー at 19:59| Comment(0) | TrackBack(0) | ロボデザイナー

2009年02月14日

アナログ入力の拡張

Ticolla CDE でアナログ入力出来ないことになっているポートから、アナログ入力をする方法です。
H/W 定義では A/D コンバータの初期化のため、ADC_INIT(); というコードが必須です。H/W 定義で一つでも Analog in が定義されていれば、initilize.c の中でこのコードは呼ばれますが、定義しない場合は main.c の中で呼んでおく必要があります。また、H/W 定義で Analog in に出来ないポートは Digital in にしておけばアナログ入力出来ます。
以下、サンプルプログラムです。CN1 と CN2 はアナログ入力しながらデータロギングが出来ないようです。CN7-10 は検証が面倒だったのでテストすらしてません(笑)。結局使い物にならないような...
#define AD_CN7 6
#define AD_CN8 7
#define AD_CN9 8
#define AD_CN10 9
#define AD_CN1 10
#define AD_CN2 11
void AD_GETDATA2(byte Port, byte *Data){
 switch (Port){
  case AD_CN6:  Port = 0 ; break;
  case AD_CN11: Port = 1 ; break;
  case AD_CN3:  Port = 2 ; break;
  case AD_CN4:  Port = 3 ; break;
  case AD_CN7:  Port = 4 ; break;
  case AD_CN8:  Port = 5 ; break;
  case AD_CN9:  Port = 6 ; break;
  case AD_CN10: Port = 7 ; break;
  case AD_CN1:  Port = 16+8 ; break;
  case AD_CN2:  Port = 16+9 ; break;
  default : return; break;
 }
 ADSCR = Port;
 for(;;){
  if (ADSCR_COCO == 1) break;
 }
 *Data = ADR;
 return;
}

尚、このブログに書いてあることは、ロボデザイナの保証する範囲をこえたものですから、ボードが破損しようが火を吹こうが一切私は責任を持ちません。そういう覚悟のもと、実行して下さい。
posted by モッパー at 14:34| Comment(1) | TrackBack(0) | ロボデザイナー

2009年02月11日

データロギング

CN3,CN4,CN5 を Digital out にして実際にデータを出力しながら他のポートをデータロギングするとダメらしい。CN1,CN2 への出力は大丈夫。CN7-11 に出力しろということか ?(未チェック)。CN12 と CN13 も未チェック。シリアル出力の各結線を明確にしないとね。本当に謎の多いボードです。
posted by モッパー at 22:37| Comment(0) | TrackBack(0) | ロボデザイナー

2009年02月03日

ロボデザイナー Ticolla CDE と SDCC について

以前、Ticolla CDE が コンパイラに SDCC を使っていることを書きましたが、コンパイル時のエラーが SDCC のアウトプットそのままであり、エラーメッセージが英語でしかも不親切な表現で表示されるため、子供達にとって(もっと問題なのはメンターにとっても)エラーの原因を探ることがとても困難です。
かなり極端な例ですが、#pragma less_pedantic なしで以下のコードをコンパイルします。

void main(void) {
 byte a = 1;
 if (a == 1) return;
}
要は a が 1 であることが明白なのになんで評価するの ? というコードです。ちょっと単純化しすぎているので、そんなのダメで当然じゃんと思われるかもしれませんが、複雑なプログラムの中での出来事である場合や、初心者の子供の目で見た場合を想定して下さい。

そうすると以下のエラーが出力されます。
main.c:36: warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG
EVELYN the modified DOG は知る人ぞ知る FRANK ZAPPA の曲の題名ですが、ある程度は ZAPPA を知る人の私が曲の歌詞を紐解いてもエラーの意味を理解出来ないほど超ハイレベルなオタク度を誇るエラーメッセージですね、これ(笑)。Ticolla CDE が SDCC を使っていることを自ら発見しネットで正確な情報を検索出来るか、もしくはC言語の達人でない限り、コンパイルエラーに完全にハマったときの対処が非常に困難な場合があると感じます。折角 GUI としては良く出来ていて、タイルベースからテキストベースへの移行に適した開発環境なのにとても口惜しいですね...
posted by モッパー at 00:44| Comment(0) | TrackBack(0) | ロボデザイナー

2008年12月29日

ROBODESIGNER と HC08 マイコンについて

そもそも前提となる知識を書かずに端々のことばっかり書いてしまったので、前提となる知識を書いておきます。ROBODESIGNER のコントローラボード RDC-101 は Freescale 社の 8bit マイコンである、68HC08(略称HC08)を使用しています。HC08 は 8bit マイコンの名機である、モトローラ 6800 のアーキテクチャやインストラクションセットを継承するマイコンです。6800 は 80 系(8080,Z80) とは違い 旧DEC 系のミニコン(PDP11やVAX)を彷彿とさせる美しいアーキテクチャでした。私自身は学生時代は 6800 に憧れつつどうしても国内シェアの高さから 80系に流れてしまいましたが、いつも68系に関われなかったことが心残りでした。今になって HC08 に出会えたのも何かの縁かもしれません。
脱線しましたが、ROBODESIGNER のコントローラボード RDC-101 に最初に乗っているのは JRT-101 という CPU です。JRT-101 の開発環境は Ticolla というタイルベースのプログラミング環境ですが、複雑なプログラムを書くことは困難です。Ticolla CDE は C 言語でのプログラミング環境であり、 Ticolla では不可能な高度で複雑なプログラミングが出来ます。UI が Ticolla に似ていることもあり、Ticolla を学んだ子供が C 言語に挑戦するためには良い開発環境だと思います。Ticolla CDE を使うためには CPU を JRT-104 に変える必要があります。RDP-904 か RDS-X03U を買うと Ticolla CDE と JRT-104 がついてきます。
JRT-101 は多分 MC908QY4 です。JRT-104 は多分 MC908QB8 です。MC908QB8 は MC908QY4 に比べて AD コンバータの本数が増えたり AD が 10 bit 化されていたりいくつかの点での強化が行われていますが、Ticolla CDE の制限によりそれらの恩恵は得られず、JRT-104 は単にメモリの増加と処理速度が速くなった JRT-101 としての位置づけでしかないようになってしまっています。ただし、自分でポートの初期化をしてしまうとか初期化ルーチンを作るとかしてしまえば MC908QB8 の追加機能の恩恵を受けることが出来る部分もあります。
また、ピン互換の HC08 に載せ変えてしまうという荒業もあります。この場合、Ticolla や Ticolla CDE は使えなくなってしまいますので、Freescale CodeWarrior とか SDCC での開発環境を使用することになります。 
 
HC08 マイコンの購入はこちらで出来ます。
 
Ticolla CDE はインラインでのアセンブラ記述も出来るようです。子供の頃夢だった 6800 のインストラクション勉強しなおして書いてみようかな...
posted by モッパー at 12:38| Comment(0) | TrackBack(0) | ロボデザイナー

2008年12月09日

ROBODESIGNER(ロボデザイナー)のノウハウ(2)

PWM と Interrupt の両立が難しい。JRT-104 は JRT-101よりタイマ本数が増えてるので、増えたタイマを初期化して PWM とは独立したタイマ割り込みを実現出来るはずだが、まだ出来てません。初期化関連のライブラリのソースコードが入手出来て、かつ手を入れることが出来ればなんとかなりそうですが... Freescale CodeWarrior で ROBODESIGNER 用の開発環境作ってしまっても良いんですがそこまで手が回りません。このあたり、LEGO 関連を巡る状況との大きな違いを感じます。自分自身の行動の反省を含めてですが、やっぱり色々なしがらみを飛び越えてイノベーションを目指す能力が日本人には著しく欠けていると思います。既に存在するものの緻密な検証とかスペックが明確になった後の高品質なモノの実現には恐ろしく長けている民族なんですが、全くもったいない。さらにはそういった文化を後続する世代にコピーしつつあることが最も問題だと思います。
posted by モッパー at 23:09| Comment(0) | TrackBack(0) | ロボデザイナー

2008年11月08日

ROBODESIGNER(ロボデザイナー)のノウハウ(1)

ROBODESIGNER(ロボデザイナー)の開発環境である Ticolla CDE (JRT-104) について分かったことを書いておきます。(2009/5/16 CN12 と CN13 が I2C 通信用のコネクタと分かったので、内容を改訂しました。)
  • JRT-104 は多分 MC68HC908QB8。もし当たりなら、A/Dが10bit化されているとか、タイマ本数も増えているとか、そのあたりの恩恵も受けられるはず。net 上にMC68HC908QB8のマニュアルは転がっている。JRT-104 を高度に使いこなすためにはこれを入手することが必須。
  • コンパイラは SDCC を使っている。
  • <= や =< はどうもまともに動かないことがある。(未確認)
  • a.c というファイルの自作関数から b.c というファイルの自作関数は呼べない。b.c の自作関数をa.c に入れてローカル関数にしないとダメ。
  • CN12 や CN13 は I2C 通信用のコネクタ。ピンアサインはこの記事の下のほうにあるポートアサイン表を参照。
  • CN12 と CN13 は I2C メモリを使ったり I2C センサと通信しないのであれば、Digital in/out にも使える。ただし、他のコネクタとピンアサインが違うことに注意が必要。H/W 定義はできないので、main.cでinit(); の直後で以下のようにやれば良い。(Digital in の場合)
    CONNECTER12 = 0;
    CN12DDR = 0;
    CN12PUE = 0;
  • #pragma less_pedantic しないと、コンパイラのロジックチェックが厳しすぎて苦労する。礼儀正しいコード書けば良いだけだが子供には厳しすぎる。
  • stdio.h とか float.h もあるが、ひどくメモリー食い。そんなもんいるかという話もあるが、float は使わず整数演算にしたほうが良い。
  • JRT104 のポートアサイン表です。 JRT104port.pdf
  • 動作中にポートの In/Out 変えることも可能。ただし、CN5 は何故か出来なかった。他にも出来ないポートあるかも。
posted by モッパー at 13:44| Comment(3) | TrackBack(0) | ロボデザイナー
にほんブログ村 その他趣味ブログ 電子工作へ