• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

C.A.Mのブログ一覧

2019年09月26日 イイね!

SPIマシン語チューン

ということで、
マイコンを速いやつに取り替える

っていうんでは、チューナーとは言えないので、
ここはチューニングで速くするのがスマート🤭


機械語で1文字表示ルーチンを作りました。
x 5のところは、左シフト(=2倍)を2回しもう一回元の数字をたす。
フォントのデータはプログラムメモリ上に置いてあるので、上位アドレスのビット7を1として読み出す。
フォントのデータのドット有無(=ビット検出)は、ビットマスクを準備しておいてそれをシフトしていって縦軸に合わせる方法。
図で、andして………“1なら点あり” のところ、“0以外なら点あり”のまちがい。

Cコンパイラの時は、
計算式が簡単に書けるばっかりに、計算に時間がかかるコードを書いてしまっていたようです。
機械語は自由がきかない分、自然とシンプルな流れになる♪
この計算方式はコンパイラでも使えるはず。

で、結果は

データとデータの間の880nsecは、ちょっと遅くなった?
ドットとドットの間は計算に時間がかかっていた31usecから、
なんと2〜3usecと10倍ほどもスピードアップ♪

これによって、1文字描画は

560usecくらい、約3倍に高速化しました♪


スクロール後の1行消去のほうは

あんまり代わり映えしなくて9.1msecくらいです。
Cコンパイラもなかなか頑張ってるんですね。
メーカーが言うように無理にアセンブラでやることは無いのかも。。。


結構速くなったし、これ以上を求めても難しくなりそうなので、
単線シリアルデータ受信のボーレートを
LCD描写能力に合わせて9600ボーに落としました。


できました♪



Posted at 2019/09/27 22:05:30 | コメント(0) | トラックバック(0) | PIC ESP32 マイコン | 日記
2019年09月25日 イイね!

SPIにもいろいろある

SPIの送信のところのタイミングを見てみます。


SSPI1BUFというバッファレジスタにデータを書き込んでやれば、
データが送信される仕組みです。

タイミングをログするためバッファへの書き込みの前後にLEDをオンオフして
その様子が見れるようにロジアナへ追加入力しました。

1つ目のデータは
バッファへ書き込む前にハイ、書き込んでからすぐローにしています。
CPUの1サイクルは125nsecなので、
プログラムコードでは3サイクル=375nsecのはずが、
740nsecかかってるみたいです。
約倍の6サイクルなので、
CPUがなんらかの仕事を3コード実行してるみたいです。 ←妄想です。

2つ目のデータのところ拡大。

ちょっと前にスルーレートコントロールとやらで、
マイコンの出力ポートの応答が遅れる?
っていうのがありましたので、
確認のため、LEDハイ即ロー即ハイというのを入れてみました。
スルーレートコントロールの設定をマキシマムにしてあるので、遅れはほとんどなく、
ほぼ1サイクルずつで切り替わっているようです。
なので、出力ポートの遅れはないものとして考えて良いと思います。

バッファレジスタに書き込んでから実際にSPIのバスにデータが出始めるまでにも
結構な ”間“ が有るんですね。500nsec=4サイクルくらいかな?


という実験結果を見てから、そういう目でデータシートを見直してみると

どうやら、SSPI1BUF バッファレジスタに書き込んだあとに、データはSSPI1SRシフトレジスタというところに移されるみたいです。
シフトクロックってのが入っているから、1ビット送信するたびシフトさせて、
送信ビットと受信ビットを入れ替えるための作業用スペースかな?
で、これらの作業はCPUがやってるのかな?

これが今、デバッガモノリスに使ってるPIC16F1系のマイコンです。


対して、次期モーモニに使おうと思っている
上位機種のPIC18F26K83では、

どうやらSPIコントロール専用のハードウエアが内蔵されていて、
CPUはバッファにデータを書き込んだら仕事は終わり。
あとはハードウエアがやってくれる ということのようです。
とすると、やっぱりPIC16F1のはCPUが全部仕事させられているってことかな。
← 妄想です。



マイコン自体は100円とかしか違わないんだから、上位のマイコンを使う方がずっといいですねぇ。
シロートDIYでは下位のものを使う意味は無いのではないかと思います。
←妄想です。

と言っても
買ってしまったものは なんとか有効に消化しなければ。。。 ←貧乏性です。
Posted at 2019/09/27 13:45:50 | コメント(0) | トラックバック(0) | PIC ESP32 マイコン | 日記
2019年09月23日 イイね!

Cコンパイラの中でアセンブラ

スクロール後の1行クリアとフォント1文字描写の高速化を機械語でやってみようと思います。
1文字描写の方はフォントデータのビット処理の部分で結構いける気がします。

しかし、
ここで、MPLABX&XC8での
.asmモジュールの組み込み方法が?????
インラインアセンブルという方法もあるのですが、
なんだか注釈行みたいで かっこ悪い。
ちょっと長めのプログラムになると面倒そう。

いろえろ検索しても、そのものズバリの答えは見つからなくて。。。
メーカーに問い合わせるも、お勧めできない方法とのこと。




なんてことはない、XC8 user’s Guideに出てました。
が、詳しすぎて難解です。。。😌

なのですが、意外にあっけなく うまくいったので、結果だけ😛



.cファイルの方では、
関数も変数も普通にunsigned char 、8ビット幅宣言でオッケーです😃




