目次
テストベンチを使えば、実機で確認するよりも、
早く開発ができる。
そこで、今日はテストベンチを書いていた。
しかし、実機上ではうまく動いているのだが、
テストベンチがうまく動かなかったりする。
どういうことなんだろうか。。
ISE WebPACKで、
波形を確認するツールを使うと、
1000nsまでの波形しか見ることができない。
This is a Lite version of ISE Simulator(ISim).
と書いてあるし、機能制限なのだろうか。
テストベンチの、50000行までの制限はあるらしいけど。
(チルダ)が見えなくなる問題†
ISE標準のエディタを使っていると、~(チルダ)がまったく
見えなくなることがあるようだ。
コピーして、他のエディタで見れば、分かるみたい。
印刷しようとしても、印刷できない。
原因不明・・・?
その上、その後プリンタの調子がおかしかった。
他の人まで印刷できなかったり?した。
このソフトが原因かどうかまでは定かではない。
ステートマシンを書き、状態遷移させるHDLを書いた。
その後、状態に応じた制御信号を出力させた。
最初は、うまく出力されなかった。
どうやらデコード方式のステートマシンが、
ワンホット方式のステートマシンへ最適化されたらしい。
そのときに、出力されるはずの制御信号が、消されたらしい。
原因は、よく分からないが、HDLを書き換えたりしていると、
デコード方式の論理合成結果になった。
何だったんだろう。
配置配線のピン配置を決める時に、「PACE」というソフトが使う。
このソフトでピン配置を決めて、後にポートリストを変更後、
再度ピン配置を決めると前のピン配置のデータが残ってしまうようだ。
しかも、ピン配置を変更しても、どこかにデータが残っているらしく、
必ず警告に遭遇してしまう。
top.ucfを直接見ても、何も書いていないはずのピンにエラーが・・・
よく分からない。
秋田先生にコツを教えてもらいチャレンジ
結構時間がかかったけど、コツを掴めば、SDRAMのはんだづけはスムーズに終わった。
が、カメラモジュールの半田付けがうまくいかない。
問題は、ランドの位置と、カメラモジュールにわずかな隙間ができてしまうようだ。
PCBEで設計する時にぴったりにしすぎたせいのようだ。
何か解決方法を考えなければ。。
基本的には、グリッドは1.27mmあたりに固定し、 長めの配線を引くようにするとよいと思います。 グリッドのことなる部品の足のまわりは、 端点接続(T)を活用して、最小限だけ斜め線をひっぱって、 あとは1.27mmのグリッドに載せるのが、よいように思います。
できるだけきれいに線を引こうとか考えていたせいか、
ピッチ幅をいろいろ変えすぎて、最終的に苦労する結果になった。
ピッチ幅をいろいろ変えていたせいか、端点を接続しても
等電位にならないことがあった。なぜか「交点・端点」コマンドを使っても、
うまくいかないこともありました。何度かやるとうまくいったり!?
試しに先生に書いてもらったチュートリアルを実行する。
図入りでかなり分かりやすい。
戸惑う所はなかった。
うまく動かないと思っていたら、
どうやらうまく動いているらしい。
ただ、赤色が青色に比べて明るすぎるみたいだ。
例題1.2の回答例?
void main()
{
// Insert your main routine code here.
BYTE d;
PWM8_1_Start();
PWM8_2_Start();
M8C_EnableGInt;
ADC8_1_Start(ADC8_1_FULLRANGE);
ADC8_1_bCal(0x42,ADC8_1_CAL_VBG);
ADC8_1_StartADC();
PWM8_1_WritePulseWidth(10);
PWM8_2_WritePulseWidth(10);
while(1){
while(ADC8_1_fIsDataAvailable() == 0);
d = ADC8_1_bGetDataClearFlag();
PWM8_1_WritePulseWidth(d);
PWM8_2_WritePulseWidth(255-d);
}
}
どうやら\0、NULL文字を入れ忘れたせいらしい。
NULL文字まで出力してくれるというのが、PutStringらしい。
100バイト同時もOKだったが、
1000バイト書き込むと、どうやらエコーも256バイトまでのようだ。
CRも含めて256バイト
なので、文字列は、最大255バイトまでなら送ってもいいようだ。
UART_SDCARD_CmdReset();を入れただけでは、
解決しないようだ。
// Echo off.
UART_SDCARD_PutString(SDcmd[SD_E0]);
UART_SDCARD_PutChar(CR);
while(1){
//Menu Select
SW = UART_PC_cGetChar();
switch(SW){
case 49: //1
UART_SDCARD_PutString(SDcmd[SD_E0]);
UART_SDCARD_PutChar(CR);
Receive_func();
break;
エコーオフの>がRXバッファに残る
��iを送信後、Receive_func();で読み取るが、エコーオフの>を読み取り終了
結局、iで返ってきた情報が読めず。。
��iのコマンドの最後だけ、>だけがまた残る(Rxバッファはおそらく1バイトなので)
�´△侶�り返し
おそらくこんなことが起こっていたのだろう。。(汗
秋田先生に報告したら、
バッファオーバーランエラーのフラグを見てやればよかったね、とのこと。
たしかにそうだ。RxState()で状況を判断すれば、もう少し早く問題を
解決できたかもしれない。
今後の参考にしよう。
結局、今回の場合は、意外なところで>が返ってきていたので、
気づかなかったわけである。
だから、ピンを立てて、直接返ってきている信号を見てやれば、解決しそうだ。
あくのりっちが突然固まる。
次に再起動しても、2ポートにCP2102を使えないっぽい。
UART_PC_CPutString("test3!!\r\n");
//Receive Prompt
while ( !( RxState =UART_SDCARD_bReadRxStatus() & UART_SDCARD_RX_COMPLETE )){}
if( RxState == UART_SDCARD_RX_COMPLETE){
//Start Receive
Receive_Prompt = UART_SDCARD_cGetChar();
if(Receive_Prompt == 0x3e){
UART_PC_CPutString("Prompt >");
このプログラムの一行目をコメントアウトすると、
”>”が受け取れなくなった。どうやらCPutStringしているところをコメントアウトすると、
エコーをcGetCharで受信してしまうようだ。
エコーはオフにしておいた方がよさそうだ。
プロンプトまでか、100バイトまでを読み込んだ後にCPutStringで出力していたが、
これだと100バイト分出力されてしまうので、おかしくなる。
CWriteで指定バイト分だけ出力した方がよさそうだ。
char Receive_Data[100];
UART_PC_PutString(Receive_Data);
while ( !( UART_PC_bReadRxStatus() & UART_PC_RX_COMPLETE )){}
while(1){
if( (Receive_Data = UART_PC_cGetChar()) != 0x3e ){ // ">" de nainara
UART_PC_PutChar(Receive_Data);
}else{
break;
}
}
while ( !( UART_PC_bReadRxStatus() & UART_PC_RX_COMPLETE )){}
は、cGetCharではいらないっぽい。
よく考えてみれば、cGetCharは、受信するまで待ってくれる
UART_PC_IntCntl(UART_PC_ENABLE_RX_INT); // Enable RX interrupts
UART_PC_IntCntl(UART_PC_DISABLE_RX_INT);
を明示してやれば、受信割り込みの許可・不許可の切替可能
こうすれば、前の受信割り込みの問題を解決できるかもしれない。
今更ながら、もう一度PSoCのUART通信について、試してみようと思う。
自分への備忘録。
3eである“>”を受信するまで、繰り返しcGetCharで取り込むというプログラム。
char Receive_Data;
while((Receive_Data = UART_PC_cGetChar()) != 0x3e ){ // ">" de nainara
UART_PC_PutChar(Receive_Data);
}
しばらく動かなかったが、どうやら原因は、
UART_PC_IntCntl(UART_PC_ENABLE_RX_INT); // Enable RX interrupts
が入っていたためらしい。
前に先生に聞いたことあったのに、忘れていた。。(汗
cGetChar自体はRXの割り込みを使っていないので、コメントアウトしないといけないみたい。
ということは、szGetParamとかと一緒に使う時には、
その都度切替が必要なのかな。
UART通信のサンプルプログラムは、
コマンドを入力して、コマンドとパラメータを分離するようなプログラム。
これを普通の文字列を取り込むプログラムにしておきたい。
char *strPtr;
UART_PC_CPutString("\r\nWelcome to PSoC UART test program. V1.1 \r\n");
while(1){
if(UART_PC_bCmdCheck()){
while(strPtr = UART_PC_szGetParam()) { // loop on each parameter
UART_PC_CPutString(" <");
UART_PC_PutString(strPtr); // Print each parameter
UART_PC_CPutString(">\r\n");
}
}
UART_PC_CmdReset(); // Reset command buffer
}
これが何故かうまく動かない。。
ほとんどサンプルと同じなんだけどな、、
ちょっとプログラム変えたら、意味不明なエラーが大量に出てきた。
単純なミスだけど、すごく発見しづらい。。
PSoCのエディタは、見づらいので、他のエディタで作成するというのも
ありかもしれない。
今年の情報共有方法は、Wikiにすることにしました。
MeRLWikiで使い慣れているということもあるし。
どこまで浸透するかな〜〜