PIC18F4550: Problema de Clock externo y fuses. Imposible una temporización controlada

Hola estoy tratando de hacer funcionar un pic18f4550 con un oscilador externo y exprimir al

máximo sus capacidades estoy experimentando serios problemas de sincronización.

El pic funciona, pero no al tiempo que en teoría debería. No así utilizando el oscilador

interno.


Y bueno, mi intencion es que el micro funcione con las mayores velocidades que el externo ofrece.

He hecho esta pregunta muy detallada en pdf, disponible en el siguiente link

https://drive.google.com/file/d/0Bwu8ILk5gSPBbmR6bHlZZHluWUk/edit?usp=sharing

O PUEDES DESCARGAR AQUI TODO PROGRAMA MAS SIMULACION MAS PREGUNTA DETALLADA

Y un zip con la simulacion del proteus y el programa ccs adjuntos.

Patología del sistema ¿Por qué afirmo que no funciona?

1. A simple vista del estado lógico de un led conectado a un pin y un delay_ms(1000);

(10101010…) se aprecia lentitud , no de ms noo , de incluso 1000% del valor. (En

Proteus va bien)

2. Tambien simple vista del Lcd incrementando el valor de una variable cada

delay_ms(1000); se aprecia discordancia. (En Proteus va bien)

3. Imposible establecer cualquier tipo de comunicación que se base en el clock externo,

(rs-232, usb etc). (En Proteus va bien).

4. El ICSP, (InCircuitSerialProgramming) funciona perfectamente.

5. Todas las “malfunciones” mencionadas NO ocurren utilizando Reloj interno a 1 MHZ

(INRC_IO), pero también he experimentado problemas con algunas configuraciones.

6. No es por el hardware ya que lo he probado sobre diferentes prototipos tanto soldados

como en protoboards.


Agradecería mucho que alguien me aclarase algo sobre el tema, muchas gracias.

Y por favor, que nadie me sugiera que revise el conexionado, jaja.

El objetivo en grafico:
objetivo.png
 

Adjuntos

  • PreguntaForo4550.rar
    661.4 KB · Visitas: 6
  • pregunta.pdf
    629 KB · Visitas: 7
Última edición:
Hola.
Por partes:
- Todos los fuses que indiques EC (External Clock) no utilizan un cristal externo, lo que utilizan es una señal cuadrada generado por otro integrado y aplicado a OSC1 (CLKIN). OSC2 (CLKOUT) trabaja como pin digital o como salida del Clock.

- Proteus NO simula Cristal. Si colocas un generador como el Clock digital en OSC1 a la frecuencia que quiers igual va a funcionar. En la vida real no es así; para EC necesitas un aparato o chip que inyecte una señal cuadrada al pin OSC1 del PIC.

- Las otras configuraciones como HSPLL, XT si requieren de un cristal externo.

Revisa la hoja de datos, en la sección del oscilador (External Clock Input) indica como es el sistema.

Saludos
 
Última edición:
Faaaaaaaaaaaa, que pregunta detallada, así da gusto responder!!!.
Aparte de chequear las sugerencias de ByAxel, te pediría más detalles del hardware del cristal: ¿que capacitores estás usando, de que valor, son NP0?, ¿como elegiste los valores?.

Acerca de llegar a 48 MHz, sí es posible. Para eso hay que usar el módulo PLL interno del pic. Mira la siguiente figura (pag 26 de la hoja de datos):
Podés usar cristales de 4, 8, 12, 16 MHz (más arriba no te recomendaría porque la protoboard no se lleva bien con velocidades altas de reloj):

pll pic18f4550.png

Vas a tener que elegir el divisor PLLDIV de acuerdo a tu cristal, para que el reloj de entrada al pll de 96 MHz sea siempre de 4MHz como dice en la figura (PLLDIV = 0 para cristal de 4MHz, =1 para 8MHz, = 3 para 12 MHz, = 4 para 16MHz).
La salida del PLL es de 96 MHz, por lo tanto habrá que poner CPUDIV = 0 para que divida por 2 ese reloj (PLL postscaler); y luego hay que configurar FOSC3:0 para que la CPU tome como fuente de reloj la señal del PLL postscaler.

Para escribir esos registros se puede hacer a mano escribiendo los registros necesarios, o se pueden usar las propias librerías que te provee el compilador CCS. No tengo experiencia usando CCS, pero Moyano Jonathan ha escrito toneladas de posts usando el pic18f4550 con ccs y usb (entre otros muchos aportes muy valiosos):

https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/

Ya en el primer post menciona como configurar los fuses para usar el pll como reloj, cito:
Código:
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
*/

Fin de la cita (los amigos españoles entenderán...)

Creo que lo único que tendrías que cambiar es PLL5 (cristal de 20MHz) a PLL4 (cristal de 16MHz).

Suerte!!!
 
Atrás
Arriba