Comunicación RS-485 PIC C CCS

hola a todos tengo una duda, ya realice una comunicacion entre dos pic con la configuración
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
y los pases de datos los realizo con put() y los capturo con el get() todo esto en pic c.
La comunicación entre los pic es buena. Pero ahí puntos en el programa justo después de un envío de datos que tengo delay para realizar un retardo como para darle tiempo a uno de los pic para que realice la tarea y estén sincronizado uno del otro.
Como quiero mejora esto, estoy en busca de la mejor practica para realizar una comunicación fluida entre pic sin ningún tipo de delay y me tope con la función I2C y realizando estudios a diferentes ejemplo en la web encontré que ahí ocasiones que también tiene delay y no se si esto es correcto

me pueden decir cual seria la mejor forma de manejar una comunicación entre pic en PICc ?
para mi me funciona mejor el rs232 y es mas facil de utilizar pero solo entre 2 pic's y tiene un alcance hasta de 20 metros con cable blindado.
el i2c solo tiene como maximo alcance de 6 metros y lo aturde mucho el ruido.
bien suerte.



bien amigo Darkbyte, ya me funciono con el pic18f4685 muy bien tenias toda la razon era de cuadra los #fuses, me queda solo un problema por resolver.

estoy en el inconveniente de que no se como capturar el dato que me envia el esclavo ya que es un vector int msg[32] y necesito compraralo en un if.
 
Última edición:
Estoy en el inconveniente de que no sé cómo capturar el dato que me envía el esclavo, ya que es un vector int msg[32] y necesito compararlo en un if.
Entonces en alguna parte de ese arreglo de 32 bytes debe estar lo que te interesa y envía el esclavo.
Sólo tú sabes cómo y qué es lo que estás enviando.
 
hola en una trasmisión de datos tipo rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8), si yo en un momento quiero trasmitir datos de tipo int y en otro punto de la programación necesito trasmitir caracteres o incluso combinarlos como podría hacer esto.
Actualmente estoy enviando putc(Vln_Emisario) y recibiendo = getc() datos de tipo int8. Pero en un punto x de la programación me gustaría también mandar de un pic al otro datos tipo character.
como puedo resolver esto.
Gracias por todo .
Atte
Nelsonr
 
Todo depende de la forma en que interpretes los que envías.

Es decir, si envías "A", lo interpretas como "A", y si envías 0x0A, lo debes interpretar como 0x0A

Ejemplo con caracteres (Byte como "Caracter"):

// Envío:
putc("A");

// Recepción:
dato = getc();
if(dato == "A")
// Código
...

Ejemplo con enteros (Byte como "Número entero"):

// Envío:
putc(0x0A);

// Recepción:
dato = getc();
if(dato == 0x0A)
// Código
...

O sea que no es lo mismo interpretar Bytes como Caracteres, que Bytes como Números enteros.
 
Última edición:
Hola. Estoy utilizando el PIC18F46K22 y viene con dos puertos RS-232.
Uno lo quiero utilizar como RS-232 y el otro como RS-485.

Mi consulta. ¿Está bien cómo lo estoy configurando?

Muestro cómo lo tengo ahora.

PHP:
#use rs232(baud=9600,parity=N,xmit=TX1,rcv=RX1,bits=8,stream=PORT1)

//port2
#define RS485_USE_EXT_INT TRUE
#define RS485_RX_PIN RX2
#define RS485_TX_PIN TX2
#define RS485_ENABLE_PIN RS_EN
//#define RS485_RX_ENABLE None
#define RS485_RX_BUFFER_SIZE 10
#define RS485_ID 10
#include <rs485.c>//NOTE: only one RS485 port is supported by the driver

Me salta un error en la librería rs485.c en la siguiente linea:
Código:
#use rs232(baud=9600, xmit=RS485_TX_PIN, rcv=RS485_RX_PIN, enable=RS485_ENABLE_PIN, bits=9, long_data, multi_master, errors, stream=RS485_CD)

No sé por qué.

//#define RS485_RX_ENABLE None
Esta línea la puse así pero no sé si está bien.

Lo que quiero es que con un pin me habilite a transmitir o recibir.
O sea, veo que muchos unen las patitas 2 y 3 del MAX 485 y depende si es 1 o 0, transmite o recibe, por lo que veo.

