#include <system.h>
//Target PIC18F1320 configuration word
//#pragma DATA _CONFIG, _CP_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTOSC_OSC_NOCLKOUT
#pragma DATA _CONFIG1H, _INTIO2_OSC_1H & _FSCM_OFF_1H
#pragma DATA _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _BORV_27_2L
#pragma DATA _CONFIG2H, _WDT_OFF_2H & _WDTPS_32K_2H
#pragma DATA _CONFIG3H, _MCLRE_ON_3H
#pragma DATA _CONFIG4L, _DEBUG_OFF_4L & _LVP_OFF_4L & _STVR_ON_4L
#pragma DATA _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L
#pragma DATA _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
#pragma DATA _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L
#pragma DATA _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
#pragma DATA _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L
#pragma DATA _CONFIG7H, _EBTRB_OFF_7H
//Set clock frequency
#pragma CLOCK_FREQ 8000000
// 38 khz
#define CCP1Period 12
#define CCP1DutyCy 25
bit running = 0;
unsigned char turnon[6] = { 0x40, 4, 1, 0, 0xbc, 0xbd};
void interrupt( void )
{
// Handle timer1 interrupt
// Used to time the length of pulses
if( pir1.TMR1IF )
{
running = 0;
t1con.TMR1ON = 0; // Turn TIMER1 off
pir1.TMR1IF = 0; //clear timer 1 interrupt bit
}
}
void xmit_pulse(short micro_pulse)
{
static short clock_count;
clock_count = 65536 - micro_pulse;
LOBYTE( tmr1l, clock_count);
HIBYTE( tmr1h, clock_count);
pir1.TMR1IF = 0; // Reset overflow bit
t1con.TMR1ON = 1; // Turn TIMER1 on
running = 1;
trisb.3 = 0;
t2con.TMR2ON = 1;
while (running) ; // Wait for pulse time to end
t2con.TMR2ON = 0;
tmr2 = 0;
portb.3 = 0;
trisb.3 = 1;
}
void send_on(void) {
static char i;
static char j;
static char t;
static unsigned char *ovalue;
static unsigned char k;
// Send it 3 times
for (k = 0; k < 3; k++) {
ovalue = &turnon;
xmit_pulse(3550); // 4 ms header
delay_100us(10); // 1 ms
delay_10us(6); // .6 ms
for (i = 0; i < 6; i++) {
for (j = 8; j > 0; j--) {
t = j - 1;
if (test_bit(*ovalue, t)) {
// A one
xmit_pulse(512); // 400 micro s
delay_100us(10); // 1 ms
delay_10us(2); // .2 ms
}
else {
// A zero
xmit_pulse(512); // 400 micro s
delay_100us(3); // 400 micro s
}
}
ovalue++;
}
// End bit
xmit_pulse(400);
delay_ms(70);
}
}
void main( void )
{
static unsigned char Low;
static unsigned char High;
static unsigned int Duty = CCP1DutyCy;
// Set speed to 8 mhz
set_bit(osccon, IRCF2);
set_bit(osccon, IRCF1);
set_bit(osccon, IRCF0);
ccp1con = 0; // CCP Module off
tmr2 = 0; // Clear Timer 2
//Configure port B
trisb = 0x00;
trisb.3 = 1;
intcon2.NOT_RBPU = 0;
//Initialize port B
portb = 0;
//Set timer 1
//prescaler rate 1:1
//Internal clock (FOSC/4)
t1con = 00001000b;
// Configure Capture/Compare/PWM for PWM
// at 38khz.
//Set timer 2 prescaler rate
// T2CPS = 1:4
t2con = 00000001b;
//t2con = 0;
pr2 = CCP1Period;
Low = Duty & 3;
High = Duty >> 2;
ccpr1l = High;
ccp1con = 00001100b;
ccp1con.5 = Low.1;
ccp1con.4 = Low.0;
intcon.PEIE = 1; // Enable peripheral interrupts
intcon.GIE = 1; // Enable global interrupt
pie1.TMR1IE = 1; // Enable Timer 1 interrupts
// test
trisb.3 = 0;
t2con.TMR2ON = 1;
while (1) ;
// test
// Main Loop
send_on();
while (1) {
}
}