ラベル PIC16F の投稿を表示しています。 すべての投稿を表示
ラベル PIC16F の投稿を表示しています。 すべての投稿を表示

土曜日, 12月 07, 2019

小型マイコンを使うということ -- 今までのまとめにかえて

自分のブログなので,自分のまとめとしておく。

PIC, AT, STMといったいわゆる小型のマイコンを,趣味,興味から使い始めてみて2ヶ月ほど。その間に,ありがたいことで,職場でも使わせていただく機会があり,いろいろ勉強になった数ヶ月だった。

なんだかんだと,PICを一番使っている。特に,内蔵モジュールのPWMとコンパレータを使った案件は楽しかった! まさにPICを使いこなしている,という雰囲気だ。
ただ,XC8/XC16と,MPLAB IDEには手を焼く。
まず,XC8は整数の扱いが他のコンパイラーと少し違う? 計算が正しいか,入念なチェックが必要。
XC16+MCCは無愛想で,生成されたサンプルがさっぱり理解できない...
とか,細かいところはやはり不満。
そして,ICSPによるプログラム書き込みはいいけど,そのままそれをシリアルモニターできないのはツラい。別途シリアル回線を準備するか,OLED等で状況表示,スイッチ等で動作変更が必要となる。
使う用途は限定されるが,MPLAB IDEのsimulationは,それなりに使える。上記,「コンパイラーは正しく計算しているか?」の検証は,ある程度できる。

STM32 Nucleo + mbed では,上記のようなPICの不満は解消される。
ハードウエア設定はほぼ皆無でよく,サンプルを見てソースコードを埋め込めば,割とあっさりと動くようになる。USBで接続したまま,mbedのweb上のコンパイラーからダウンロードされた .bin を,ターゲットにコピーするようにすれば,即,実行される。さらにUSBを接続したままで,パソコン上でシリアルターミナルソフトで状況確認が容易である。
惜しいのは,大掛かりなmbedの影響か,CPUの能力を100%引き出せてはいないのではないか,ということ。STM32であれば,ST純正の開発環境を使えば少しは違うのかと思うが,まだ試せていない。
職場でも使ってみた。いい感じではあったが,残念ながら,私の接続ミスでターゲットを壊してしまった。反省...

古いSTM32も,mbedで.binをつくり,STLINKでターゲットに書いて実行させることはできるようになった。ただしこちらも壊してしまい,深くは検証できていない。また反省...




アトメルのCPU + Arduinoの環境,小規模な制御は,上記の流れから「かなりいい線」ではないかと思っている。シリアルを接続したまま,書き込みと,そのままArduino IDEのシリアルモニターが使える。Arduino言語はそれなりによくできていて,参考になるコードもいっぱい。コーディングはしやすい。
惜しいのは,クラウドベースの開発環境が無いこと。mbedの「場所を問わずに開発」はよくできている。
それはともかく,もう少し使ってみよう,ということで,職場でも使えそうなこれを発注してみた。

https://www.dfrobot.com/product-1075.html


職場では,ブレッドボードは使わない。実験基板に,あるいは直接はんだ付けしてテストする。小規模な方が,組み込むにせよ,外でテストするにしても,有利である。
USBからプログラム,シリアルモニターが使えそうなので,開発や,状況確認も簡単そうだ。

さて,届くまで楽しみに,別のボードで遊んでいよう。

日曜日, 12月 01, 2019

ニッケル水素電池 放電器 続き

ユニバーサル基板を用意して,Curiosityの上に乗せられるようにしてみた。Arduinoのシールド風。

はんだ付けは偉大だった... あれだけ不安定だった,電圧測定,電流計算はピタリと安定し,(テスターだけど)実測値にほぼ合っている。これならいいか。想定通り,300mAほどの放電ができている。よかった...

(2019/12/4 追記)
その後,回路はそのまま,プログラムを修正した。

まずは,容量計算がおかしかったのを修正。これは根本的な誤り。1秒間の電流変化から,台形面積で容量を求めるはずが,三角形の面積の式になっていた。ああ,恥ずかしい。

また,「容量予測」 ができるようにしてみた。
いわゆる Δv/Δt をみて,終始電圧までの時間を計算。次の式で予想容量としてみた。
  • (累積容量)+(終了までの予想時間)×(現在の電流値)
