/************************************************************** 12F1822 NEW IR_Remocon Control File-Name IR_Remocon_V33.c Gucci-Tech Chojiro Higashiguchi MPLAB 8.60 / Hitech PICC Pro Lite mode v9.80 Digikey Remocon 2011/5/14 PM11:081 Coting Start 2011/5/14 PM11:081 ON-LED Alternate Pin assignment: (1)Vdd +3.0V (2)RA5 'IN' [CCP1] IR_Seki (3)RA4 'OUT' Debug Signal (4)RA3 'IN' [MCLR] Vdd between resister 10Kohm (5)RA2 'IN' [INT] (6)RA1 'OUT' [ICSPCLK] OUT_Signal (7)RA0 'OUT' [ICSPDAT] Blue_LED (8)Vss TMR1 Timer Data Paramater List Fossc=16MHz TMR1_Priscaler=1 DaTM1_H = 0xB9; // 65536 - 18000 = 47536(0xB9B0) DaTM1_L = 0xB0; // 0.25uS * 18000 = 4.5msec DaTM1_H = 0xDC; // 65536 - 9000 = 56536(0xDCD8) DaTM1_L = 0xD8; // 0.25uS * 9000 = 2.25msec DaTM1_H = 0xEE; // 65536 - 4500 = 61036(0xEE6C) DaTM1_L = 0x6C; // 0.25uS * 4500 = 1.125msec DaTM1_H = 0xCB; // 65536 - 13500 = 52036(0xCB44) DaTM1_L = 0x44; // 0.25uS * 13500 = 3.375msec DaTM1_H = 0xE5; // 65536 - 6750 = 58786(0xE5A2) DaTM1_L = 0xA2; // 0.25uS * 6750 = 1.6875msec DaTM1_H = 0xEA; // 65536 - 5625 = 59911(0xEA07) DaTM1_L = 0x07; // 0.25uS * 5625 = 1.40625msec DaTM1_H = 0xD8; // 65536 - 10125 = 55411(0xD873) DaTM1_L = 0x73; // 0.25uS * 10125 = 2.53125msec DaTM1_H = 0xD7; // 65536 - 10400 = 55136(0xD760) DaTM1_L = 0x60; // 0.25uS * 10400 = 2.6msec **************************************************************/ #include #pragma jis __CONFIG( FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF ); __CONFIG( WRT_OFF & PLLEN_OFF & STVREN_ON & BORV_25 & LVP_OFF ); void IR_DatST(void); void ActionLED(void); void Delay_10ms(unsigned char time); void LED_Flash(unsigned char F_Cnt); #define MHz 000000 #define _XTAL_FREQ 16MHz #define IR_Seki RA5 #define OUT_Sig RA1 #define Blue_LED RA0 #define DebgSig RA4 unsigned char IR_DatX; //unsigned int IR_DatY; unsigned char TMR1_EF; // TMR1 Enalbe Flag unsigned char TMR1_DC; // TMR1 Data Counter unsigned char IR_Dat1; // IR_Data1 unsigned char IR_Dat2; // IR_Data2 unsigned char RepeatF; // Reader-Repeat Flag unsigned char StartF; // START Flag unsigned char ToggleF1; // Toggle Flag 1 // 9ms -> 3.375ms -> 2.53125ms -> 1.125ms or 2.25ms const unsigned int DaTM1_H[5]={0x73, 0xCB, 0xD8, 0xEE, 0xDC}; const unsigned int DaTM1_L[5]={0x60, 0x44, 0x73, 0x6C, 0xD8}; // INT External Interrupt // void interrupt isr(void){ // TMR1 Interrupt // if(TMR1IF){ if(IR_Seki == 0) TMR1_DC = 3; // TMR1 1.125ms Data Set if(IR_Seki == 1) TMR1_DC = 4; // TMR1 2.25ms Data Set TMR1H = DaTM1_H[TMR1_DC]; TMR1L = DaTM1_L[TMR1_DC]; } TMR1_EF = 1; TMR1IF = 0; // TMR1 Interrupt Flag Clear } void IR_DatST(void){ int j; unsigned char BitPos; IR_DatX = 0; BitPos = 0x80; for (j=0; j<8; j++){ // Data Code 8bit Data Read while(TMR1_EF == 0){ // 1.125ms or 2.25ms Check } // Custom Code Data Chrck TMR1_EF = 0; if(IR_Seki == 1) IR_DatX |= BitPos; BitPos = BitPos >> 1; DebgSig =! DebgSig; // Debug Signal ONRY } DebgSig = 0; // Debug Signal ONRY } //Delay 100msec -------------------------------- void Delay_10ms(unsigned char time){ while(time--){ __delay_ms(10); } } //------------------main void main(void){ //Initialization OSCCON = 0b01111010; // PLL Disable, 16MHz internal Oscillator GIE = 0; // Interrupt service is disable ANSELA = 0; // ALL digital port APFCON = 0b00000001; // Rx/DT=RA1,SDO=RA0,SS=RA3,T1G=RA4, // TxCK=RA0,P1B=RA0,CCP1=RA5 // bit 76543210 nWPUEN = 0; // PULL-UP Enable [OPTION-Registor] TRISA = 0b11101100; // GPIO dirction setting WPUA = 0b11101100; // Pulll-up Enable Select PORTA = 0b11101100; // GPIO initialize LATA = 0b11101100; T1CON = 0b00000000; // Fosc/4,Prescale=1,T1OSCEN=Disable // T1SYNC=Yes-SYNC,TMR1ON=STOP // (1/(16MHz/4))*1 = 0.25uS(400kHz) // TMR1H = 0x73; // 65536 - 36000 = 29536(0x7360) // TMR1L = 0x60; // 0.25uS * 36000 = 9msec TMR1H = 0xEE; // 65536 - 4500 = 61036(0xEE6C) TMR1L = 0x6C; // 0.25uS * 4500 = 1.125msec TMR1IF = 0; // TMR1 Interrupt Flag Clear // Interrupt Enable // TMR1IE = 1; // TMR1 Interrput Enable PEIE = 1; // Peripheral Interrput Enable GIE = 1; // Global Interrupt Enable TMR1_DC = 0; TMR1_EF = 0; Blue_LED = 1; Delay_10ms(20); Blue_LED = 0; Delay_10ms(20); Blue_LED = 1; Delay_10ms(20); Blue_LED = 0; //--------------------------------------------------------- while(1){ while(IR_Seki == 1){ // IR-Sencer Faill Check! __delay_ms(1); } // 9ms Pulse Witdh Check // while(1){ if(IR_Seki == 0){ __delay_ms(4); if(IR_Seki == 0) __delay_ms(4); else break; }else break; // 4.5ms Pulse Witdh Check // while(IR_Seki == 0){ // IR-Sencer Rise Check! } if(IR_Seki == 1){ __delay_us(3500); if(IR_Seki == 1) RepeatF = 1; else RepeatF = 0; } else break; // Cusf1 tom Code 16bit Pulse Check // while(IR_Seki == 1){ // IR-Senser Faill Check } __delay_us(1400); DebgSig = 1; // Debug Onry if((IR_Seki == 0) && (RepeatF == 1)){ // Timming Fine Adjustment // unsigned char i; i = 0; for(i=0; i<15; i++){ // DebgSig =! DebgSig; // Debug Onry while(IR_Seki == 0){ // IR-Sencer Rise Check! } __delay_us(300); while(IR_Seki == 1){ // IR-Senser Faill Check } __delay_us(300); DebgSig =! DebgSig; // Debug Onry } DebgSig = 0; // Debug Onry } else break; // Timming Fine Adjustment // TMR1ON = 1; // TMR1 Start // Deta Code 8bit Data Read // IR_DatST(); IR_Dat1 = IR_DatX; // Reverse Data Code 8bit Data Read // IR_DatST(); IR_Dat2 = IR_DatX; TMR1ON = 0; // TMR1 Stop ActionLED(); } TMR1_DC = 0; TMR1H = 0xEE; // 65536 - 4500 = 61036(0xEE6C) TMR1L = 0x6C; // 0.25uS * 4500 = 1.125msec // Repeat Timming Adjustment // Delay_10ms(20); // Stop Bit Time Pass & 0.2sec Wait } } // IR Data Action // void ActionLED(void){ if((IR_Dat1 == 0x08) && (IR_Dat2 == 0xF7)){ // 'POWER' Switch // if(ToggleF1 == 0){ OUT_Sig = 1; // OUT Signal 'ON' Blue_LED = 1; // Blue LED 'ON' ToggleF1 = 1; }else{ OUT_Sig = 0; // OUT Signal 'OFF' Blue_LED = 0; // Blue LED 'OFF' ToggleF1 = 0; } } if((IR_Dat1 == 0x60) && (IR_Dat2 == 0x9F)){ // 'FLASH' Switch // Blue_LED = 1; // Blue LED 'ON' } if((IR_Dat1 == 0xB8) && (IR_Dat2 == 0x47)){ // 'ESC' Switch // Blue_LED = 0; // Blue LED 'OFF' } if((IR_Dat1 == 0xE8) && (IR_Dat2 == 0x17)){ // '1' Switch // LED_Flash(1); } if((IR_Dat1 == 0x48) && (IR_Dat2 == 0xB7)){ // '2' Switch // LED_Flash(2); } if((IR_Dat1 == 0x68) && (IR_Dat2 == 0x97)){ // '3' Switch // LED_Flash(3); } if((IR_Dat1 == 0xB2) && (IR_Dat2 == 0x4D)){ // '4' Switch // LED_Flash(4); } if((IR_Dat1 == 0x02) && (IR_Dat2 == 0xFD)){ // '5' Switch // LED_Flash(5); } if((IR_Dat1 == 0x32) && (IR_Dat2 == 0xCD)){ // '6' Switch // LED_Flash(6); } if((IR_Dat1 == 0x20) && (IR_Dat2 == 0xDF)){ // '7' Switch // LED_Flash(7); } if((IR_Dat1 == 0x00) && (IR_Dat2 == 0xFF)){ // '8' Switch // LED_Flash(8); } if((IR_Dat1 == 0x50) && (IR_Dat2 == 0xAF)){ // '9' Switch // LED_Flash(9); } } void LED_Flash(unsigned char F_Cnt){ unsigned char k; Blue_LED = 0; // OFF LED 'OFF' for(k=0; F_Cnt>k; k++){ Blue_LED = 1; Delay_10ms(20); Blue_LED = 0; Delay_10ms(20); } if(ToggleF1 != 1) Blue_LED = 0; // ON LED 'OFF' else Blue_LED = 1; }