ソフト

2023年11月20日 (月)

BLACK FRIDAY セールの話

BLACK FRIDAY セールの話とは

 よく知らないが、ちまたでは BLACK FRIDAY なるセールが始まっている?始まる?そうで、今回見つけたのがまた Adobe のセール。Scrshot-20231120-164800

Scrshot-20231120-215241
アマゾンでもやっているようで、こちらは 30%ぐらいのディスカウントのようだ。何せ今の通常の Creative Cloud は ¥6,000/月 程度なのに今回は ¥3,564 なので、今契約しているプランを解約してこれに変えてもだいぶ安くなるはずと思う。

 まてよ、この前そんなことがあったな、と思ったら今年2月にも他のアカウントで、Adobe 契約更新したっけ... と思い出し、さっそく現行の契約を止める所を見るとたしかにありました。(以下画像は新規の部分です)
Scrshot-20231120-215909

しかしながら、一筋縄ではいかずに 契約解除→解除の理由「高いから」→他のプランに変更→全てのプラン など操作していく内に、ありました。結果、結構安くなりましたね。現状は年払いで2月まで契約だったので、残りの分は返金してくれるようです。

 放っといてそのまま払い続けるユーザーには分りにくいようにしているあたり、Adobe も利益優先の会社ですね。
Photosyop Ver3.0 からのユーザーで、毎回バージョンアップし続けた私のようなユーザーに、何の特典もない現状のサブスクも考え直して欲しいなぁ
Scrshot-20231120-221102

| | コメント (0)

2023年10月25日 (水)

PIC18FQ MCC で I2C

PIC18FQ MCC で I2C とは

呪文みたいな表題になってしまったが、ちょっと I2C 通信でトラブったので、そのメモ代わりに書いておく。

MCC とは Microchip Code Cpnfigure といったソフトで、 UI でCPUの周辺動作を規定したり、動かすのに必要なドライバーを書き出してくれるます。 MPLAB-X IDE という 最近の開発環境での付加ソフトなのですが、最近まで使っている古い MPLAB IDE というソフトと違って、簡単にソフトが作れるそうなのですが、内部構造が判りにくくて、資料が少ないことから結構難儀しました。

今回は I2C 関連でのおはなし

i2c1_master_example.c というサンプルコードが生成されるので、見てみると

void I2C1_WriteNBytes(i2c1_address_t address, uint8_t* data, size_t len)
{
    while(!I2C1_Open(address));  // バスがBUSYのうちは待っている
    I2C1_SetBuffer(data,len);   // 書き込むデーターの アドレスと長さ
    I2C1_SetAddressNackCallback(NULL,NULL);
                 //反応無いとき "NACK"の場合の処理 ここでは何もしない
    I2C1_MasterWrite();   // 書込処理
    while(I2C1_BUSY == I2C1_Close());  // 完了待って STOP 処理
}

これは大体判る。ここにある xxxxCallback という部分がくせもの
ここでの i2c1_address_t address  は,7ビットなので、実際送信時は シフトされて RW ビットが追加される。

次は EEPROM読み出しなどに使うアドレス指定書込後、RESTART してデーターを読むようなのだが

void I2C1_ReadDataBlock(i2c1_address_t address, uint8_t reg, uint8_t *data, size_t len)
{
    i2c1_buffer_t bufferBlock;         // 結果を書き込むバッファを作成
    bufferBlock.data = data;
    bufferBlock.len = len;

    while(!I2C1_Open(address));  // バス開放待ち
    I2C1_SetDataCompleteCallback
                 rdBlkRegCompleteHandler,&bufferBlock);  //ここがキモ
    I2C1_SetBuffer(&reg,1);          // 送信するデーター 1バイト
    I2C1_SetAddressNackCallback(NULL,NULL);
          //反応無いとき "NACK"の場合の処理 ここでは何もしない
    I2C1_MasterWrite();
    while(I2C1_BUSY == I2C1_Close());  // 完了まで待って STOP 処理
}

ちょっと見ると I2C1_MasterWrite(); だけなので、書き込むだけでどこで読むんだろう?
と思って見てみると I2C1_SetDataCompleteCallback というのがありますね。
DataComplate とあるので、送信が完了した時の動作を指定するところのようです。
この rdBlkRegCompleteHandler というのは、まさに RESTART を送って、データーを読み込む所のようです。

i2c1_buffer_t bufferBlock;  と言う物を作って、アドレスと長さを指定します。

