楽釣工房では、小魚用しゃくり機、わかさぎ用しゃくり機、Picマイコン制御による自動しゃくり機(しゃくりパターン制御)、赤外線リモコンの応用回路(電気機器のON/OFF、温度制御、リモコンに依る数値設定など)、電子回路について書いて行きます。

 ブログの投稿記事に画像データを多く使用している為、他の投稿記事を読む事に不便をかけると思われます。
従って、投稿記事の前文をブログで公開し、全体の記事は ホーム・ページ [ 楽釣119 ] で公開する事にしました。
ホーム・ページ [ 楽釣119 ] では、今までの記事の内容を整理し、内容の不具合を修正し、又、記事の追加をして、ホーム・ページで公開しています。
  
___________________________________________________________________________________________________________________

プログラム



[ リモコン信号受信処理 ① ]

アッセンブラ―プログラムから PIC C Lite へ移植                               2011/02/03


信号の読み取りタイミングを修正する(赤字の部分が修正箇所です)          [2011/02/15]

プログラム・ダウンロード Remocon-1.c

//********************************************************
// [ 16F84A ] リモコン・信号読み取り 2011/02/02
//
// MPLAB アッセンブラ― から PIC C Lite への移植
//
// [ Remocon-1 ] Copyright by H.Satake
//
// [ELPA製かんたんリモコン RC-17,RC29D の標準コードで使用する。]
// [ 38KHzで信号を読み取った時の値(但し、下位4ビットをマスクする) ]
//   ヘッダー信号    : 0x50
//   データー ”0”     : 0x10  プログラムでは使わない。
//  データー ”1”   : 0x20
//    カスタム・コード  : 0x00   :読み取るだけで使わない。
// コード信号が3回送られて来るが、その内の2回分を無視する。(約90ms)
//
// PORT A bit[0] :リモコン信号入力[ 負論理入力 ]
// PORT B         :リモコン・コード出力
//********************************************************

#include <pic.h>
#define _XTAL_FREQ 10000000 //10Mhz[Max ms:78ms、us:78848us]

__CONFIG(HS & UNPROTECT & PWRTEN & WDTDIS);

unsigned char nn;
unsigned char C_data;
unsigned char K_data;

void D_cont();
void TH_count();                          //追加
void T_count();
void Brank();

main(){
PORTA = PORTB = 0;
TRISA = 0b00000001; //PORT A set(bit[0]:input)
TRISB = 0b00000000; //PORT B set(All output)

while(1){
C_data=0;    //コード・データー
K_data=0; //カスタム・コード・データー
if (!RA0){ //RA0-->0 信号有り
T_count(); //信号読み取り
TH_count();
if (nn==0x50){ //ヘッダー信号OK?
D_cont(); //コード信号読み取り

// PORTB = C_data; //コード・データーを ポートB へ出力

if (C_data==0x80){ //[ 1 ボタン
if (!RB0){
PORTB=PORTB + 0b00000001;
}else{
PORTB=PORTB & 0b11111110;
}
}
if (C_data==0x81){ //[ 2 ]ボタン
if (!RB1){
PORTB=PORTB + 0b00000010;
}else{
PORTB=PORTB & 0b11111101;
    }
}
if (C_data==0x82){ //[ 3 ]ボタン
if (!RB2){
PORTB=PORTB + 0b00000100;
}else{
PORTB=PORTB & 0b11111011;
    }
}
if (C_data==0x83){ //[ 4 ]ボタン
if (!RB3){
PORTB=PORTB + 0b00001000;
}else{
PORTB=PORTB & 0b11110111;
    }
}
if (C_data==0x84){ //[ 5 ]ボタン
if (!RB4){
PORTB=PORTB + 0b00010000;
}else{
PORTB=PORTB & 0b11101111;
    }
}
if (C_data==0x85){ //[ 6 ]ボタン
if (!RB5){
PORTB=PORTB + 0b00100000;
}else{
PORTB=PORTB & 0b11011111;
    }
}  
if (C_data==0x86){ //[ 7 ボタン
if (!RB6){
PORTB=PORTB + 0b01000000;
}else{
PORTB=PORTB & 0b10111111;
    }
}
if (C_data==0x87){ //[ 8 ]ボタン
if (!RB7){
PORTB=PORTB + 0b10000000;
}else{
PORTB=PORTB & 0b01111111;
    }
     }
if (C_data==0x95){ //[ 電源 ]ボタン
PORTB=0;
     }
__delay_ms(45); //2回分の信号時間を無視する
__delay_ms(45); //(約90ms)
}
}
  }
}

