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í:
#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...