このルーチンは、送信時のレジスタ指定が1バイトなので、256バイト以下ならいいですが、大きな EEPROM などでは足りません。
そこで、

(i2c1_address_t address, uint8_t reg, uint8_t *data, size_t len)
....
I2C1_SetBuffer(&reg,1);  
の部分を

(i2c1_address_t address, uint8_t *reg, uint8_t *data, size_t len)
...
I2C1_SetBuffer( reg,2);  
と2バイトにして ( uint16_t にしてもいいかな?)

新たな関数を作ってみました。

*結局 MCCの作成する I2C ルーチンは、ステータスを定義して

バスは空いているか?
書き込めるか?
書いたら完了したか?
応答はあったか?
完了したら次はどうするか?
全部終了したか?
STOPで終わる

など、順次実行するもので、ソフト上からはあまり良く判らないのが難点ですね。
そのままだと、相手がいなくても、反応がなくても止まることがないので初心者にはいいかな?
エラー処理をきちんとやろうとすると面倒かも?

| | コメント (0)

2019年10月10日 (木)

「mbed のボードに書き込む」はなし

 ここのところ、ARM の CPUを使ったボードで開発する案件を手がけています。

初めはPIC で開発したのですが、メーカーのライブラリが 64Bit 演算に対応していないといけないらしく、PIC16F1シリーズではコンパイラが対応してなかったので、急遽 PIC24F シリーズに変えたのですが、どうも演算ライブラリが ARM に依存している部分があるようで、結局「ARM でやった方がスピードの点でも早い」ということで、慣れない開発環境で始めました。

NXP(旧モトローラ)が提供する開発環境で MCUXpresso IDE というものですが、古くは LPCXpresso といった開発環境で書籍にはこちらの紹介は多くあります。トラ技の トラ技ARM ライター なども LPCXpresso の記事があって参考になったのですが、デバッグ時の記事ばかりで、実際に Flash ROM に焼いてスタンドアロンで書き込む記事があまりないのです。

 仕方が無いので、英文の MCUXpresso IDE User Manual や、Help とかみて、release 用にコンパイルしないといけないとか、ライブラリも Debug と Release 両方に登録しないといけないとか、色々面倒ですが解決してやっとビルドが通るようになりました。

 しかしながら、RUN すれば自動で書き込んでくれて、それでいいだろうと思って動かしてもダメで(私の操作、ライターの選択が悪かったかも知れませんが)、RUN出来ないのです。

20190917-165009

UserGuideを見ると、どうやらFlash Programmer なる機能があるようで、これを起動して、releaseフォルダにできた xxxx.axf というファイルを指定すれば良いようです。これで、やっと書き込めました。

 そして、最終的に開発基板でなく量産用に似ているCPUを使った mbed 用の小型ボードに書き込み、動作確認することになりました。説明では mbed ボードの2つのスイッチを押しながら、PCの USBポートに接続し、RSET SW の方を離すとPCにUSBメモリーとして認識されるということで、そこまではあっけなく行きました。
 しかしながら、他の情報にあった xxx.axf ファイルから xxx.bin ファイルに変換してから書き込む。という手順に則って書いたのですが、RESET SW を離しても USB メモリー認識状態のまま。一向に動こうとしないのです。試しにサンプルファイルの xxx.bin というやつをダウンロードして書いてみると、動くんですね LED チカチカプログラム。

 ネットで検索してもなかなか解決法が出てこないときに、ふとトラ技の古い記事を見つけました。

2014年5月号の 「トラ技ARMライタ用デバッガファームウェアができるまで」という記事です。このトラ技ARMライタというのは、ほぼ mbed ボードなので、書き込みも同じようにして書くことは判っていました。この記事の最後の部分。

●作り方⑭...チェックサムを加える にありました。
 ...認識させて正常に動かすためには、チェックサムを付加する必要があります。チェックサムを付加するときは、
checksum.exe-p LPC11U35-d firmware.bin
とコマンドラインで実行すれば大丈夫です。

とありました。

実際には checksum.exe をユーザーフォルダにコピーして、作った xxx.bin も同じフォルダに入れて、コマンドプロンプトを起動して

checksum-p LPC11U35-d firmware.bin

で書けました。

昔のトラ技って役に立ちますね。

注:中古雑誌では ARM ライタ付属していないのがほとんどです。

| | コメント (0)

2019年4月18日 (木)

How To C [ else]のはなし

