Autor Tema: EUSART no funciona en PIC 18F2550 a 48Mhz  (Leído 3540 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
EUSART no funciona en PIC 18F2550 a 48Mhz
« en: 05 de Mayo de 2009, 02:02:02 »
Hola, estoy realizando pruebas con la EUSART del PIC18F2550 corriendo a 48Mhz y CCS 4.074, lo que pasa es que la recepcion por interrupcion no me funciona pero la transmisión funciona bien. Estoy probando en PROTEUS y fisicamente obteniendo en ambos casos los mismos resultados, leyendo el datasheet se ven que para el calculo de Baudios usan 1, 2, 4, 8, 10, 20 y 40 Mhz (no 48 Mhz), en proteus cambie a 40 y 20 Mhz y nada; para confirmar la recepción, envio el ultimo byte pero nada. les pego pedazo del codigo:
Código: C
  1. #include <18F2550.h>
  2. #fuses PLL1,CPUDIV1,NOUSBDIV,HSPLL,NOFCMEN,NOIESO,NOPUT
  3. #fuses BROWNOUT,NOWDT,NOPBADEN,NOMCLR,NOSTVREN,NOPROTECT,NOLVP,NODEBUG
  4. #fuses NOXINST,NOCPB,NOWRT,NOWRTC,NOWRTB,NOWRTD,NOEBTR,NOEBTRB,NOVREGEN
  5. #use delay(clock = 48000000)
  6. #use rs232(baud = 9600, xmit=PIN_C6, rcv=PIN_C7)
  7. #use fast_io(a)
  8. #use fast_io(B)
  9. #use fast_io(C)
  10. #byte porta = 5
  11. #byte portb = 6
  12. #byte portc = 7
  13.  
  14. #include "internal_eeprom.c"
  15.  
  16. int1 flag_timer0;             ///INDICA DESBORDE DE TIMER0
  17. int1 pulso_1 = 0;             ///PARA SEÑALAR ACTIVACION DE SALIDA DE PULSO_1
  18. int1 pulso_2 = 0;             ///PARA SEÑALAR ACTIVACION DE SALIDA DE PULSO_2
  19. int1 pulso_3 = 0;             ///PARA SEÑALAR ACTIVACION DE SALIDA DE PULSO_3
  20. int1 estado_1 = 1;            ///PARA SABER EL ESTADO ANTERIOR DE PULSO_1
  21. int1 estado_2 = 1;            ///PARA SABER EL ESTADO ANTERIOR DE PULSO_2
  22. int1 estado_3 = 1;            ///PARA SABER EL ESTADO ANTERIOR DE PULSO_3
  23. int1 salidas = 0;             ///PARA SEÑALAR ACTIVACION DE SALIDAS EN GENERAL
  24.  
  25. int8 byte_0;                  ///BYTE PARA RECEPCION SERIAL
  26. int8 byte_1;                  ///BYTE PARA RECEPCION SERIAL
  27. int8 byte_2;                  ///BYTE PARA RECEPCION SERIAL
  28. int8 byte_3;                  ///BYTE PARA RECEPCION SERIAL
  29. int8 byte_4;                  ///BYTE PARA RECEPCION SERIAL
  30. int8 byte_5;                  ///BYTE PARA RECEPCION SERIAL
  31. int8 byte_6;                  ///BYTE PARA RECEPCION SERIAL
  32. int8 byte_7;                  ///BYTE PARA RECEPCION SERIAL
  33. int8 nivel = 1;               ///INDICA LA PAUSA ACTIVA
  34.  
  35. int16 pausa_1 = 0;            ///VALOR DE PAUSAS DENTRO DEL CONTEO
  36. int16 pausa_2 = 0;            ///VALOR DE PAUSA DE FINAL DEL CONTEO
  37. int16 pausa_3 = 0;            ///VALOR DE PULSO DE SALIDA EN OTRO PIN DESPUES DE CONTEO
  38. int16 conteo  = 0;            ///GUARDA EL VALOR DE PULSOS A CONTAR
  39. int16 reconteo = 0;           ///PARA CONTAR CUANTOS PULSOS VAN
  40. int16 conteo_1 = 0;           ///PARA CONTAR CUANTO TIEMPO VA DENTRO DEL PULSO_1
  41. int16 conteo_3 = 0;           ///PARA CONTAR CUANTO TIEMPO VA DENTRO DEL PULSO_3
  42.  
  43.  
  44. #INT_RDA
  45. void serial (void)
  46.    {
  47.       disable_interrupts(INT_RTCC);
  48.       byte_7 = byte_6;
  49.       byte_6 = byte_5;
  50.       byte_5 = byte_4;
  51.       byte_4 = byte_3;
  52.       byte_3 = byte_2;
  53.       byte_2 = byte_1;
  54.       byte_1 = byte_0;
  55.       byte_0 = getc();
  56.       putchar(byte_0);                   ///RETORNO LO RECIBIDO
  57.       if (byte_0 == 13)
  58.          {
  59. ////otro codigo
  60.          
  61.          }
  62.     enable_interrupts(INT_RTCC);  
  63.    }
  64.  
  65. #INT_RTCC
  66. void timer_0 (void)
  67.    {
  68.    set_timer0(64383);       ///100 MICROSEGUNDOS EXACTOS 64336
  69.    //set_timer0(65459);         ///10 MICROSEGUNDOS EXACTOS 65416
  70.    flag_timer0 = 1;
  71.    }
  72.  
  73.  
  74. void main()
  75.  {
  76.     set_tris_a (0);
  77.     set_tris_b (0);
  78.     set_tris_c (0x80);
  79.     setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_1);
  80.     port_b_pullups(true);
  81.    
  82.     disable_interrupts(int_timer1);
  83.     disable_interrupts(int_timer2);
  84.     disable_interrupts(int_timer3);
  85.     disable_interrupts(int_ext);
  86.     disable_interrupts(int_ext1);
  87.     disable_interrupts(int_ext2);
  88.     disable_interrupts(int_rb);
  89.     disable_interrupts(int_ad);
  90.     disable_interrupts(int_tbe);
  91.     disable_interrupts(int_ssp);
  92.     disable_interrupts(int_ccp1);
  93.     disable_interrupts(int_ccp2);
  94.     disable_interrupts(int_buscol);
  95.     disable_interrupts(int_lowvolt);
  96.     disable_interrupts(int_comp);
  97.     disable_interrupts(int_eeprom);
  98.     disable_interrupts(int_oscf);
  99.     disable_interrupts(int_usb);
  100.  
  101.  
  102.    
  103.     setup_adc_ports(NO_ANALOGS);
  104.     setup_adc(ADC_OFF);
  105.     setup_spi(FALSE);
  106.     setup_timer_2(T2_DISABLED,0,1);
  107.     setup_timer_3(T3_DISABLED);
  108.     setup_comparator(NC_NC_NC_NC);
  109.     setup_vref(FALSE);
  110.  
  111.     enable_interrupts(INT_RTCC);
  112.     enable_interrupts(INT_RDA);
  113.     enable_interrupts(GLOBAL);
  114.     pausa_1 = read_int16_eeprom(0);
  115.     pausa_2 = read_int16_eeprom(2);
  116.     pausa_3 = read_int16_eeprom(4);
  117.     conteo  = read_int16_eeprom(6);
  118.     delay_ms(200);
  119.     printf("HOLA MUNDO CRUEL!!!\n\r");
  120.     do
  121.     {
  122.  
  123.     }
  124.     while(true);    
  125.  }

