با عرض سلام
من ميخوام از يک برد فرستنده به يک گيرنده ديتا ارسال کنم. (بانرم افزار ccs )
ارسال يک به صورت يک پالس 120khz به مدت 1ms در نقاط عبور از صفر خط AC است . ضمنا فرکانس کريستالي که به کار بردم : 7.67375Mhz
برنامه هم اينه:

[code=c]
#include <ide.h>

/////////////////////////////LCD\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

struct lcd_pin_map { // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rw; // access to the LCD pins.
BOOLEAN rs; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;

#if defined(__PCH__)
#if defined use_portb_lcd
#byte lcd = 0xF81 // This puts the entire structure
#else
#byte lcd = 0xF83 // This puts the entire structure
#endif
#else
#if defined use_portb_lcd
#byte lcd = 6 // on to port B (at address 6)
#else
#byte lcd = 8 // on to port D (at address 8)
#endif
#endif

#if defined use_portb_lcd
#define set_tris_lcd(x) set_tris_b(x)
#else
#define set_tris_lcd(x) set_tris_d(x)
#endif


#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.


// The following are used for setting
// the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in


/*
BYTE lcd_read_byte() {
////////// lcd_read_byte() \\\\\\\\\\\
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
/////////////////////\\\\\\\\\\\\\\\\\\\\\\
}


void lcd_send_nibble( BYTE n ) {
////////// lcd_send_nibble(n) \\\\\\\\\\\\
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
/////////////////////\\\\\\\\\\\\\\\\\\\\\\
}
*/

void lcd_send_byte( BYTE address, BYTE n )
{
int8 x;
BYTE low,high;
lcd.rs = 0;
do
{
////////// lcd_read_byte() \\\\\\\\\\\
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
x = (high<<4>> 4); \\
////////// lcd_send_nibble(n) \\\\\\\\\\\\
lcd.data = n>>4;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
/////////////////////\\\\\\\\\\\\\\\\\\\\\
// lcd_send_nibble(n & 0xf); \\
////////// lcd_send_nibble(n) \\\\\\\\\\\\
lcd.data = n & 0xf;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
/////////////////////\\\\\\\\\\\\\\\\\\\\\\

}


void lcd_init() {
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
// lcd_send_nibble(3);
////////// lcd_send_nibble(n) \\\\\\\\\\\\
lcd.data = 3;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
/////////////////////\\\\\\\\\\\\\\\\\\\\\
delay_ms(5);
}
// lcd_send_nibble(2);
////////// lcd_send_nibble(n) \\\\\\\\\\\\
lcd.data = 2;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
/////////////////////\\\\\\\\\\\\\\\\\\\\\

for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;
int8 t;
BYTE low,high;


if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
// lcd_send_byte(0,0x80|address);
/////// lcd_send_byte(address,n)\\\\\\
lcd.rs = 0;
do
{
////////// lcd_read_byte() \\\\\\\\\\\
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
t = (high<<4>> 4); \\
////////// lcd_send_nibble(n) \\\\\\\\\\\\
lcd.data = (0x80|address)>>4;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
/////////////////////\\\\\\\\\\\\\\\\\\\\\
// lcd_send_nibble(n & 0xf); \\
////////// lcd_send_nibble(n) \\\\\\\\\\\\
lcd.data = (0x80|address)& 0xf;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
/////////////////////\\\\\\\\\\\\\\\\\\\\\\

}

void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}
/*
char lcd_getc( BYTE x, BYTE y) {
char value;

lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
*/
void lcd_putnum(int8 i)
{
// lcd_putc((i/10)+0x30);
lcd_send_byte(1,(i/10)+0x30);
i %= 10;
// lcd_putc(i+0x30);
lcd_send_byte(1,i+0x30);
}

void lcd_putday(int8 day)
{
switch (day)
{
case 0: lcd_send_byte(1,'S'
lcd_send_byte(1,'A'
lcd_send_byte(1,'T'
// lcd_putc("SUN"
break;
case 1: lcd_send_byte(1,'S'
lcd_send_byte(1,'U'
lcd_send_byte(1,'N'
// lcd_putc("SUN"
break;
case 2: lcd_send_byte(1,'M'
lcd_send_byte(1,'O'
lcd_send_byte(1,'N'
// lcd_putc("MON"
break;
case 3: lcd_send_byte(1,'T'
lcd_send_byte(1,'U'
lcd_send_byte(1,'E'
// lcd_putc("TUE"
break;
case 4: lcd_send_byte(1,'W'
lcd_send_byte(1,'E'
lcd_send_byte(1,'D'
// lcd_putc("WED"
break;
case 5: lcd_send_byte(1,'T'
lcd_send_byte(1,'H'
lcd_send_byte(1,'U'
// lcd_putc("THU"
break;
case 6: lcd_send_byte(1,'F'
lcd_send_byte(1,'R'
lcd_send_byte(1,'I'
// lcd_putc("FRI"
break;
}
}


#byte trisc=0x87
#bit Xout=trisc.2
int i=0;

void start_code();
void send_one();
void send_zero();
void send_house();
void send_unit();
void send_command();


void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,15,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(32L);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("X10 MODULE"

while(1)
{
output_low(PIN_A1);
delay_ms(500);
output_high(PIN_A1);

if(i>=3) //transmit code every 3 seconds.
{
i=0;
start_code();
send_house();
send_unit();
while(!input(PIN_B0));//wait 3 half cycles of ac line .
while(!input(PIN_B0));
while(!input(PIN_B0));
start_code();
send_house();
send_command();
}
i++;
}
}

void send_zero()
{
while(!input(PIN_B0));//wait for zero crossing.
xout=1; //enable 120kHz out put.
delay_ms(1);
xout=1; //disable 120kHz out put.

while(input(PIN_B0));
xout=0;
delay_ms(1);
xout=1;
}


void send_one()
{
while(!input(PIN_B0));
xout=0;
delay_ms(1);
xout=1;
while(input(PIN_B0));
xout=1;
delay_ms(1);
xout=1;
}


void start_code()
{
while(!input(PIN_B0));
xout=0;
delay_ms(1);
xout=1;
while(input(PIN_B0));
xout=0;
delay_ms(1);
xout=1;
while(!input(PIN_B0));
xout=0;
delay_ms(1);
xout=1;
while(input(PIN_B0));
xout=1;
delay_ms(1);
xout=1;
}

void send_house()
{
send_zero();
send_one();
send_one();
send_zero();
}

void send_unit()
{
send_zero();
send_one();
send_one();
send_zero();
send_zero();
}


void send_command()
{
send_zero();
send_zero();
send_zero();
send_one();
send_one();
}


***************************

[/code]

لطفا بگيد آيا منطقي که براي ايجاد پالس 120kHz به مدت 1ms به کار بردم صحيحه؟ واگه اشکال ديگه اي هم داره لطفا تصحيح کنيد.