Interrupciones internas en PSI con cálculo de frecuencia

Hola compañeros del foro. No sé si sea adecuado abrir un nuevo, pero no encontré un tema que sea actual y que hable del Pic Simulator IDE que muchos usamos actualmente. Básicamente hace mucho que vengo jugando con PICS practicando, mis conocimientos de electrónica analógicos son muy buenos, pero los de PICS no tanto.

Mi consulta básicamente es como se calcula la velocidad final del micro, he visto en la datasheet un plano del micro y la verdad que estoy empezando a pensar que lo interpreto de maneras muy diferentes a lo que realmente es, por ejemplo veo que al usar la configuración PLL la frecuencia se divide... Pero al dividirse aumenta???? Como es esto como funciona. Y respecto a esto como se cuando debo usar el timer 1,2,3,4. etc. De lo que he ojeado es que para calcular el tiempo de retardo se deben tener muy en cuenta las velocidades a las que trabaja el pic. No les pido códigos completos ni que me realicen el trabajo solo una breve explicación y si tienen algún fragmento “didáctico” de código en PSI se los agradecería.

Para empezar lo único que quería hacer era tener una frecuencia de 5hz en una pata del integrado conectada a un led, y después tener una botonera con una pantalla o algo por el estilo, A lo que quiero llegar es ver si puedo hacer cosas en la pantalla mientras el led prende y apaga sin alterar su frecuencia. Es esto posible o estoy loco?

Tengo un pic18F4550 disponible y ya le he conectado una pantalla la he hecho andar y escribir perfectamente sin ningún problema, solo que ahora se me presento esta otra parte del desafío. Y un par de preguntitas de novato.

Que es el FOSC?
Que es el PLL?
Si mi pic trabaja a 96Mhz puedo tener por lo menos una salida cuadrada de 40Mhz?
Qué libro en español/Ingles me recomiendan para trabajar en pic con el PSI?
Los pics se queman cuando se conectan sin estar grabados?

Cordiales saludos a todos y gracias de antemano por su ayuda espero que sea algo que le sirva a todos. :apreton: :)
 
Fijate en la hoja de datos que el diagrama en bloques del oscilador del PIC que mencionaste es así:

Osc.png

Viendo el diagrama rápido, tenés 3 formas de generar el clock del CPU y los periféricos:

1 - Cristal externo de alta frecuencia => lo conectás a los pines Osc1/2.
2 - Cristal externo de baja frecuencia => lo conectás a los pines T1OSO/I, pero ojo que estos pines también pueden ser usados para generar un clock ... tal vez a un timer y hacer un RTC por soft.
3 - Oscilador interno.

Supongamos que hacés la más completa y usas un Cristal externo de alta frecuencia, entonces tenés la opción de:

- Usar PLL
- No usar PLL

El PLL es un forma de generar una frecuencia muy alta a partir de una menor, por ej. vos podrías entrar con un cristal de 10MHz y salir con una frecuencia de 96MHz.

Si usas PLL, primero pasas por un pre-escaler (PLLDIV) que lo único que hace es dividir la frecuencia de tu cristal por el divisor que elijas, esto está pensado para que a la salida de ese pre-escaler salgas con 4MHz (fijate que hace incampié en el diagrama), por lo tanto a modo de ej. si usas un cristal de 12MHz, deberías usar un pre-escaler con un divisor de 3 para que la salida obtengas 4MHz.

Luego de pre-escaler entras al PLL y mágicamente salís con 96MHz (esa frecuencia tiene que ver con el funcionamiento del USB, 48MHz). De esos 96MHz pasas de nuevo por otro pre-escaler (el que dice CPUDIV) y suponé que dividis por 2 => a la salida obtenes 48MHz, esos 48MHz serán la frecuencia máxima a la que vas a poder trabajar.

Si no usaras el PLL, solo pasas por el pre-escaler (CPUDIV), entonces si tenés cristal de 12MHz y configuras el divisor en 1 => a la salida obtenés 12MHz.

Espero que más o menos te haya aclarado el panorama, luego en el soft es cuestión de ver el nombre y el estado de los registros según ese diagrama.

Fosc seguramente es la frecuencia del cristal de alta frecuencia que utilices.
 
muchísimas muchísimas gracias cosmefulanito04, al fin al fin me entro en la cabeza, si bien la foto no la puedo ver en tu publicación es obvio que hablamos de la página 26 del datasheet de microchip (18F4550). Realmente esto me aclaro mucho, ahora también entiendo eso de “only input 4MHZ” pensé que solo servían cristales de 4Mhz. Por ejemplo si quiero hacer andar mi pic a 32MHZ por decir algo, y corregime por favor si me equivoco, los primeros pasos serian estos:

1. Cristal físico de 8mhz en osc1,osc2

.....y a continuación en cualquier lenguaje de programación.....

2. Frecuencia: 8Mhz
3. PLL división /2
4. CPUDIV /3
5. No me falta nada como seleccionar "FOSC:3,FOSC:0" o seleccionar algo en el "MUX".

PD.: no sé ni que hace el "MUX" Me darías una breve reseña de su funcionamiento. Muchas gracias por tu ayuda! :D
 
...
1. Cristal físico de 8mhz en osc1,osc2

.....y a continuación en cualquier lenguaje de programación.....

2. Frecuencia: 8Mhz
3. PLL división /2
4. CPUDIV /3
....

Hasta acá vas bien, con eso obtendrías 32MHz.

...
5. No me falta nada como seleccionar "FOSC:3,FOSC:0" o seleccionar algo en el "MUX".

El Mux justamente sirve para seleccionar:

1 - Cristal externo de alta frecuencia => lo conectás a los pines Osc1/2.
2 - Cristal externo de baja frecuencia => lo conectás a los pines T1OSO/I, pero ojo que estos pines también pueden ser usados para generar un clock ... tal vez a un timer y hacer un RTC por soft.
3 - Oscilador interno.

Vos lo tendrías que dirigir a 1- => entonces los registros FOSC3:FOSC0 y OSCCON deben estar correctamente configurados.

Viendo rápidamente, los bits de OSCCON deberían estar así:
- Bit7: según como quieras que funcione el sleep mode
- Bit6-4: no le prestas atención, solo para configurar el oscilador interno
- Bit3: tendrías que verlo bien, yo creo que en 1.
- Bit2: no te interesa.
- Bit1-0: ambos bits en 0 para elegir al oscilador primario como fuente de clock.

En cambio los bits FOSC3:FOSC0 que están en el registro CONFIG1H, configuran el tipo de cristal, HS con PLL... etc (ver pag. 296)

Deberías dejarlo en HS con PLL => los bits deberían ser 111x.
 
Muchas gracias nuevamente después de tantas horas tratando de entender donde se realizaban las configuraciones creo que algo logre hacer. Mas o menos me voy orientando entre la diferencia de los Configuración bits (FUSES) y las configuraciones en las direcciones, otra vez te pido si le echas un ojito a la programación…

abbcc78320809dc61fe459febee5014do.jpg


Respecto a lo que es codigo tengo 3 opciones y no se cual es la que realmente anda, (Por lo menos el compilador no me tiro error de codigo)
OPCION 1
Código:
Define CONFIG1L = 0x11
Define CONFIG1H = 0x0e
Define CONFIG2L = 0x1e
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = 0x83
Define CONFIG4L = 0x80
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40

'''''fosc0

Define CLOCK_FREQUENCY = 8


OSCCON.7 = 0  '(Creo)
'OSCCON.6 = 0 'no le presto atencion
'OSCCON.5 = 0 'no le presto atencion
'OSCCON.4 = 0 'no le presto atencion

OSCCON.3 = 0
'1 = oscillator start - up timer time - out has expired; primary oscillator is running
'0 = oscillator start - up timer time - out is running; primary oscillator is Not ready



'OSCCON.2 = 0 'no le presto atencion

'Primary oscillator
OSCCON.1 = 0
OSCCON.0 = 0


OPCION 2
Código:
Define CONFIG1L = 0x11
Define CONFIG1H = 0x0e
Define CONFIG2L = 0x1e
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = 0x83
Define CONFIG4L = 0x80
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40

'''''fosc0

Define CLOCK_FREQUENCY = 8

OSCCON.IDLEN = 0  '(Creo)
'OSCCON.IRCF2  'no le presto atencion
'OSCCON.IRCF1  'no le presto atencion
'OSCCON.IRCF0  'no le presto atencion
OSCCON.OSTS = 0  '(no entiendo bien que hace)
'OSCCON.IOFS 'no le presto atencion
OSCCON.SCS1 = 0
OSCCON.SCS0 = 0


OPCION 3 ____________________________ (ME da error en el compilador)
Código:
Define CONFIG1L = 0x11
Define CONFIG1H = 0x0e
Define CONFIG2L = 0x1e
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = 0x83
Define CONFIG4L = 0x80
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40

'''''fosc0

Define CLOCK_FREQUENCY = 8


IDLEN = 0  '(Creo)
'IRCF2  'no le presto atencion
'IRCF1  'no le presto atencion
'IRCF0  'no le presto atencion
OSTS = 0  '(no entiendo bien que hace)
'IOFS 'no le presto atencion
SCS1 = 0
SCS0 = 0

Saludos y buenas noches! :)
 
Última edición:
El CONFIG1H parece bien configurado para "HS con PLL".

Y entre la opción 1 y 2, si bien seguramente el compilador las interpreta de la misma forma, uno indica el nº de bit y el otro el nombre de ese bit, yo me quedaría con las 2da forma que resulta más fácil de ver que bits estás tocando.

La tercera está mal, porque no llamás a la estructura del registro OSCCON, por eso no compila.

De todas formas, sería bueno que alguien que este acostumbrado a usar PIC y de estas familias te confirme si que está bien configurado.
 
Muchas gracias nuevamente cosmefulanito04. He estado haciendo varias pruebas y efectivamente el pic parece trabajar mucho más rápido que antes. Respecto a interrupciones para este pic he visto que el PSI usa una “Subrutina o salto” llamado (On High Interrupt). Aquí ellos dan un ejemplo que por lo que veo en este ejemplo el micro solo lee en el ADC y no entrega ningún dato ni nada.

Código:
Dim t As Word 
t = 0 
TRISA = 0xff 
ADCON1 = 0 
TRISB = 0 
T0CON.T0CS = 0 
INTCON.TMR0IE = 1 
Enable High 

loop: 
   	Adcin 0, PORTB 
Goto loop 

End 

On High Interrupt 
   	Save System 
   	t = t + 1 
   	INTCON.TMR0IF = 0 
Resume

Como podría interpretar esto, como funciona eso del desborde del timer? como se que tan rápido cuenta el timer?
Hasta que numero cuenta el timer?
Como se cual timer debo usar?

Discúlpame si te persigo con mis preguntas pero la verdad que me estoy comiendo todo el datasheet y aun así me cuesta arrancar con este tipo de cosas. Saludos :apreton:

PD.: Efectivamente la opcion1 y opcion 2 son perfectamente validas!
 
Atrás
Arriba