Autor Tema: Problemas con la interrupcion #INT_RDA (SOLUCIONADO)  (Leído 5294 veces)

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

Desconectado frankcr

  • PIC10
  • *
  • Mensajes: 36
Problemas con la interrupcion #INT_RDA (SOLUCIONADO)
« en: 14 de Septiembre de 2010, 22:58:49 »
Hola como estan, estoy tratando de enviar y recibir datos por medio del UART del PIC 18f4550 a una PC. Cuando envio los datos del PIC a la PC se envian bien, pero cuando envio un caracter de la PC al PIC no me reconoce el caracter o no activa la interrupcion o no se que pasa. Lo extraño es que a la patilla de RX del PIC llega bien el dato ASCII del caracter que envio desde la PC (lo comprobe con un osciloscopio), tengo varios dias en la misma situacion y nada..... En el archivo adjunto el codigo para saber si tengo algo mal....

Muchas gracias
« Última modificación: 15 de Septiembre de 2010, 18:28:57 por frankcr »

Desconectado Johnny_05

  • PIC10
  • *
  • Mensajes: 11
Re: Problemas con la interrupcion #INT_RDA
« Respuesta #1 en: 15 de Septiembre de 2010, 02:47:53 »
Que tal frankcr...

En realidad no se si tu codigo pueda estar abierto a un cambio grande, porque tambien
se me presentaron muchos problemas cuando trabaje con una camunicacion de este tipo
y despues de observar varias cosas me parecio que todo tenia que ver con la manera en
que son enviados los datos, es decir en la secuencia en la que viajan.
EL codigo que al final de cuentas me ayudo a resolver esto lo pongo a continuacion, es muy
breve pero la unica funcion que este tiene es recibir el dato, borre las lineas que eran
especificamente para el uso que yo le di. Solo es lo que corresponde a la rutina de interrupcion


#int_RDA
void  RDA_isr(void)
{

   dato=0;

   a=(getch()-48);
   delay_ms(100);
   i=i+1;
   
   if(i>2)
   {
     
   i=0;
     
      dato=((a[0]*100)+(a[1]*10)+(a[2]));
        }
}


Espero te ayude de alguna manera
Saludos...






 

Desconectado frankcr

  • PIC10
  • *
  • Mensajes: 36
Re: Problemas con la interrupcion #INT_RDA (SOLUCIONADO)
« Respuesta #2 en: 15 de Septiembre de 2010, 18:27:53 »
Hola como estas pero ya resolvi el problema al parecer esta en la instruccion de setup_oscillator, cambie algunos parametros que tenia esta instrucción y funciono... estuve toda una semana con el problema y lo resolvi, asi que si alguien trabaja con el PIC 18F4550 tomen en cuenta la observacion

#include <18F4550.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12                    //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4                  //System Clock by 4
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES VREGEN                   //USB voltage regulator enabled
#FUSES ICPRT                    //ICPRT enabled

#use delay(clock=8000000)
#use rs232(baud=9600, parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) //manejo del RS2326.

char rcvchar = 0x00;

#int_RDA
void RDA_isr(void)
{
   disable_interrupts(GLOBAL);
   rcvchar = 0x00;
   if(kbhit()){
      rcvchar = getc();
      
      if (rcvchar == 0x61){
      OUTPUT_TOGGLE(PIN_D1);
      }
/*
      else{
      OUTPUT_LOW(PIN_D1);
      }*/
   }
   enable_interrupts(GLOBAL);
}
   
void main(void){
/*
      disable_interrupts(GLOBAL);
      disable_interrupts(INT_RDA);
   */   
      setup_psp(PSP_DISABLED);
      setup_wdt(WDT_OFF);
      setup_timer_0(RTCC_INTERNAL);
      setup_timer_1(T1_DISABLED);
      setup_timer_2(T2_DISABLED,0,1);
      setup_timer_3(T3_DISABLED);
      setup_comparator(NC_NC_NC_NC);
      setup_vref(FALSE);
   //   setup_oscillator(OSC_8MHZ|OSC_TIMER1|OSC_31250|OSC_PLL_OFF);   
      setup_oscillator(OSC_8MHZ|OSC_PLL_OFF);   
      setup_adc_ports(NO_ANALOGS);

   //   set_tris_D(0b10000011);   
   //   set_tris_C(0b10000000);   
      
      enable_interrupts(GLOBAL);
      enable_interrupts(INT_RDA);
      
   /*   OUTPUT_LOW(PIN_D1);
      delay_ms(5000);
   */
while(1){
   
   if (!input(PIN_D4)){
         
      delay_ms(5000);
      printf("\n\rPassword: ");
   /*   output_toggle(PIN_D1);
      delay_ms(1000);
      enable_interrupts(GLOBAL);
      enable_interrupts(INT_RDA);
   */
   }

   }
}

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Problemas con la interrupcion #INT_RDA (SOLUCIONADO)
« Respuesta #3 en: 16 de Septiembre de 2010, 02:54:48 »
Gracias por el detalle de compartir con nosotros la solución al problema.


 

anything