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...
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.