Así que bueno, algo mal está, porque me sale error como puse en la línea de arriba de la librería.
 
Última edición por un moderador:
Hola, Lo que sucede que el codigo apenas lo comence a escribir ya me da error porque justo me lo da en la cabecera el ERROR.

HTML:
#include <DomoK22.h>
//#use spi (MASTER, SPI2, ENABLE=PIN_D3, LOAD=PIN_D5, DIAGNOSTIC=PIN_D2, BAUD=9600, ENABLE_DELAY=10, DATA_HOLD=10, MODE=0, BITS=8, STREAM=SPI2)


#ZERO_RAM

void main()
{

   rs485_init();

   while(TRUE)
   {
   }
}
esto es lo unico que tengo en C siempre antes de comenzar a escribir el programa chequeo que compile lo basico aunque sea con las cabeceras #USE y demas y luego comienzo.

HTML:
#include <18F46K22.h>
#device ADC=10

#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PROTECT                  //Code protected from reads

#use delay(internal=16MHz)
#use FIXED_IO( A_outputs=PIN_A3 )
#use FIXED_IO( B_outputs=PIN_B3 )
#use FIXED_IO( C_outputs=PIN_C0 )
#use FIXED_IO( E_outputs=PIN_E2,PIN_E1,PIN_E0 )
/*#define RS   PIN_A0
#define RW   PIN_A1
#define EN   PIN_A2
#define BKL   PIN_A3
#define DTA4   PIN_A4
#define DTA5   PIN_A5
#define DTA6   PIN_A6
#define DTA7   PIN_A7*/
#define INT00   PIN_B0
#define INT01   PIN_B1
#define INT02   PIN_B2
#define RB3   PIN_B3
#define IN_RB4   PIN_B4
#define IN_RB5   PIN_B5
#define IN_RB6   PIN_B6
#define IN_RB7   PIN_B7
#define SPKR   PIN_C0
#define RS_EN   PIN_C1
#define ADC14   PIN_C2
#define I2C_CLK   PIN_C3
#define I2C_DTA   PIN_C4
#define STS   PIN_C5
#define TX1   PIN_C6
#define RX1   PIN_C7
#define SPI2_CL   PIN_D0
#define SPI2_DI   PIN_D1
#define SPI2_DG   PIN_D2
#define SPI2_EN   PIN_D3
#define SPI2_DO   PIN_D4
#define SPI2_LD   PIN_D5
#define TX2   PIN_D6
#define RX2   PIN_D7
#define RE0   PIN_E0
#define RE1   PIN_E1
#define RE2   PIN_E2
#define MCLR   PIN_E3

#use rs232(baud=9600,parity=N,xmit=TX1,rcv=RX1,bits=8,stream=PORT1)



//port2
#define RS485_USE_EXT_INT TRUE
#define RS485_RX_PIN RX2
#define RS485_TX_PIN TX2
#define RS485_ENABLE_PIN RS_EN
//#define RS485_RX_ENABLE None
#define RS485_RX_BUFFER_SIZE 10
#define RS485_ID 10
#include <rs485.c>//NOTE: only one RS485 port is supported by the driver


#use i2c(Master,Fast,sda=I2C_DTA,scl=I2C_CLK)//,force_hw)


eso es lo unico que tengo y me da el siguiente error

dentro de RS485.c del mismo CCS

#use rs232(baud=9600, xmit=RS485_TX_PIN, rcv=RS485_RX_PIN, enable=RS485_ENABLE_PIN, bits=9, long_data, multi_master, errors, stream=RS485_CD)

error en esta linea y me pone el compilador

*** Error 100 "C:\Program Files (x86)\PICC\Drivers\rs485.c" Line 92(8,145): USE parameter value is out of range H/W USART can not multi master
1 Errors, 0 Warnings.
Build Failed.


es todo lo que tengo hasta ahora, pero si ya con esto no puedo compilar no puedo continuar programando lko que quiero hacer que es comunicarme con otros pic.
 
El error que a mi me muestra, dice que "H/W USART can not multi master"
O sea que, USART por Hardware no puede ser Multi Maestro.

Entonces elimina la definición "#define RS485_USE_EXT_INT TRUE" que está en //port2
 
