implementación rs485

4

Click here to load reader

Upload: julian-dario-barrera-pinto

Post on 02-Jul-2015

531 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Implementación  rs485

Tecnólogo en Automatización industrial Implementación de red de micro controladores por medio del RS485

SENA – 2011 Centro Industrial De Mantenimiento Y Manufactura –Sogamoso-2011

Jairo José Barrera Pinto ing de Diseño Y Automatización Electrónica

Implementación del protocolo rs-485

El circuito de la imagen 1 muestra el sistema que está compuesta por un micro controlador

pic16f628a que actúa como maestro, dos micro controladores pic18f452 que actúan como

esclavos, cuenta con 3 integrados max487 que son los encargados de adecuar los niveles de

voltaje ttl que entrega el micro a señales rs485, estos dispositivos permiten una comunicación

half dúplex es decir que se puede enviar y recibir datos pero al mismo tiempo, es por eso que

cuenta con los puertos y DE . Para activar la transmisión de datos se necesitan 5 voltios en

DE y para habilitar la recepción de necesitan 5 voltios en DE, además para acoplar las señales

se utilizan resistencias en paralelo entre las salidas A y B(remítase al datasheet del max487).

El circuito funciona de la siguiente manera:

Cuando el maestro determina que existen 5 voltios en alguno de sus puertos realiza alguna

acción, para la implementación de este circuito se simularon 3 pulsadores, El pulsador 1 envía

una orden para que el esclavo 1 active las salidas determinadas, el pulsador 3 envía un

mensaje similar pero para el esclavo 2 y el botón 2 envía un mensaje a los dos esclavos para

des-activar las salidas de cada uno de los esclavos. A continuación encontraran los apartes

principales del código fuente tanto del maestro como de uno de los esclavos.

MAESTRO

#include

"C:\Users\Jairo\Desktop\rs485\pic_pic.h"

void main()

{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV

_1);

setup_timer_1(T1_DISABLED);

setup_timer_2(T2_DISABLED,0,1);

setup_comparator(NC_NC_NC_NC);

setup_vref(FALSE);

Page 2: Implementación  rs485

Tecnólogo en Automatización industrial Implementación de red de micro controladores por medio del RS485

SENA – 2011 Centro Industrial De Mantenimiento Y Manufactura –Sogamoso-2011

Jairo José Barrera Pinto ing de Diseño Y Automatización Electrónica

OUTPUT_high(PIN_B0);

while(true)

{

if(input(pin_a0))

{

enviar_esclavo1();

}

if(input(pin_a1))

{

enviar_limpiar();

}

if(input(pin_a2))

{

enviar_esclavo2();

}

}

}

void enviar_esclavo1()

{

putc('t');

delay_ms(2);

putc('t');

delay_ms(2);

putc('1');

delay_ms(2);

putc('0');

delay_ms(2);

putc('1');

delay_ms(2);

putc('0');

delay_ms(2);

putc('1');

delay_ms(2);

putc('0');

delay_ms(2);

putc('1');

delay_ms(2);

putc('x');

delay_ms(2);

}

Como se puede ver se han enviado 10 bites

, cada uno de los cuales tiene una función:

despreciado

Nombre esclavo

Rd 0

Rd1

Rd2

Rd3

Rd4

Rd5

Rd6

Fin de trama

t T 1 0 1 0 1 0 1 X

El primer bit no se tiene en cuenta (hasta el

momento) el segundo bit se usa para que

el esclavo determine si el mensaje es para

él o no ,los siguientes 6 bites representan

el estado que se quiere para el puerto

especificado es decir el bit 4 se transmite

como un 1 es decir que el puerto Rd 2 debe

estar en alto, finalmente el bit 9 que se

envía con el carácter ‘x’ para que el esclavo

entienda que se ha finalizado la

trama.(tenga en cuenta que faltan las

funciones para el esclavo 2 y la función

que limpia los puertos de los dos esclavos)

En cuanto al esclavo podemos ver los siguientes fragmentos de código :

#include

"C:\Users\Jairo\Desktop\rs485\ESCLAVO.h

"

#include <LCD.C>

char dato[20];

int bandera;

static int8 USART_nextRec;

static char USART_buffer[12];

#int_RDA