簡単のため,電流値はほぼ一定であると仮定した。
テストしてみると,予想値が安定しない。電圧測定値が安定していないことが原因のようで,愚直にADを16回読んで平均をとる方法に改めた。これでかなり安定した。

いろいろ放電させてみたところ,このセットの場合,開始から約30分ぐらいで,ほぼ全容量に近い値を予想できるようになった。 よく知られている通り,放電開始直後と,終始電圧直前では,電圧の下がり方が急峻で,予想もうまくいかない。Δv/Δtが安定し,さらに累積容量が増えていくと,予想値が実際の値に近くなっていくようだ。

この回路では約300mAのゆるい放電のため,たとえば1500mAhの容量だと容量測定に5時間かかることになるが,それが30分程度の放電で予想できる。我ながら,便利になったものだ。

欲を言えば,充電も同じセットでできると,電池をセットしっぱなしで,容量チェックと捕充電もできるのだが,充電は優秀なパナソニックの専用機に任せて,手を抜くことにした。この案件はこれで終了でいいだろう!

日曜日, 11月 24, 2019

ニッケル水素電池 放電器 その2?

micro:bitで試作したものをいろいろチェックしてみると,いろいろと不具合があった。どうも実測値と異なる。簡単な回路なのに...

PIC16F1619 Curiosity をつかって,試作を組み直してみた。



CuriosityのPOT1を回すと,RC0の電圧が変わる -> 放電電流が変わる。

S1を押すと,POT1の出力を短絡し,放電電流を0にする。

電池から2.2オームに届くまでに,かなり電圧降下している。
きちんと半田付けにて作らなければうまく動かないようだ。

半田ごては注文したので,届いたらきちんと作ってみよう。

OLEDで,状況を一気に表示するのは,やっぱりすごく便利。


月曜日, 11月 11, 2019

PIC16F1619 w/Curiosity OLEDを試す

XPress Boardの件は返事待ちで悲しいけど,とりあえず先に進む。あまり活用していなかったCuriosityでOLEDを使ってみる。

 うん,とってもいい感じ(自画自賛)

バッファ領域が取れない件,バッファなしにして,キャラクターデータをそのまま書くように修正した。ついでに,xは横ドット数で良くて,yは行数 0 から 3 までの指定とした。

void OLED_char6(char character, short x, short y) {
    short table_offset = (character-0x20)*5;
    OLED_command(0x20); // Set memory addressing mode
    OLED_command(0x02); // Page addressing mode
    OLED_command(y+0xB0); // Set page start address
    OLED_command(x & 0x0F);// Set lower column start address
    OLED_command(0x10 + (x >> 4)); // Set higher column start address
    I2CStart();
    I2CSend(_address);
    I2CSend(0x40);
    char i = 0;
    for(; i < 5; i++) { I2CSend(OLED_characters[i+table_offset]); }
    I2CStop();
}

xとyの範囲チェックをあまり厳密にしていない。無茶するとOLEDが固まり,PIC側も道連れにするようだ。要注意。

派手なグラフィックとかは苦手だけど,ちょっと情報を書き出すには充分な感じ!

日曜日, 11月 10, 2019

Xpress Board で PIC16F18345 を試す

  Xpress PIC16F18345 Evaluation Board なるものを見つけまして,

https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/DM164141

.hex をドラッグ&ドロップで送り込める,なかなか面白そうなボード。買ってしばらく放置していたのだが,オシロスコープの件が落ち着いてきたので,試してみた。


今まで使ってきたOLEDを接続。プログラムは前回と同じで,例によってレジスタ設定の記述を変更した。

ビルド時,「メモリーが足りない」と怒られた。あー,バッファの領域を取れないんだなー。

暫定でバッファの量を減らし,ビルドOK

.hex をXPRESSドライブに放り込む。あっさり動き出した!! すごい!
これで不安定なICSP接続からさようならだ!と喜んだのも少しの間...

とりあえずバッファ足りない件を直さなきゃ,と,ソースを一部修正。最ビルドして,.hexを送り込むが,どうも更新してくれない。おかしい... 一番最初に送った,テスト表示をするプログラムが走る。