Yo pensé que esa línea es para saber cuando algún PIC transmite algún dato y cuando éste lo recibe hace la interrupción.
¿Si elimino eso funciona igual la interrupción cuando llegue algún dato por la UART?

O sea: #int_RDA //Interrupción
¿UART Rx funciona?
 
Última edición por un moderador:
Voy a comenzar entonces manos a la obra. Voy primero eliminando esa línea que me dijiste esperó no aparezca el error y a partir de ahí comenzar. Muchas gracias ante otro error escribiré :)
 
Hola Gente tanto tiempo, tengo problemas con el RS485, sigo sin entender y la verdad que no entiendo nada ya esto, yo estoy utilizando un pic18f14k50 como master y un pic16f887 como esclavo hice un programa tan sensillo como que envie un dato por ejemplo 0x0A y el receptor al recibir eso que encienda un led, y si envia por ejemplo 0x0B el receptor lo apaga, bueno conclusion no funciona, estoy usando las UART de los pic osea es por hardware y el receptor tendria que trabajar con interrupcion no me funciona, osea quiero unir los dos pines osea un pin del pic controle la transmision y la resepcion y tampoco funciona. no puedo creer que sea dificil lo que quiero hacer tan tonto soy para esto...

MASTER
Código:
#include <18F14K50.h>
#device ADC=10
#ignore_warnings  201, 216
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(internal=4MHz)
#define bt1   PIN_B0
#define bt2   PIN_B1
#define rx   PIN_B5
#define tx   PIN_B7
#define en   PIN_C4

#use  rs232(UART1, stream=pic1)

//port1
//#define RS485_RX_BUFFER_SIZE 8
#define RS485_USE_EXT_INT true
//#define RS485_ID 10

#define RS485_RX_PIN rx
#define RS485_TX_PIN tx
#define RS485_ENABLE_PIN en
//#define RS485_RX_ENABLE en
#define RS485_RX_BUFFER_SIZE 8
#define RS485_ID 10
#include <rs485.c>//NOTE: only one RS485 port is supported by the driver



void main()
{
   int   dest_id = 0;
   
   //port_b_pullups(0x03);

  
   RS485_init();
   delay_ms(1000);
   dest_id=12;
   
   

   while(TRUE)
   {
     // rs485_wait_for_bus(FALSE); 
      
      rs485_send_message(dest_id, 1, 0x0A);  
      delay_ms(2000);
      rs485_send_message(dest_id, 1, 0x0B);  
      delay_ms(2000);
   }

}

ESCLAVO
Código:
//#include <slave rs485.h>
// EN 0RX 1TX
#include <16F887.h>
#device ADC=10

#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES BORV21                   //Brownout reset at 2.1V

#use delay(internal=4MHz)
#use FIXED_IO( A_outputs=PIN_A0 )
#define led   PIN_A0
#define en   PIN_C5
#define tx   PIN_C6
#define rx   PIN_C7

#use  rs232(UART1, stream=pic1)

//port1
#define RS485_USE_EXT_INT TRUE
#define RS485_RX_PIN rx
#define RS485_TX_PIN tx
#define RS485_ENABLE_PIN en
//#define RS485_RX_ENABLE en
#define RS485_RX_BUFFER_SIZE 8
#define RS485_ID 12
#include <rs485.c>//NOTE: only one RS485 port is supported by the driver
int8 in_char = 0;

#INT_RDA
void serial_isr()
{
   in_char = fgetc(pic1);
}

void main()
{
   int data_received;
   
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   

   rs485_init(); 

   while(TRUE)
   {

      if(rs485_get_message(data_received, TRUE)) 
      //TODO: User Code
      if(data_received == 0x0A) 
            output_high(led); 

      else
            output_low(led); 

   }

}

no entiendo la verdad,
y si coloco #define RS485_USE_EXT_INT FALSE se pone peor millones de errores saltan,
no entiendo bien la comunicacion asi, yo utilizo rs232 utilizo los comandos put o get todo perfecto pero quiero utilizar rs485

me pueden dar una mano, yel circuito en proteus seria los dos pic y los dos max487 utilizo pero ni siquiera puedo compilar estos programas.. :cry:
 
