Pll - arm lpc2132

Me esta sucediendo algo extraño con el puerto serie/PLL

Voy por pasos, pude adquirir este mini-modulo:

http://cgi.ebay.com/NXP-LPC2132-Mod...ltDomain_0?hash=item58860922e2#ht_2615wt_1242

Para la programacion del mismo utilizo el LPC2000 Flash utility v2.2.3 usando el puerto serie (Uart0), para lo cual use un max 232, y 2 pulsadores (1 para el reset y otro para la Eint1 - P0.14). A la hora de programarlo no tengo ningun inconveniente, el LPC2000 lo detecta e inclusive lo graba correctamente (o eso es lo que me indica al finalizar), tambien pude comprobar la integridad del programa comparando el cargado en la flash, con el que tengo en el dico rigido.

Pero mi inconveniente esta en que no puedo hacer funcionar bien el puerto serie en mi programa, a la hora de conectarme a traves del hyperterminal o el programita terminal, el codigo parece ejecutarse bien, pero los datos que recibo son malos, como si la velocidad del puerto estuvieran mal configurados, porque si pudo programar sin problemas usando el mismo puerto, solo queda que yo me haya equivocado en algo.

Entonces mi duda es si estara bien configurado el bendito PLL y como hago en todo caso para deshabilitarlo.

Este es mi codigo:

Código:
#include <LPC213x.h>

#define TEMP (1<<6)
#define DEMP (1<<0)
#define PLOCK (1<<10)


void PLL_config()
{
	VICIntEnable=0x0; // Deshabilito cualquier interrupcion
	PLLCFG=0x60; // P=8 -- M=1 => Cclk=14,7465MHz*M=14,7465MHz Fcco=cclk*2*P=235,.. MHz - Segun el datasheet hasta aca iria bien la config.
	PLLFEED = 0xAA;
	PLLFEED = 0x55;
	PLLCON = 0x01;
	PLLFEED = 0xAA;
	PLLFEED = 0x55;
	while (!(PLLSTAT &  PLOCK)); // Espero hasta que se asegure el PLL 
	PLLCON = 0x03; // Habilito el PLL
	PLLFEED = 0xAA;
	PLLFEED = 0x55;	
	VPBDIV=0x00; // FPclk=fosc/4
}

void serie_config()
{
	U0LCR=0x83;  // Dlab en 1 y 8 bits de datos
	U0DLL=0x60;  // usando cristal de 14,7465MHz, para obtener 2400 baudios => Divisor= 96 => 0x0060
	U0DLM=0x00;
	U0LCR=0x03;  // Dlab en 0
}


int main(void)
{
	unsigned char flag=0;
        PLL_config(); 
	PINSEL0=0x00000005; // PIN 0= TXD0 y PIN 1= RXD0 
	PINSEL1=0;
	serie_config();

	U0THR=0x61;	 
	while(1)
		{
		if(U0LSR&DEMP)
			{
			if(U0RBR==0x73)
				{
				if(flag==1)
					flag=0;
				else
					{flag=1; U0THR=0x61;}
				}
			}
		if((U0LSR&TEMP)&&flag)
			{
		 	U0THR=0x61;
			}
		}
}

Como se ve, el codigo es simple e inclusive uso el puerto serie como pulling (para facilitar el ejemplo).

Si uso el debug del keil (en forma de simulacion), todo queda bien configurado y la simulacion es correcta. Si uso el proteus, la simulacion tambien es buena, aunque me tira un error de que el cclk estaria a 73MHz (13 MHz mas de lo que soportaria el uC), sin embargo la comunicacion la realiza 2400 baudios sin problemas.

Cuando lo hago en la practica, sucede el error antes mencionado, como si la comunicacion fuera a una velocidad incorrecta.
 
¿Que compilador usas? Lo digo porque mis primeras experiencias con ARM fueron frustantes debido a que el IAR que uso añade un archivo de inicio dependiente del target, que incluye la inicialización del PLL y de algunas interrupciones y periféricos, así que tuve que informar o configurar el compilador 'a mano' para que usase una copia diferente y personalizada del startup.c.

Igual no tiene nada que ver con tu sistema, pero a mí me funcionó, aunque me costó encontrarlo.
 
Probe esa tambien, yo uso el keil, y cuando creas un nuevo proyecto te pregunta si queres agregar un startup, yo le pongo que si, y despues el keil me permite configurarlo, ej:



Probe tambien desactivando el PLL tanto en mi codigo, como en el startup. Y siempre obtengo lo mismo, envio 'a' y la Pc recibe 'Á', si cambio la configuracion de velocidad en el uC de 2400 a 9600, sucede lo mismo, si activo o desactivo el PLL, tambien sucede lo mismo (siempre configurando el divisor del puerto serie en funcion de Pclk).

Por ultimo, agregue unas lineas para que encienda o apague un led si recibia algo por el puerto, y funciona bien, pero nuevamente los datos que envio/llegan estan mal.
 
Al final pude hacerlo funcionar, usando el puerto serie pude verificar que el PLL estaba bien, al parecer el cristal no estaria llendo a la frecuencia que deberia o el conjunto de los capacitores falla, o el cristal tal vez no sea de la frecuencia mencionada en el esquematico.
 
Atrás
Arriba