その後,数時間格闘。送った .hex は全て無視され,最初のテストプログラムが動く。

さて困った。日本の microchip に問い合わせを送る。返事が返ってくるかなあ...

水曜日, 11月 06, 2019

XC8 と XC16 で複数ソースファイルに使える「グローバル変数」の定義の仕方が違う?

前提として,
  • main.c
  • 再利用できそうな関数を記述した my_lib.c とそのヘッダーファイル my_header.h
  • main.c と my_lib.c で共通で使う変数 my_c
があるものとする。このいわゆる「グローバル変数」である my_c の定義,以下のように書かないと,エラーになったり,局所的なファイルになったりする。

XC8
my_header.h
extern char my_c = 'H'; // グローバル変数

void my_init(void); // my_lib.c で記述し,main.c から呼ばれる関数
void my_print(void); // my_lib.c で記述し,main.c から呼ばれる関数
my_lib.c
#include "my_header.h"

void my_init(void) {
    // my_c を使って関数記述
}

void my_print(void) {
    // my_c を使って関数記述
}
main.c
#include "my_header.h"

void main(void)
{
    // my_c, my_init, my_print を使う
}

XC8の別の方法
my_header.h
// extern char my_c = 'H'; // グローバル変数 これは不要

void my_init(void); // my_lib.c で記述し,main.c から呼ばれる関数
void my_print(void); // my_lib.c で記述し,main.c から呼ばれる関数
my_lib.c
#include "my_header.h"

char my_c = 'H'; // 実はグローバル変数

void my_init(void) {
    // my_c を使って関数記述
}

void my_print(void) {
    // my_c を使って関数記述
}
main.c
#include "my_header.h"

extern char my_c; // extern宣言必須

void main(void)
{
    // my_c, my_init, my_print を使う
}

XC16

my_header.h
// extern char my_c = 'H'; // グローバル変数 これは不要

void my_init(void); // my_lib.c で記述し,main.c から呼ばれる関数
void my_print(void); // my_lib.c で記述し,main.c から呼ばれる関数
my_lib.c
#include "my_header.h"

char my_c = 'H'; // 実はグローバル変数

void my_init(void) {
    // my_c を使って関数記述
}

void my_print(void) {
    // my_c を使って関数記述
}
main.c

// #include "my_header.h" // これが不要

extern char my_c; // extern宣言必須

void main(void)
{
    // my_c, my_init, my_print を使う
}

うーむ,わけわからん。。。誰か教えてください!(切実)

火曜日, 10月 15, 2019

PIC Curiosityで事始め

いろいろ環境が違うと結果が異なるかもしれないので,書き出しておく。

MacBook 12-inch 2017 macOS Mojave 10.14.6

MPLAB X IDE v5.25 
Curiosity 製品は DM164137 

上記ページにある,Demo Code から始めることにする。

Demo Code にある PIC16F1619_Cur_v355.X MPLAB で開いてビルド。エラーが出ている...

根が深そうなので,さっくり諦める。新規プロジェクト作成。

Project Option 
 

Low Voltage ProgrammingONにしろ,と書いてあるが,そこはONになっていた。


MCCで設定する。まずはSystem Module 動作周波数はとりあえず最低の500kHz


ADCモジュール こちらは最速に。普通にVDD基準


ピン定義
 

main.c のメインループに以下を追加。動いた!
POT1を回すと,それに合わせてLED位置が移動。adc.hやら,pin_manager.h をみると,書き方が書いてある。

    unsigned int POT1_value = 0;

    ADC_SelectChannel(RC0_POT1);
    ADC_StartConversion();
   
    RA5_D4_SetLow();
    RA1_D5_SetLow();
    RA2_D6_SetLow();
    RC5_D7_SetLow();
       
    while (1) {
        if(ADC_IsConversionDone())
            {
                POT1_value = ADC_GetConversion(RC0_POT1)>>14;
                ADC_StartConversion();
            }

        switch(POT1_value) {
            case 0:
                RA5_D4_SetHigh();
                RA1_D5_SetLow();
                RA2_D6_SetLow();
                RC5_D7_SetLow();
                break;
            case 1:
                RA5_D4_SetLow();
                RA1_D5_SetHigh();
                RA2_D6_SetLow();
                RC5_D7_SetLow();
                break;
            case 2:
                RA5_D4_SetLow();
                RA1_D5_SetLow();
                RA2_D6_SetHigh();
                RC5_D7_SetLow();
                break;
            case 3:
                RA5_D4_SetLow();
                RA1_D5_SetLow();
                RA2_D6_SetLow();
                RC5_D7_SetHigh();
                break;
        }

    }