void D_cont(){ //コード信号読み取り
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
C_data=C_data+0x01; //コード・データー ビット0
}
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
C_data=C_data+0x02; //コード・データー ビット1
}
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
C_data=C_data+0x04; //コード・データー ビット2
}
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
C_data=C_data+0x08; //コード・データー ビット3
}
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
C_data=C_data+0x10; //コード・データー ビット4
}
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
C_data=C_data+0x20; //コード・データー ビット5
}
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
C_data=C_data+0x40; //コード・データー ビット6
}
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
C_data=C_data+0x80; //コード・データー ビット7
}

Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
K_data=K_data+0x01; //カスタム・コード・データー ビット0
}
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
K_data=K_data+0x02; //カスタム・コード・データー ビット1
}
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
K_data=K_data+0x04; //カスタム・コード・データー ビット2
}
Brank();
T_count();
if (nn==0x20){ //ビット・データー = 1?
K_data=K_data+0x08; //カスタム・コード・データー ビット3
}

}
                       //赤字部分追加
void TH_count(){ //ヘッダー信号読み取り
nn = 0;                                 //38KHz(26μsec)クロックで読み取り
while(1){
__delay_us(26); //26μsec遅延
if (!RA0){ //RA0=0であればカウント+1
nn=nn+1;
}else { //RA0=1なのでカウント終了
nn=nn & 0xf0;  //8ビットの下位4ビットをマスク
break;
}
}
}
void T_count(){ //コード、カスタムコード読み取り
nn = 0;                                  //(30μsec)クロックで読み取り
while(1){
__delay_us(30); //30μsec遅延 値を修正
if (!RA0){ //RA0=0であればカウント+1
nn=nn+1;
}else { //RA0=1なのでカウント終了
nn=nn & 0xf0;  //8ビットの下位4ビットをマスク
break;
}
}
}
void Brank(){ //無信号期間検出
while(1){
if (!RA0){
break;
}
}
}


-------------------------------------------------------------------------------

[ 16F57 電子フラッシャー ② ]

ビット・パターン表記でプログラムしています。                   2011/01/10

プログラム・ダウンロード F57-4-2.c


/*
[ 16F57 電子フラッシャー ] 2011/01/10

Port A:未使用 (未設定)
Port B:出力
Port C:出力
OSC   :XT (10Mhz)

                                 bit7                             bit0
LED 配置 B_port  〇  〇  〇  〇  〇  〇  〇  〇
C_port  〇  〇  〇  〇  〇  〇  〇  〇

MPLAB IDE v8.6 [ PICC Lite ]
*/

#include <htc.h> 
#include <pic.h>
#define _XTAL_FREQ 10000000 // 10Mhz

__CONFIG(WDTDIS & HS & UNPROTECT);

void pat_1();
void pat_2();
void pat_3();
void pat_4();
void dwrite();

void main(){
TRISB=0x00;
TRISC=0x00;
while(1){
pat_1();
pat_2();
pat_3();
pat_4();
}
}

void pat_1(){
unsigned char p1;
for (p1=1;p1<=5;p1++){
dwrite(0b00000001,0b00000001);
dwrite(0b00000011,0b00000000);
dwrite(0b00000110,0b00000000);
dwrite(0b00001100,0b00000000);
dwrite(0b00011000,0b00000000);
dwrite(0b00110000,0b00000000);
dwrite(0b01100000,0b00000000);
dwrite(0b11000000,0b00000000);

dwrite(0b10000000,0b10000000);
dwrite(0b00000000,0b11000000);
dwrite(0b00000000,0b01100000);
dwrite(0b00000000,0b00110000);
dwrite(0b00000000,0b00011000);
dwrite(0b00000000,0b00001100);
dwrite(0b00000000,0b00000110);
dwrite(0b00000000,0b00000011);
}
dwrite(0b00000000,0b00000001);
dwrite(0b00000000,0b00000000);
}

void pat_2(){
unsigned char p2;
for (p2=1;p2<=5;p2++){
dwrite(0b00000001,0b00000001);
dwrite(0b00000011,0b00000000);
dwrite(0b00000110,0b00000000);
dwrite(0b00001100,0b00000000);
dwrite(0b00001000,0b00010000);
dwrite(0b00000000,0b00110000);
dwrite(0b00000000,0b01100000);
dwrite(0b00000000,0b11000000);

dwrite(0b10000000,0b10000000);
dwrite(0b11000000,0b00000000);
dwrite(0b01100000,0b00000000);
dwrite(0b00110000,0b00000000);
dwrite(0b00010000,0b00001000);
dwrite(0b00000000,0b00001100);
dwrite(0b00000000,0b00000110);
dwrite(0b00000000,0b00000011);
}
dwrite(0b00000000,0b00000001);
dwrite(0b00000000,0b00000000);
}

