admin のすべての投稿

誰も教えてくれない「組込みC言語」 3

定数の命名ルール

#define 定義する定数名は大文字にする

これは変数と混同しない為のコーディングルールとして良く使われています。

1
2
#define		signal_max		200
#define		signal_min		100

ではなく

1
2
#define		SIGNAL_MAX		200
#define		SIGNAL_MIN		100

のように定義します。

この定数にも前回の変数の型をいれると

1
2
#define		U1_SIGNAL_MAX		200
#define		U1_SIGNAL_MIN		100

となります。

例えば

1
if(u1_port_00 > u1_signal_max)

だと u1_signal_max は 定数なのか 変数なのかパッと見わかりませんが
定数は大文字にするというルールを決めておけば
この場合の u1_signal_max は 変数だとすぐにわかります。
当然

1
if(u1_port_00 > U1_SIGNAL_MAX)

だと U1_SIGNAL_MAX は 定数だとすぐにわかります。

余談ですが
定数の読み「じょうすう」、「ていすう」どっちで読んでいますか?
自分は昔は「ていすう」と読んでいましたが、今は「じょうすう」とよんでいます。

誰も教えてくれない「組込みC言語」 2

組込みプログラムではバグを早期に発見できるように
変数名はサイズが分かるように命名します。

例えば

1
2
3
4
5
6
7
8
9
10
11
void main(void){
	unsigned char	i;
 
	while (1U)
	{
		P3.0 = 0;
		for(i=0;i<50000;i++){};
		P3.0 = 1;
		for(i=0;i<50000;i++){};
	}
}

このプログラムにはバグが有ります。
iは符号なし8bitの変数(0 ~ 255)ですが
その範囲を超えた 50000 と比較しています。
このサンプルの場合は宣言部と比較している箇所が近いために気付きやすいのですが
変数がグローバル変数で別のファイルに定義されている場合はちょっと見気付きません。

これをちょっと見でもバグだと気付くように変数名を変えてみましょう。

1
2
3
4
5
6
7
8
9
10
11
void main(void){
	unsigned char	u1_i;
 
	while (1U)
	{
		P3.0 = 0;
		for(u1_i=0;u1_i<50000;u1_i++){};
		P3.0 = 1;
		for(u1_i=0;u1_i<50000;u1_i++){};
	}
}

変数名を i から u1_i に変えました。
もうお気づきかと思いますが u1_i の u1 は この変数が符号なしの1バイトの変数を意味しています。

このように変数名に型を表すワードを明示しておけば、
u1_i<50000 この部分を見ただけで 変数が符号なしの1バイトの変数 と 1バイトの範囲を超えた値と比較しているのが一目瞭然となります。 u1 s1 u2 s2 s4 f4 f8 を変数の接頭語として良く使用します。 意味は以下のようになります。 u1 符号なし1バイト s1 符号あり1バイト u2 符号なし2バイト s2 符号あり2バイト u4 符号なし4バイト s4 符号あり4バイト f4  単精度実数 f8  倍精度実数

誰も教えてくれない「組込みC言語」 1

■組込み現場では int型は使わない。

組込み系のC言語の本にも
unsigned int i;
int j;
とかサンプルプログラムに書かれているが
これは間違いではないが実際に組込みプログラムに携わっているプログラマーは使わない(はず)

なぜならば int型は マイクロプロセッサに依存する為
16ビットだったり、32ビットだったりするからです。

他のプロセッサに移植する際に見つけにくいバグの1つとなってしまいます。

よって以下のプログラムは

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void main(void){
	unsigned int	i;
 
	while (1U)
	{
		P3.0 = 0;
		for(i=0;i<50000;i++){};
		P3.0 = 1;
		for(i=0;i<50000;i++){};
	}
}
 
void main(void){
	unsigned short	i;
 
	while (1U)
	{
		P3.0 = 0;
		for(i=0;i<50000;i++){};
		P3.0 = 1;
		for(i=0;i<50000;i++){};
	}
}

と書くべきだと思います。

サンプルプルプログラムに int型の宣言がある組込み向けc言語の解説書は自分的にはアウトです。
ただマイコンチップを特定の機種に絞っている本は別です。

ルネサスのRL78 Webシミュレータ

ルネサスは三菱電機、日立製作所、NECの各社の半導体部門の集合体なので
マイクロプロセッサも合併する前の流れがあって、当然開発環境も。
HEW、CS+、e²studio、サードパーティだとGHS社のMULTIとか。

ここ数日これらの開発環境を調べていたら
e²studioが面白い進化(?)をしていた。
e²studioは元々ルネサス・ヨーロッパ製のIDEでeclipse + CDT ベースとしている。
現在は日本でのサポート有り。

RL78 Webシミュレータを使って実機が無くても外部部品の入出力や端子計測が可能らしい。

これはWebシミュレータ専用の総合開発環境ではない為に、ターゲットボードやE1エミュレータを揃えれば
そのまま実機での評価に移行できる(はず)。

RL78 Web Simulatorのページ

実際の使用手順

Webシミュレータのボードのモデルは実際に販売されている
Renesas Starter Kit for RL78/G13 っぽいです。

ZEROPLUSのLAP-CがWIn10に対応&追加プロトコル無料

秋月電子やマルツパーツで販売されているZEROPLUSのLAP-Cシリーズのソフトウェア&ドライバーが
Win8、Win10対応になりました。
おまけに110種以上のプロトコルが無料に!
(最新版のソフトウェアーは標準ですべてのプロトコルに対応していますので別途プロトコルファイルをダウンロードする必要はありません。)

