Autor Tema: pic24F y CCS  (Leído 3537 veces)

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

Desconectado Tulkas

  • PIC10
  • *
  • Mensajes: 14
pic24F y CCS
« en: 13 de Julio de 2010, 18:50:15 »
Buenas.

Hace un par de semanas que no puedo continuar con mi proyecto por un problema que no se de donde viene.

Estoy haciendo un sistema de adquisición de datos y estoy usando un pic24fj48ga002 y el compilador CCS v 1.406.  Tengo experiencia de unos cuantos años haciendo sistemas de adquisición con microcontroladores pic e incluso tengo librerías hechas de tal forma que cada vez que comienzo un nuevo proyecto tardo menos tiempo en acabarlo.  Digo esto porque el problema que tengo no creo que sea tan "fácil" como una tener una soldadura fría o una conexión errónea en el circuito ya que llevo con esto varias semanas.

Bueno al grano.  El  sistema de adquisición consta de una tarjeta de memoria y un conversor A/D y básicamente lo que hace es coger las muestras de conversor y escribirlas en la tarjeta SD.  Debido a que necesito rapidez he decidido usar dos puertos SPI en lugar de uno compartido, es decir, un bus para la SD y un bus para el conversor.  El pic que estoy usando tiene dos SPI hardware y además se pueden usar en casi cualquier pin gracias a los pines que llaman RP.

El problema que tengo es que cuando trato de inicializar la tarjeta SD me da error, la librería la he hecho hace mucho tiempo y la he ido actualizando, esta librería está funcionando actualmente con distintos pics, pic18f2525, pic18f452, y algún otro más que ahora no recuerdo.  Como se que no es un problema de la librería ni de la configuración del SPI verifiqué el hardware y comprobé que no era.  Luego estuve investigando por los foros de CCS y pude ver que el CCS tiene unos cuantos bugs y parece que en alguna versión este compilador se hace la picha un lío con los pines RP.  Cuando leí esto comprobé que los pines se asignaban correctamente en mi caso pero por si las moscas hice una función muy básica para transmitir y recibir datos por spi, la hice sin usar el hardware claro está.  Aún así me seguía dando error, así que decidí montar el pic en una protoboard y probar otra vez, pero tampoco, no hay manera.  He comprobado con el osciloscopio las señales y parece que todo es correcto.

Después de todo esto usé un pic24fj128ga010 y le conecté una tarjeta SD, como este pic lo tengo sobre una placa de desarrollo (explorer 16) no tengo los pines SPI accesibles, así que volví a usar la función que hice anteriormente.  El resultado es que sigue dando error.  La función del spi que hice para probar la usé en un pic18f2525 con una tarjeta sd y funcionaba, por tanto empiezo a pensar que el problema que tengo es con los pic24f.  Aunque esto me desconcierta bastante porque uso dos patas para la comunicación por puerto serie y enciedo leds y parace que todo funciona...

Alguna idea??

Muchas gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: pic24F y CCS
« Respuesta #1 en: 13 de Julio de 2010, 23:28:55 »
Utilizar CCS para los PIC24 es arriesgarse a esto, no saber si es el compilador o el hardware.  :? Te recomiendo que en MPLAB simules el proyecto y veas si los registros de configuración del módulo SPI se cargan correctamente y hacer un programita simple como para ver mediante un osciloscopio si las señales son correctas.

Lo recomendable es usar C30  :undecided:


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

Desconectado Tulkas

  • PIC10
  • *
  • Mensajes: 14
Re: pic24F y CCS
« Respuesta #2 en: 19 de Julio de 2010, 15:09:10 »
Buenas, gracias por tu respuesta.

