---Cのプログラムです。---

 冗長なプログラムですが,Cのプログラムです。PICに密接し
 た設定は,本の丸写しです。
 このプログラムは,タイムアップすると,無限ループに入る
 ようにしています。本番では,ここを,変更して,自分自身
 の電源を切るようにします。アセンブラーでは,各種フラグを
 ビット操作でしていますが,本プログラムでは,贅沢にフラグ
 にいint型の整数を使ってます。データーメモリに余裕がある
 のでこの方がすっきりします。ただ,計算スピードやら,コンパイル
 後のメモリ等については,よく分かりません。
 PICに密接した設定や,割り込みの処理のプログラムがまだ,
 よく分からないところがありますが,その他は,PC用のプログラム
 とあんまり変わりません。 
 /******************************************
99タイマーテスト
********************************************/
#include __CONFIG(UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);
int sw3;
int sw2;
int sw1;
int sw3_data;
int sw2_data;
int sw1_data;
int sw12_data;
int sec1_data;
int sec10_data;
int min1_data;
int min10_data;
int count;
int count1;
int start_stop;
int entyou;
int buzzer;
int dengen;
int sec1_data_w;
int sec10_data_w;
int min1_data_w;
int min10_data_w;
void count_up(void);
void InitInterTimer0 (void);
void WaitTime (int cnt);
void datahozon(void);
void datasaisettei(void);
void main(void){
CMCON=0X07; //1,2,17,18
PORTA=0xFF;
PORTB=0xFF;
TRISA=0x1C;
TRISB=0x00;
RA0=0;//ブザーoff
RA1=0;//電源オフ
RA7=0;//本体操作
sec1_data=0;
sec10_data=0;
min1_data=0;
min10_data=0;
sw3=1;
sw2=1;
sw1=1;
sw3_data=1;
sw2_data=1;
sw1_data=1;
sw12_data=1;
min1_data_w=min1_data;
min10_data_w=min10_data;
start_stop=0;//初期値ストップ
buzzer=0;
dengen=0;
entyou=0;
// タイマ0割込み設定関数の呼び出し
InitInterTimer0();
// 割込み全体の許可
GIE = 1;
for( ; ; ){
//キー入力チェック1
if(RA2==0){
sw3=0;// スタートストップ
}
if(RA3==0){
sw2=0;//SW2 一分
}
if(RA4==0){
sw1=0;//SW1十分
}
//LED表示
PORTB=0xf0 | sec1_data_w;//秒1位表示
RB4=0;
_delay(250);
RB4=1;
PORTB=0xf0 | sec10_data_w;//秒10位表示
RB5=0;
_delay(250);
RB5=1;
PORTB=0xf0 | min1_data_w;//分1位表示
RB6=0;
_delay(250);
RB6=1;
PORTB=0xf0 | min10_data_w;//分10位表示
RB7=0;
_delay(250);
RB7=1;
//キー入力チェック2
//スタートストップチェック
if(RA2==0){
if(sw3==0){
if(sw3_data==1){
sw3_data=0;
if(start_stop==1){
start_stop=0;
}
else{
if(min1_data_w>0 || min10_data_w>0){
datahozon();
}
start_stop=1;
buzzer=0;
}
}
}
}
else{
sw3_data=1;
sw3=1;
}
//**************************************
//1分操作
if(RA3==0){
if(sw2==0){
if(sw2_data==1){
sw2_data=0;
if(start_stop==0){
sec1_data_w=0;
sec10_data_w=0;
if(min1_data_w<9){ min1_data_w++; } else{ min1_data_w=0; } } } } } else{ sw2_data=1; sw2=1; } //************************************** //10分操作 if(RA4==0){ if(sw1==0){ if(sw1_data==1){ sw1_data=0; if(start_stop==0){ sec1_data_w=0; sec10_data_w=0; if(min10_data_w<9){ min10_data_w++; } else{ min10_data_w=0; } } } } } else{ sw1_data=1; sw1=1; } //**************************************** //同時操作 if(sw2_data==0){ if(sw1_data==0){ if(sw12_data==1){ sw12_data=0; if(start_stop==0){ min1_data_w=0; min10_data_w=0; } } } else{ sw12_data=1; } } else{ sw12_data=1; sw1=1; sw2=1; } //*******ブザーオンオフ********************************* if(buzzer==1){ if(min1_data_w==0 && min10_data_w==0 && sec10_data_w==0 && sec1_data_w==0){ if(RA0==0){RA0=1;} } if(min1_data_w>0 || min10_data_w>0 || sec10_data_w>0 || sec1_data_w>0){
if(RA1==0){RA1=1;}//電源オン
}
}
if(buzzer==0){
if(RA0==1){
RA0=0;
entyou=0;
sec1_data_w=0;
sec10_data_w=0;
datasaisettei();
}
}
}
}
// 割込みサービスルーチン
static void interrupt isr(){
//****************延長処理*********************
if(entyou==1){
if(count<1950){ count++; } else{ if(sec1_data_w>0){
sec1_data_w--;
buzzer=1;
count=0;
}
else{
if(sec10_data_w>0){
sec10_data_w--;
sec1_data_w=9;
count=0;
}
else{
RA7=1;//******************本体電源もオフ*********************
for( ; ; ){ }
}
}
}
}
//***************カウントダウン**************
if(start_stop==1){
if(count<1950){ count++; } else{ if(sec1_data_w>0){
sec1_data_w--;
buzzer=1;
count=0;
}
else{
if(sec10_data_w>0){
sec10_data_w--;
sec1_data_w=9;
count=0;
}
else{
if(min1_data_w>0){
min1_data_w--;
sec10_data_w=5;
sec1_data_w=9;
count=0;
}
else{
if(min10_data_w>0){
min10_data_w--;
min1_data_w=9;
sec1_data_w=9;
sec10_data_w=5;
count=0;
}
else{
count=0;
entyou=1;
start_stop=0;
sec1_data_w=9;
sec10_data_w=5;
}
}
}
}
}
}
//***********************カウントダウン終了********************
// タイマ0割込みフラグをクリア
T0IF = 0;
}
void InitInterTimer0 (void){
// クロック源を内部クロックに設定
T0CS = 0;
// プリスケーラをタイマ0に割り当て
PSA = 0;
// プリスケーラ値を2に設定
PS2 = 0;
PS1 = 0;
PS0 = 0;
// TMR0レジスタをクリア
TMR0 = 0x00;
// タイマ0割込みフラグをクリア
T0IF = 0;
// タイマ0割込みの許可
T0IE = 1;
}
// 待ち時間関数の呼び出し
void WaitTime (int cnt){
while(cnt > 0){
cnt--;}
}
void datahozon(void){
min1_data=min1_data_w;
min10_data=min10_data_w;
}
void datasaisettei(void){
min1_data_w=min1_data;
min10_data_w=min10_data;
}