void interrupt_service_rutine_rda(void)

{

char USART_nextChar;

USART_nextChar='\0';

if(kbhit())

{

USART_nextChar=getc();

Page 3: Implementación  rs485

Tecnólogo en Automatización industrial Implementación de red de micro controladores por medio del RS485

SENA – 2011 Centro Industrial De Mantenimiento Y Manufactura –Sogamoso-2011

Jairo José Barrera Pinto ing de Diseño Y Automatización Electrónica

USART_add_to_buffer(USART_nextChar);

}

}

void USART_add_to_buffer(char c)

{

if(c!='x')

{

USART_buffer[USART_nextRec++]=c;//gusr

da en la pocicion el valor c

}

else

{

//puts("termino la recepcion de datos

para este cadena");

USART_nextRec=0;

bandera=1;

}

}

void main()

{

setup_adc_ports(NO_ANALOGS);

setup_adc(ADC_CLOCK_DIV_2);

setup_psp(PSP_DISABLED);

setup_spi(SPI_SS_DISABLED);

setup_wdt(WDT_OFF);

setup_timer_0(RTCC_INTERNAL);

setup_timer_1(T1_DISABLED);

setup_timer_2(T2_DIV_BY_1,99,1);

setup_ccp1(CCP_PWM);

// set_pwm1_duty(0);

lcd_init();

enable_interrupts(INT_RDA);

enable_interrupts(GLOBAL);

output_low(pin_c5);

lcd_gotoxy(1,1);

printf(lcd_putc,"ok para recivir ");

while(true)

{

output_high(pin_c0);

delay_ms(1000);

output_low(pin_c0);

delay_ms(1000);

lcd_gotoxy(1,2);

printf(lcd_putc "\fcadena:\r ");

lcd_gotoxy(2,2);

printf(lcd_putc "%s"USART_buffer );

if(USART_buffer[0]!='t'&& bandera==1)

{

lcd_gotoxy(1,1);

printf(lcd_putc,"no es esclavo");

bandera=0;

USART_buffer=0;

}

if(USART_buffer[0]=='t' && bandera==1)

{

lcd_gotoxy(1,1);

printf(lcd_putc,"es esclavo");

if(USART_buffer[2]=='1')

output_high(pin_d0);

else

output_low(pin_d0);

bandera=0;

USART_buffer=0;

}

}

}

Para la programación del Esclavo se utilizo

la interrupción por recepción de datos

Page 4: Implementación  rs485

Tecnólogo en Automatización industrial Implementación de red de micro controladores por medio del RS485

SENA – 2011 Centro Industrial De Mantenimiento Y Manufactura –Sogamoso-2011

Jairo José Barrera Pinto ing de Diseño Y Automatización Electrónica

El compilador automáticamente crea el

código que está en rojo, y es allí donde se

recogen los bits enviados por el maestro ,

para lograr esto se utiliza el comando kbhit

() que indica si ha finalizado el envió de

datos, y la variable USART_buffer la cual es

una vector de caracteres tipo chart es decir

USART_buffer =

En cada una de estas celdas se almacenara

uno de los bist enviados. ¿cómo se hace

para actualizar la posición dentro del

vector?

Cuando se recoge el carácter x se indica

que ha terminado la cadena a continuación

se termina la interrupción y se procede a

valida si el mansaje es para este esclavo o

no, si lo es se procede a realizar las

acciones especificas de acuerdo a la trama.

La función USART_add_to_buffer(char c)

Recibe como parámetro la variable c que

es el bit recibido y lo almacena en la

posición especifica del vector. Tenga en

cuenta que falta el código para activar las

salidas del esclavo según corresponda a lo

deseado.

Analice el código tanto del esclavo como

del maestro he implemente una red de

micro controladores que cumpla con lo

siguiente:

1. El maestro dispone de 3 botones

con el botón 1 se le indica al

esclavo “t” que active los puertos

Rd0,Rd2 y Rd4.

El botón 2 pondrá en bajo los

puertos de los dos esclavos.

El botón 3 indicara al esclavo “j”

que active todo los puertos.

2. Los esclavos cuentan con una LCD

que muestra el estado del esclavo

y la cadena recibida, también

cuenta con 7 led conectados al

puerto D.