Autor Tema: 18F26K22 con 64MHZ  (Leído 3600 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
18F26K22 con 64MHZ
« en: 05 de Abril de 2015, 02:52:44 »
Hola, alguien sabe como configurar este micro para que trabaje a 64mhz interno?

Código: [Seleccionar]
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPLLEN                  //4X HW PLL disabled, 4X PLL enabled in software
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES WDT_SW                   //No Watch Dog Timer, enabled in Software
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOSTVREN                 //Stack full/underflow will not cause reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=64M)

main(){
 setup_oscillator(OSC_64MHZ|OSC_INTRC|OSC_PLL_OFF);
}


tengo configurando un timer para que se desborde cada 0.5 segundos y luego contando 1 minutos para realizar alguna tarea, pero no funciona
he cambiado el valor del overflow pero igual se desborda en el mismo tiempo, lo cual me dice que el cristal no esta configurado...
y creo que el ccs compila con valores por defecto.

Código: [Seleccionar]

#int_TIMER1                           
void TIMER1_isr(void){                         //                         
   cont++;                                          //                                   
   if(cont == 2){                                 // 0,5*1=1 seg
        ban_1seg = 1;cont = 0;                                                     
     
   }                                               
   set_timer1(-934464);                               // 0.5=4/64000000*8(65536-x),x=-934464
}


Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: 18F26K22 con 64MHZ
« Respuesta #1 en: 05 de Abril de 2015, 03:08:10 »
Seleciona el Oscilador interno de 16MHz y Activa el multiplicador 4PLL.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re: 18F26K22 con 64MHZ
« Respuesta #2 en: 05 de Abril de 2015, 13:31:39 »
Listo de esta forma trabaja a 64MHZ :)

Código: [Seleccionar]
#include <18F26K22.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                  //Internal RC Osc, no CLKOUT
#FUSES NOPLLEN                  //4X HW PLL disabled, 4X PLL enabled in software
#FUSES NOFCMEN                 //Fail-safe clock monitor disabled
#FUSES NOIESO                    //Internal External Switch Over mode disabled
#FUSES NOBROWNOUT           //No brownout reset
#FUSES WDT_SW                  //No Watch Dog Timer, enabled in Software
#FUSES NOPBADEN                //PORTB pins are configured as digital I/O on RESET
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES STVREN                    //Stack full/underflow will cause reset
#FUSES NOLVP                      //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=64M, internal=16MHz)

y en main

Código: [Seleccionar]
void main(void)
{
   setup_oscillator(OSC_64MHZ | OSC_INTRC);
}
« Última modificación: 05 de Abril de 2015, 14:16:34 por cvargcal »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: 18F26K22 con 64MHZ
« Respuesta #3 en: 05 de Abril de 2015, 14:12:45 »
o activarlo desde los fuses

#FUSES NOPLLEN                  //4X HW PLL disabled, 4X PLL enabled in software

Lo vas a tener que ver en tus palabras de configuracion, algunos es H4 para modificalro en los fuses

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: 18F26K22 con 64MHZ
« Respuesta #4 en: 08 de Mayo de 2015, 23:06:06 »
Yo en su momento lo hice con:

Código: [Seleccionar]
#INCLUDE <18F26k22.h>
   
#FUSES INTRC_IO, PLLEN, PRIMARY, TIMER3B5, NOWDT, NOHFOFST, NOIESO, PUT, MCLR, BROWNOUT, BORV22, WDT4096, NOLVP, NOCPD, PROTECT, CPB

#USE DELAY (CLOCK = 64 000 000)

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: 18F26K22 con 64MHZ
« Respuesta #5 en: 08 de Mayo de 2015, 23:31:45 »
Pero como ya no uso CCS, ahora lo he echo en XC8 y estoy teniendo unos inconvenientes:

En el datasheet, pag 28:




Se supone que para que pase por el multiplicadorx4, PLL_Select tiene que valer 0 cierto? Para esto, en la siguiente pagina, en esta tabla:



Te dicen, entre otras cosas, que PLLEN debe ser 0.

Teniendo en consideración todo esto, y el echo de configurar el oscilador interno a 16mhz, el siguiente código debería funcionar:
Código: [Seleccionar]
// CONFIG1H
#pragma config FOSC = INTIO7    // Oscillator Selection bits (Internal oscillator block, CLKOUT function on OSC2)
#pragma config PLLCFG = OFF     // 4X PLL Enable (Oscillator used directly)
#pragma config PRICLKEN = OFF   // Primary clock enable bit (Primary clock can be disabled by software)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = ON        // Internal/External Oscillator Switchover bit (Oscillator Switchover mode enabled)

int main(int argc, char** argv)
{
    OSCCONbits.IRCF = 0b111;     // 16 mhz oscilador interno
    OSCTUNEbits.PLLEN = 0;      

    TRISC = 0;
    LATCbits.LATC4 = 0;


    while (1)
    {
        LATCbits.LATC4 ^= 1;
    }
}

Esta toda bien la lógica o me falta algo? Porque probando con dicho código, me da una frecuencia diferente. Pero si pongo PLLEN a 1, si funciona correctamente a 64mhz.  :?
« Última modificación: 08 de Mayo de 2015, 23:40:08 por jeremylf »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: 18F26K22 con 64MHZ
« Respuesta #6 en: 09 de Mayo de 2015, 00:48:12 »
Citar
// CONFIG1H
#pragma config FOSC = INTIO67   // Oscillator Selection bits (Internal oscillator block)
#pragma config PLLCFG = ON      // 4X PLL Enable (Oscillator multiplied by 4)
#pragma config PRICLKEN = OFF   // Primary clock enable bit (Primary clock can be disabled by software)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = ON        // Internal/External Oscillator Switchover bit (Oscillator Switchover mode enabled)

