#define IR_in PORTAbits.RA6 //define as needed
#define IR_tris TRISAbits.TRISA6
unsigned char GetPulse(void){
unsigned char count;
count=0;
IR_tris=1;
while(IR_in==1); //wait for high
while(IR_in==0){ //time low period
count++;
Delay100TCYx(1); //50uS assumes 8MHz
}
return count;
}
void GetIR(char *cmd,char *dev){
char i;
*cmd=0;
*dev=0;
while(GetPulse()<40); //wait for start pulse
for(i=0;i<7;i++){
*cmd=*cmd>>1;
if(GetPulse()>18)
*cmd|=0x40;
}
for(i=0;i<5;i++){
*dev=*dev>>1;
if(GetPulse()>18)
*dev|=0x10;
}
}
//you would call it by doing,
char command,device;
GetIR(&command,&device); //note pointers passed
//command and device are now valid.
blueroomelectronics said:Never thought about that, how much lower?
// 37.7kHZ PWM IR carrier signal
#include <p18f1320.h>
#include <delays.h>
#pragma config WDT = OFF,OSC = INTIO2,LVP = OFF
void Delay10TCYx(PARAM_SCLASS unsigned char);
void Delay100TCYx(PARAM_SCLASS unsigned char);
void Delay1KTCYx(PARAM_SCLASS unsigned char);
void Delay10KTCYx(PARAM_SCLASS unsigned char);
void MyL0(void);
void MyL1(void);
void main(void) {
[B] OSCCON=0x72;[/B] // speed up the clock to 8MHz
bit 6-4 IRCF2:IRCF0: Internal Oscillator Frequency Select bits
111 = 8 MHz (8 MHz source drives clock directly)
110 = 4 MHz
101 = 2 MHz
100 = 1 MHz
011 = 500 kHz
010 = 250 kHz
001 = 125 kHz
000 = 31 kHz (INTRC source drives clock directly)
OSCCON=0x72 does give 8MHz. Even if you have the config set to HS and a 20MHz crystal attached.3v0 said:If the people gave you PWM setups for a 8MHz clock you need to change your ckock freq from 4 to 8MHz. I would check but I am running behind.
Pommie said:OSCCON=0x72 does give 8MHz. Even if you have the config set to HS and a 20MHz crystal attached.
Mike.
AtomSoft said:ok this sucks! lol i can always make my own protocol right?
I wanted to use sony's because i have code to read sonys already but i guess ill have to remake everything which shouldnt be that hard if i make my own code just change some variables around and stuff..
So is it possible to make a custom protocol?
Like
Start Bit = 4ms
Space = 1ms
Logic High = 3ms
Logic Low = 2ms
Something like that.... but about 16bit instead of sony 12bit
;------------------------------------------------------
; PROJECT : 3 CHANNEL TX IR REMOTE
; CRYSTAL 4 MHz
; MPLAB : 7.11 , Assembly
; RC5 FORMAT @38KHz , 35% DUTY CYCLE
; ADDRESS = 0X0B 0000 1011 you may change
; CH1 = 0X01
; CH2 = 0X02
; CH3 = 0X03
; NOT USE TOGGLE ALWAY = 0
; WWW.SIXCA.COM
; 4-JULY 2005
;
; FREE TO USE FOR PERSONAL OR EVEN COMERCIAL PRODUCT
;------------------------------------------------------
list P=12F629
#include <P12F629.INC>
__config _WDT_OFF & _XT_OSC & _CP_ON & _CPD_ON & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON
#DEFINE CH1 GPIO,0 ; CONNECT WITH TX SWITCH CHANNEL 1
#DEFINE CH2 GPIO,1 ; CONNECT WITH TX SWITCH CHANNEL 2
#DEFINE CH3 GPIO,3 ; CONNECT WITH TX SWITCH CHANNEL 3
#DEFINE IR GPIO,2 ; CONNECT WITH IR LED WITH TRANSISTOR DRIVES
#DEFINE TOG_BIT TOGGLE,0 ; TOGLE BIT NOT USE FOR THIS PROJECT
#DEFINE CH1_CMD 0X01 ; CHANNEL 1 COMMAND
#DEFINE CH2_CMD 0X02 ; CHANNEL 2 COMMAND
#DEFINE CH3_CMD 0X03 ; CHANNEL 3 COMMAND
CNT1 EQU 20H
CNT2 EQU 21H
CNT3 EQU 22H
CNT4 EQU 23H
TOGGLE EQU 24H
CMD EQU 25H ; IR COMMAND BUFFER
ORG 000
BCF IR
;BSF STATUS,RP0
;CALL 0X3FF
;MOVWF OSCCAL
;BCF STATUS,RP0
CALL DEBOUNCE
;
MOVLW 0X07
MOVWF CMCON ; MAKE ALL GPIO TO DIGITAL I/O
BSF STATUS,RP0
BCF OPTION_REG,7 ; ENABLE WEAK PULL-UP
BCF WPU,2 ; DISABLE WEAK PULL-UP FOR GPIO2
MOVLW B'00001011' ; GPIO<0,1,3> = INPUT , GPIO 2 = OUTPUT
MOVWF TRISIO
BSF IOCB,IOCB0
BSF IOCB,IOCB1
BSF IOCB,IOCB3
BSF INTCON,GPIE
BCF STATUS,RP0
BCF INTCON,GIE
BCF TOG_BIT
;------------------------------------
; MAIN LOOP
MAIN: SLEEP ; GOTO SLEEP MODE(I a sleepy! and need to save my energy)
BTFSS CH1
GOTO DO_CH1
BTFSS CH2
GOTO DO_CH2
BTFSS CH3
GOTO DO_CH3
GOTO MAIN
;------------------------------------
DO_CH1: CALL DEBOUNCE
BTFSC CH1
GOTO MAIN
MOVLW CH1_CMD ; LOAD COMMANE FOR CHANNEL 1
MOVWF CMD
CALL SEND_RC5
;
BTFSS CH1
GOTO $-1 ; WAIT FOR SWITCH RELEASED
;
CALL DEBOUNCE ; DELAY AFTER SWITCH RELEASED
GOTO MAIN
;------------------------------------
DO_CH2: CALL DEBOUNCE
BTFSC CH2
GOTO MAIN
MOVLW CH2_CMD ; LOAD COMMANE FOR CHANNEL 1
MOVWF CMD
CALL SEND_RC5
;
BTFSS CH2
GOTO $-1 ; WAIT FOR SWITCH RELEASED
;
CALL DEBOUNCE ; DELAY AFTER SWITCH RELEASED
GOTO MAIN
;
;------------------------------------
DO_CH3: CALL DEBOUNCE
BTFSC CH3
GOTO MAIN
MOVLW CH3_CMD ; LOAD COMMANE FOR CHANNEL 1
MOVWF CMD
CALL SEND_RC5
;
BTFSS CH3
GOTO $-1 ; WAIT FOR SWITCH RELEASED
;
CALL DEBOUNCE ; DELAY AFTER SWITCH RELEASED
GOTO MAIN
;
;======================================
; SEND LOGIC 0
;======================================
LOGIC0: MOVLW .32 ; 1
MOVWF CNT1 ; 1
;
LOG0_1: BSF IR ; 1 MAKE IR HIGH 35% Duty cycle = 9 uS
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
;
;===================================
BCF IR ; 1 MAKE IR LOW 17 uS
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
NOP ; 1
;
DECFSZ CNT1,F ; 1/2
GOTO LOG0_1 ; 2 26 uS
;
CALL DELAY_OFF
RETURN ; 2
;
;======================================
; SEND LOGIC 1
;======================================
LOGIC1: CALL DELAY_OFF ; DELAY 899 uS
MOVLW .32 ; 1
MOVWF CNT1 ; 1
;
LOG1_1: BSF IR ; 1 MAKE IR HIGH 35% Duty cycle = 9 uS
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
;
;===================================
BCF IR ; 1 MAKE IR LOW 17 uS
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
NOP ; 1
;
DECFSZ CNT1,F ; 1/2
GOTO LOG1_1 ; 2
;
RETURN ; 2
;
;======================================
; DELAY FOR NO CARRAIR
; DELAY ABOUT 835 uS
;======================================
DELAY_OFF:
MOVLW 5 ; 1
MOVWF CNT3 ; 1
MOVLW .54 ; 1
MOVWF CNT4 ; 1
DECFSZ CNT4,F ; 1/2
GOTO $-1 ; 2
DECFSZ CNT3,F ; 1/2
GOTO $-5 ; 2
RETURN ; 2
;======================================
; SEND RC5 TO REMOTE
; INPUT : CMD (6 BIT IR COMMAND)
;======================================
SEND_RC5:
; SEND 2 START BIT
CALL LOGIC1
CALL LOGIC1
; SEND TOGGLE BIT
BTFSS TOG_BIT
GOTO $+3
CALL LOGIC1
GOTO $+2
CALL LOGIC0
; SEND ADDRESS 5 BIT FIX AT 01011 (0X0B) IT MAY BE CHANGED BY YOU
CALL LOGIC0 ; 0 MSB FIRST BIT 4
CALL LOGIC1 ; 1
CALL LOGIC0 ; 0
CALL LOGIC1 ; 1
CALL LOGIC1 ; 1 LSB BIT 0
;
; SEND COMMAND 6 BIT(00HH LLLL) MSB FIRST
BCF STATUS,C
RLF CMD,F ; AFTER FIRST ROTAGE 0HHL LLL0
RLF CMD,F ; AFTER SECOND ROTAGE HHLL LL00
;
MOVLW 6
MOVWF CNT2
;
RLF CMD,F ; SEND MSB FIRST
BTFSS STATUS,C
GOTO $+3
CALL LOGIC1
GOTO $+2
;
CALL LOGIC0
DECFSZ CNT2,F
GOTO $-7
;
RETLW 0
;
;======================================
; DEBOUNCE SWITCH
; DELAY 15 mS
;======================================
DEBOUNCE:
MOVLW .1 ; 1
MOVWF CNT1 ; 1
DEL_1: MOVLW .20
MOVWF CNT2 ; 1
DEL_2: CLRF CNT3 ; 1
DEL_3: DECFSZ CNT3,F ; 1/2
GOTO DEL_3 ; 2
DECFSZ CNT2,F ; 1/2
GOTO DEL_2 ; 2
DECFSZ CNT1,F ; 1/2
GOTO DEL_1 ; 2
RETLW 0 ; 2
END
#include <p18f1320.h>
#include "delays.h"
#pragma config WDT = OFF, LVP = OFF, OSC = INTIO2
void sendbyte(char Num,char bits){
char i;
for(i=0;i<bits;i++){
CCPR1L = 0x1A; // 0
CCP1CON = 0x1C; // 50%
if(Num&1==1)
Delay100TCYx(24); //1.2mS
else
Delay100TCYx(12); //0.6mS
Num=Num>>1;
CCPR1L = 0x00; //Space
CCP1CON = 0x0C ; // 0%
Delay100TCYx(12); //0.6mS
}
}
void main(void) {
OSCCON=0x72; // speed up the clock to 8MHz
ADCON1 = 0;
TRISBbits.TRISB3 = 0;
PR2 = 0b00110100 ;
T2CON = 0b00000100 ;
CCPR1L = 0b00011010 ;
CCP1CON = 0b00011100 ;
while(1) {
CCPR1L = 0x1A; // 0
CCP1CON = 0x1C ; // 50%
Delay100TCYx(48); //2.4mS pulse
CCPR1L = 0x00; //Space
CCP1CON = 0x0C ; // 0%
Delay100TCYx(12); //0.6mS
sendbyte(18,7); //device 18
sendbyte(1,6); //command 1
Delay1KTCYx(100);
}
}
;------------------------------------------------------
; PROJECT : 3 CHANNEL TX IR REMOTE
; CRYSTAL 4 MHz
; MPLAB : 7.11 , Assembly
; RC5 FORMAT @38KHz , 35% DUTY CYCLE
; ADDRESS = 0X0B 0000 1011 you may change
; CH1 = 0X01
; CH2 = 0X02
; CH3 = 0X03
; NOT USE TOGGLE ALWAY = 0
; WWW.SIXCA.COM
; 4-JULY 2005
;
; FREE TO USE FOR PERSONAL OR EVEN COMERCIAL PRODUCT
; Modified by William Richardson for use with the
; blueroomelectronics Junebug Tutor
; BETA (not tested...)
;------------------------------------------------------
list P=18F1320
#include <P18F1320.INC>
CONFIG OSC=INTIO2,WDT=OFF,LVP=OFF
#DEFINE CH1 PORTB,0 ; CONNECT WITH TX SWITCH CHANNEL 1
#DEFINE CH2 PORTB,2 ; CONNECT WITH TX SWITCH CHANNEL 2
#DEFINE CH3 PORTB,5 ; CONNECT WITH TX SWITCH CHANNEL 3
#DEFINE IR LATB,3 ; CONNECT WITH IR LED WITH TRANSISTOR DRIVES
#DEFINE TOG_BIT TOGGLE,0
#DEFINE CH1_CMD 0X01 ; CHANNEL 1 COMMAND
#DEFINE CH2_CMD 0X02 ; CHANNEL 2 COMMAND
#DEFINE CH3_CMD 0X03 ; CHANNEL 3 COMMAND
cblock 0x00
CNT1,CNT2,CNT3,CNT4,TOGGLE,CMD
endc
ORG 0x00
movlw 0x62
movwf OSCCON ; 4MHz clock (1us instruction)
setf ADCON1 ; set all I/O to digital
bcf INTCON2,RBPU ; enable PORTB input pullups
clrf PORTB ; zero the output bits
MOVLW B'11110111' ; IR Output on RB3
MOVWF TRISB
rcall DEBOUNCE
BCF TOG_BIT
;------------------------------------
; MAIN LOOP
MAIN:
; SLEEP ; removed for test GOTO SLEEP MODE(I a sleepy! and need to save my energy)
BTFSS CH1
bra DO_CH1
BTFSS CH2
bra DO_CH2
BTFSS CH3
bra DO_CH3
bra MAIN
;------------------------------------
DO_CH1: rcall DEBOUNCE
BTFSC CH1
bra MAIN
MOVLW CH1_CMD ; LOAD COMMANE FOR CHANNEL 1
MOVWF CMD
rcall SEND_RC5
BTFSS CH1
bra $-2 ; WAIT FOR SWITCH RELEASED
rcall DEBOUNCE ; DELAY AFTER SWITCH RELEASED
bra MAIN
;------------------------------------
DO_CH2: rcall DEBOUNCE
BTFSC CH2
bra MAIN
MOVLW CH2_CMD ; LOAD COMMANE FOR CHANNEL 1
MOVWF CMD
rcall SEND_RC5
BTFSS CH2
bra $-2 ; WAIT For SWITCH RELEASED
rcall DEBOUNCE ; DELAY AFTER SWITCH RELEASED
bra MAIN
;
;------------------------------------
DO_CH3: rcall DEBOUNCE
BTFSC CH3
bra MAIN
MOVLW CH3_CMD ; LOAD COMMAND FOR CHANNEL 1
MOVWF CMD
rcall SEND_RC5
BTFSS CH3
bra $-2 ; WAIT FOR SWITCH RELEASED
rcall DEBOUNCE ; DELAY AFTER SWITCH RELEASED
bra MAIN
;
;======================================
; SEND LOGIC 0
;======================================
LOGIC0: MOVLW .32 ; 1
MOVWF CNT1 ; 1
LOG0_1: BSF IR ; 1 MAKE IR HIGH 35% Duty cycle = 9 uS
bra $+2
bra $+2
bra $+2
bra $+2
BCF IR ; 1 MAKE IR LOW 17 uS
bra $+2
bra $+2
bra $+2
bra $+2
bra $+2
bra $+2
nop ; 1
DECFSZ CNT1,F ; 1/2
bra LOG0_1 ; 2 26 uS
rcall DELAY_OFF
RETURN ; 2
;
;======================================
; SEND LOGIC 1
;======================================
LOGIC1: rcall DELAY_OFF ; DELAY 899 uS
MOVLW .32 ; 1
MOVWF CNT1 ; 1
LOG1_1: BSF IR ; 1 MAKE IR HIGH 35% Duty cycle = 9 uS
bra $+2
bra $+2
bra $+2
bra $+2
BCF IR ; 1 MAKE IR LOW 17 uS
bra $+2
bra $+2
bra $+2
bra $+2
bra $+2
bra $+2
nop ; 1
DECFSZ CNT1,F ; 1/2
bra LOG1_1 ; 2
RETURN ; 2
;
;======================================
; DELAY FOR NO CARRAIR
; DELAY ABOUT 835 uS
;======================================
DELAY_OFF:
MOVLW .5 ; 1
MOVWF CNT3 ; 1
Loop1: MOVLW .54 ; 1
MOVWF CNT4 ; 1
decfsz CNT4,F ; 1/2
bra $-2 ; 2
decfsz CNT3,F ; 1/2
bra Loop1: ; 2
return ; 2
;======================================
; SEND RC5 TO REMOTE
; INPUT : CMD (6 BIT IR COMMAND)
;======================================
SEND_RC5:
rcall LOGIC1 ; SEND 2 START BIT
rcall LOGIC1
BTFSS TOG_BIT ; SEND TOGGLE BIT
bra $+6
rcall LOGIC1
bra $+4
rcall LOGIC0
; SEND ADDRESS 5 BIT FIX AT 01011 (0X0B) IT MAY BE CHANGED BY YOU
rcall LOGIC0 ; 0 MSB FIRST BIT 4
rcall LOGIC1 ; 1
rcall LOGIC0 ; 0
rcall LOGIC1 ; 1
rcall LOGIC1 ; 1 LSB BIT 0
; SEND COMMAND 6 BIT(00HH LLLL) MSB FIRST
bcf STATUS,C
rlcf CMD,F ; AFTER FIRST ROTAGE 0HHL LLL0
rlcf CMD,F ; AFTER SECOND ROTAGE HHLL LL00
MOVLW .6
MOVWF CNT2
rlcf CMD,F ; SEND MSB FIRST
btfss STATUS,C
bra $+6
rcall LOGIC1
bra $+4
rcall LOGIC0
decfsz CNT2,F
bra $-14 ; seems wrong..
retlw 0
;======================================
; DEBOUNCE SWITCH
; DELAY 15 mS
;======================================
DEBOUNCE:
MOVLW .1 ; 1
MOVWF CNT1 ; 1
DEL_1: MOVLW .20
MOVWF CNT2 ; 1
DEL_2: CLRF CNT3 ; 1
DEL_3: DECFSZ CNT3,F ; 1/2
bra DEL_3 ; 2
DECFSZ CNT2,F ; 1/2
bra DEL_2 ; 2
DECFSZ CNT1,F ; 1/2
bra DEL_1 ; 2
RETLW 0 ; 2
END
/*
* PWM registers configuration
* Fosc = 4000000 Hz
* Fpwm = 40000.00 Hz (Requested : 40000 Hz)
* Duty Cycle = 35 %
* Resolution is 6 bits
* Prescaler is 1
* Ensure that your PWM pin is configured as digital output
* see more details on http://www.micro-examples.com/
* this source code is provided 'as is',
* use it at your own risks
*/
PR2 = 0b00011000 ;
T2CON = 0b00000100 ;
CCPR1L = 0b00001000 ;
CCP1CON = 0b00101100 ;
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?