comunicación PIC-PIC
Publicado por manuel ortiz (1 intervención) el 25/11/2006 01:23:19
hola, estoy realizando un proyecto donde tengo que comunicar 2 microcontroladores, uno es el PIC16F877A y el otro es el PIC16F873A.
la cuestión es que el enlace tiene que ser inalámbrico, para lo cual he intentado desarrollar un protocolo half-duplex basado en bisync, utilizando los módulos de TX y RX TLP434 y RLP434
el problema no está en los módulos de RF, ya que estos están bien sintonizados y pasan la información de manera transparente.
para hacer las pruebas estoy conectando los pics directamente (con cable), el pin de TX de uno con el de RX del otro y viceverza, y utilizo la directiva RS232 del PICC Compiler.
los programas que tengo hechos simulan perfectamente en el PIC SIMULATOR IDE, sin embargo cuando implemento los circuitos en la realidad... los pics funcionan correctamente (de alguna forma hago para visualizar su correcto funcionamiento), y al parecer la transmisión llega hasta el terminal RX, pero el pic q utilizo como receptor no realiza las instrucciones que tengo en la parte de la interrupción, los códigos son los siguientes:
//PROGRAMA DEL PIC 16F877A (TRANSMISOR)
#include <16F877.h>
#use delay( clock = 4000000 ) /* reloj de 4 MHz */
#use rs232(baud=300, xmit=PIN_C6,rcv=PIN_C7, enable=PIN_B1)
#byte puerto_a = 5 /* dirección del puerto A */
#byte puerto_b = 6 /* dirección del puerto B */
#byte puerto_c = 7 /* dirección del puerto C */
#byte puerto_d = 8 /* dirección del puerto D */
#byte puerto_e = 9 /* dirección del puerto E */
#byte SPBRG = 0x99
#byte TXSTA = 0x98
#byte RXSTA = 0x18
#INT_TBE
void tbe() {
delay_ms(500);
output_bit(PIN_B0, 1);
delay_ms(200);
output_bit(PIN_B0, 0);
delay_ms(200);
output_bit(PIN_B0, 1);
delay_ms(200);
output_bit(PIN_B0, 0);
delay_ms(200);
}
void main(){
do {
SPBRG = 0xCF;
TXSTA = 0xA0;
RXSTA = 0x90;
set_tris_a(0x38);
set_tris_b(0x00);
set_tris_c(0x80);
set_tris_d(0xFF);
set_tris_e(0x02);
//enable_interrupts(INT_TBE);
//enable_interrupts(GLOBAL);
putc(0x03);
delay_ms(500);
}while(TRUE);
}
//PROGRAMA DEL PIC16F873A (RECEPTOR)
#include <16F873A.h>
#use delay( clock = 4000000 ) /* reloj de 4 MHz */
#use rs232(baud=300, xmit=PIN_C6,rcv=PIN_C7)
#byte puerto_a = 5 /* dirección del puerto A */
#byte puerto_b = 6 /* dirección del puerto B */
#byte puerto_c = 7 /* dirección del puerto C */
#byte puerto_d = 8 /* dirección del puerto D */
#byte puerto_e = 9 /* dirección del puerto E */
#byte TXSTA = 0x98
#byte RXSTA = 0x18
#byte SPBRG = 0x99
#byte INTCON = 0x0B
int valor;
#INT_RDA
void isr() {
valor = getc();
output_bit(PIN_B0, 1);
delay_ms(500);
output_bit(PIN_B0, 0);
delay_ms(500);
}
void main() {
do {
set_tris_a(0x00);
set_tris_b(0x00);
set_tris_c(0x80);
disable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
SPBRG = 0xCF;
TXSTA = 0xA0;
RXSTA = 0x90;
output_bit(PIN_B1, 1);
delay_ms(100);
output_bit(pin_B1, 0);
delay_ms(100);
}while(1);
}
Si alguien tiene alguna idea de cuál es el error, le agradecería si me lo indica.
Adios.
la cuestión es que el enlace tiene que ser inalámbrico, para lo cual he intentado desarrollar un protocolo half-duplex basado en bisync, utilizando los módulos de TX y RX TLP434 y RLP434
el problema no está en los módulos de RF, ya que estos están bien sintonizados y pasan la información de manera transparente.
para hacer las pruebas estoy conectando los pics directamente (con cable), el pin de TX de uno con el de RX del otro y viceverza, y utilizo la directiva RS232 del PICC Compiler.
los programas que tengo hechos simulan perfectamente en el PIC SIMULATOR IDE, sin embargo cuando implemento los circuitos en la realidad... los pics funcionan correctamente (de alguna forma hago para visualizar su correcto funcionamiento), y al parecer la transmisión llega hasta el terminal RX, pero el pic q utilizo como receptor no realiza las instrucciones que tengo en la parte de la interrupción, los códigos son los siguientes:
//PROGRAMA DEL PIC 16F877A (TRANSMISOR)
#include <16F877.h>
#use delay( clock = 4000000 ) /* reloj de 4 MHz */
#use rs232(baud=300, xmit=PIN_C6,rcv=PIN_C7, enable=PIN_B1)
#byte puerto_a = 5 /* dirección del puerto A */
#byte puerto_b = 6 /* dirección del puerto B */
#byte puerto_c = 7 /* dirección del puerto C */
#byte puerto_d = 8 /* dirección del puerto D */
#byte puerto_e = 9 /* dirección del puerto E */
#byte SPBRG = 0x99
#byte TXSTA = 0x98
#byte RXSTA = 0x18
#INT_TBE
void tbe() {
delay_ms(500);
output_bit(PIN_B0, 1);
delay_ms(200);
output_bit(PIN_B0, 0);
delay_ms(200);
output_bit(PIN_B0, 1);
delay_ms(200);
output_bit(PIN_B0, 0);
delay_ms(200);
}
void main(){
do {
SPBRG = 0xCF;
TXSTA = 0xA0;
RXSTA = 0x90;
set_tris_a(0x38);
set_tris_b(0x00);
set_tris_c(0x80);
set_tris_d(0xFF);
set_tris_e(0x02);
//enable_interrupts(INT_TBE);
//enable_interrupts(GLOBAL);
putc(0x03);
delay_ms(500);
}while(TRUE);
}
//PROGRAMA DEL PIC16F873A (RECEPTOR)
#include <16F873A.h>
#use delay( clock = 4000000 ) /* reloj de 4 MHz */
#use rs232(baud=300, xmit=PIN_C6,rcv=PIN_C7)
#byte puerto_a = 5 /* dirección del puerto A */
#byte puerto_b = 6 /* dirección del puerto B */
#byte puerto_c = 7 /* dirección del puerto C */
#byte puerto_d = 8 /* dirección del puerto D */
#byte puerto_e = 9 /* dirección del puerto E */
#byte TXSTA = 0x98
#byte RXSTA = 0x18
#byte SPBRG = 0x99
#byte INTCON = 0x0B
int valor;
#INT_RDA
void isr() {
valor = getc();
output_bit(PIN_B0, 1);
delay_ms(500);
output_bit(PIN_B0, 0);
delay_ms(500);
}
void main() {
do {
set_tris_a(0x00);
set_tris_b(0x00);
set_tris_c(0x80);
disable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
SPBRG = 0xCF;
TXSTA = 0xA0;
RXSTA = 0x90;
output_bit(PIN_B1, 1);
delay_ms(100);
output_bit(pin_B1, 0);
delay_ms(100);
}while(1);
}
Si alguien tiene alguna idea de cuál es el error, le agradecería si me lo indica.
Adios.
Valora esta pregunta


0