---予定変更 16F84A~16F627A ---

 HPにのっていた99タイマーをちょっと改良して,半田ごてタイ
 マーを作る予定でいましたが,16F84Aは端子が,どうしても2
 本たりないで,上位互換である,16F627Aに変更して,作る
 ことにしました。もう少し調べれば,16F627Aよりもメモリーが
 が多くて,安いPICがあったのですが,失敗しました。これも,
 身銭を切ったお勉強です。
 テスト基盤,

 

 でのプログラムの作成もやっと完成しそうです。今まで使って
 いた半田ごてタイマーと違うところは,使える時間を99分まで
 の間で設定できることです。
 (時間の設定)→(カウントダウン)→
  (ブザー)→(一分以内にスタートボタンを押す)
    →(最初の設定時間に戻る)→(カウントダウン)
 を繰り返します。一分以内にボタンを押さないと,本体
 も含めて電源が切れるようになります。
 
 当初 アセンブラー(HPにあったもの)をちょっと改良
 するつもりでしたが,プログラムの半分ぐらいは,意味
 が分かったのですが,面倒なので,フリーのCコンパイ
 ラーで,くみなおしました。プログラムの大きさが心配
 でしたが,PICの容量の85%ぐらいでおさまりました。

---タイマーを作っています。---

 PICを使ったタイマーを作ってます。やっと7セグメントLEDの
 表示部分だけが出来ました。テスト点灯で,一カ所だけ,光ら
 せています。

 

 このタイマーのハードにSSRを組み込んで,半田ごてタイマー
 にしようと思います。
 ハードの追加は,PIC16F84の開いている端子にSSRを接続
 するだけなので,それほど難しくはありませんが,プログラム
 の変更が大変だろうなあ。

