Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

RS485 PC PIC bağlantısı

Başlatan denizyoruten, 11 Ağustos 2015, 13:51:03

denizyoruten

Merhaba arkadaşlar. Bilgisayarımdan PIC16F887'ye RS485 ile bağlanmak istiyorum. İnternette biraz araştırdım ama işime yarayacağını düşündüğüm şeyleri bulamadım. MikroC Pro kullanıyorum. Library'deki örneklerine baktım ancak uyarlayamadım. Basit bi echo yapmak istiyorum, yani gönderdiğim şeyi pic geri gönderecek. Bunun için half duplex yada full duplex bağlamam gerektiğini düşünüyorum. Elimdeki entegre MAX487, 2 adet var. Kullandığım kablo da bu:

http://www.solar-inverter.com/en-GB/270.htm

Sonuç olarak, sizden bir şema bir de örnek kod istiyorum üstünde çalışabileceğim. Şimdiden teşekkürler!


Edit: Şöyle bir kod buldum MPLab XC8 için:

#include <xc.h>

// CONFIG
#pragma config FOSC = INTRC_NOCLKOUT     // Oscillator Selection bits (RC oscillator)
#pragma config WDTE = OFF                // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON               // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON
#pragma config CP = OFF                  // FLASH Program Memory Code Protection bits (Code protection off)
#pragma config BOREN = ON                // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF                 // Low Voltage In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config IESO = ON
#pragma config FCMEN = ON
#pragma config CPD = OFF                // Data EE Memory Code Protection (Code Protection off)

// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF

#define _XTAL_FREQ 8000000

//Function prototypes
void delay_ms(int x);
void init_uart(void);

//Variables
#define DIR             PORTCbits.RC3
#define received_data   PORTD

unsigned char rx_buffer[8];        //can store 8 characters???
unsigned char rx_index = 0;
unsigned char tx_buffer[8];
unsigned char tx_index = 0;
unsigned char byte_in;

void main()
{
    OSCCONbits.IRCF = 0b111;    //internal osc at 8MHz

    PORTD = 0;
    PORTC = 0;
    PORTB = 0;
    TRISB = 0;
    TRISC = 0;
    TRISD = 0;

    init_uart();

    delay_ms(100);

     while (1) // infinite loop which handles incoming data as they arrive
{
         delay_ms(100);

         if (PIR1bits.RCIF == 1)
         {
             if (FERR == 1)         //if framing error - turn on LED
                PORTCbits.RC2 = 1;
             if (OERR ==1 )         //if overrun error - turn on LED
             {                      //and disable CREN, and enable again
                 PORTCbits.RC1 = 1; //turn LED on
                 RCSTAbits.CREN = 0;
                 RCSTAbits.CREN = 1;
                 delay_ms(100);
                 PORTCbits.RC1 = 0;  //turn LED off
             }

             //RECEIVE bytes from PC and store in buffer
             for (int i = 0; i <= 7; i++)
             {
                 byte_in = RCREG;
                 rx_buffer = byte_in;

               //Error checking again
                if (FERR == 1)
                PORTCbits.RC2 = 1;
                if (OERR ==1 )
                {
                    PORTCbits.RC1 = 1;
                     RCSTAbits.CREN = 0;
                    RCSTAbits.CREN = 1;
                    delay_ms(100);
                    PORTCbits.RC1 = 0;
                }
             }
             
         //Creat buffer for transmission to echo back
         tx_buffer[0] = rx_buffer[0];
         tx_buffer[1] = rx_buffer[1];
         tx_buffer[2] = rx_buffer[2];
         tx_buffer[3] = rx_buffer[3];
         tx_buffer[4] = rx_buffer[4];
         tx_buffer[5] = rx_buffer[5];
         tx_buffer[6] = rx_buffer[6];
         tx_buffer[7] = rx_buffer[7];
             
             
        //ECHO BACK
         DIR = 1;                   //"Pick up" line to transmit           
         __delay_ms(100);
         for (int i = 0; i <=7; i++)
         {
            while (TXIF == 0)
                ;    //wait until TXIF is  set => TX buffer is empty
             TXREG = tx_buffer; //send buffer byte by byte
         }
         while (TXSTAbits.TRMT == 0)
             ;    //wait until TRMT is set => transmit shift register is empty
         __delay_ms(100);    //extra delay. May not be needed now
         DIR = 0;                   //Release line if transmission is finished
         delay_ms(100);
         }

}
}
//Main end

void delay_ms(int x) //Delay for __ms
{
    int y=(x*1000)/15;
    while(--y !=0)
        continue;
}

void init_uart(void)
{
   RB2 = 1;                 //Blue LED on
   TRISCbits.TRISC6 = 0;   //Tx pin is output
   TRISCbits.TRISC7 = 1;   //Rx pin is input (automatically configured)

   SPBRG = 51;    //9600 baud rate
   BRGH = 1;
   BRG16 = 0;
   SPEN = 1;        //enable serial port
   SYNC = 0;        //asynchronous
   RCIE = 1;        //receive interrupt flag
   TXIE = 0;        //transmit interrupt flag
   RX9 = 0;         //8bit receive
   TX9 = 0;         //8bit transmit
   CREN = 1;        //enable reception
   TXEN = 1;        //enable transmission

   SCKP = 0;        //transmit non-inverted data to Tx pin
   WUE = 0;         //receiver is operating normally
   ABDEN = 0;       //auto-baud detect mode is disabled
   ADDEN = 0;       //disable address detection

   RCIF = 0;
   delay_ms(3000);
   RB2 = 0;   //Blue LED off
}

Sorun şu ki RB2 normalden biraz daha kısa süre yanıyor (3 saniye yanması gerekirken 1 saniye yanıyor). Sonrasında da C2 yanıyor.

denizyoruten

#1
Error sıkıntısını da çözdüm sanırım ama MikroC Pro terminalden gönderdiğim karakterleri aynı şekilde geri alamıyorum şuan. Önerisi olan var mı arkadaşlar?

Edit: O sıkıntıyı da çözdüm. Şuan tek sıkıntım tek bir karakter gönderince geriye 8 tane aynı karakterden gönderiyor.