Implementación rs485
Click here to load reader
-
Upload
julian-dario-barrera-pinto -
Category
Documents
-
view
532 -
download
4
Transcript of 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);
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();
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
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.