اطلاعیه

Collapse
No announcement yet.

data transmit with 120kHz burst+PIC

Collapse
این موضوع بسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    data transmit with 120kHz burst+PIC

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