Supongo el problema estara en la configuracion del PIC, pero aun no doy cual es, espero alguien me pueda ayudar.

Saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: EUSART no funciona en PIC 18F2550 a 48Mhz
« Respuesta #1 en: 05 de Mayo de 2009, 02:17:53 »
Bueno, primero, supongo que estas usando un cristal de 4mhz externo por el PLL1, entonces, el fusible no deberia ser HSPLL, sino XTPLL (ya que estos se refieren al oscilador externo que uses, no a la frecuencia final del pic)

Es una mirada, rapida, si encuentro algo dspues, t lo ago saber.


Suerte.

EDITO:
No te recomiendo deshabilitar y volver a habilitar una interrupcion dentro de otra (TIMEr0 en RDA), he tenido problemas al hacer algo parecido en desfases de tiempos en el timer.

Si estas seguro de la configuracion d de los tris el puerto c (dond sta el rx y tx d 232) puedes dejar los #use fast_io(X) tal cmo stan, yo te recomiendo que uses el standar, para que el ccs lo haga, solo si no estas seguro.

« Última modificación: 05 de Mayo de 2009, 02:23:01 por jeremylf »

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: EUSART no funciona en PIC 18F2550 a 48Mhz
« Respuesta #2 en: 05 de Mayo de 2009, 02:36:42 »
Hola paisa jeremylf, bueno tal como dices, uso Cristal externo de 4 Mhz; cambie a XTPLL obteniendo los mismos resultados no responde nada  :?
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: EUSART no funciona en PIC 18F2550 a 48Mhz
« Respuesta #3 en: 05 de Mayo de 2009, 03:05:45 »
Encontre el problema, el timer0 es el culpable, lo deshabilito y corre bien, seguire probando....

saludos y gracias  :)
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: EUSART no funciona en PIC 18F2550 a 48Mhz
« Respuesta #4 en: 07 de Mayo de 2009, 01:04:57 »
Bueno continúo probando.
Tenia problemas en la interrupcion de USART en PIC18F2550 y era debido a que ocurría interrupción del timer0 y malograba el proceso serial; en este momento ya tengo ambos modulos trabajando y para solucionar el problema use la prioridad de interrupciones que en CCS vendría asi:

Código: C
  1. #priority rda,rtcc

Sigo probando  :mrgreen:
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.


 

anything