با عرض سلام
من میخوام از یک برد فرستنده به یک گیرنده دیتا ارسال کنم. (بانرم افزار 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 به کار بردم صحیحه؟ واگه اشکال دیگه ای هم داره لطفا تصحیح کنید.
من میخوام از یک برد فرستنده به یک گیرنده دیتا ارسال کنم. (بانرم افزار 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 به کار بردم صحیحه؟ واگه اشکال دیگه ای هم داره لطفا تصحیح کنید.