[ リモコン信号受信処理 ① ]
アッセンブラ―プログラムから 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 信号有り
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
/*
[ 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
//********************************************************************
//[ 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
#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
//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++){
void dw(d1,d2,d3){ // 下降移動(始め、終り、移動遅延時間)
unsigned char d;
for (d=d1;d>=d2;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)
}