METEX P-16 メモ

  • 周波数カウンタ 60MHzまで測定可能とあるが信号が汚いと計れないようなので適度に分周する。
  • R-Hでレンジ切替(大→小)。1秒間長押しでオートレンジモードになる。その場合、左上に[A]の表示がなされる。
  • オーバーレンジのときは画面表示が[ OL.]となり、警告ビープが断続的に鳴る。(ORじゃないのかという突っ込みはなしで)
  • テストリード収納部が狭いのでリードの断線に注意する。自分は元のテストリードが断線したので切り離してブレッドボードに刺せる線に変更した。

cf.http://akizukidenshi.com/catalog/g/gM-01159/

Posted in メモ | Leave a comment

MinGWのfwriteがおかしい

aaaaaa

という内容のtest.txtを用意する。

同じディレクトリで以下を実行する

#include <stdio.h>

int main() {
	FILE *file;
	if ((file = fopen("test.txt", "r+")) == NULL) {
		printf("file open error.");
		return 1;
	}

	char c;
	int len = fread(&c, 1, 1, file);
	printf("read length:%d\n", len);
	printf("read char: %c\n", c);

	c = 'X';
	len = fwrite(&c, 1, 1, file);
	printf("write length:%d\n", len);

	int errno = fclose(file);
	printf("fclose errno:%d\n", errno);

	return 0;
}

するとtest.txtの中身はどうなるだろうか。

aXaaaa

になるというのが普通の感覚だろう。実際linux上のgccではそうなる。

しかしwindows上のMinGWだと

aaaaaa

のままなのだ。

fwriteが失敗した場合、戻り値が書きこもうとしたバイト数未満になるはずだがそうはなっていない。
fcloseの戻り値も0で正常だ。
MinGWだけならまだしもVisual Studio 2010 C++でも同じ挙動となる。

しかしながらプログラムを以下のように直すとうまくいく。

#include <stdio.h>

int main() {
	FILE *file;
	if ((file = fopen("test.txt", "r+")) == NULL) {
		printf("file open error.");
		return 1;
	}

	char c;
	int len = fread(&c, 1, 1, file);
	printf("read length:%d\n", len);
	printf("read char: %c\n", c);

	// 以下3行を追加。
	int pos = ftell(file);
	printf("file pos:%d\n", pos);
	fseek(file, pos, SEEK_SET);

	c = 'X';
	len = fwrite(&c, 1, 1, file);
	printf("write length:%d\n", len);

	int errno = fclose(file);
	printf("fclose errno:%d\n", errno);

	return 0;
}

単にfseekで現在位置を指定するだけである。そうすると中身がちゃんと書き換わるのである。
対策としてはfwriteの前にfseekを追加するか、読み書きは別の処理で行うかなどする必要があるだろう。

MinGWは速度重視らしいのでlinuxとの完全互換は捨てているのかもしれない。だがVisualStudioの方はどういうことだろうか・・・
Win32APIとの絡みな気もするが実装は追えていない。

