Autor Tema: Dos puertos serie RS232 en PIC 16F877, con RB0 (SOLUCIONADO)  (Leído 1776 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Dos puertos serie RS232 en PIC 16F877, con RB0 (SOLUCIONADO)
« en: 12 de Noviembre de 2012, 06:38:36 »
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.
Código: C
  1. #include <16f877.h>            //pic a utilizar
  2.  
  3.  
  4. #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT, NOWRT   //ordenes para el programador
  5. #use delay(clock=4000000,RESTART_WDT)   //Fosc=4Mhz
  6.  
  7.  
  8. #include<lcd_D.c>
  9. #include<stdlib.h>
  10.  
  11. #use fast_io(A)
  12. #use fast_io(B)
  13. #use fast_io(C)
  14. #use fast_io(D)
  15.  
  16. #byte port_a = 0x05
  17. #byte port_b = 0x06
  18. #byte port_c = 0x07
  19. #byte port_d = 0x08
  20.  
  21.  
  22.  
  23. char dato1;
  24. char dato2;
  25.  
  26.  
  27. //!//Subrutina para refrescar el display
  28. void display (void)
  29.    {
  30.          
  31.                printf(lcd_putc,"\f");
  32.                printf(lcd_putc,"COM RS232 v2.0\n");
  33.                printf(lcd_putc,"TRANSMITER");
  34.  
  35.   }
  36.  
  37.  
  38.  
  39. //Subrutina de interrución del TMR1
  40. #INT_TIMER1
  41. void control_timer1(void)
  42.    {
  43.    output_bit(pin_b3,!input(pin_b3));
  44.    set_timer1(3036);
  45.    }
  46.  
  47.  
  48.  
  49. #use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7,PARITY=N,BITS=8)
  50. ///////////////////////////////////////////////////////////////// Serial1
  51. #int_RDA             //Interrupción por recepción de datos en UART
  52.  
  53.  
  54.    void RDA_isr()
  55.    {
  56.    dato1=getc();
  57.    printf(lcd_putc, "\fRv Dato1 %c %d", dato1,dato1);
  58.    printf(lcd_putc, "\nRv Dato2 %c %d", dato2,dato2);
  59.    
  60.    delay_ms(1000);
  61.    }
  62.  
  63.  
  64. #use rs232(baud=9600,xmit=PIN_B1, rcv=PIN_B0,PARITY=N,BITS=8)
  65. ///////////////////////////////////////////////////////////////// Serial2
  66. #int_ext          //Interrupción por recepción de datos en RB0
  67.  
  68.    void serial_isr2()
  69.    {
  70.    dato2=getc();
  71.    printf(lcd_putc, "\fRv Dato1 %c %d", dato1,dato1);
  72.    printf(lcd_putc, "\nRv Dato2 %c %d", dato2,dato2);
  73.    delay_ms(200);
  74.    }
  75.  
  76.  
  77.  
  78. ///PROGRAMA
  79. void main(void)
  80. {
  81.  
  82.    disable_interrupts(GLOBAL);
  83.    set_tris_a(0x00);       //    RA0   -->  
  84.                            //    RA1   -->  
  85.                            //    RA2   -->  
  86.                            //    RA3   -->  
  87.                            //    RA4   -->  
  88.                            //    RA5   -->  
  89.  
  90.    port_b_pullups(false);   // Resistencias de polarización del puerto B
  91.  
  92.    set_tris_b(0x01);       //    RB7   -->
  93.                            //    RB6   -->
  94.                            //    RB5   -->
  95.                            //    RB4   -->
  96.                            //    RB3   -->  
  97.                            //    RB2   -->
  98.                            //    RB1   -->   TX2
  99.                            //    RB0   -->   RX2
  100.  
  101.                            
  102.      set_tris_c(0x80);     //    RC0   -->  
  103.                            //    RC1   -->  
  104.                            //    RC2   -->  
  105.                            //    RC3   -->  
  106.                            //    RC4   -->  
  107.                            //    RC5   -->                  
  108.                            //    RC6   -->   TX1
  109.                            //    RC7   -->   RX1  
  110.                            
  111.     set_tris_d(0x00);      //    RD0   -->  OUT E
  112.                            //    RD1   -->  OUT RS
  113.                            //    RD2   -->  OUT RW
  114.                            //    RD3   -->  
  115.                            //    RD4   --> OUT D4  
  116.                            //    RD5   --> OUT D5                
  117.                            //    RD6   --> OUT D6  
  118.                            //    RD7   --> OUT D7                        
  119.                            
  120.                            
  121.  
  122.    lcd_init();         //inicializa lcd
  123.    delay_ms(200);
  124.    printf(lcd_putc,"\fLCDInicializado");
  125.    delay_ms(500);
  126.    display();
  127.    delay_ms(1000);
  128.    
  129.    
  130.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  131.    enable_interrupts(INT_TIMER1);
  132.    disable_interrupts(INT_RB);
  133.    enable_interrupts(int_ext);
  134.    ext_int_edge (H_TO_L);
  135.    enable_interrupts(int_rda);
  136.    enable_interrupts(GLOBAL);
  137.    
  138.    
  139.    delay_ms(500);
  140.    display();
  141.    delay_ms(1000);
  142.    printf(lcd_putc, "\fRv Dato1");
  143.    printf(lcd_putc, "\nRv Dato2");
  144.      
  145.    while(1)
  146.    {
  147.    }
  148.  
  149.          
  150. }


Solución:
Lefaltaba... ext_int_edge (H_TO_L);

« Última modificación: 12 de Noviembre de 2012, 09:37:08 por freshdesing »