Howtoc_if
今回は if( ) .... に対する else のはなしです。
if( xxx ) {
....
}

だけですむ場合はいいのですが、違った場合も処理をしたい時、例えば 7 がアタリの場合

if( A == 7 ){
  print ( " アタリです");
}

だけでは、はずれたときに分からないので

if( A == 7 ){
   print ( " アタリです");
} else {
   print ( " ハズレです");
}

という具合に、 else 以下の {  } のなかに、違うときの処理を書きます。

「じゃあ 4 の時も当たりにしたいときはどうしたらいいでしょうか?
普通に考えると、else { } の中に また if 文を入れれば良いので

if( A == 7 ){
   print ( " アタリです");
} else {
    if( A == 4 ){
       print ( " アタリです");
    } else {
       print ( " ハズレです");
    }
}

さらに、 77 も当たりにしたい場合は

f( A == 7 ){
   print ( " アタリです");
} else {
    if( A == 4 ){
       print ( " アタリです");
    } else {
       if( A == 77 ){
           print ( " アタリです");
        } else {
           print ( " ハズレです");
        }
    }
}

とだんだん見にくくなります。この記述をシンプルにするには

else if という命令を使います。 else と if が まとまった物なので「違うけどこの場合は...」って文で楽です。例をあげると上のプログラムは

if( A == 7 ){
   print ( " アタリです");
} else if( A == 4 ){
   print ( " アタリです");
} else if( A == 77 ){
   print ( " アタリです");
} else {
   print ( " ハズレです");
}

とインデントがすっきりして見やすくなりました。
次回は、さらに見やすくなる 方法を考えましょう。

| | コメント (0)

2019年4月 9日 (火)

How To C if() のはなし

今回も How to C
前回の続きで 今回は if(  ) のはなし

Howtoc_if

条件で計算やプログラムの流れを変えるには

if( xxx ) を使います。

A がもし 10 以上だったら、B を1つ増やし、 Aから 10 引く計算をします。
これは Aが1の位 B が10の位の変数とする場合など良く使いますね。

if( A > 10 ){

   B = B + 1 ;
   A = A -10 ;

}

と書きます。

ここで、前回から使っていたんですが 計算文の最後の " ; "のセミコロンですが、Cでは命令文の最後を示します。
何も書かないで勝手にリターンしたままだと、エラーになります。

「だけど、 if( A > 10 ) の中は " ; "は無いし、その行の if( A> 10 ){  の後もないじゃん!」

と言うでしょう。そのとおりです。これら条件式 ....if()の中の文や
その行は(正確に言うとここは { } の中に当たるから)つけません。

別の書き方をすると

if( A > 10 ) {   B = B +1 ;   A = A -10 ; }

と書いてあるのです。つまり、改行やスペース、タブなどは 無視されているのです。
1つの計算式の終わりに " ; " をつけるのです。

*ここでちょっと問題が出ました。 Aが 20 以上の場合に、A がまだ 10  より多くなってしまします。
そこで、if のなかにさらに if を入れることもできます。

if( A > 10 ){
   B = B + 1 ;
   A = A -10 ;

   if( A > 10 ){
       B = B + 1 ;
       A = A -10 ;
    }

}

ここで2回目の if の位置(インデントと言います)がその前の A = A-10; の頭とそろっています。
こうすることによって、これは初めの if の中の if 文だとわかります。


では if( xxx ) じゃなかった場合はどうするのでしょう?

C では else という文を使います。 それは次回

 

| | コメント (0)

2019年4月 7日 (日)

"=="ってなんだ

前回の続き How to C です。

Howtoc
この "=="とイコールが2つならんだのは、前回の "="の代入ではなく
等しい
とう、まさに イコールを表すものです。
なんで "="を2つつけるかと言えば、「もう "="は使っちゃたので」区別のため "=="」なのです。
その辺が Visual Basic との考えの違いで、そちらは「使う場所や、場合が違うので、いいんじゃない}
とおおらかなのか、いい加減なのか マイクロソフトです。
だいたい Visual BAsic は A という変数に 文字で "100" と入れたあと、
A x 10 =
とやると 数値で 1000 と勝手に数値に変換して計算くれる
ある意味柔軟な言語です。
と、話は戻りまして、"=="はどう使われるかというと、条件分岐などで使うのですが、例えば
もし A が 10 だったら、5足して
などというプログラムを
if( A == 10 ) {
    A = A + 5 ;
}
と言う風に書きます。
if(  xxxx ) は、文字どおり 「もし xxxx だったら」という機能でこの ( xxxx ) の中の条件が合った場合、次の { ..... } に囲まれた部分が実行されるのです。
ですから、 Visual Basic みたいに
if( A = 10 ){
   A = A +5 ;
}
と "="を1つしか書かないと、Aに10 を入れる作業を行った後,この式は A = 10 という正しい事を行っているので、そのままエラーにならずに次の
 A= A+5 を常に実行してしまうことになります。