Pon atención a los errores del compilador.
En el programa "Master" muestra lo siguiente:
CCS C Compiler dijo:
"rs485.c" Line 92(8,145): USE parameter value is out of range H/W USART can not multi master
Anteriormente ya te había mencionado sobre ese error.
Entonces, comenta o elimina; #define RS485_USE_EXT_INT true

Compilará, pero ahora mostrará lo siguiente:
CCS C Compiler dijo:
>>> Warning 240 "Master.c" Line 50(38,42): Pointer types do not match
>>> Warning 240 "Master.c" Line 52(38,42): Pointer types do not match
Y eso es porque necesitas pasar los datos como punteros.
O sea, aquí:
PHP:
      rs485_send_message(dest_id, 1, 0x0A);  
      delay_ms(2000);
      rs485_send_message(dest_id, 1, 0x0B);  
      delay_ms(2000);
Posteriormente, en el programa "Esclavo" se hace lo mismo.
Después de eliminar o comentar la definición del problema, muestra lo siguiente:
CCS C Compiler dijo:
*** Error 92 "Esclavo.c" Line 33(1,2): Duplicate Interrupt function
Entonces se comenta o elimina la función duplicada y ya compilará.
Código:
[COLOR=DimGray]/*
#INT_RDA
void serial_isr()
{
   in_char = fgetc(pic1);
}
*/[/COLOR]
CCS C Compiler dijo:
0 Errors, 2 Warnings.
Build Successful.
Pero tendrás dos advertencias. La primera es porque debes usar un puntero.
Eso lo harás colocando un * a lado derecho de la variable "data_received"
Así: *data_received
Y la segunda advertencia es porque la variable "in_char" quedó sin uso al eliminar la función duplicada.
 
Última edición:
Si, justo estoy en eso, ya errores no tiene segun el compilador pero no me enciende el led aun del esclavo.

mira mi codigo

MAESTRO
Código:
#include <18F14K50.h>
#device ADC=10
#ignore_warnings  201, 216
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(internal=4MHz)
#define bt1   PIN_B0
#define bt2   PIN_B1
#define rx   PIN_B5
#define tx   PIN_B7
#define re   PIN_C4
#define de   PIN_C5

#use  rs232(UART1, stream=pic1)

//port1
//#define RS485_RX_BUFFER_SIZE 8
#define RS485_USE_EXT_INT false
//#define RS485_ID 10

#define RS485_RX_PIN rx
#define RS485_TX_PIN tx
#define RS485_ENABLE_PIN de
#define RS485_RX_ENABLE re
#define RS485_RX_BUFFER_SIZE 10

int8 OUR_RS485_ID = 10;
#define RS485_ID OUR_RS485_ID


#include <rs485.c>//NOTE: only one RS485 port is supported by the driver
//#include <driver_rs485.c>
void RS485send(char* s, int8 id)
{
   int8 size;

   for(size=0; s[size]!='\0'; ++size);

   rs485_wait_for_bus(FALSE);

   while(!rs485_send_message(id, size, s))
      delay_ms(OUR_RS485_ID);
}

void main()
{
   int   dest_id = 0;
   int a,b;
   a='a';
   b='b';
   //port_b_pullups(0x03);

  //output_high(en); 
  
   RS485_init();
   delay_ms(1000);
   dest_id=12;
   
   

   while(TRUE)
   {
      //rs485_wait_for_bus(FALSE); 
      RS485send(a, dest_id);
      
     // rs485_send_message(dest_id, 1, &a);  
      delay_ms(2000);
      RS485send(b, dest_id); 
      delay_ms(2000);
   }

}

ESCLAVO

Código:
#include <16F887.h>
#device ADC=10

#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES BORV21                   //Brownout reset at 2.1V

#use delay(internal=4MHz)
#use FIXED_IO( A_outputs=PIN_A0 )
#define led   PIN_A0
#define re   PIN_C4
#define de   PIN_C5
#define tx   PIN_C6
#define rx   PIN_C7

#use  rs232(UART1, stream=pic1)
//#use  rs232(UART1, stream=pic1)