void pat_3(){
unsigned char p3;
for (p3=1;p3<=5;p3++){
dwrite(0b00000001,0b00000001);
dwrite(0b00000010,0b00000010);
dwrite(0b00000100,0b00000100);
dwrite(0b00001000,0b00001000);
dwrite(0b00010000,0b00010000);
dwrite(0b00100000,0b00100000);
dwrite(0b01000000,0b01000000);
dwrite(0b10000000,0b10000000);

dwrite(0b01000000,0b01000000);
dwrite(0b00100000,0b00100000);
dwrite(0b00010000,0b00010000);
dwrite(0b00001000,0b00001000);
dwrite(0b00000100,0b00000100);
dwrite(0b00000010,0b00000010);
}
dwrite(0b00000001,0b00000001);
dwrite(0b00000000,0b00000000);
}

void pat_4(){
unsigned char p4;
dwrite(0b00000001,0b00000001);
dwrite(0b00000001,0b00000010);
dwrite(0b00000001,0b00000100);
dwrite(0b00000001,0b00001000);
dwrite(0b00000001,0b00010000);
dwrite(0b00000001,0b00100000);
dwrite(0b00000001,0b01000000);
dwrite(0b00000001,0b10000000);

for (p4=1;p4<=5;p4++){
dwrite(0b00000001,0b10000000);
dwrite(0b00000010,0b01000000);
dwrite(0b00000100,0b00100000);
dwrite(0b00001000,0b00010000);
dwrite(0b00010000,0b00001000);
dwrite(0b00100000,0b00000100);
dwrite(0b01000000,0b00000010);
dwrite(0b10000000,0b00000001);

dwrite(0b01000000,0b00000010);
dwrite(0b00100000,0b00000100);
dwrite(0b00010000,0b00001000);
dwrite(0b00001000,0b00010000);
dwrite(0b00000100,0b00100000);
dwrite(0b00000010,0b01000000);
}
dwrite(0b00000001,0b10000000);
dwrite(0b00000001,0b01000000);
dwrite(0b00000001,0b00100000);
dwrite(0b00000001,0b00010000);
dwrite(0b00000001,0b00001000);
dwrite(0b00000001,0b00000100);
dwrite(0b00000001,0b00000010);
dwrite(0b00000001,0b00000001);
dwrite(0b00000000,0b00000000);
}

void dwrite (b,c){
unsigned char i;
PORTB =b;
PORTC =c;
for (i=1;i<=8;i++){
__delay_ms(10); // delay for 10*8 = 80 (ms)
}
}


--------------------------------------------------------------------------------

[ 16F57 電子フラッシャー ① ]

ビット・パターン表記でプログラムしています。                   2011/01/10

プログラム・ダウンロード F57-5.c


/*
[ 16F57 電子フラッシャー ] 2011/01/10

Port A:未使用 (未設定)
Port B:出力
Port C:出力
OSC   :XT (10Mhz)
MPLAB IDE v8.6 [ PICC Lite ]
*/
#include <htc.h> 
#include <pic.h>
#define _XTAL_FREQ 10000000 // 10Mhz

__CONFIG(WDTDIS & HS & UNPROTECT);

void pat_1();
void dwrite();

void main(){
TRISB=0x00;
TRISC=0x00;
while(1){
pat_1();
}
}
void pat_1(){
unsigned char p1;
for (p1=1;p1<=5;p1++){
dwrite(0b00000001,0b00000001);
dwrite(0b00000011,0b00000000);
dwrite(0b00000110,0b00000000);
dwrite(0b00001100,0b00000000);
dwrite(0b00011000,0b00000000);
dwrite(0b00110000,0b00000000);
dwrite(0b01100000,0b00000000);
dwrite(0b11000000,0b00000000);

dwrite(0b10000000,0b10000000);
dwrite(0b00000000,0b11000000);
dwrite(0b00000000,0b01100000);
dwrite(0b00000000,0b00110000);
dwrite(0b00000000,0b00011000);
dwrite(0b00000000,0b00001100);
dwrite(0b00000000,0b00000110);
dwrite(0b00000000,0b00000011);
}
}
void dwrite (b,c){
unsigned char i;
PORTB =b;
PORTC =c;
for (i=1;i<=8;i++){
__delay_ms(10); // delay for 10*8 = 80 (ms)
}
}
--------------------------------------------------------------------------------
 [ 12F629 わかさぎ用しゃくり機 ]


 プログラムにエラーがあったので、修正して投稿しなおしました。              2011/01/12