Para mi deberias habilitarlo

bit 4 PLLCFG: 4 x PLL Enable bit
1 = 4 x PLL always enabled, Oscillator multiplied by 4
0 = 4 x PLL is under software control, PLLEN (OSCTUNE<6>)

« Última modificación: 09 de Mayo de 2015, 00:55:59 por KILLERJC »

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: 18F26K22 con 64MHZ
« Respuesta #7 en: 09 de Mayo de 2015, 15:54:12 »
Según la tabla el PLLCFG no importa y el que manda es PLLEN del registro OSCTUNE. Según tabla, PLLEN debe de estar en 0 para que se active el multiplicador x4  :?
« Última modificación: 09 de Mayo de 2015, 16:12:37 por jeremylf »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: 18F26K22 con 64MHZ
« Respuesta #8 en: 09 de Mayo de 2015, 18:38:01 »
Tengo unas contradicciones con lo que hay en el datasheet.

Por una parte:
El PLLCFG si importa (especialmente cuando lo pones con que los pines de OSC funcionen como salida, ya que el ultimo bit es 0), tenes la figura un poquito mas arriba de la tabla, si la salida de la AND de la palabra de configuracion y el PLLCFG es 1, tendrias un 1 siempre en PLL_Select, por mas que modifiques PLLEN, ya que termina siendo una OR entre estos 2 ultimos valores. Lo que lleva a algo mas raro, cuando tenes salida al exterior, si o si la habilitacion es por software y no en los fuses.

Por otra parte:
Citar
when internal clock modes are enabled, the PLL can only be controlled through software. The PLLEN control bit of the OSCTUNE register is used to enable or disable the PLL operation when the HFINTOSC is used.
Aca deja claro que si o si se debe activar con el PLLEN

Pero lo que mas me molesta es que teniendo un bit que se llame PLLEN,

bit 6 PLLEN: Frequency Multiplier 4xPLL for HFINTOSC Enable bit(1)
1 = PLL enabled
0 = PLL disabled

En el que con un 1 se HABILITA, y si luego seguis la logica, ese multiplexor esta mal, o estan intercambiados los valores de 0 y 1. Debe existir un error en el datasheet, y no esta documentado el error. Busque y no aparece en los errata

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: 18F26K22 con 64MHZ
« Respuesta #9 en: 09 de Mayo de 2015, 20:53:13 »
No estoy usando un K22, pero entiendo que es de esa familia el K80.
Por lo tanto lo que te pongo debería servirte bien.

Código: C
  1. #include <18F26K80.h>
  2. #device adc=12
  3.  
  4.  
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. #FUSES DEBUG                    //Permite debug con ICD
  7. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  8. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  9. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  10. #FUSES PLLEN                    //PLL habilitado
  11. #FUSES SOSC_DIG                 //Digital mode, I/O port functionality of RC0 and RC1
  12. #FUSES PUT                      //Power Up Timer
  13. #FUSES NOBROWNOUT               //No brownout reset
  14. #FUSES WDT_NOSLEEP              //Watch Dog Timer, disabled during SLEEP
  15. #FUSES CANB                     //CANTX and CANRX pins are located on RB2 and RB3
  16.  
  17.  
  18.  
  19. #use delay(clock=64000000, int=64000000, RESTART_WDT)

Este código anda bien y ejecuta a 64 Mhz.
Espero que les ayude... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: 18F26K22 con 64MHZ
« Respuesta #10 en: 09 de Mayo de 2015, 22:17:43 »
Tengo unas contradicciones con lo que hay en el datasheet.

Por una parte:
El PLLCFG si importa (especialmente cuando lo pones con que los pines de OSC funcionen como salida, ya que el ultimo bit es 0), tenes la figura un poquito mas arriba de la tabla, si la salida de la AND de la palabra de configuracion y el PLLCFG es 1, tendrias un 1 siempre en PLL_Select, por mas que modifiques PLLEN, ya que termina siendo una OR entre estos 2 ultimos valores. Lo que lleva a algo mas raro, cuando tenes salida al exterior, si o si la habilitacion es por software y no en los fuses.

Por otra parte:
Citar
when internal clock modes are enabled, the PLL can only be controlled through software. The PLLEN control bit of the OSCTUNE register is used to enable or disable the PLL operation when the HFINTOSC is used.
Aca deja claro que si o si se debe activar con el PLLEN

Pero lo que mas me molesta es que teniendo un bit que se llame PLLEN,

bit 6 PLLEN: Frequency Multiplier 4xPLL for HFINTOSC Enable bit(1)
1 = PLL enabled
0 = PLL disabled

En el que con un 1 se HABILITA, y si luego seguis la logica, ese multiplexor esta mal, o estan intercambiados los valores de 0 y 1. Debe existir un error en el datasheet, y no esta documentado el error. Busque y no aparece en los errata

En mi caso, estoy queriendo hacerlo correr a 64mhz desde el oscilador interno de 16mhz; por eso, el PLLCFG no importa. Y es como dices, por eso con PLLEN a 0 se habilita el 4xPLL y con PLLEN a 1 se deshabilita, esta al revéz =S


MGLSOFT, gracias por tu código pero en CCS ya está claro como hacerlo. El problema es en XC8 porque hay que hacerlo a mano y hay incongruencias respecto al datasheet; esto es realmente molesto.


 

anything