パソコンをWin10にアップデートしてから使えなくなっていたので
これで復活です。
ソフトウェアーダウンロードページ

対応プロトコル一覧

マルツオンライン(Amazon)

Cent じゃなくてSENT(Single-Edge Nibble Transmission)だよ

CentOSなら知っていた。
SENTって?
Weblioで調べても send の過去形・過去分詞 としか書いていない。
wikipediaにも波形の写真が載せて程度
https://en.wikipedia.org/wiki/SENT_%28protocol%29

まだ新しい規格(とは言っても2007年04月なので10年近く経とうとしている)なのでWebからもほとんど情報が拾えない。
SENT は SAE J2716 の「SENT – Single-Edge Nibble Transmission for Automotive Applications」であり
シリアル通信の規格の1つ。

仕様書はSAE Internationalのページから購入できる。
最新版「J2716_201604」

要は立下りから立下りまでのバルスの幅で4bitのデータを送る規格。
シンクロナスフレーム、ステータスフレーム、データフレームCRCフレーム、ポーズパルス(オプション)で構成されている。

長年プログラマーをやっているけど恥ずかしながら4bitの単位をニブル(Nibble)と言うのを知らなかった。

対応しているマイコンチップもまだ少なく
ルネサスのRH850ファミリ、MicrochipのdsPIC33/PIC24ファミリ、NXPのMPC574xPファミリ位しかお目に掛かれていない。

とりあえずMicrochipの「dsPIC33EV256GM102」で色々と実験する予定です。
Microchipの「Single-Edge Nibble Transmission)モジュール」のマニュアル

ESP8266のプログラム書込み時の煩わしさを軽減したい。

ESP8266のプログラムって手順が面倒ですよね。
それで自分が辿った手間軽減の記録です。

1. 通常の書込み方法。
 GPIO0をLOWにする。
 RSTをLOWににする(一瞬)。
 プログラムを書き込む。
 GPIO0をHIGHにする。
 RSTをLOWににする(一瞬)。
 書き込んだプログラムが実行される。

2. GPIO0にDTR、RSTにRTSを接続した場合。
 Arduino IDEで書込みを行うと自動でプログラミングモードとなり
 書込みが終わると自動で書き込んだプログラムが走り出す。
 ただ、ここでシリアルモニターを起動すると再び書込みモードとなってしまいプログラムが走らない。
 シリアルモニターを使わない場合は問題なし。

3. WemosD1 miniのGPIO0とRSTへの接続回路を使った場合。
 Arduino IDEで書込みを行うと自動でプログラミングモードとなり
 書込みが終わると自動で書き込んだプログラムが走り出す。
 シリアルモニターを起動しても問題なし。
 ただし、Arduino IDEで「WeMos D1 R2 & mini」を選択する必要があり
 コンパイル時にエラーが出ます。
 ただエラーは出るが、正常に書込みは行われておりプログラム問題なく実行される。
ESP8266_DTR_RTS

2016年4月24日 補足
ボードで「Generic ESP8266 Module}を選択して
Reset Method で「nodemcu」を選択すれば書込みが出来るのを確認しました。
esp8266_arduino_ide

技適取得済格安WiFiモジュールESP8266とBlynkの組み合わせで簡単IoT

久しぶりにBlynkをいじってみました。
今回は巷で大モテの ESP8266 をターゲットボードとして使いました。

前回Blynkの記事を書いたときは対応しているボードが少なかったのですが現在はずいぶん増えています。

まず、スマホのアプリ作成ですが、
これは単にプロジェクトの作成時にターゲットボードに
「ESP8266」を選択するだけです。
Blynk_esp8266_1

今回は1個のSWと1個のLEDを接続しているだけなので操作画面は
以下のようにいたってシンプルです。
Blynk_esp8266_2

LEDとスライダーの設定は以下のようになっています。
Blynk_esp8266_3

Blynk_esp8266_4

次にArduino IDEでESP8266のスケッチを作成してターゲットボードに書き込みます。
スケッチはBlynkのサンプルに含まれている
「ESP8266_Standalone」を使います。
(BlynkのライブラリーをArduino IDEに取り込んでおく必要があります。)
Blynk_esp8266_5

ssid、password、authはご自身の環境に合わせてください。

GPIO16に接続したSWの入力でスマホのLED表示を変化させているで
GPIOの入力をBlynkのバーチャル入力へ変換する処理を入れています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**************************************************************
 * Blynk is a platform with iOS and Android apps to control
 * Arduino, Raspberry Pi and the likes over the Internet.
 * You can easily build graphic interfaces for all your
 * projects by simply dragging and dropping widgets.
 *
 *   Downloads, docs, tutorials: http://www.blynk.cc
 *   Blynk community:            http://community.blynk.cc
 *   Social networks:            http://www.fb.com/blynkapp
 *                               http://twitter.com/blynk_app
 *
 * Blynk library is licensed under MIT license
 * This example code is in public domain.
 *
 **************************************************************
 * This example runs directly on ESP8266 chip.
 *
 * You need to install this for ESP8266 development:
 *   https://github.com/esp8266/Arduino
 *
 * Change WiFi ssid, pass, and Blynk auth token to run :)
 *
 **************************************************************/
 
#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
 
const char ssid[] = "lo--------87";
const char password[] = "12----------4";
 
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "56----------------------------3d";
 
int in_data = 0;
void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, password);
}
 
void loop()
{
  Blynk.run();
 
  in_data = digitalRead(16) * 255 ;
  Blynk.virtualWrite(1, in_data);
 
}