PIC16F1789 & MPUトレーナー 14 / UART を使う / PC から PIC へ 1 文字送る

参考: 定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ), pp.169-176
f:id:ti-nspire:20170415154907p:plain:h315


main.c

#include "mcc_generated_files/mcc.h"

#define LED0	RB2
#define LED1	RB3
#define LED2	RB4

char sio_getc() {
	char ch;
	ch = EUSART_Read();
	return ch;
}
/*
void sio_putc(char ch) {
	EUSART_Write(ch);
}

void sio_puts(char *str) {
	while(*str) {
		sio_putc(*str);
		str++;
	}
}
*/
void main(void) {
	char ch;
	SYSTEM_Initialize();
	
	while(1) {
		ch = sio_getc();
		int num = ch - '0';
		
		switch(num) {
			case 0:  LED0 = 1; break;
			case 1:  LED1 = 1; break;
			case 2:  LED2 = 1; break;
			default: LED0 = 0; LED1 = 0; LED2 = 0; break;
		}
	}
}

PIC16F1789 & MPUトレーナー 13 / ウォッチドッグタイマーを使う

参考: 定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ), pp.149-156


main.c

/*
テキスト p.155、リスト 17-3 のまま。経過時間を表示するプログラムである。

ウォッチドッグタイマーのタイムアウトピリオドは 4 秒に設定してある。

ここでは動作確認として人がスイッチを押してウォッチドッグタイマーをリセットする。

ウォッチドッグタイマーをリセットしないまま 4 秒が経過するとシステムリセットがかかる。
*/



―――――――――――――――――――――――――――――――――――――――――――――――――

ウォッチドッグ・タイマは、タイムアウトすると PIC マイコンをリセットする。(中略) 例えば、プログラムでは、ウォッチドッグ・タイマをタイムアウトしないように書く。タイムアウトしないはずなのに、タイムアウトしたということは、不思議な動作をしているということなので、PIC マイコンをリセットしようというような目的で使う。
引用元: 『キホンからはじめる PIC マイコン C 言語をフリーのコンパイラで使う』オーム社、中尾真治、p.71


「ウォッチドッグタイマー」の「タイマー」とは「カウンター」のことである。

たとえば 10 進 1 桁のカウンターは 0 から 9 まで 1 ずつカウントアップする。9 を超えると、「10」にはなれないので (2 桁にはなれないので) オーバーフロー (桁あふれ) を起こして 0 に戻る。そしてまた 9 までカウントアップする。

だから 10 進 1 桁のカウンターで 1 Hz のクロックをカウントすれば 10 秒タイマーが出来る。そのクロックを 2 分周してからカウントすることにしておけば (2 クロックを 1 回としてカウントすることにしておけば) 20 秒タイマーが出来るし、オーバーフローしたあとに 0 に戻さずに 5 に戻すことにしておけば 5 秒タイマーが出来る。

ウォッチドッグタイマーは、ウォッチドッグタイマー自身がオーバーフロー (あるいはアンダーフロー) したときに番犬として吠える役割 (すなわちシステムリセットを引き起こす役割、言い返ればプログラムを 0 番から実行し直す役割) を負っている。だから、システムに異常の発生していないときは、ウォッチドッグタイマーがオーバーフロー (あるいはアンダーフロー) しないよう (すなわちウォッチドッグタイマーがタイムアウトしないよう)、何らかの手段で定期的にウォッチドッグタイマーをリセットしなければならない (カウントアップ (あるいはカウントダウン) している途中で元に巻き戻してまた最初からカウントアップ (あるいはカウントダウン) が始まるようにしなければならない)。こうした定期的なリセット処理 (システムをリセットすることではなく、ウォッチドッグタイマーをリセットすること) がうまく働かなかったとき (すなわち異常が発生していると判断されたとき) に番犬が吠える。そしてシステムリセットがかかる。

The window mode makes it possible to define a time slot or window inside the total timeout period during which WDT must be reset. If the WDT is reset outside this window, either too early or too late, a system reset will be issued.
(http://www.atmel.com/images/Atmel-8362-8-and-16bit-AVR-microcontroller-ATxmega256A3BU_datasheet.pdf)

普通のウォッチドッグタイマーは、あらかじめ決めておいた時間内にウォッチドッグタイマーがリセットされなかったとき (リセットされないままタイムアウトしたとき) に吠えるが、「ウィンドウウォッチドッグタイマー」というのは、上の引用文にあるように、決めておいたウィンドウ (タイムアウト期間内に設けた時間枠) を過ぎてからウォッチドッグタイマーがリセットされたとき (リセットが遅すぎたとき) にも吠えるし、その時間枠に入る前にウォッチドッグタイマーがリセットされたとき (リセットが早すぎたとき) にも吠えるウォッチドッグタイマーのことである。つまり、普通のウォッチドッグタイマーは、タイムアウト期間内 (上の英文の “the total timeout period”) のどこでリセットをかけても有効であるが、ウィンドウウォッチドッグタイマーは、タイムアウト期間内に設けたもう 1 つの時間枠の中でリセットをかけなければならない。上の英文の which の先行詞は “a time slot or window” である。