اطلاعیه

Collapse
No announcement yet.

شبکه کردن avr با rs485

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    شبکه کردن avr با rs485

    سلام دوستان

    راستش من می خوام چندتا میکرو را از طریق rs485 شبکه کنم یکم برنامه نوشتم اما درست کار نمیکنه
    لطفا کمک کنید
    این برنامه اسلیو

    /************************************************** ***
    This program was produced by the
    CodeWizardAVR V1.24.4 Standard
    Automatic Program Generator
    © Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    e-mailffice@hpinfotech.com

    Project :
    Version :
    Date : 6/23/2009
    Author : R.G
    Company : R.G
    Comments:


    Chip type : ATmega16
    Program type : Application
    Clock frequency : 8.000000 MHz
    Memory model : Small
    External SRAM size : 0
    Data Stack size : 256
    ************************************************** ***/

    #include <mega16.h>
    #include <delay.h>
    // Alphanumeric LCD Module functions
    #include <lcd.h>
    #asm
    .equ __lcd_port=0x1B ;PORTA
    #endasm



    //slave address
    #define sa 1

    //protocol max lenght
    #define prtocol_max_lenght 32

    // send recieve port
    #define src PORTB.0

    // number of sync byte
    #define n_sync 2


    // Declare your global variables here
    unsigned char a[prtocol_max_lenght];
    unsigned char text[32]={'a','r','m',' a','n',' ','k','o','n&#039 ;};



    //declare function
    unsigned char slave_recieve(unsigned char data[prtocol_max_lenght]);
    void slave_send(unsigned char data[prtocol_max_lenght],unsigned char tedad);

    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7

    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<OVR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)

    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];

    #if RX_BUFFER_SIZE<256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif

    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;

    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {

    char status;
    status=UCSRA;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {

    slave_recieve(a);

    }


    }











    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli&quot
    --rx_counter;
    #asm("sei&quot
    return data;
    }
    #pragma used-
    #endif

    // USART Transmitter buffer
    #define TX_BUFFER_SIZE 8
    char tx_buffer[TX_BUFFER_SIZE];

    #if TX_BUFFER_SIZE<256
    unsigned char tx_wr_index,tx_rd_index,tx_counter;
    #else
    unsigned int tx_wr_index,tx_rd_index,tx_counter;
    #endif

    // USART Transmitter interrupt service routine
    interrupt [USART_TXC] void usart_tx_isr(void)
    {
    if (tx_counter)
    {
    --tx_counter;
    UDR=tx_buffer[tx_rd_index];
    if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
    };
    }

    #ifndef _DEBUG_TERMINAL_IO_
    // Write a character to the USART Transmitter buffer
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while (tx_counter == TX_BUFFER_SIZE);
    #asm("cli&quot
    if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
    {
    tx_buffer[tx_wr_index]=c;
    if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
    ++tx_counter;
    }
    else
    UDR=c;
    #asm("sei&quot
    }
    #pragma used-
    #endif

    // Standard Input/Output functions
    #include <stdio.h>






    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTA=0x00;
    DDRA=0x00;

    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
    //initial value of src=PORTB.0=0
    PORTB=0x00;
    DDRB=0xFF;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // USART initialization
    // Communication Parameters: 9 Data, 1 Stop, Odd Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud rate: 500k
    // U2X=1
    // MPCM=1
    UCSRA=0x03;
    UCSRB=0xDC;
    UCSRC=0xB6;
    UBRRH=0x00;
    UBRRL=0x33;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // LCD module initialization
    lcd_init(16);

    // Global enable interrupts
    #asm("sei&quot

    src=0;

    while (1)
    {
    // Place your code here

    };
    }



    unsigned char slave_recieve(unsigned char data[prtocol_max_lenght])
    {
    unsigned char i, tedad,con;


    if(UDR==sa)
    {

    UCSRA&=0xfe;
    while(!(UCSRA&0B10000000));
    con=UDR;


    if(con==0x02)
    {
    lcd_putsf("command"
    //delay_us(100);
    //slave_send(text,9);
    UCSRA|=0x01;
    return 1;
    }




    if (con == 0x01)
    {

    while(!(UCSRA&0B10000000));
    tedad=UDR;

    for(i=0;i<tedad;i++)
    {
    while(!(UCSRA&0B10000000));
    data[i]=UDR;
    }
    lcd_puts(a);
    }


    UCSRA|=0x01;
    return 1;

    }

    }




    void slave_send(unsigned char data[prtocol_max_lenght],unsigned char tedad)
    {
    unsigned char i=0;

    src=1; // sender

    // sync
    for(i=0;i<n_sync;++i)
    {
    UCSRB &=0xfe;
    UDR=0xff;
    while( !(UCSRA & 0b00100000)); //waite until transmition complete
    }


    UCSRB &=0xfe;
    UDR=tedad;
    while( !(UCSRA & 0b00100000)); //waite until transmition complete


    for (i=0;i<tedad;i++)
    {
    UCSRB &=0xfe;
    UDR=data[i];
    while( !(UCSRA & 0b00100000)); //waite until transmition complete
    }

    src=0; //receiver

    }





    #2
    پاسخ : شبکه کردن avr با rs485

    اینم مستر


    /************************************************** ***
    This program was produced by the
    CodeWizardAVR V1.24.4 Standard
    Automatic Program Generator
    © Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    e-mailffice@hpinfotech.com

    Project :
    Version :
    Date : 6/23/2009
    Author : R.G
    Company : R.G
    Comments:


    Chip type : ATmega32
    Program type : Application
    Clock frequency : 8.000000 MHz
    Memory model : Small
    External SRAM size : 0
    Data Stack size : 512
    ************************************************** ***/

    #include <mega32.h>
    #include <stdio.h>
    #include <delay.h>
    #asm
    .equ __lcd_port=0x1B ;PORTA
    #endasm
    #include <lcd.h>

    //slave address
    #define s1 1
    #define s2 2


    #define src PORTB.0 // send recieve port
    #define prtocol_max_lenght 32 //protocol max lenght
    #define n_sync 2




    //declare function
    void master_send(unsigned char data[prtocol_max_lenght],unsigned char tedad,unsigned char address,unsigned char con);
    unsigned char master_recieve(unsigned char data[prtocol_max_lenght]);
    void master_command(unsigned char address,unsigned char command);




    //declare global variable
    unsigned char x[prtocol_max_lenght];
    unsigned char x1[prtocol_max_lenght]={'r','a','h',' i','m',' ','g','h','o',& #039;r','a','n','i&# 039;};
    unsigned char x2[prtocol_max_lenght]={'n','i','l',' u','f','a','r'} ;

    unsigned char t=0;


    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7

    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<OVR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)

    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];

    #if RX_BUFFER_SIZE<256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif

    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;

    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {

    lcd_putchar (UDR);


    }

    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli&quot
    --rx_counter;
    #asm("sei&quot
    return data;
    }
    #pragma used-
    #endif

    // USART Transmitter buffer
    #define TX_BUFFER_SIZE 8
    char tx_buffer[TX_BUFFER_SIZE];

    #if TX_BUFFER_SIZE<256
    unsigned char tx_wr_index,tx_rd_index,tx_counter;
    #else
    unsigned int tx_wr_index,tx_rd_index,tx_counter;
    #endif

    // USART Transmitter interrupt service routine
    interrupt [USART_TXC] void usart_tx_isr(void)
    {
    if (tx_counter)
    {
    --tx_counter;
    UDR=tx_buffer[tx_rd_index];
    if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
    };
    }

    #ifndef _DEBUG_TERMINAL_IO_
    // Write a character to the USART Transmitter buffer
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while (tx_counter == TX_BUFFER_SIZE);
    #asm("cli&quot
    if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
    {
    tx_buffer[tx_wr_index]=c;
    if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
    ++tx_counter;
    }
    else
    UDR=c;
    #asm("sei&quot
    }
    #pragma used-
    #endif

    // Standard Input/Output functions
    #include <stdio.h>

    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here



    // Input/Output Ports initialization
    // Port A initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
    PORTA=0x00;
    DDRA=0xFF;

    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0xff;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // USART initialization
    // Communication Parameters: 9 Data, 1 Stop, Odd Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud rate: 500k
    // U2X=1
    UCSRA=0x02;
    UCSRB=0xDC;
    UCSRC=0xB6;
    UBRRH=0x00;
    UBRRL=0x33;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // Global enable interrupts
    #asm("sei&quot

    // LCD module initialization
    lcd_init(16);



    delay_ms(1000);
    master_send(x1,13,1,1);


    delay_ms(500);
    master_command(1,0x02);
    delay_ms(50);
    src=0;
    //master_recieve(x);

    //lcd_puts(x);


    /*delay_ms(800);
    //lcd_putchar('y'
    //master_send(x2,7,2,1);

    master_send(x2,7,1,1);
    delay_ms(500);
    //master_send(x1,13,2,1);

    */

    while (1)
    {


    };

    }




    void master_command(unsigned char address,unsigned char command)
    {
    src=1;

    UCSRB |=0x1;
    UDR=address;
    while( !(UCSRA & 0b00100000)); //waite until transmition complete

    UCSRB &=0xfe;
    UDR=command;
    while( !(UCSRA & 0b00100000)); //waite until transmition complete



    }




    void master_send(unsigned char data[prtocol_max_lenght],unsigned char tedad,unsigned char address,unsigned char con)
    {

    unsigned char i;

    src=1;


    UCSRB |=0x1;
    UDR=address;
    while( !(UCSRA & 0b00100000)); //waite until transmition complete

    UCSRB &=0xfe;
    UDR=con;
    while( !(UCSRA & 0b00100000)); //waite until transmition complete

    UCSRB &=0xfe;
    UDR=tedad;
    while( !(UCSRA & 0b00100000)); //waite until transmition complete


    for (i=0;i<tedad;++i)
    {
    UCSRB &=0xfe;
    UDR=data[i];
    while( !(UCSRA & 0b00100000)); //waite until transmition complete
    }



    }






    unsigned char master_recieve(unsigned char data[prtocol_max_lenght])
    {
    unsigned char i,tedad;
    src=0; //receiver


    // sync
    for(i=0;i<n_sync;++i)
    {
    while(!(UCSRA&0B10000000));
    tedad=UDR;

    }


    while(!(UCSRA&0B10000000));
    tedad=UDR;



    for(i=0;i<tedad;++i)
    {
    while(!(UCSRA&0B10000000));
    data[i]=UDR;


    }


    lcd_putchar(tedad+'A'
    lcd_puts(data);


    return 1;


    }

    دیدگاه


      #3
      پاسخ : شبکه کردن avr با rs485

      سخت افزارتو درست بستی؟
      A-Hosseini

      دیدگاه

      لطفا صبر کنید...
      X