Autor Tema: Posible problema UART en pic24f, C30.  (Leído 2570 veces)

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

Desconectado culebrasx

  • PIC10
  • *
  • Mensajes: 39
Posible problema UART en pic24f, C30.
« en: 22 de Abril de 2011, 13:46:00 »
Hola, ya llevo bastante tiempo con un problema que no resolver, estoy haciendo la comunicación entre dos pic, pos RS485 con el max487, pero ahora mismo no está en la placa y le paso la entrada de datos del max487 a un max487 para leerla desde el ordenador..

EL pic es el pic24fj16ga002.

Tuve un problema similar con el pic que había al otro lado, solo recibía basura por el max232(también anulé el max487 para poder leerlo desde el pc) al final sera un problema de configuración de pll's y clocks, por lo que pienso que ahora me puede pasar lo mismo...

utilizo un cristal que pone "32.000" espero que sean MHz,(eso me aseguraron en la tienda), junto con dos C de 22pf, no hay ningún corto.
El pic está a 3V.
llevo la masa mi max232 a masa de mi circuito y la entrada ttl a la salida programa U1TX, y solo recibo basura, y con el otro 'ahora' si que va bien ese mismo max232, asi que ese no falla.

el codigo es uno que he utilizado de Suky, ;-),....gracias....
que pongo aquí:

Código: [Seleccionar]
#include <p24fj16ga002.h>

 _CONFIG2(IESO_OFF  & SOSCSEL_SOSC  & FNOSC_PRI & FCKSM_CSDCMD   & POSCMOD_HS    )
 _CONFIG1( JTAGEN_OFF & GWRP_OFF & FWDTEN_OFF & WDTPS_PS1)
  

#include <uart.h>
 
char DataUART;
char KbhitUART;
 

#define FCY 16000000  // MHz
#define BAUDRATE 9600
#define BRGHigh 1
#if BRGHigh
  #define BRGVAL ((FCY/BAUDRATE)/4)-1
    
#else
  #define BRGVAL ((FCY/BAUDRATE)/16)-1  
38
#endif
/* **
**************************************************************************
********* ** */
void __attribute__((__interrupt__, __shadow__)) _U1RXInterrupt(void){
    
  DataUART=getcUART1();
  KbhitUART=1;
  _U1RXIF=0; // Borramos flag.
}
/* **
**************************************************************************
********* ** */
main(void){
const char Texto[]= "Probando comunicación serial...\r\nPIC24HJ128GP502 xD ...\r\n";

  
  // Habilitamos escritura sobre registros RPINRx y RPORX.
  __builtin_write_OSCCONL(OSCCON & ~(0x40));  
  RPINR18bits.U1RXR = 9; //Asignamos pin recepción UART1 a RP9.-
  RPOR4bits. RP8R = 0b00011; // Asignamos RP8 al pin de transmisión UART1.
  // Bloqueamos escritura sobre registros RPINRx y RPORX.
  __builtin_write_OSCCONL(OSCCON |0x40);  
  
 
  U1MODEbits.USIDL=1; // Al pasar al modo Sleep, apagar modulo.
  U1MODEbits.IREN=0; // Codificacion/decodificacion IrDA deshabilitado.
  U1MODEbits.RTSMD=1; // RTS en modo simple.
  U1MODEbits.UEN=0b00; // Tx/Rx habilitado, CTS/RTS deshabilitados.
  U1MODEbits.WAKE=0; // Wake-up deshabilitado.
  U1MODEbits.LPBACK=0; // Modo LoopBack deshabilitado.
  U1MODEbits.ABAUD=0; // Auto-Baud rate deshabilitado.
  U1MODEbits.BRGH=BRGHigh; // Mode seleccionado en define.-
  U1MODEbits.PDSEL=0b00; // 8 bits- sin paridad.
  U1MODEbits.STSEL=0; // 1 bit de Stop.
 
  U1STAbits.UTXISEL1=1; // Interrupcion por transimision no usada.
  U1STAbits.UTXISEL0=1; // Interrupcion por transimision no usada.
  U1STAbits.UTXINV=0; // Pin Tx en reposo igual a 1.
  U1STAbits.UTXBRK=0; // Break deshabilitado.
  U1STAbits.URXISEL=0b00; // Interrumpir cuando se recibe un caracter.
  U1STAbits.ADDEN=0; // Auto-Address deshabilitado.
  U1STAbits.OERR=0; // Borramos bits de error por overflow.
  
  U1BRG =BRGVAL;  // Baud Rate determinado en defines.
 
  IPC2bits.U1RXIP=0b01; // Fijamos nivel de prioridad.  
  IFS0bits.U1RXIF=0; // Borramos flag.
  IEC0bits.U1RXIE=1; // habilitamos interrupcion por recepción.
 
  U1MODEbits.UARTEN=1;// Encendemos modulo.
  U1STAbits.UTXEN=1; // Transmision habilitada.
 
  KbhitUART=0;
  putsUART1(Texto);
 
  while(1){
  
  putsUART1(Texto);
  }
}
 

en header files tengo añadidas:
libpic30.h
p24fj16ga002.h

y en linker script
p24fj16ga002.gld

el heap size lo tengo a 256

EDITADO: tanto en Proteus como en MPLAB saca lo que debe de sacar....

Muchas gracias y un saludo a toda la comunidad,... unas buenas fiestas para toda la gente de españa...

« Última modificación: 22 de Abril de 2011, 14:16:41 por culebrasx »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Posible problema UART en pic24f, C30.
« Respuesta #1 en: 22 de Abril de 2011, 14:45:16 »
¿Y si probas usar un cristal de 8 MHz y habilitar el PLL? Viendo la página 242 del datasheet muestra 2 valores para HS:

Entre 10 y 32 MHz, y entre 10 y 24MHz  :shock: Lo más seguro 8MHz x 4  :mrgreen:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado culebrasx

  • PIC10
  • *
  • Mensajes: 39
Re: Posible problema UART en pic24f, C30.
« Respuesta #2 en: 23 de Abril de 2011, 03:14:52 »
 :shock: :shock: :shock: :shock:... llevo casi una semana con este error.... y suky en 10 segundos....jejjeje, cada uno está donde se merece...y suky tiene un lugar reservado en el Olimpo,jejeje gracias...
 ;-)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Posible problema UART en pic24f, C30.
« Respuesta #3 en: 23 de Abril de 2011, 10:21:23 »
Buenísimo que haya funcionado!  :-/


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado culebrasx

  • PIC10
  • *
  • Mensajes: 39
Re: Posible problema UART en pic24f, C30.
« Respuesta #4 en: 23 de Abril de 2011, 14:30:21 »
Si, lo que pasa es que no veo la diferencia de alimentar directamente con un cristal de 32MHz, ...y alimentar con uno de 8MHz y luego multiplicarlo por 4.....

Saludos....

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Posible problema UART en pic24f, C30.
« Respuesta #5 en: 23 de Abril de 2011, 14:53:44 »
Si, lo que pasa es que no veo la diferencia de alimentar directamente con un cristal de 32MHz, ...y alimentar con uno de 8MHz y luego multiplicarlo por 4.....

Saludos....

No soporta cristal de 32MHz  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro