Hola intento configurar dos puertos series en un 16F877, uno de ellos por y RDA y el otro por INT RB0. la comunicación por RDA funciona correctamente y recibe los datos, pero la comunicación por RB0 no llegan los datos bien. Solo mando datos hacie el PIC, y un solo caracter.
Adjunto le codigo por si alguien ve el posible fallo... Gracias por adelantado.
#include <16f877.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT, NOWRT //ordenes para el programador
#use delay(clock=4000000,RESTART_WDT) //Fosc=4Mhz
#include<lcd_D.c>
#include<stdlib.h>
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#byte port_a = 0x05
#byte port_b = 0x06
#byte port_c = 0x07
#byte port_d = 0x08
char dato1;
char dato2;
//!//Subrutina para refrescar el display
void display (void)
{
printf(lcd_putc
,"COM RS232 v2.0\n"); printf(lcd_putc
,"TRANSMITER");
}
//Subrutina de interrución del TMR1
#INT_TIMER1
void control_timer1(void)
{
output_bit(pin_b3,!input(pin_b3));
set_timer1(3036);
}
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7,PARITY=N,BITS=8)
///////////////////////////////////////////////////////////////// Serial1
#int_RDA //Interrupción por recepción de datos en UART
void RDA_isr()
{
printf(lcd_putc
, "\fRv Dato1 %c %d", dato1
,dato1
); printf(lcd_putc
, "\nRv Dato2 %c %d", dato2
,dato2
);
delay_ms(1000);
}
#use rs232(baud=9600,xmit=PIN_B1, rcv=PIN_B0,PARITY=N,BITS=8)
///////////////////////////////////////////////////////////////// Serial2
#int_ext //Interrupción por recepción de datos en RB0
void serial_isr2()
{
printf(lcd_putc
, "\fRv Dato1 %c %d", dato1
,dato1
); printf(lcd_putc
, "\nRv Dato2 %c %d", dato2
,dato2
); delay_ms(200);
}
///PROGRAMA
void main(void)
{
disable_interrupts(GLOBAL);
set_tris_a(0x00); // RA0 -->
// RA1 -->
// RA2 -->
// RA3 -->
// RA4 -->
// RA5 -->
port_b_pullups(false); // Resistencias de polarización del puerto B
set_tris_b(0x01); // RB7 -->
// RB6 -->
// RB5 -->
// RB4 -->
// RB3 -->
// RB2 -->
// RB1 --> TX2
// RB0 --> RX2
set_tris_c(0x80); // RC0 -->
// RC1 -->
// RC2 -->
// RC3 -->
// RC4 -->
// RC5 -->
// RC6 --> TX1
// RC7 --> RX1
set_tris_d(0x00); // RD0 --> OUT E
// RD1 --> OUT RS
// RD2 --> OUT RW
// RD3 -->
// RD4 --> OUT D4
// RD5 --> OUT D5
// RD6 --> OUT D6
// RD7 --> OUT D7
lcd_init(); //inicializa lcd
delay_ms(200);
printf(lcd_putc
,"\fLCDInicializado"); delay_ms(500);
display();
delay_ms(1000);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(INT_TIMER1);
disable_interrupts(INT_RB);
enable_interrupts(int_ext);
ext_int_edge (H_TO_L);
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
delay_ms(500);
display();
delay_ms(1000);
printf(lcd_putc
, "\fRv Dato1"); printf(lcd_putc
, "\nRv Dato2");
while(1)
{
}
}
Solución:
Lefaltaba... ext_int_edge (H_TO_L);