//port1
#define RS485_USE_EXT_INT false
#define RS485_RX_PIN rx
#define RS485_TX_PIN tx
#define RS485_ENABLE_PIN de
#define RS485_RX_ENABLE re
#define RS485_RX_BUFFER_SIZE 8
#define RS485_ID 12


#include <rs485.c>//NOTE: only one RS485 port is supported by the driver




void main()
{
   int data_received;
   
  // enable_interrupts(INT_RDA);
  // enable_interrupts(GLOBAL);
   
 //  output_low(en); 
   rs485_init(); 

   while(TRUE)
   {

      if(rs485_get_message(data_received, false)) 
      delay_ms(500);
      //TODO: User Code
      if(data_received == 'a') 
           { output_high(led); delay_ms(599);}

      else
            output_low(led); 

   }

}

coloque en proteus para no grabar a cada rato los pic,
decia coloque en proteus los dos picx los dos max y el led en el esclavo para que se encienda
cuando reciva un caracter A y que se apague cuando es B, un fracaso lo mio,

hay algo en el programa que por ser basico no lo estoy viendo
 
D@rkbytes entiendo lo que decis, pero si te fijas es muy parecido yo justamente lo que copie de ese es los dos pines DE y RE porque los tenia unidos ahora cada uno esta con cada pin como se ve en el programa, lo unico que no utilice del post 08 son los char PCgetc(), PCgetInt() y otros mas que saque todo eso pórque yo no estoy ingresando nada, solo es usar el RS485send(a, dest_id); que seria el del post u el original
rs485_send_message(dest_id, 1, 'a'); si utilizo el de la libreria rs485, si envio el dato tendria que hacerlo, y para recibirlo utilizo como ves en mi programa ni siquiera aun estoy utilizando la interrupcion dentro del while del esclavo coloque el rs485_get_message(data_received, false) y tendria que recibirlo y con un ir como se observa en el programa enciendo o apago, bueno no lo hace, si queres te paso el programa y el proteus para que veas como se simula
 

Adjuntos

  • cto sim.zip
    153.8 KB · Visitas: 34
Me parece que tienes que seguir el protocolo del ejemplo "ex_rs485.c" y no así directamente como lo estás haciendo.
Fíjate cómo en ese ejemplo se van pasando los datos a funciones y posteriormente son enviados.
Nota los arreglos pasados a punteros y su proceso.

Si entras en modo de depuración, podrás ver que no se están cumpliendo las condiciones en la función "rs485_get_message" de la librería "rs485.c"
 
sabes que sucede que en el ejemplo de "ex_rs485.c" pasa por muchas funciones que lo veo hasta complicado.
mi programa esta la interrupcion por hardware por lo tanto ni siquiera me deja escribir
#INT_RDA
void serial_isr()

como en el ejemplo de "ex_rs485.c" por la cantidad de errores que tira , eso es de seguro porque adentro de la libreria "rs485.c" debe estar siendo utilizado para la lectura de los datos cuando se recibe.

quiero creer y entender que "rs485_get_message" tiene que tener la capacidad de recibir el dato y almacenarlo en una variable, si por ejemplo declaro "INT msg[3];" como variable y lo utilizo en la funcion "rs485_get_message(msg, FALSE)" tiene que tener la capacidad de guardar en msg[0] la direccion destino, [1] el len que en mi caso es 1, y [2] el dato osea 0x0A , o 0x0B segun quiera,

y con un if(msg[2]==0x0A) tendria que funcionar eso lo que no comprendo?

yo no tengo que utilizar ni GETC() ni nada de eso porque comprendo que la libreria ya me hace todo eso lo estoy probando asi y nada aun.
el ejemplo "ex_rs485.c" lo veo muy complicado, solo entendi quiero me parece que en la interrupcion timer1 se esta usando la funcion "rs485_get_message" y luego con un printf y el msg[i+2] que no entendi bien, que es como colocar [2] porque el for cuando es 0 va al 2, y bueno decia con el printf muestra el dato en el display, porque el mio no lo hace eso?

Código:
#include <16F887.h>
#device ADC=10

#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES BORV21                   //Brownout reset at 2.1V

#use delay(internal=4MHz)
#use FIXED_IO( A_outputs=PIN_A0 )
#define led   PIN_A0
#define re   PIN_C4
#define de   PIN_C5
#define tx   PIN_C6
#define rx   PIN_C7