C99の仕様(http://gcc.gnu.org/c99status.html)からしてみても問題なさそうだし、そもそも無意味な処理である現在位置にシークで書き込みが成功するというのはどう考えてもバグだろう。

cf.発端。コメント欄での言及。http://sigalrm.blogspot.jp/2011/10/cortex-m3-exception-vector-checksum.html

追記:Borland C++ Compiler 5.5でも同様の現象を確認 cf.https://downloads.embarcadero.com/free/c_builder

Posted in 未分類 | Leave a comment

AutoHotKeyネタ

;IEを全て強制終了
^!e::Run cmd /C taskkill /f /im:iexplore.exe
;今日の日付を入力
^!t::
 FormatTime, dt,, yyyyMMdd
 Send, %dt%
return
Posted in AutoHotKey | Leave a comment

Java 参照型の値渡し

JavaにはC言語のような参照渡しは存在しない。

なるべく参照型の値渡しとかせめてオブジェクト参照渡しとか違いが分かるように言うのが良いだろう。

void foo () {
    String a = "Foo";
    bar(a);
    System.out.println(a); // Foo
}

void bar (String b) { // String b = a; が実行されていると考えると分かりやすい
    b = "Bar";
}

上は下記の処理と同等である。これでBarが出力されると思う人はまずいないだろう。

String a = "Foo";
String b = a;
b = "Bar";
System.out.println(a); // Foo
Posted in 未分類 | Leave a comment

Visual C# 2010 Express メモ

■構成を選べるようにする

  • 上部メニュー>ツール>設定>上級者設定→オンにする
  • 上部メニュー>ツール>オプション>プロジェクトおよびソリューション>全般>ビルド構成の詳細を表示→オンにする

■ビルド時にexeのみ生成したい

  • プロジェクトを右クリックしてプロパティ→左ペインの「デバッグ」→Visual Studio ホスティングプロセスを有効にする→オフにする
  • プロジェクトを右クリックしてプロパティ→左ペインの「ビルド」→詳細設定→デバッグ情報→「none」を選択してOK
  • プロジェクトを右クリックしてプロパティ→左ペインの「署名」「セキュリティ」のClickOnceのチェックは外す

※当然デバッグできなくなるので注意

Posted in 未分類 | Leave a comment

eagle メモ

  • オートルータのやり直しはコンソールで「ripup;」を実行。
  • 全ポリゴンのripupは「ripup @;」(Ratsnestの逆)
  • 特定のネットを除いたripupは「ripup ! ネット名;」 ex.RIPUP ! GND VCC;
  • autorouter  > routing grid がピッチ以下である必要がある。(デフォルトが50milなので5milなどにする)
  • ポリゴンでベタグランドした状態でautorouterするとうまくいかない(グランドの配線が残る)場合があるので、autorouter後にベタグランドする。
  • グループ操作は「実行したいコマンド(Move)」「グループ選択」「右クリックメニューで表示されるMove: Group」で実行できる。大変分かりにくい。
  • SSOPは0.65mmピッチでよい。
  • あるNet名を既存のNet名に変更する場合、propertiesからは変更できないようだ(エラーがでる。)。Nameコマンドから実行する必要がある。
Posted in 未分類 | Leave a comment

CANメモ

電位 名称 真偽 CAN_L基準時の
CAN_Hの電位 ※
CAN_H=2.5V
CAN_L=2.5V
リセッシブ 0V
CAN_H=3.5V
CAN_L=1.5V
ドミナント 2V

※このように測定した場合は負論理となる。

  • ドミナントとリセッシブを同時に出力しようとした場合ドミナントが勝つ。(この表現は正確ではないが)
  • シリアル通信同様、アイドル時が真となる。
Posted in CAN | Leave a comment

UARTのレベル変換IC使用時にTTLレベルも残す方法

マイコンとIC間のRxdにスイッチングダイオードをかます。

IC側がカソードになるようにする。

マイコンのスレシホールド電圧が1V超であることが必要。

そうすることでTTL側のRXがLowにしようとしたときにIC側のHiに影響をうけることがない。

Posted in 未分類 | Leave a comment

Arduino ブートローダーメモ 328Pの場合

hexのパス
C:\Program Files (x86)\Arduino\hardware\arduino\bootloaders\atmega\ATmegaBOOT_168_atmega328.hex

BODLEVEL = 2V7
RSTDISBL = [ ]
DWEN = [ ]
SPIEN = [X]
WDTON = [ ]
EESAVE = [ ]
BOOTSZ = 1024W_3C00
BOOTRST = [X]
CKDIV8 = [ ]
CKOUT = [ ]
SUT_CKSEL = EXTXOSC_8MHZ_XX_16KCK_14CK_65MS

EXTENDED = 0xFD (valid)
HIGH = 0xDA (valid)
LOW = 0xFF (valid)

SDK側の設定
ツール>マイコンボード>Arduino Duemilanove w/ ATmega328

Posted in Arduino | Leave a comment

LPC11UXX メモ

LPC11U37/401を試用。(マルツパーツのLQFP48パッケージ)

ポイント

  • 12MHzの外部水晶発振子を使う。USB機能には必須
  • USBのD-を3.3Vにプルアップする。3番ピン。

LPCXpressoでは以下のサンプルコードを使用。cf.http://nxp-lpc.com/lpc_micon/cortex-m0/lpc11u00/

サンプルコード/ LPCXpresso LPC11Uxx [LPC1100]CMSIS2.0 + ペリファラル・ドライバ。USBのサンプルはLPC11U2x/LPC11U3のROM内のUSBxドライバを使用しています。

ライブラリが競合する場合があるので必ず空のワークスペースにインポートする。
各プロジェクトのreadme.txt通りに設定する。
C/C++ Build>MCU Settingsで実際に使うMCUに変更すること。

USB_ROM_MSCプロジェクト OK →マスストレージデバイスとして認識される。

USB_ROM_CDCプロジェクト OK だが ReadMe.txtに書かれている情報とは違いドライバファイルがプロジェクト内に無いので以下のサンプル内にあるドライバファイルを修正して使った。(修正済みのドライバファイル→LPC11Uxx_vcom_XP_w7

USB複合デバイス for LPC11Uxx [LPC1100]HID, MSC, CDC, DFU。このサンプルではLPC11U2x/3xのROM内のAPIは使っていません。

仮想シリアルポート(NXP LPC11Uxx USB VCOM)として認識される。これはMCU上のシリアルポートのブリッジとして機能する。

動作確認:teratermなどで当該ポートを開く(9600baud)。46番ピン(RXD)と47番ピン(TXD)をショートさせるとローカルエコーされるのがわかる。

他プロジェクトは未検証。

 

Posted in LPC11U37/401, NXP | Leave a comment