---PICプログラミング---

 友人の影響で,PICのプログラムをいじり始めました。
 アセンブラーとCコンバイラーがどちらも無料であるので,
 DLしてあれこれ始めました。
 最初にCであれこれやりましたが,まあ,比較的すんなりいき
 ましたが,アセンブラーではまりました。
 なんと,
 LIST
 と
  LIST
 の違いで,コンパイルエラーとなりました。どかが違うかというと,
 LISTの前に空白があるかないかの違いでした。

---今日も暑かったです。---

 今日も暑かったです。海岸の夕方の散歩も予定を変更して,
 ドッグランでのプールにしました。
 暑かったせいかか,レオは,結構泳ぎました。家に帰って
 きてから,疲れたのか,ケージで寝てます。でも,お腹がすくと
 そばにきて,ゴハンやら,おやつの催促です。
 きっと,今日は,ぐっすりでしょうねえ。

---膿皮症の治療---

 我が家の看板犬のレオ(バーニーズマウンテンドッグ)は,毎年
 のように,膿皮症という皮膚病になります。もともとのアレルギー
 と皮膚が弱いためですが,今年もひどくなりました。
 あまり,薬はのませたくないのですが,

 

 プレドニン(副腎皮質ホルモン)とオフロキサシン(合成抗菌剤)
 を10日間処方してもらいました。オフロキサシンの適応となる病気は,
 「細菌感染症、ハンセン病、眼瞼炎、涙のう炎、麦粒腫」などがあげられ
 てました。
 やっと飲み終わり,皮膚病も一段落のようですが,また,再発するかも
 しれません。

---LCDオシロスコープとマルチテスター---

 LCDオシロスコープの作り方を検索している時に目についた
 のが,マルチテスターです(写真上部)。

 

 ある電子部品のお店には,なんと,このマルチテスター本体
 が売っているではありませんか。速攻で買ってしまいましたが,
 なんと,このままでは,動かないのです。
 マルチテスターは,2008年の9月号のトランジスター技術の
 付録に基盤が付いていて,これを作って,なおかつ2008年
 8月号のUSBマイコンが必要だったのです。あれこれ探して
 オークションで,2008年の8月号を見つけてなんとか手に入れ
 
 ました。しかし,これでも動かないのです。マイコンにマルチテスタ
 ーのプログラムを書き込まないとだめなのです。
 トランジスター技術のサポートサイトから,書き込みに必要なソフト
 をDLして,やっと動かすことができました。とりあえず,ただの箱
 にならずにすみました。

---一緒に昼寝---

 我が家の看板犬のレオは,現在体重54Kg。でも,とてつもなく
 甘えん坊で,ネコと一緒で,ひとのそばで,寝るのがいいみた
 いです。まるで,大きなネコです。
 今日も,ばあさんと一緒に昼寝です。

 

 大きさは,ばあさんと同じくらいです。

---モーターに回転計をつけました。---

 スピンドルモーターに回転計をつけました。POMで,ケースを作り
 その中に,センサーを入れて,モーターの脇につけました。
 はじめ,縦につけるつもりでケースを作りましたが,センサー
 が反応しないので,横型に作り替えてつけました。
 他の回転計で調べてみた数値とほぼ同じで,回転数も正確な
 ようです。
 回転数の表示部も,ケースに入れます。

---モーターの交換終わりました---

 トルク不足で途中で止まってしまったモーターの換装が終わり
 ました。
 MDFを前回のモーターと同じように削って見ましたが,途中で止
 まることなく最後まで切削出来ました。ただ,終わってモーター
 を触ると結構熱を持っていたことと,機械全体に低周波の振動
 が起こるみたいで,結局振動数が機械本体と共鳴してるような
 感じです。
 アルミを削ってみて,どうなるか,問題なく切削できるか,もうち
 ょっと回転数を上げないとだめなのか,いろいろやってみるつも
 りです。

左側が以前のモーターで,右側のコレットの上についてるのが,
 換装したモーターです。ちょっと寸胴で,以前のものより二回りぐ
 らい胴太になってます。
 KV値(一ボルトあたりの回転数)は,新しいモーターの方が,小さく
 なってます。
 交換前モーター 890KV
 新モーター    560KV
 新しいモーターは,トルク重視のモーターのようです。