#use  rs232(UART1,enable=re, stream=pic1)
//#use  rs232(UART1, stream=pic1)

//port1
#define RS485_USE_EXT_INT false
#define RS485_RX_PIN rx
#define RS485_TX_PIN tx
#define RS485_ENABLE_PIN de
#define RS485_RX_ENABLE re
#define RS485_RX_BUFFER_SIZE 10
#define RS485_ID 12


#include <rs485.c>//NOTE: only one RS485 port is supported by the driver

int8 data_received[10];


void main()
{
   
   rs485_init(); 
 

   while(TRUE)
   {
            
          rs485_get_message(data_received, FALSE);

      
      if(data_received[2] == 0x0a)
           { output_high(led); delay_ms(400);}
     
      else
           { output_low(led);  delay_ms(400);}
           

   }

}


"rs485_get_message(data_received, FALSE);" lo estoy usando dentro del while otra cosa que me gustaria que sea por interrupcion que aun nose como lo hare. int_rda es el que se utiliza por interrupcion cuando se recibe pero bueno nose

osea las interrupciones en el ejemplo de "ex_rs485.c" las pueden utilizar porque tienen declarado #define RS485_USE_EXT_INT TRUE

pero en mi caso es #define RS485_USE_EXT_INT FALSE
 
Última edición:
Los datos si se tienen que pasar a un arreglo cómo puntero.
Modifiqué el programa del ejemplo "ex_rs485.c" para hacer Master/Slave y funciona, aunque los datos se acomodan en otra parte después de pasarlos a la función "RS485send".
No sé por qué, y para saberlo se tendría que estudiar mejor todo el proceso.

Tal vez con algunas modificaciones más, se pueda usar únicamente un int en vez de un arreglo.

Adjunto los programas.
 

Adjuntos

  • 16F628A RS-485 Master Slave.rar
    55.9 KB · Visitas: 69
Última edición:
Estaba mirando lo que me enviaste y sos un GENIO!!!!!! pero ahora te pregunto algo desde mi ignorancia, porque utilizas "#define RS485_USE_EXT_INT TRUE" osea porque TRUE y no en FALSE?
y lo segundo si el micro tiene UART incorporada porque no lo utilizas? osea si pongo FALSE tendria que utilizar la UART del micro?

Otra cosa que quise hacer para ir probando sobre tu programa si cambio de pin el RX, ahora esta en el RB0 pero si utilizo el #define RS485_RX_PIN PIN_B2 por ejemplo , no enciende mas el led ahora lo declaro de nuevo RB0 si, eso tiene algo que ver con "clear_interrupt(INT_EXT);" y "enable_interrupts(INT_EXT);" que esta en la funcion "rcv_on"?
 
Última edición:
No he estudiado bien la librería, lo que realicé lo hice por lógica de procesos.
Si te fijas, no completé los programas, el esclavo no responde, y el maestro no verifica.
Más que nada me interesaba que el esclavo validara la recepción comprobando el checksum.
¿Por qué utilizas "#define RS485_USE_EXT_INT TRUE" osea porque TRUE y no en FALSE?
Porque usé la interrupción externa por RB0 para el pin de recepción. (Rx)
Y lo segundo. ¿Si el micro tiene UART incorporada por qué no lo utilizas?
O sea, ¿Si pongo FALSE, tendría que utilizar la UART del micro?
No, la librería lo hará por software y usando las terminales definidas, ya sea por usuario o las que tiene por defecto.
De ésta forma la librería se puede usar en dispositivos sin módulo USART y aparte lo libera en los que si tienen.
Otra cosa que quise hacer para ir probando sobre tu programa, si cambio de pin el RX, ahora está en el RB0, pero si utilizo el #define RS485_RX_PIN PIN_B2 por ejemplo, no enciende más el led, ahora lo declaro de nuevo RB0 y sí.
¿Eso tiene algo que ver con "clear_interrupt(INT_EXT);" y "enable_interrupts(INT_EXT);" que está en la función "rcv_on"?
No, el que no responda a ese pin, debe ser porque no lo está tomando en cuenta.
La declaración sobre la definición de pines, debe estar antes de incluir la librería.
 
Última edición:
Atrás
Arriba