プログラム・ダウンロード wakasagi-Cx.c

//********************************************************************
//[ 12F629 ] Test Program                    2010/12/15
//
// わかさぎ用しゃくり機の前準備実験-C1
//
// CMCON = 0b00000111                      :コンパレーター OFF [ Digital input ]
//
//********************************************************************
// PIC C-Lite MPLAB IDE v8.6
//********************************************************************
#include <htc.h>                                 // Required to interface with delay routines
#include <pic.h>
#define _XTAL_FREQ 4000000                  // 4Mhz [Max ms:197ms us:197120us]

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS);

void u_sec();                                          // μs delay
void v_sec();                                          // 待ち時間
void wt();                                              // ms delay
void up();                                              // 上昇移動
void dw();                                             // 下降移動
void ps_on();                                         // ONパルス                 

//**************************************************
int main(){
     TRISIO = 0b00001111;                       // I/O port set
     CMCON = 0b00000111;                      // コンパレーター OFF
     GPIO = 0;                                        // out put reset
      wt( 1,100);                                      // start wait time
while(1){
//pat_1:*******************
     if (GPIO0){
                  up( 1,70, 50);
                  wt( 70, 25);
                   dw(70, 1, 50);                      // Down
                  wt( 1, 25);
           }
//pat_2:*******************
     if (GPIO1){
                  up( 1,17, 50);                      // Up
                  wt( 17, 15);
                  up(17,34, 50);
                  wt( 34, 15);
                  up(34,51, 50);
                  wt( 51, 15);
                  up(51,70, 50);
                  wt( 70, 25);
                   dw(70, 1, 50);                      // Down
                  wt( 1, 25);
           }
//pat_4:*******************
     if (GPIO2){
                  up( 1,30, 15);
                  up(49,60, 15);
                  dw(60,30, 70);
                  up(49,60, 15);
                  dw(60,30, 70);
                  up(49,60, 15);
                  dw(60,30, 70);
                  up(49,60, 15);
                  dw(60,30, 70);
                  up(49,60, 15);
                  dw(60,30, 70);
                  up(30,70, 15);
                  wt( 70, 25);
                  dw(70, 1, 50);                      // Down
                  wt( 1, 25);
          }
//pat_8:*******************
     if (GPIO3){
                  up( 1,10, 25);
                  up(10,17, 3);
                  wt( 17, 5);
                  dw(17,10, 25);
                   up(10,28, 25);
                  up(28,35, 3);
                  wt( 35, 5);
                  dw(35,28, 25);
                   up(28,45, 25);
                  up(45,52, 3);
                  wt( 52, 5);
                  dw(52,45, 25);
                   up(45,62, 25);
                  up(62,70, 3);
                  wt( 70, 25);
                   dw(70, 1, 50);                       // Down
                  wt( 1, 25);
           }
      }
}
//*********************************************
void u_sec(tcu){                                     // Onパルス
          while(tcu--){__delay_us(15);
      }
}
void v_sec(tcv){                                     // 待ち時間
          while(tcv--){__delay_us(100);
      }
}
void wt(i , j){                                         // 待ち時間(停止位置、回数(停止時間))
           while(j--){
                        ps_on(i);
      }
}
void up(u1,u2,u3){                                 // 上昇移動(始め、終り、移動遅延時間)
          unsigned char u;
                  for (u=u1;u<=u2;u++){
                         ps_on(u);
                         v_sec(u3);                   // delay 
      }
 }
void dw(d1,d2,d3){                                 // 下降移動(始め、終り、移動遅延時間)
            unsigned char d;
                   for (d=d1;d>=d2;d--){
                          ps_on(d);
                          v_sec(d3);                  // delay
      }
}
void ps_on(p){                                        // ONパルス
                  GPIO5 = 1;
                  u_sec(22);                          // 原点位置
                  u_sec(p);                            // 動作パルス時間
                  GPIO5 = 0;
                  __delay_ms(19);                   // (20ms = 原点位置+動作パルス時間+19ms)
}