Al final he hecho lo que me has aconsejado, me he pasado a C30.  Podría haber usado otro pic de la gama 18F pero en algún momento voy a volver a los 24F y va a pasar lo mismo.  Bueno, escribo porque ya tengo un problemilla, estoy trasteando con el C30 un poco porque aunque también es C cuesta empezar.  Lo que estoy haciendo ahora es intentar usar los periféricos por separado y ahora estoy con la uart.  He sido capaz de ponerla a funcionar a 19200 pero sólo la transmisión, la recepción no funciona.  He partido de un ejemplo ya hecho que esperaba una interrupción por el pin RX, yo lo estoy haciendo con polling del bit de recepción, el RXDA.  El pin TX del pic lo tengo conectado directamente al RX del RS232 y el RX del pic está conectado con el TX del PC con un transistor por medio, para cambiar niveles.  No estoy invirtiendo niveles con el transistor, sólo lo estoy adecuando a la entrada del pic.  Luego en el software los invierto con los bits correspondientes RXINV y UTXINV.  Lo que hago es enviar un mensaje por puerto serie y luego en un bucle while espero a recibir un carácter desde el hyperterminal del windows, pero no recibo nada...


Código: [Seleccionar]
#include <p24fj48ga002.h>
#define FCY 10000000
#include <libpic30.h>
#include <uart.h>
#include <stdio.h>

_CONFIG2(IESO_OFF & FNOSC_PRI & FCKSM_CSDCMD & POSCMOD_HS)
_CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_ON & ICS_PGx1 & FWDTEN_OFF)


#define BAUDRATE 19200
#define BRGHigh 0
#if BRGHigh
      #define BRGVAL ((FCY/BAUDRATE)/4)-1
#else
      #define BRGVAL ((FCY/BAUDRATE)/16)-1
#endif

char lectura;

int main(void)
{

__delay_ms(200);

//CONFIGURAMOS PINES I/O

_TRISB15 = 0; //PIN 15 DEL PUERTO B (LED)

//CONFIGURAMOS LOS PINES RP

OSCCONL = 0x46;
OSCCONL = 0x57;
_IOLOCK = 0;
RPINR18bits.U1RXR = 14; //pin rp14 como entrada usart RX
RPOR6bits.RP13R = 3; //pin rp13 como salida        usart TX
_IOLOCK = 1;
OSCCONL = 0x46;
OSCCONL = 0x57;

//CONFIGURAMOS PUERTO SERIE HARDWARE

U1MODEbits.USIDL = 0; //CONTINUE MODULE OP IN IDLE MODE
U1MODEbits.IREN = 0; //IRDA ENCODER DISABLED
U1MODEbits.RTSMD = 1; //U1RTS PIN IN SIMPLEX MODE
U1MODEbits.UEN = 0b00; //U1TX Y U1RX PINS ENABLED U1CTS Y U1RTS NO
U1MODEbits.WAKE = 0; //NO WAKEUP ENABLED
U1MODEbits.LPBACK = 0; //LOOPBACK MODE IS DISABLED
U1MODEbits.ABAUD = 0; //BAUD RATE MEASUREMENT DISABLED O COMPLETED
U1MODEbits.RXINV = 1; //U1RX IDLE STATE IS '0'
U1MODEbits.BRGH = BRGHigh;
U1MODEbits.PDSEL = 0b00;         //8 BITS DATA, NO PARITY
U1MODEbits.STSEL = 0; //ONE STOP BIT

U1STAbits.UTXISlllllEL0 = 1;
U1STAbits.UTXISEL1 = 0;
U1STAbits.UTXINV = 1; //U1TX IDLE '0'
U1STAbits.UTXBRK = 0; //SYNC BREAK TRANSMISSION DISABLED OR COMPLETED
U1STAbits.URXISEL = 0b00;
U1STAbits.ADDEN = 0; //ADDRESS DETECT MODE DISABLED
U1STAbits.OERR = 0;
IFS0bits.U1RXIF = 0;
U1BRG = BRGVAL;                 //BAUDRATE

U1MODEbits.UARTEN = 1; //UART1 IS ENABLED
U1STAbits.UTXEN = 1; //TRANSMIT IS ENABLED

printf("Hola mundo\n\r");

while(1)
{
if (U1STAbits.URXDA == 1)
{
lectura = getcUART1();
printf("%c",lectura);
}

}

return 0;
}

Alguna idea.

Gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: pic24F y CCS
« Respuesta #3 en: 19 de Julio de 2010, 15:13:50 »
Revisa por aquí, hay un ejemplo de uso del C30 en un PIC24H, pero es casi lo mismo.


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

