TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: elmasvital en 07 de Enero de 2009, 12:37:57
-
Esto es lo que más puedo odiar que me pase en la electrónica. Toda la mañana perdida para intentar entender porqué un asm que funcionaba en asm30, cuando lo paso a asm8 y lo embebo en ccs no funcionaba. Todo apunta a que el problema está en la sincronización de la señal y por tanto me centré en asegurarme de que el micro estaba funcionando a 6mips. En un pic18f 1 ciclo de instrucción es igual a 4 ciclos de reloj por lo que debo tener el reloj configurado a 24mhz.
Como tambien voy a hacer uso del usb pues tengo que configurarlo para que este corra 48mhz.
En el datasheet de microchip tenemos para el cristal que uso (20mhz) los siguientes pll/cpudiv...
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=24359.0;attach=8358)
Según esto debía configurar para mi cristal de 20mhz un pll5 y un cpudiv4. Lo pongo así en CCS y NO me funcionaba
la rutina precisamente porque no estaba funcionando el micro a 6mips, mis sospechas eran correctas.... Pero porqué?
Ok pues aqui tenemos las opciones de configuración (fuses) validos para este micro con respecto al pll y cpudiv en CCS:
PLL1,PLL2,PLL3,PLL4,PLL5,PLL6,PLL10,PLL12.
Si configuras el fuse de PLL del micro en ccs obtendrás lo mismo que indica en el datasheet. Aqui no estaba el problema
CPUDIV1,CPUDIV2,CPUDIV3,CPUDIV4
Si veis en la captura anterior no existe cpudiv1 y aparece cpudiv6 que no aparece aquí. Pero no solo para este tipo de reloj a 20mhz, sino para ninguno de este micro... ¿cómo podia ser esto?. Pero es además que si configuras cpudiv2 en ccs se corresponderá con lo que en el datasheet indica cpudiv +3... Una autentica pasada y una locura que te hace perder toda la mañana.
--------------------------------------------------------ACLARACIÓN----------------------------------------
El caso que describo solo se da cuando seleccionamos un tipo de oscilador que metemos por divisor PLL casos --> HSPLL, ECPLL, ECPIO. En el caso en que no activemos el divisor PLL los fuses CPUDIV1-4 de CSS se corresponden con los del datasheet.
----------------------------------------------------------------------------------------------------------------
Asi que las correspondencias en PLL están deacuerdo con lo que pone en el datasheet pero en cpudiv la correspondencia sería
EN CCS EN DATASHEET
CPUDIV1--> CPUDIV +2
CPUDVI2--> CPUDIV +3
CPUDIV3--> CPUDIV +4
CPUDIV4--> CPUDIV +6
Esto lo podeis comprobar viendo el archivo de salida que da CCS en el hex y viendo el primer byte de configuración con respecto a los bits CPUDIV1:CPUDIV0
No se si será un bug pero si asi fuera... si cambiaran esto harían que el código escrito hasta la fecha dejara de funcionar. Ahí queda para navegantes
1 saludo.
-
¿Ya lo has resuelto?
-
vaya este mensaje fue un mensaje que empecé a escribir y lo dejé a medias esperando terminarlo :-P. No sabia que le habia dado a enviar. Bueno lo he editado para terminar el tema.
Lo tengo resuelto si :-P
-
Cosas como esas no son extrañas en CCS :D :D :D pero si hacen que la vida sea extraña. Muchas gracias por el aporte
Saltaré el charco para no meter la pata en el
Salu2
-
Eso es lo malo de los lenguajes de alto nivel, en cambio en asembler todo es absolutamente transparente, pero bueno cada uno tiene lo suyo, sus pro y sus contras.
Javicho.
-
Precisamente el software que estoy desarrollando es mitad ensamblador y mitad CCS. Hay partes que no se pueden desarrollar en ensamblador (ni yo quiero hacerlo) como por ejemplo la parte USB.
Aunque renegaba mucho cuando lo estudiaba... debo reconocer eque el ensamblador es necesario conocerlo a fondo para poder programar bien en C o al menos ayuda mucho.
1 saludo.
-
debo reconocer eque el ensamblador es necesario conocerlo a fondo para poder programar bien en C o al menos ayuda mucho.
Eso es muy cierto, pues es necesario conocer la máquina a fondo y su lenguaje para que ella nos entienda y sacarle el máximo del potencial.
Salu2
-
De que PIC hablas?? :shock: :shock:
No encuentro esos bits en los que trabajo habitualmente... :( :(
-
Que tal amigos!
MGLSOFT se refieren a pic con usb integrado :mrgreen:
puede ser por ejemplo un pic18f2550 o pic18f4550 entre otros, los cuales poseen hardware pra el manejo del usb.
Saludos
-
Ahora entendi, lei tan rapido que no vi lo del USB... :D :D
-
Hola,
Eso es lo malo de los lenguajes de alto nivel, en cambio en asembler todo es absolutamente transparente, pero bueno cada uno tiene lo suyo, sus pro y sus contras.
No hay que hecharle la culpa al lenguaje, en C podes hacer lo mismo que en assembler solo perdiendo un poco de perfomance pero ganando muchisimo en portabilidad, mantencion y legibilidad que para nada es poca cosa. Aca la culpa la tiene la implementación no el lenguaje, lo que noto en este foro y sobre todo en usarios de CCS es que en una gran porcentaje son muy dependiente de las funciones de libreria ( IIC, Display, etc, etc ) y se topan con muchos errores, mi filosofia es desarrollar yo mismo las cosas y no depender de implementaciones externas. De lo único que dependo del compilador es de la RTL
Saludos !
-
Asi que las correspondencias en PLL están deacuerdo con lo que pone en el datasheet pero en cpudiv la correspondencia sería
EN CCS EN DATASHEET
CPUDIV1--> CPUDIV +2
CPUDVI2--> CPUDIV +3
CPUDIV3--> CPUDIV +4
CPUDIV4--> CPUDIV +6
No es por defender el CCS pero, si vemos este esquema (RedPic lo explicó magistralmente en otro post pero no lo encuentro):
(http://img397.imageshack.us/img397/1930/oscilatorconfiguratorkk4.jpg)
Vemos que el significado del CPUDIV depende de si se selecciona el PLL o no (bits FOSC3:FOSC0) por lo tanto, si la fuente del oscilador es sin PLL, el CPUDIV del CCS coincide con el datasheet, pero si se selecciona el módulo pll como fuente de reloj, entonces pasa eso que has colocado en tu post.
-
Tienes razón en tu exposición... aunque la linea que has pintado en rojo, en el ejemplo que expones no debería entrar por el divisor PLL sino por el Oscilador Postscaller en el que efectivamente los CPUDIV de CCS se corresponden con los del Datasheet.
En realidad escribí este post para que alguien me lo explicara... pero ya cuando llevas unas cuantas de horas como que los ojos se te van cerrando y no ves más que lo que tienes justo delante :-)
-
La linea roja no la puse yo ja ja ja, me fusilé el diagrama de otro post. Lo que comentas me ha pasado infinidad de veces y si no fuera por este foro ya me habria dedicado a criar ovejas :D
-
Hola.
Pues retomo el hilo porque he estado probando las configuraciones del oscilador con el PLL habilitado y claro ... no coincidían las configuraciones. Al final pude dar con el fallo ... lástima que hice al revés, es decir, primero probé y luego me dio por buscar acá en el foro jejeje.
De todas maneras, las configuraciones del CPUDIVx las tome así:
CPUDIV1 = 00
CPUDIV2 = 01
CPUDIV3 = 10
CPUDIV4 = 11
A la hora de setear el clock, verifico en el datasheet a que divisor corresponde ...
De todas maneras, me parece que debería haber unos fuses que sean equivalentes al CPUDIVx pero con el PLL activado.
Saludos
-
Según la ultima imagen y lo explicado previamente en el post de Duende_azul , si yo deseo trabajar con diferente tiempo de reloj, esto es: 20 Mhz que me entrega el oscilado HS para el ciclo de instrucción y aplicar PLL5 para los 4Mhz para los 96 Mhz--->48Mhz del usb 2.0 ¿debería al menos poner los siguientes fuses?:
#fuses HS, PLL5, CPUDIV1, USBDIV
asi como también :
#use delay(clock=20000000)
De ante mano, gracias :o
-
No, sería:
#fuses HSPLL, PLL5, CPUDIV1, USBDIV
#use delay(clock=48000000)
#use delay no es más que una definición que usa el compilador para crear demora, configurar UART entre otras cosas, y se debe colocar el valor a la cual trabajará el microcontrolador. Luego en los fuses se debe indicar que será un HS pero además se usará PLL.
Saludos!
-
No, sería:
#fuses HSPLL, PLL5, CPUDIV1, USBDIV
#use delay(clock=48000000)
#use delay no es más que una definición que usa el compilador para crear demora, configurar UART entre otras cosas, y se debe colocar el valor a la cual trabajará el microcontrolador. Luego en los fuses se debe indicar que será un HS pero además se usará PLL.
Saludos!
Ahora me salió una consulta mucho mas noob. Es decir si configuro #use delay(clock=4000000) el compilador configurará de tal forma el microcontrolador para que opere a esa velocidad? (ya teniendo los 48 Mhz generados con el PLL)
CORRECCION:
Si activo HSPLL junto con CPUDIV1 la frecuencia de reloj para el funcionamiento del pic será de 48 Mhz (tanto USB como frecuencia reloj del propio uC). Yo deseo que el uC me opere a 20 Mhz (por cosas de la vida del RTOS CSS que no me calcula bien los tiempos en 48 Mhz pero si a 20 Mhz) pero igual deseo usar el USB 2.0. A cambio, leyendo el datasheet de la familia 18fxx5x se que se puede operar a distintas frecuencias (pagina 30 del datasheet, sección 2.3.2 Running different USB and microcontroller clocks).
La cosa es que activando el fuse HSPLL el programa me anda mas rápido (teniendo la directiva use en 20Mhz) y con HS funciona perfectamente (y el usb también, funcionando a 48 Mhz, creo :o)
-
Si activo HSPLL junto con CPUDIV1 la frecuencia de reloj para el funcionamiento del pic será de 48 Mhz (tanto USB como frecuencia reloj del propio uC). Yo deseo que el uC me opere a 20 Mhz (por cosas de la vida del RTOS CSS que no me calcula bien los tiempos en 48 Mhz pero si a 20 Mhz) pero igual deseo usar el USB 2.0. A cambio, leyendo el datasheet de la familia 18fxx5x se que se puede operar a distintas frecuencias (pagina 30 del datasheet, sección 2.3.2 Running different USB and microcontroller clocks).
La cosa es que activando el fuse HSPLL el programa me anda mas rápido (teniendo la directiva use en 20Mhz) y con HS funciona perfectamente (y el usb también, funcionando a 48 Mhz, creo :o)
jejeje! Si sabre que falla a 48MHz. :5] No se puede obtener 20 MHz. Creería que hay que activar el PLL mediante el fuse HSPLL y luego de pasar por el PLL al obtener 96 MHz se puede dividir entre 2, 3, 4 y 6, pero no se lograría la frecuencia deseada. :?
Saludos!
-
jejeje! Si sabre que falla a 48MHz. :5] No se puede obtener 20 MHz. Creería que hay que activar el PLL mediante el fuse HSPLL y luego de pasar por el PLL al obtener 96 MHz se puede dividir entre 2, 3, 4 y 6, pero no se lograría la frecuencia deseada. :?
Saludos!
Ya, estuve releyendo y releyendo el datasheet y al final me di cuenta que estaba mal. Al dejar HS solamente el pic usa USB pero a baja velocidad. Rayos!!