void main(void){
// --------------------------------------------------------------------------------------
//PeriphInit(); Configura registro System Option
SOPT1=0b00000000; //Arranco con todos los bits en cero
SOPT1_RSTPE=1 ; //Habilita pin de RESET
SOPT1_BKGDPE=1 ; //Habilita pinA4 para usarlo como pin debugger
SOPT1_RSTOPE=0 ; //Deshabilito el pin RST
SOPT1_WAITE=0 ; //Deshabilita el modo espera del Microcontrolador
SOPT1_STOPE=1 ; //habilita el modo STOP (Bajo consumo)
SOPT1_COPT=0 ; //Configura modo de trabajo del COP (No me afecta si no uso el COP)
SOPT1_COPE=0 ; //Deshabilito el COP o perro guardian
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
//ICS_FEI(); //Configura frecuencia interna de trabajo (FBus) a 25MHz
//Para lograrlo, se manipula el registro ICSTRM quien es un ajuste fino para
//el oscilador interno del Microccontrolador. El valor a colocar en este registro ya
//esta definido por el fabricante y se encuentra en una posicion especifica de la memoria FLASH
//esta posicion es llamada NVICSTRM y en esa posicion ppueden haber valores entre 0x00 y 0x80
//Si al leerlo encontramos 0xFF quiere decir que estaen blanco y se perdio esa informacion
//por lo que se hace necesario colocarle un valor por defecto 0XAD
if (NVICSTRM != 0xFF)
ICSTRM = NVICSTRM; // Saca el valor de la memoria FLASH
else
ICSTRM = 0xAD; //Coloca el numero por defecto
//---------------------------------------------------------------------------------------
ICSC1_IREFSTEN=0; //Fuente de reloj interna es deshabilitada despues de un STOP
ICSC1_IRCLKEN=0; //Deshabilita fuente de reloj interna
ICSC1_IREFS=1; //Selecciono fuente de sañal de reloj interna
ICSC1_RDIV0=0; //Divisor de la señal de reloj Externa = 1
ICSC1_RDIV1=0; //Divide fuente se ñal de reloj interna en 1 no afecta por usar un
ICSC1_RDIV2=0; //
ICSC1_CLKS0=0; //Seleccionamos que la fuente de reloj para usar por el Core del MCU
ICSC1_CLKS1=0; //sea la salida del FLL
//---------------------------------------------------------------------------------------
ICSC2_EREFSTEN=0; //Fuente de reloj externa es deshabilitada despues de un STOP
ICSC2_ERCLKEN=1; //Habilita fuente de reloj externa
ICSC2_EREFS=1; //Tipo de fuente de reloj Cristal
ICSC2_LP=0; //FLL es habilitado en modo bypass
ICSC2_HGO=0; //Fuente de reol externa de bajo consumo
ICSC2_RANGE=0; //Tipo de cristal externo baja frecuencia (32.768KHz)
ICSC2_BDIV0=0; //Divido fuente de reloj externa en 0 por tener un cristal de 32.768KHz
ICSC2_BDIV1=0;
//---------------------------------------------------------------------------------------
ICSSC_FTRIM=0; //Ajuste fino para obtener la FBus deseado
ICSSC_OSCINIT=0; //
ICSSC_CLKST0=0;
ICSSC_CLKST1=0; //Señal para FBus proviene del FLL
ICSSC_IREFST=0; //Indico que la fuente de reloj de referencia es externa
ICSSC_DMX32=0; //Ajuste manual de frecuencia FBus
ICSSC_DRST_DRS0=0; //Selecciono rango de operacion del FLL (High range)
ICSSC_DRST_DRS1=1;
while (ICSC1_CLKS != ICSSC_CLKST) {} // Espera a que se ajuste el FBus al deseado.
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
//Configuramos las resistencias PUll-UP de los puertos en donde estan colocados los pulsadores
//Habilito solo las PULLL-UP donde estan los pulsadores
PTAPE = 0b00001100;
PTBPE = 0b00000000;
PTCPE = 0b00000000;
PTDPE = 0b00001100;
PTEPE = 0b00000000;
PTFPE = 0b00000000;
PTGPE = 0b00000000;
PTHPE = 0b00000000;
PTJPE = 0b00000000;
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
//Configuro el Conversor AD del Microcontrolador.
//Este micro trae un AD seleccionable 8 - 10 - 12bits
//el metodo que usa es aproximaciones sucesivas
//24 Canales de conversion
//El resultado de la conversion puede ser seleccionado si 8, 10 o 12 bits
//En el entrenador se tienen varias señales analogas con las que se hace necesario implementar el AD
//Potenciometro ANA0 - CH0 - PTA0
//Acelerometro
// Xout ANA1 - CH1 - PTA1
// Yout ANA1 - CH1 - PTA6
// Zout ANA1 - CH1 - PTA1
ADCCFG_ADICLK0=0; //Selecciona fuente de reloj para ADC del Bus interno del MCU
ADCCFG_ADICLK1=0;
ADCCFG_MODE0=1; //Selecciono conversion de 12 bits
ADCCFG_MODE1=0;
ADCCFG_ADLSMP=0; //Selecciono tipo de conversion rapida
ADCCFG_ADIV0=0; //Divisor de señal de reloj /4
ADCCFG_ADIV1=1; //velocida de operacion es de 6.25MHz
ADCCFG_ADLPC=0; //Alta velocida de trabajo del ADC
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
// Configura puerto RS232
SCI1BD = Config_baud; // Configura BaudRate del puerto SCI del MCUEste microcontrolador es de 32 -bit pertenece a una nueva familia de Freescale denominada Flexis. Leyendo un poco, logro entender que ese nombre se debe a que hay total compatibilidad de pines entre aquellos flexis de 8 bits, de 16 y de 32 bits. Esto permite tener un diseño básico con uno de 8 bts y a medida que la complejita y cantidad de procesos aumentan se puede ir cambiando de referencia hasta llegar a este que tengo en mis manos. También hay compatibilidad con el software desarrollado tanto para uno de 8 bits o para unos de 32 bit, permitiendo la migración de aplicaciones de 8 bits a 32 bits o viceversa, posibilitando la reutilización completa del código desarrolladoSi esta apuesta de FreeScale, tambien MicroChip lo hace con los PIC32, y creo que tambien ATMEL con el AVR32, la idea es tener un core de 32 bits pero que los perifericos sean compatibles con los de 8 bits. La compatibilidad se mantiene siempre y cuando utilices C como lenguaje nativo y en especial ANSI C ya que los core son totalemnte diferentes.
Ya después de un tiempo si podemos llevar a este microcontrolador al máximo rendimiento. Tengo entendido que con un micro de 32 bits se puede implementar hasta LINUX. Dios quiere poder estar montando en un futuro no tan lejano otro TutoFlash sobre como montar Linux a este Micro.
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
void SendChar(char s_char);
char Mensaje[12]={
'\r','\n','H','O','L','A',' ','M','U','N','D','O'
};
int i;
void Configura_RS232(void){
// Configura puerto RS232
//El valor a colocar en esta posicion corresponde a:
// BUSCLK
// -----------------
// [SBR12:SBR0]x16
//BusCLK = 24000000 = 24MHz
//[SBR12:SBR0]=115000 y es el baud que se desea
SCI1BD = 13;// Configura BaudRate del puerto SCI del
}
/////////////////////////////////////////////////////////////////////////////////////////
//Funcion que envia un Char por el puerto RS232
// --------------------------------------------------------------------------------------
// Manda un dato o caracter por el puerto RS232
/////////////////////////////////////////////////////////////////////////////////////////
void PutChar(char s_char) {
//Habilita y configura modulo TX
SCI1C2_SBK=0; //Modulo SCI1 TX en modo transmision normal
SCI1C2_RWU=0; //Modulo SCI1 RX en modo recepcion normal
SCI1C2_RE=0; //Modulo RX Deshabilitado
SCI1C2_TE=1; //Modulo TX Habilitado
SCI1C2_ILIE=0; //Deshabilita interrupcion por hardware en linea IDLE
SCI1C2_RIE=0; //Deshabilita interrupcion por recepcion de datos RS232
SCI1C2_TCIE=0; //Deshabilita interrupcion por fin de transmison de dato RS232
SCI1C2_TIE=0; //Deshabilita interrupcion por activacion de vandera TDRE (Buffer de salida esta vacio)
while(!SCI1S1_TDRE){ } //Espera a que el buffer de transmision este vacio
//Si esta lleno significa que no se ha terminado de transmitir
//El ultimo dato
SCI1D = (byte) s_char; //Monta dato a transmitir en buffer de salida
}
/////////////////////////////////////////////////////////////////////////////////////////
void main(void) {
DisableInterrupts; /* enable interrupts */
/* include your code here */
// --------------------------------------------------------------------------------------
//PeriphInit(); Configura registro System Option
SOPT1=0b00000000; //Arranco con todos los bits en cero
SOPT1_RSTPE=1 ; //Habilita pin de RESET
SOPT1_BKGDPE=1 ; //Habilita pinA4 para usarlo como pin debugger
SOPT1_RSTOPE=0 ; //Deshabilito el pin RST
SOPT1_WAITE=0 ; //Deshabilita el modo espera del Microcontrolador
SOPT1_STOPE=1 ; //habilita el modo STOP (Bajo consumo)
SOPT1_COPT=0 ; //Configura modo de trabajo del COP (No me afecta si no uso el COP)
SOPT1_COPE=0 ; //Deshabilito el COP o perro guardian
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
//ICS_FEI(); //Configura frecuencia interna de trabajo (FBus) a 25MHz
//Para lograrlo, se manipula el registro ICSTRM quien es un ajuste fino para
//el oscilador interno del Microccontrolador. El valor a colocar en este registro ya
//esta definido por el fabricante y se encuentra en una posicion especifica de la memoria FLASH
//esta posicion es llamada NVICSTRM y en esa posicion ppueden haber valores entre 0x00 y 0x80
//Si al leerlo encontramos 0xFF quiere decir que estaen blanco y se perdio esa informacion
//por lo que se hace necesario colocarle un valor por defecto 0XAD
if (NVICSTRM != 0xFF)
ICSTRM = NVICSTRM; // Saca el valor de la memoria FLASH
else
ICSTRM = 0xAD; //Coloca el numero por defecto
//---------------------------------------------------------------------------------------
ICSC1_IREFSTEN=0; //Fuente de reloj interna es deshabilitada despues de un STOP
ICSC1_IRCLKEN=0; //Deshabilita fuente de reloj interna
ICSC1_IREFS=1; //Selecciono fuente de sañal de reloj interna
ICSC1_RDIV0=0; //Divisor de la señal de reloj Externa = 1
ICSC1_RDIV1=0; //Divide fuente se ñal de reloj interna en 1 no afecta por usar un
ICSC1_RDIV2=0; //
ICSC1_CLKS0=0; //Seleccionamos que la fuente de reloj para usar por el Core del MCU
ICSC1_CLKS1=0; //sea la salida del FLL
//---------------------------------------------------------------------------------------
ICSC2_EREFSTEN=0; //Fuente de reloj externa es deshabilitada despues de un STOP
ICSC2_ERCLKEN=1; //Habilita fuente de reloj externa
ICSC2_EREFS=1; //Tipo de fuente de reloj Cristal
ICSC2_LP=0; //FLL es habilitado en modo bypass
ICSC2_HGO=0; //Fuente de reol externa de bajo consumo
ICSC2_RANGE=0; //Tipo de cristal externo baja frecuencia (32.768KHz)
ICSC2_BDIV0=0; //Divido fuente de reloj externa en 0 por tener un cristal de 32.768KHz
ICSC2_BDIV1=0;
//---------------------------------------------------------------------------------------
ICSSC_FTRIM=0; //Ajuste fino para obtener la FBus deseado
ICSSC_OSCINIT=0; //
ICSSC_CLKST0=0;
ICSSC_CLKST1=0; //Señal para FBus proviene del FLL
ICSSC_IREFST=0; //Indico que la fuente de reloj de referencia es externa
ICSSC_DMX32=0; //Ajuste manual de frecuencia FBus
ICSSC_DRST_DRS0=0; //Selecciono rango de operacion del FLL (High range)
ICSSC_DRST_DRS1=1;
while (ICSC1_CLKS != ICSSC_CLKST) {} // Espera a que se ajuste el FBus al deseado.
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
Configura_RS232();
for(i=0;i<12;i++){
PutChar(Mensaje[i]);
}
for(;;) {
__RESET_WATCHDOG();
}
}
Con Microchip, el PLL se activa con los fusibles de programación y solo se configura cuando se "Quema" el PIC. Si se quiere bajar a bajo consumo toca usar Sleep, pero así el micro deja de realizar operaciones y solo atiende interrupciones.Sin ánimo de llevarte la contraria, sólo me gustaría matizar este tema. Con los 33F puedes manejar el oscilador a tu antojo en tiempo de ejecución, moviéndote en toda la gama con una flexibilidad extraordinaria, y sin siquiera necesitar cristal externo porque lo puedes gestionar con el oscilador interno.
A los QE128 me parece imposible meterle un Linux, ya que no hay posibilidad de expandirle la RAM o la FLASH, y con lo que tiene incorporada no alcanza, para esta la familia V2 en adelante que si se pude hacer tranquilamente.