Desconectado Tulkas

  • PIC10
  • *
  • Mensajes: 14
Re: pic24F y CCS
« Respuesta #4 en: 19 de Julio de 2010, 16:49:17 »
Hola, gracias por responder.

Ese es el programa del que he partido.  El que yo he hecho no tiene grandes diferencias así que no me explico por qué no funciona.  Será por como asigno los pines RP??.

Un saludo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: pic24F y CCS
« Respuesta #5 en: 19 de Julio de 2010, 16:52:18 »
Hay funciones para desbloquear la escritura de ciertos registros, prueba con esas.

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

Desconectado Tulkas

  • PIC10
  • *
  • Mensajes: 14
Re: pic24F y CCS
« Respuesta #6 en: 19 de Julio de 2010, 21:14:16 »
Hola, he visto varias cosas que no entiendo.

He cambiando de pin RP la entrada de la UART1. He probado desde el pin RP3 hasta el pin RP13, desde el RP3 hasta el RP9 entran datos, todo lo que escribo por hyperterminal lo leo y lo vuelvo a enviar, haciendo un eco.  A partir del pin RP10 no funciona, la entrada RX de la uart deja de funcionar, esto puede ser posible???.  Por otro lado, si elimino la parte en que escribo en el registro OSCCAL los pines RP siguen configurándose, la pregunta es, para que sirve entonces esta secuencia.


Un saludo.

« Última modificación: 19 de Julio de 2010, 21:19:46 por Tulkas »

Desconectado Tulkas

  • PIC10
  • *
  • Mensajes: 14
Re: pic24F y CCS
« Respuesta #7 en: 19 de Julio de 2010, 22:10:55 »
Vale, ya lo he solucionado, el problema estaba en que al principio no había configurado los pines como digitales y por defecto estaban habilitados como analógicos

AD1PCFG = 0xFFFF;         //Todos digitales

La otra pregunta... Si no utilizo __builtin_write_OSCCON...... para poder asignar los pines RP, por qué me lo permite?.  Es decir, asigno los pines RP a los periféricos sin usar la secuencia de desbloqueo, para que sirve entonces esta secuencia?.


Un saludo

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: pic24F y CCS
« Respuesta #8 en: 19 de Julio de 2010, 22:29:32 »
Hola

Esa secuencia es para emergencias. Normalmente al encender el pic los pines RPn están desbloqueados. Uno usa el bloqueo para cuando el pic sale de control, algún bug o por ruido. De esta forma los pines no se cambian de periférico súbitamente y evita cortos circuitos.

El uso del bloqueo es opcional.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: pic24F y CCS
« Respuesta #9 en: 20 de Julio de 2010, 11:58:02 »
Interesante, yo seguí el manual de referencia del microcontrolador, donde en el ejemplo muestra que se desbloquea y luego se vuelve a proteger, no me di cuenta del detalle que el microcontrolador al iniciarse está desbloqueado  :?


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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: pic24F y CCS
« Respuesta #10 en: 20 de Julio de 2010, 12:12:23 »
Aquí la sección de la datasheet para el desbloqueo...  :mrgreen:

Citar
12.4.5.1BASIC STEPS TO USE PERIPHERAL PIN SELECTION (PPS)
1.Disable any fixed digital peripherals on the pins to be used.
2.Switch pins to be used for digital functionality (if they have analog functionality) using the
ADxPCFG register.
3.Unlock the OSCCON register and clear bit, IOLOCK (not needed after device Reset).
4.Set RPINRx and RPORx registers appropriately.
5.Unlock the OSCCON register and set bit, IOLOCK, to ë1í.
6.Configure and enable newly mapped PPS peripherals.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: pic24F y CCS
« Respuesta #11 en: 20 de Julio de 2010, 12:15:18 »
Que grande que es datasheet, que haríamos sin él!  :D :D
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: pic24F y CCS
« Respuesta #12 en: 20 de Julio de 2010, 12:25:08 »
 :D :D

A mi me da flojera porque para el PIC24 hay que estar bajando los manuales de uso para cada periférico.  :x :D


 

anything