デバッグしていても、エラーにならずに、「よし A= A+5 やってるな」って具合で見過ごすことも多いです。
この条件式 "=="は仲間がいて、大変判りやすいのが

if( A > 10 )  ...... 10より大きい
if( A < 10 )   ..... 10より小さい
は、数学で使うので知ってますね? そして
if( A >= 10 ) .... 10以上(10の時も含む)
if( A <= 10 ) ....  10以下(10の時も含む)
も判るかと思います。ここで、注意なのが
if( A => 10 )
if( A =< 10 ) は、エラーになることです。"="は後づけなのですね。
この仲間に
if(  A != 10 ) .... Aが 10でない場合
があります。不等号で "<>" ってやりたくなりますが、 "!" ノットをつけて
ノットイコール "!=" と書きます。
今回は "=="から、条件分離に使う if ( xxxx ) の事をちょっと入りましたので、次回は この
if( xxxx ) をもうちょっと詳しくやってみます。
この if( xxxx ) が出来て、計算式が出来れば 大抵の計算プログラムは出来ます。
意外と簡単ですが、組み込みCPUプログラムでは、スイッチの入力や表示まで自分で作らないとならないのでそっちの方が大変ですが、最初は多くの機能を使わないでプログラムを書くのが大事ですね。ミスも少ないし...

| | コメント (2)

2019年4月 2日 (火)

How to C

新元号が発表されたと言うのでなんか書こうかと思ったが、つまらないのでしばらくソフトの入門的な話を書こうと思います。

いまさらアッセンブラ関係を書くには忘れてしまったし、C++などは基本よくわからないので、Cの話にします。

私は時々 Visal Basic もやるので、けっこう C と Basicでよく書き方を混同して間違えます。そもそもプログラム言語というのは作った人の都合があるので、普通の算数の文法からして、間違えやすいのですね。まずは今回は

Howtoc
普通の算数で
1+1 を計算するには
1+1 = 2
と計算します。
でも プログラムでは
まず入れ物を用意します。
A とします
これに まず 1を入れます。
算数では  プログラムでは
   1              A =1
これを代入式といいます。
ちっと変なのが、右のものを左に入れることです。
                   1 = A
とは 書けません。
この場合 1を定数(決まった値)
Aを変数といいます。
次に 1を足します。
算数では  プログラムでは
   1 +1             A =A+1
プログラムのほうはなんか変ですね
右辺と左辺が違うのに = があるなんておかしいです。
この = は代入ですのでわかりやすく書くと
新A  ← 旧A + 1 
ということです。
同じ A なのに時間関係が違うのです。
算数(電卓など)では
 1+1 =(もしくはエンターキー) と書くと
2 と表示されますが、
プログラムではどう使うかわからないので
 A
のままです。
たとえば
Print( A ) 
という
Aを印刷(表示)せよ
という操作をすると
Print( A ) 
2
と表示されて分かるわけです。
表示させないとわからないのが困ったもので
ここで、よく間違いは起こります。
ここまで説明した通り
 = 
は、プログラムでは代入すること
右辺の内容を左辺にコピーです。
A という入れ物に B を入れるならば
 A = B 
でオッケーです。
A= 1
A= 1
A= 1
A= 1
A= 1
と何回実行しても
A は1のままですが
A=1
のあとに
A= A+1
A= A+1
A= A+1
A= A+1
A= A+1
とやると
A= 1          // Aは 1
A= A+1      // Aは 2
A= A+1      // Aは 3
A= A+1      // Aは 4
A= A+1      // Aは 5
A= A+1      // Aは 6
となって、新しいAになって中身が増えていくのです。
足し算もちょっとわかって来たかと思います。
しかしながら C では困った記号があるのですね
==
というイコールが2つ続いたやつです。
これは、比較演算子といって全然違う記号です。
よく間違うんですよ
VisualBasic ではこれがなくて
=
が、== と同じ意味なのです。
詳しくは次回

| | コメント (0)