Curiosityは,microUSBから給電。PICへは,そこから5V直接か,3.3Vに変換してか,外部から動く。
5V/3.3Vどちらでも動くことは確認した。電源を接続して放置すると,通常起動していた。
あらかじめ入っていたサンプルプログラムがすぐ動くけど,バックアップし忘れた... ま,いいか。

最初,MPLABCuriosityとの通信がうまくいかなくて,プログラムの書き込み時に止まっていた。手持ちのUSBケーブルではだめのようで,Curisity付属のケーブルを使ったらうまくいった。電源だけは入るので,発見が遅くなってしまった。

写真は気が向いたら撮ろう。

金曜日, 10月 04, 2019

PICとmicro:bitで遊んでみる 序章

先に書きますと,購入手続きしたのはこれ!

PIC Curiosity(写真は秋月電子さんのページから)
マイクロチップ Curiosity Development Board
https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/DM164137
  • USB直結ですぐに開発が始められる。
  • SW/VR/LED 4つもついていて,いろいろなテストに便利そう。
  • PICは別売り。PIC16F1829を選んでみた。(2019/10/9 訂正 追記)PIC16F1619がセット済みでした。

Microstick for 5V PIC24F K-Series
product primary imagehttps://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/DM240013-2
  • こちらもUSB直結ですぐに開発が始められる。
  • USBケーブル,PIC24FV16KM202も同梱セット済み(2019/10/9 訂正)している
  • 小型でスタイリッシュ,おそらく仕事で使うとしたらこれ。
お仕事では,PICチップにデータ収集とかさせながら,パソコンで管理したい,という野望がある。いまどきならUSB接続したいところなのだが,いきなりは敷居が高そう... ということで,UARTをつかって,それをUSBに変換してパソコンでやり取りしてはどうか? と思いついた。

そこで,以下も手配した。


FT234X 超小型USBシリアル変換モジュール
FT234X 超小型USBシリアル変換モジュール

  • 安心のFTDI社チップ
  • 基本RX/TXを接続するだけで動作しそう(フロー制御不要)

せっかく送料かけてお買い物するなら,と,以下も注文した!
  • キャッチーな見た目で最高!
  • 5*5のLEDで,楽しいことができそう。
  • 実はUARTやらI2Cやら持っていて,PICの相手にもなりそう。
やってみたいことは以下の通り。

micro:bitをオシロとして使う
    AN入力の電圧をグラフ状に表示
    トリガーをどうする?

micro:bit - FT232経由 PCと通信
micro:bit - PIC で通信させ,micro:bitを表示器代わりに使う
PIC - FT232 - USB - PC で通信

そもそも,こうしてみようと思ったきっかけは2つあって,
  • 子供たちがプログラムに興味を持ち始めた。親である私がある程度知っていれば,子供たちに何か伝えられるのでは?
  • 回路設計・検証のお仕事をするうえで,「自動制御する測定器」的なものを自分で作れるかも...
ということで,いわゆる「ワンボードマイコン」を物色することにした。

本職では,PICマイコンのブレッドボードがあり,今はその案件が無いため不活用になっていた。業務時間中,他業務の隙間で,自分のパソコンに開発環境をインストール。ブレッドボードをお借りしてプログラムを作ってみたところ,
  • ボタンを押したらLEDが光る(ポートの状態を読んで出力ポートをセット)
  • ボリュームつまみを回すとそれに応じてLEDが光る(ADを読む)
ぐらいのことはできるようになった。めちゃ楽しい!

このまま時間をかければ,後者の目的である「自動制御する測定器」は作れそう。ただし,これはガッツリ「業務」であるため,そのお仕事があった時に着手すればよい。

それまでの間,自己啓発も兼ねて,業務外で使ってみることにした。

さて,どうなることやら。。。