.asmファイルの方では、
.cで宣言した関数、変数の名前の前に“ _ ” アンダースコアを付けて、
GLOBAL で宣言。
その後、呪文を一文。意味は考えなくてオッケー👌
あ、includeも忘れずに。

関数は、名前の後ろに ” : ” コロンを付けてラベルとすれば、
.cから普通の関数呼び出しでとんできます。
引数はwレジスタに直接代入されるし、帰り値もwレジスタの値がそのまま送られます😄


しかし、アセンブラの命令語にはマップトファイルアドレスが7ビットで書かれるので、そのままのラベルを書くと今まで見たことのない、へんちくりんなエラーが出ます😓
なので、

画像のように、変数ラベルを7ビットで再定義しておくとラクできます。
ただ、バンク切り替えは ほぼ必ず必要と思い、忘れないようにしないと。。。

変数をいろいろ宣言するとアドレスがあっちこっちになってしまいます。
そうなるとバンク切り替えの手間が増えてしまうので、
配列変数で宣言しておくことで、アドレスが連続になって、扱いやすいと思います。



以上、”コンパイラアセンブラ混在の方法がわかった♪”でした。

つづく
Posted at 2019/09/26 22:26:16 | コメント(1) | トラックバック(0) | PIC ESP32 マイコン | 日記
2019年09月23日 イイね!

スピードアップ

デバッグ用にprintfした文字を単線シリアルで受けてLCDにテキスト表示させるモノ
を作ってます。

が、どうにも表示が遅い。
受け取るデータ量が多くなると文字が飛ぶ。。

タッチパネルを触った時のデータを赤基板とモノリスの2つで受けてみると、
字の飛び方が違うところは受信側の問題でおきてるんじゃないかな。。。。


とりあえず、
マイコンがLCDに対してどんな仕事しているのかをロジアナ♪

一番上の青が単線シリアル受信データ。
緑がLCDを描画しているSPIのデータ。
1文字表示に1.5msecくらいかかってる。



3バイトでカラー1ドットが打たれます。
データとデータ間は、
普通にMCCで準備されるspi1_exchangeByte();をコールしていて約3usecかかってます。
ドット間は、31usec。これはフォントデータを読みとって計算してたりする時間。


これは、上に1行スクロールさせた後、
最下の1行をクリアするのにかかる時間 約9.5msec。
画像は単位がサンプリングのステップ数になっていますが、8ビットデータの間は、サブルーチンコールをやめて、ベタでずらずらコードを並べたので、
90ステップ=1.125usecになってます。


SPIの送信完了の検出の方法を探ってみて

PIR1STATbits.SSP1IFからSSP1STATbits.BFに変更したら少し早くなりました。
8ビットデータとデータの間は0.75usecになりました

あとはサブルーチンコールをなるべくやめたり、Cのコードのムダを整理したりして、少しは早くなり、1行クリアは8.5msecになりました。
背景色を無視して黒で塗りつぶす という処理にすれば、5msecくらいにまで高速化はできるのですが、今はそういう気分でないので しません。


このPIC機番では、MSSPモジュールと言って、I2CとSPIの供用モジュールなので、あんまり速くないのかも。。。
今度の新型モーモニに使う予定の最新PIC18F26K83の方ではSPI専用モジュール内蔵のせいなのか、クロックがびっちり並んで、8ビット間の間はありませんでしたから。
SPI対応と言ってもさまざまみたいですね。


つづく。
Posted at 2019/09/26 21:42:16 | コメント(0) | トラックバック(0) | PIC ESP32 マイコン | 日記
2019年09月22日 イイね!

Cコンパイラの算術

Cコンパイラの算術ケースの部品はできました♪

が、








なんとも、ブサイクなので、
もうちょっと飾りつけようと思います。

1:2の長方形ってすごくカッコわるい👎

それはいいんですが、
まだバグが現れました。
どー見ても、数字追いかけても計算はあってるのに、なぜ?


条件分岐で、なぜか違う方に行ってる??

プログラム内では、わけわかんないので、
テストプログラムで実験です。

条件式の左右で変数の型が符号付きと符号無しになっていると
思ったような結果になってませんでした。

実験によると、
8ビット幅では、オッケーなんですが、
16ビット幅の時は結果が逆転してますねぇ。
これはこういうものなんでしょうか?
なんにせよ、気をつけないといけませんね。

アセンブラで長くやってきたので、
ラクしようと思って、Cコンパイラを使うようになりましたが、
この変数の型宣言、式の中での型の混在で、簡単な計算式の結果が
思うようにならなくてとても苦戦しています。

算数からやり直しです😥


Posted at 2019/09/26 13:00:34 | コメント(0) | トラックバック(0) | PIC ESP32 マイコン | 日記

プロフィール

なんか作ってれば満足
みんカラ新規会員登録

ユーザー内検索

<< 2019/9 >>

1234567
8 91011121314
1516 17 181920 21
22 2324 25 262728
2930     

リンク・クリップ

らくがき帳 てっぽう編 
カテゴリ:エアソフト
2020/04/04 21:07:14
 
むかしむかし 
カテゴリ:レース
2019/04/30 23:17:16
 
らくがき帳 カメラ編 
カテゴリ:写真 カメラ
2016/09/19 21:52:18
 

愛車一覧

ホンダ ビート 赤ビート ターボ (ホンダ ビート)
盆栽化してます。
スズキ ジムニー 紺ジムニー ターボ (スズキ ジムニー)
昔乗ってたのと同じ模様をいれました。 大事な乗用車なので、イジらない。
ヘルプ利用規約サイトマップ
© LY Corporation