1年前に、遊戯王真デュエルモンスターズ~封印されし記憶~のポケットステーションで強力なカードを入手するためのツール:チートリモコンを製作記事を作成した。
今回は、チートリモコンの設計を見直し、小型で操作性を向上したLite版を製作する。
<初代チートリモコン>
・封印されし記憶を語る
・概要編
・ハードウェア編
・ソフトウェア編①:動作確認
・ソフトウェア編②:キー操作
・ソフトウェア編③:チャタリング対策
・ソフトウェア編④:NECフォーマット
・ソースコード一覧
・入手カード一覧
<チートリモコンLite>
・回路図編
・ソフトウェア編
・基板実装編
・ソースコード一覧 ←いまここ
下記ソースコードをそのままコピーすれば動くはずですが、内部発振を使っているため個体による誤差があります。
送信失敗するほど誤差があった場合はIrREMlib.cのNecGenTonの時間を調整してください。
pic16f1786_config.h
// PIC16F1786 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable bit (Vcap functionality is disabled on RA6.) #pragma config PLLEN = ON // PLL Enable (4x PLL enabled) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LPBOR = OFF // Low Power Brown-Out Reset Enable Bit (Low power brown-out is disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h>
main.c
//#include <stdio.h> //#include <stdlib.h> #include "xc.h" #include "pic16f1786_config.h" #include "IrREMlib.h" #define _XTAL_FREQ 32000000 // I/O #define CUSTOM ~PORTA #define DATA PORTC #define SEND_SW RB0 #define LED_ON LATB5 = 1; #define LED_OFF LATB5 = 0; int main() { unsigned char nec_custom = 0; unsigned char nec_data = 0; // Clock Config OSCCONbits.IRCF = 0b1110; // 8MHz(x4 = 32MHz) // I/O Port Init ANSELA = 0x00; //全てデジタル ANSELB = 0x00; //全てデジタル TRISA = 0xFF; //全て入力 TRISB = 0xDF; //RB5のみ出力 TRISC = 0xFF; //全て入力 nWPUEN = 0; //内部プルアップ有効化 WPUA = 0xFF; //全て内部プルアップ有り WPUB = 0x01; //RB0のみ内部プルアップ有り WPUC = 0xFF; //全て内部プルアップ有り LED_OFF; // Main Loop while(1){ if(SEND_SW == 0){ nec_custom = CUSTOM; nec_data = DATA; do{ NecSend(nec_custom, nec_data); __delay_ms(40); } while(SEND_SW == 0); } } return (EXIT_SUCCESS); }
IrREMlib.h
#ifndef IRREMLIB_H #define IRREMLIB_H // NEC Format void NecSend(unsigned char custom, unsigned char data); #endif
IrREMlib.c
#include "xc.h" #define _XTAL_FREQ 32000000 #define LED_ON LATB5 = 1 #define LED_OFF LATB5 = 0 void NecGenTon(void){ int i; for(i=0; i<21; i++){ LED_ON; __delay_us(8); LED_OFF; __delay_us(15); _delay(4); } __delay_us(5); } void NecGenToff(void){ // LED_OFF; __delay_us(562); } void NecGenBitOn(void){ NecGenTon(); NecGenToff(); NecGenToff(); NecGenToff(); } void NecGenBitOff(void){ NecGenTon(); NecGenToff(); } void NecSend(unsigned char custom, unsigned char data){ int i; //Leader Code for(i=0; i<16; i++){ NecGenTon(); } for(i=0; i<8; i++){ NecGenToff(); } //Custom Code for(i=0; i<8; i++){ if(custom>>i & 1){ NecGenBitOn(); } else{ NecGenBitOff(); } } //Custom Code(invert) for(i=0; i<8; i++){ if(custom>>i & 1){ NecGenBitOff(); } else{ NecGenBitOn(); } } //Data Code for(i=0; i<8; i++){ if(data>>i & 1){ NecGenBitOn(); } else{ NecGenBitOff(); } } //Data Code(invert) for(i=0; i<8; i++){ if(data>>i & 1){ NecGenBitOff(); } else{ NecGenBitOn(); } } //Stop Bit NecGenTon(); }