Bueno..Este es el primer avance completo con este entrenador. Corresponde a Configuracion y evio de una cadena de texto por RS232!!!
#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();
}
}
Bueno, espero sirva como guía para cuando ingresen con estos micros, la verdad prometen mucho. Entre algunas caracteristicas buenas están:
Precios realmente bajos. (Por fin en Freescale se dieron cuenta que el mayor mercado son los estudiantes).
La programación In-Circuit es tan tan fácil y extremadamente rápida y completa.
El puerto de programación se llama BDM. Este puerto solo usa VCC, GND, RESET, BDM.
Por un solo pin del MCU llamado BDM y dedicado única y específicamente a la programación y depuración in-circuit, se logra ver todos los registros internos del MCu y el resultado de alguna conversión AD, o datos que llegan por RS232, y en general todos los registros. A comparación de Microchip que para ir paso a paso es muy lento. y usa unos pines del MCu B6 y B7, que no pueden ser usados para mas nada durante la depuración In-Circuit.
Son muy muy estables ante ruido y el consumo es extremadamente bajo.
La flexibilidad de trabajo del oscilador es tremenda. Siempre se coloca un cristal de 32.768KHz. Luego con un PLL interno, configurable y sintonizable, puedes lograr altas frecuencias, hasta 24MHz en el bus interno.
Es como si en Microchip se trabajara a 48MHZ, que es el caso del 18F4550 que con uno de 4MHz logras 48Mhz con un PLL interno.
Entonces si ambos logran el mismo bus interno donde esta la diferencia??.
La diferencia esta en que con freescale desde software en cualquier momento puedes pasar de 24MHz de bus interno a 32.768KHz...Con eso el consumo baja al piso y el micro sigue trabajando normalmente pero a muy muy bajo consumo.
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.
Toda esa charla, no es mas que algunas razones por las que me parece muy muy atractivo estos micros Freescale y especificamente los de la familia FLEXIS. No esta de mas darle alguna pasada a otras marcas.
SALUDOS!!