TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: Geo en 03 de Enero de 2007, 16:03:53

Título: Ejercicios en C con un QY4
Publicado por: Geo en 03 de Enero de 2007, 16:03:53
Actualización 21-jul-08

Iniciación con los MC68H908QY4 (http://www.todopic.com.ar/foros/index.php?topic=22550.0) por scientist

Los enlaces a los ejercicios:
-------------------------------------------------------

Este semestre me tuve que familiarizar con microcontroladores de la familia Nitron de Freescale, en concreto estuve utilizando el 68HC08QY4. Y aprovechando pondré por aquí los programas/circuitos que tengo hasta ahora. No son muy complicados pero espero le sean de utilidad a alguien :).

Los programas están escritos en C, el entorno es CodeWarrior CW08 V2.1. Cuenta con IDE, compilador y debugger (no lo utilicé hasta ahora). De la página de Freescale (http://www.freescale.com) se puede descargar la versión 5.1 (CW for HC08 V5.1), ya lo descargué y lo probé bajando un programa sin problemas, aunque no lo utilicé en los ejercicios.

Bien, empezamos en el encendido de algunas secuencias con leds.

El circuito
(http://img486.imageshack.us/img486/8920/01secuenciaswa5.png)
Las entradas son botones (push-button) normalmente abiertos (en el dibujo está un DIP switch porque apenas uso Eagle y no vi los botones :P).

El programa
Código: [Seleccionar]
#include <hidef.h> //Contiene instrucciones en ensamblador.
#include <MC68HC908QY4.h> //Se definen los registros de I/O y sus direcciones.
#include <startup.h>

const unsigned char leds[] = {
0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
};

void inicializacion( void );
void retardo( unsigned int );

void secParpadeo( void );
void secIzquierda( void );
void secDerecha( void );
void secEncuentro( void );
void secTrenecito( void );

void main( void ) {
inicializacion();

while( 1 ) {
if ( PTA_PTA0 == 0 )
secParpadeo();
else if ( PTA_PTA1 == 0 )
secDerecha();
else if ( PTA_PTA2 == 0 )
secIzquierda();
else if ( PTA_PTA3 == 0 )
secEncuentro();
else if ( PTA_PTA4 == 0 )
secTrenecito();
else
PTB = leds[ 0 ]; // PTB = 0x00;
}

}

void inicializacion() {
CONFIG1 = 0x09; // Deshabilita el perro guardián
OSCTRIM = 0x80; // Registro de ajuste de oscilador interno
PTAPUE  = 0x3F; // Resistencias de pull-up
DDRA    = 0x00; // Puerto A, entradas.
DDRB    = 0xFF; // Puerto B, salidas.
}

void retardo( unsigned int ciclos ) {
unsigned int cuenta;

for ( cuenta = 0; cuenta < ciclos; cuenta++ );
}

void secParpadeo() {
PTB = ~PTB;
retardo( 20000 );
}

void secDerecha() {
int cuenta;
for ( cuenta = 0; cuenta < 9; cuenta++ ) {
PTB = leds[ cuenta ];
retardo( 20000 );
}
}

void secIzquierda() {
int cuenta;
for ( cuenta = 8; cuenta >= 0; cuenta-- ) {
PTB = leds[ cuenta ];
retardo( 20000 );
}
}

void secEncuentro() {
int cuentaA, cuentaB;

// Leds apagados.
PTB = leds[ 0 ];
retardo( 30000 );
for ( cuentaA = 1, cuentaB = 8; cuentaA < 9, cuentaB > 0; cuentaA++, cuentaB-- ) {
PTB = leds[ cuentaA ] | leds[ cuentaB ];
retardo( 30000 );
}
}

void secTrenecito() {
int cuenta;

for ( cuenta = 0; cuenta < 9; cuenta++ ) {
PTB = PTB | leds[ cuenta ];
retardo( 30000 );
}
for ( cuenta = 0; cuenta < 9; cuenta++ ) {
PTB = PTB & ( ~leds[ cuenta ] );
retardo( 30000 );
}

}

Como nota, cada secuencia puede programarse también utilizando una tabla de valores, por ejemplo, la última (trenecito) podría realizarse así:
Código: [Seleccionar]
const unsigned char secuencia[] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff, 0xfe, 0xfc, 0xf8, 0xe0, 0xc0, 0x80 };

void trenecito( void ) {
  int cuenta;
  for ( cuenta = 0; cuenta < 16; cuenta++ ) {
    PTB = secuencia[ cuenta ];
    retardo( 20000 );
  }
}
En este caso, esta segunda forma de realizar la secuencia permite hacer más pequeño el código resultante, lo que podría ser importante en caso de que necesitáramos optimizar espacio en el microcontrolador.

Saludos,
JJ (Geo).
Título: Re: Ejercicios en C con un QY4
Publicado por: Geo en 04 de Enero de 2007, 11:47:21
Contador 0-999

El circuito
(http://img223.imageshack.us/img223/7302/02contadorsb2.png)

El programa
Código: [Seleccionar]
#include <hidef.h> //Contiene instrucciones en ensamblador.
#include <MC68HC908QY4.h> //Se definen los registros de I/O y sus direcciones.
#include <startup.h>

int unidades, decenas, centenas;
int cuenta, aux;

const unsigned char numeros[ 10 ]=
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
//const unsigned char numeros[ 10 ] = { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b };

void inicializacion( void );
void delay( int );

void main(void) {
int retardo_displays;

inicializacion();

while( 1 ) {
cuenta++;
if ( cuenta > 999 ) {
unidades = decenas = centenas = 0;
cuenta = 0;
}
centenas = cuenta / 100;
aux = cuenta % 100;
decenas = aux / 10;
aux = aux % 10;
unidades = aux;

retardo_displays = 0;

while( retardo_displays < 10 ) {

// Activa display de unidades
delay( 1000 );
PTA = ~0x01;
PTB = numeros[ unidades ];
// Decenas
delay( 1000 );
PTA = ~0x02;
PTB = numeros[ decenas ];
// Centenas
delay( 1000 );
PTA = ~0x08;
PTB = numeros[ centenas ];

retardo_displays++;
}
}
}

void inicializacion() {
CONFIG1=0x09; //Deshabilita el perro guardián
OSCTRIM = 0x80; //Registro de ajuste de oscilador interno

DDRA = 0xFF; // Puerto A salidas
DDRB = 0xFF; // Puerto B salidas

unidades = decenas = centenas = 0;
}

void delay( int ciclos ) {
int i;
for ( i = 0; i < ciclos; i++ );
}
Título: Re: Ejercicios en C con un QY4
Publicado por: Geo en 29 de Enero de 2007, 12:31:35
Sumador/restador 4 bits
El circuito suma o resta (según una entrada de selección) dos números de 4 bits y muestra el resultado en dos displays, para ello se utilizan dos microcontroladores, el primero lee los números, realiza la operación y da el resultado de 5 bits como salida. El segundo microcontrolador lee un dato de 5 bits y lo decodifica a los displays.

El circuito
(Colocado como adjunto).

El programa

Sumador
Código: [Seleccionar]
/**************************************************
 * José Jorge Enríquez Rodríguez
 **************************************************
 * Sumador / restador.
 * Suma o resta un par de datos de 4 bits.
 * El resultado de la operación es de 5 bits.
 **************************************************
 * Entradas
 * --------
 * PTB7 a PTB4 - Dato A, MSB a LSB.
 * PTB3 a PTB0 - Dato B, MSB a LSB.
 * PTA2 - Cin, selector suma/resta.
 *
 * Salidas
 * -------
 * PTA5, PTA4, PTA3, PTA1, PTA0 - Resultado.
 **************************************************
 */

#include <MC68HC908QY4.h> // Se definen los registros de I/O y sus direcciones.
#include <hidef.h> // Contiene instrucciones en ensamblador.
#include <startup.h>

/***************************
 * Declaración de funciones
 ***************************/
void inicializacion( void );
void delay( int );

/* cin : Selector 0 - suma, 1 - resta.
 * dato_a, dato_b: números de 4 bits a sumar/restar
 * resultado:  resultado de la operación.
 */
int cin, dato_a, dato_b, resultado;

/**********************
 * Programa principal
 **********************/
void main ( void ){

inicializacion();

while (1){
// El dato A es la parte alta (4 bits) del puerto B.
dato_a = ( PTB  >> 4 );
// El dato B es la parte baja (4 bits) del puerto B.
dato_b = ( PTB & 0x0F );

// Selector suma/resta.
cin = PTA_PTA2;

// Si el selector es 0, suma; si no, resta.
if ( cin == 0 )
resultado = dato_a + dato_b;
else
resultado = dato_a - dato_b;

// Si el resultado es negativo, lo complementa a 2
// (Esto da un resultado correcto, aunque el signo no se indica
// y debe tomarse en cuenta al realizar la operación).
if ( resultado < 0 ) {
resultado = ( ~resultado ) + 1;
}

// El resultado (5 bits), se muestra en los pines
// 5, 4, 3, 1 y 0 del puerto A.
PTA_PTA5 = ( resultado & 0x10 ) >> 4;
PTA_PTA4 = ( resultado & 0x08 ) >> 3;
PTA_PTA3 = ( resultado & 0x04 ) >> 2;
PTA_PTA1 = ( resultado & 0x02 ) >> 1;
PTA_PTA0 = ( resultado & 0x01 );

delay( 10000 );
}
}

/* Configura el microcontrolador, puertos de entrada y salida.
 */
void inicializacion() {
CONFIG1 = 0x09; // Deshabilita el perro guardián
OSCTRIM = 0x80; // Registro de ajuste de oscilador interno
PTBPUE  = 0xFF; // Resistencias de pull-up para el puerto B (todos los pines).
PTAPUE  = 0x04; // Resistencia de pull-up para el puerto A (solamente el pin PTA2).
DDRA    = 0x3B; // Puerto A salidas (excepto el pin PTA2).
DDRB    = 0x00; // Puerto B entradas
}

/* Retardo de n ciclos de reloj.
 */
void delay (int ciclos){
int cuenta;
for ( cuenta = 0; cuenta < ciclos; cuenta++ );
}


Decodificador
Código: [Seleccionar]
/**************************************************
 * José Jorge Enríquez Rodríguez
 **************************************************
 * Decodificador 5 bits a dos displays de 7 segmentos.
 * Recibe un dato binario de 5 bits y lo muestra en decimal
 * en un par de displays de 7 segmentos (se usaron de cátodo común).
 **************************************************
 * Entradas
 * --------
 * PTA0 a PTA4 - Dato de 5 bits.
 *
 * Salidas
 * -------
 * PTA0 a PTA6 - Segmentos de los displays.
 * PTB7 - Cátodo display decenas.
 * PTA5 - Cátodo display unidades.
 **************************************************
 */
 
#include <MC68HC908QY4.h> // Se definen los registros de I/O y sus direcciones.
#include <hidef.h> // Contiene instrucciones en ensamblador.
#include <startup.h>

// Patrones numéricos a mandar al display de 7 segmentos,
// dígitos del 0 al 9.
const unsigned char numeros[ 10 ] = {
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};

/****************************
 * Declaración de funciones.
 ****************************/
void inicializacion( void );
void delay( int );

// Dato binario a mostrar.
int dato;

/***********************
 * Programa principal.
 ***********************/
void main( void ) {

// Auxiliares para separar el dato en dos dígitos:
// unidades y decenas.
int unidades, decenas;

inicializacion();

while( 1 ) {

// Leemos el dato en el puerto A (5 bits).
dato = PTA & 0x1f;

// Separa el número en dos dígitos.
decenas = dato / 10;
unidades = dato % 10;

// Habilita el primer display y envía el número
// correspondiente a las unidades.
PTB_PTB7 = 0;
PTA_PTA5 = 1;
PTB = numeros[ unidades ];
delay( 1000 );

// Habilita el segundo display en envía el número
// correspondiente a las decenas.
PTB_PTB7 = 1;
PTA_PTA5 = 0;
// Nota: se emplea una operación | 0x80 ya que el pin 7
// del puerto B también se utiliza para deshabilitar el
// display de unidades, por lo que se debe asegurar que
// esté en 1.
PTB = numeros[ decenas ] | 0x80;
delay( 1000 );
}
}

/* Configura el microcontrolador, puertos de entrada y salida.
 */
void inicializacion() {
CONFIG1 = 0x09; // Deshabilita el perro guardián
OSCTRIM = 0x80; // Registro de ajuste de oscilador interno
DDRA    = 0x20; // Pin 5 - salida, Pines 4 a 0 entradas
DDRB    = 0xff; // Puerto B salidas
}

/* Retardo de n ciclos de reloj.
 */
void delay (int ciclos){
int cuenta;
for (cuenta=0; cuenta < ciclos; cuenta++);
}

Por cierto, ¿por qué quitaron GeSHi de las opciones para agregar temas?
Título: Re: Ejercicios en C con un QY4
Publicado por: dhmejia en 29 de Enero de 2007, 15:08:32
Excelente aporte GEO, desde hace dias tengo ganas de empezar a trabajar con los micros freescale, creo que esto es un buen punto de partida.

saludos.
Título: Re: Ejercicios en C con un QY4
Publicado por: manuelroin24 en 30 de Enero de 2007, 18:22:18

Bueno desde ya pedire esos micros y dime amigo que herramientas utilizas para esto ???? y si tienes algun diseño de tu grabador seria interesante a ver q nos sale jejejejee
Título: Re: Ejercicios en C con un QY4
Publicado por: psykhon en 30 de Enero de 2007, 19:53:06
muy buen aporte y como la mayoria creo que hay interes en esto micros pero creo que necesitamos un programador abierto
Título: Re: Ejercicios en C con un QY4
Publicado por: Geo en 31 de Enero de 2007, 21:59:23
Estoy utilizando una tarjeta similar a esta:
(http://www.bunkeraudio.com/docs/M68EVB908Q.jpg)
Por allí tengo un diagrama del grabador, lamentablemente no he tenido oportunidad de probarlo y por eso es que no lo pongo. Veré qué puedo hacer :).

Saludos,
JJ (Geo).
Título: Re: Ejercicios en C con un QY4
Publicado por: manuelroin24 en 01 de Febrero de 2007, 13:16:09
Dime q software utilizas para tu creacion, compilacion y simulacion de estos micros

Tengo bastante interes de aprenderlos pq dan muestras gratis aqui en PERU y seria interesante
Título: Re: Ejercicios en C con un QY4
Publicado por: Geo en 01 de Febrero de 2007, 18:29:12
Lo mencioné al principio, en el primer mensaje :P. El sistema cuenta con debugger, no lo he usado a fondo. Lamentablemente, no conozco un simulador (vi algunos en internet, pero hasta ahora no me ha interesado adquirir alguno :P).

Saludos,
JJ (Geo).
Título: Re: Ejercicios en C con un QY4
Publicado por: manuelroin24 en 12 de Febrero de 2007, 12:10:31
estaba siguiendo el hilo y ya va parado muchos dias ....... vamos amigo los ejemplitos estaba buenos
Título: Re: Ejercicios en C con un QY4
Publicado por: Geo en 13 de Febrero de 2007, 20:07:23
Je, perdón por atrasarme, pero ya saben que con el trabajo y la escuela no queda tiempo de nada ;).

Ahora vamos con un multiplicador de 4 bits, tres diferentes circuitos, empezamos con este:

Multiplicador 4 bits
De manera similar al sumador, utilizamos dos microcontroladores. En el primero realizamos la multiplicación y el resultado lo separamos en dos partes de 4 bits (el multiplicar dos números de 4 bits nos resulta en uno de 8 bits), las cuales se pasan al segundo microcontrolador mediante 5 líneas, 4 de datos y 1 que indica qué parte estamos pasando (parte alta o baja del resultado).

El circuito
(Adjunto)

El programa

Multiplicador
Código: C
  1. #include <MC68HC908QY4.h>       // Incluye declaraciones de periféricos.
  2. #include <startup.h>    // Inicializa pila, variables, etc.
  3. #include <hidef.h>              // Contiene instrucciones en ensamblador.
  4.  
  5. const unsigned char numeros[ 10 ]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };
  6.  
  7. void inicializacion( void );
  8. void delay( unsigned int );
  9.  
  10. int dato_a, dato_b;
  11. int prev_a, prev_b;
  12. int multiplicacion;
  13.  
  14. void main( void ) {
  15.         inicializacion();
  16.        
  17.         dato_a = dato_b = 0;
  18.         prev_a = prev_b = 0;
  19.        
  20.         while ( 1 ) {
  21.                 dato_a = PTA & 0x0F;
  22.                 dato_b = PTB & 0x0F;
  23.  
  24.        
  25.                 multiplicacion = dato_a * dato_b;
  26.                        
  27.                 // Envía la parte baja.
  28.                 PTA_PTA4 = 0;
  29.                 PTB_PTB7 = ( multiplicacion & 0x08 ) >> 3;
  30.                 PTB_PTB6 = ( multiplicacion & 0x04 ) >> 2;
  31.                 PTB_PTB5 = ( multiplicacion & 0x02 ) >> 1;
  32.                 PTB_PTB4 = ( multiplicacion & 0x01 );
  33.                 delay( 65000 );
  34.                        
  35.                 // Envía la parte alta.
  36.                 PTA_PTA4 = 1;
  37.                 PTB_PTB7 = ( multiplicacion & 0x80 ) >> 7;
  38.                 PTB_PTB6 = ( multiplicacion & 0x40 ) >> 6;
  39.                 PTB_PTB5 = ( multiplicacion & 0x20 ) >> 5;
  40.                 PTB_PTB4 = ( multiplicacion & 0x10 ) >> 4;
  41.                 delay( 65000 );
  42.                
  43.  
  44.                 /*
  45.                         PTA_PTA4 = 0;
  46.                         PTB_PTB7 = ( dato_a & 0x08 ) >> 3;
  47.                         PTB_PTB6 = ( dato_a & 0x04 ) >> 2;
  48.                         PTB_PTB5 = ( dato_a & 0x02 ) >> 1;
  49.                         PTB_PTB4 = ( dato_a & 0x01 );
  50.                         delay( 65000 );
  51.                        
  52.                        
  53.                         PTA_PTA4 = 1;
  54.                         PTB_PTB7 = ( dato_b & 0x08 ) >> 3;
  55.                         PTB_PTB6 = ( dato_b & 0x04 ) >> 2;
  56.                         PTB_PTB5 = ( dato_b & 0x02 ) >> 1;
  57.                         PTB_PTB4 = ( dato_b & 0x01 );
  58.                         delay( 65000 );
  59.                 */
  60.                                        
  61.         }
  62.        
  63. }
  64.  
  65. void inicializacion( void ) {
  66.         CONFIG1 = 0x09;         // Deshabilita el perro guardián.
  67.         OSCTRIM = 0x80;         // Oscilador interno.
  68.         DDRB = 0xf0;    // Puerto B, parte alta salidas, parte baja entradas.
  69.         DDRA = 0xf0;    // Puerto A, parte baja entradas, alta salidas.
  70.         PTBPUE = 0x0f;          // Habilita resistencias pull-up para el puerto B
  71.         PTAPUE = 0x0f;
  72. }
  73.  
  74. void delay( unsigned int n ) {
  75.         unsigned int i;
  76.         for ( i = 0; i < n; i++ );
  77. }

Decodificador
Código: C
  1. #include <MC68HC908QY4.h>       // Incluye declaraciones de periféricos.
  2. #include <startup.h>    // Inicializa pila, variables, etc.
  3. #include <hidef.h>              // Contiene instrucciones en ensamblador.
  4.  
  5. // const unsigned char numeros[ 10 ]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };
  6. const unsigned char numeros[ 10 ]={ 0x7d,0x30,0x6e,0x7a,0x33,0x5b,0x5f,0x70,0x7f,0x7b };
  7.  
  8. void inicializacion( void );
  9. void delay( unsigned int );
  10.  
  11. int numero;
  12. int parte_baja, parte_alta;
  13. int unidades, decenas, centenas;
  14. int aux;
  15. int retardo_displays;
  16.  
  17. void main( void ) {
  18.         inicializacion();
  19.        
  20.         while( 1 ) {
  21.                 // Si PTA4 es 0, lee parte baja
  22.                 if ( PTA_PTA4 == 0 ) {
  23.                         parte_baja = PTA & 0x0f;
  24.                 }
  25.                 // Si PTA4 es 1, lee parte alta
  26.                 else {
  27.                         parte_alta = PTA & 0x0f;
  28.                 }
  29.        
  30.                 numero = ( ( parte_alta & 0x0f ) << 4 ) | ( parte_baja );
  31.                 //numero = parte_baja;
  32.                
  33.                 centenas = numero / 100;
  34.                 aux = numero % 100;
  35.                 decenas = aux / 10;
  36.                 unidades = aux % 10;
  37.                
  38.                 retardo_displays = 0;
  39.                 while ( retardo_displays < 20 ) {
  40.  
  41.                         // Habilita primer display
  42.                         PTA_PTA5 = 0;
  43.                         PTB_PTB7 = 1;
  44.                         PTB = numeros[ centenas ] | 0x80;
  45.                         delay( 1000 );
  46.                        
  47.                         // Segundo display
  48.                         PTA_PTA5 = 1;
  49.                         PTB_PTB7 = 0;
  50.                         PTB = numeros[ decenas ];
  51.                         delay( 1000 );
  52.                        
  53.                         // Tercer display
  54.                         PTA_PTA5 = 1;
  55.                         PTB_PTB7 = 1;
  56.                         PTB = numeros[ unidades ] | 0x80;
  57.                         delay( 1000 );
  58.                        
  59.                         retardo_displays++;
  60.                 }
  61.         }
  62. }
  63.  
  64. void inicializacion( void ) {
  65.         CONFIG1 = 0x09;         // Deshabilita el perro guardián.
  66.         OSCTRIM = 0x80;         // Oscilador interno.
  67.         DDRA = 0x20;            // PTA5 - salida, el resto entradas.
  68.         DDRB = 0xFF;            // Puerto B - salidas
  69. }
  70.  
  71. void delay( unsigned int n ) {
  72.         unsigned int i;
  73.         for ( i = 0; i < n; i++ );
  74. }

Luego pongo otros dos circuitos similares, en el siguiente utilizaremos también dos microcontroladores pero el resultado lo pasaremos de manera serial (bastante primitiva :P), y finalmente en el tercer circuito haremos uso de un solo microcontrolador, el cual leerá los datos a multiplicar de manera alternada con un selector :).

Por otro lado, trataré de probar el circuito que tengo de un grabador para verificar que funcione, en cuyo caso lo colocaré por aquí :). Nos vemos.
Título: Re: Ejercicios en C con un QY4
Publicado por: psykhon en 14 de Febrero de 2007, 23:46:17
la verdad que lo que hace falta es un buen programador y un buen compilador gratuito para qu estos micros despeguen
Título: Re: Ejercicios en C con un QY4
Publicado por: Vigo en 15 de Febrero de 2007, 09:55:35
la verdad que lo que hace falta es un buen programador y un buen compilador gratuito para qu estos micros despeguen

Hola Comunidad

Compilador EXCELENTE el CODE WARRIOR la versión especial que se baja de freescale deja programar libre assembler, 16K de Flash en C y 4K en C++.  Compilador en assembler es sin duda el WinIde.

Como hardware de programación el HC908GS.zip se baja de

http://www.firtec.com.ar/downloader/index.php?subcat=20&ENGINEsessID=75ed3f9db9c18a24ad037487f8ddcc74

Lo que mejor me a parecido y se acerca mucho a un programador profesional es el que desarrollaron ahi mismo se solicita el diagrama de manera libre a  informes@firtec.com.ar y te pasan el link de descarga que en realidad es para sus alumnos pero si lo pedis te lo dan sin problemas.

    Saludos
          Vigo
Título: Re: Ejercicios en C con un QY4
Publicado por: psykhon en 15 de Febrero de 2007, 12:19:14
muchas gracias vigo, consistente y directo al grano, lo que faltaba
Título: Re: Ejercicios en C con un QY4
Publicado por: jdhios en 11 de Octubre de 2007, 18:46:38
Hola Geo, muy buena tu programación. Enseño programación C y programao ya hace unos cuantos añitos (32) y pocas veces he visto personas tan prolijas trabajando en C. Muy bueno. Sobre programador en el sitio esta el circuito pueden usarlo tranquilos, muchos ya los armaron y le funciona muy bien aunque se le pueden todavia hacer mejoras. Cualquier cosa que necesiten pueden preguntar. Pueden bajar ejemplos y tutoriales de www.bairesrobotics.com.ar

Saludos
Jorge
Título: Re: Ejercicios en C con un QY4
Publicado por: RICHI777 en 11 de Octubre de 2007, 19:23:34
Hola a todos, muy buenos ejemplos Geo ! Excelentemente escrito ! un buen programa en "C" con solo mirarlo tiene que entenderse que hace y solo unos pocos comentarios !!!
Lo único y muy importante para corregir es el tipo de datos, en algun lugar hace uso de variables tipo "int", hay que recordar que esta arquitectura es de 8 bits, y simular un entero de 16 bits con signo al pobre micrito le cuesta un huevo. Podes verlo vos mismo con un ejemplo tirando un dissambler en operaciones que utilizan enteros con signo y sin signo, vos mismo notaras las diferencias.
Otra cosa, que es muy utilzada tanto en lo visual y lo conceptual es utilizar typedefs, como si fuera Pascal. Ejemplo:
typedef unsigned char byte;
typedef unsigned short int word;
typedef unsigned long dword;

Hay mas...los programas asi quedan mas claros !
Saludos !


Título: Re: Ejercicios en C con un QY4
Publicado por: RICHI777 en 19 de Octubre de 2007, 17:26:53
Bueno lo que dije en el post anterior si bien es una buena practica de codificacion, en el caso del HC(S)08 y FreeScale poco importa, ya que el micro tiene un par de intrucciones para el manejo de un entero de 16 bits signeado ( H:X ) y el compilador se las arregla para dejar el codigo lo mas optimo posibe, en mi vida vi muchos compiladores pero este se zarpa de lo bueno que es.
Salu2!
Título: Re: Ejercicios en C con un QY4
Publicado por: Micro23 en 30 de Enero de 2008, 20:00:22
Te Felicito por tus aportes Geo!  Encontre algunos codigos de ejemplo para el CodeWarrior en este link (http://www.electrocomponentes.com/Ingenieria/Microcontroladores/Herramientas%20de%20Desarrollo/Freescale/Ejemplos%20CodeWarrior/)
Si suben algunas carpetas encontraran info interesante.
Saludos.
Título: Re: Ejercicios en C con un QY4
Publicado por: LABmouse en 22 de Mayo de 2008, 14:26:01
Geo muchisimas gracias por los aportes, ahora que estoy entrando de elleno en el mundo de los DSPs y MCUs freescale me estan sirviendo muchisimo tus programas..

SALUDOS!!
Título: Re: Ejercicios en C con un QY4
Publicado por: scientist en 18 de Julio de 2008, 00:44:38
hola geo, muy buenos aportes, por circunstancias del destino ha caido en mis manos una tarjeta igualita a la tuya, en el disco de instalacion, me vino la version del codewarrior v 3.1, ahora he estado jugando con el codewarrior, pero no logra dar con las opciones antes de entrar a al programa en c, digo, no seria mucho pedir que hicieras algo asi como una iniciacion, no importa con cual version, pero si para poder empezar a trabajar, estoy algo atascado aqui, nunca he trabajado con la familia de 8 bits de freescale, y me estoy dando de topes, gracias
Título: Re: Ejercicios en C con un QY4
Publicado por: Geo en 20 de Julio de 2008, 23:55:19
Tengo otros programas de prueba que había olvidado subir, perdonen el descuido pero en ocasiones olvido algunas cosas, el próximo fin me pongo a mano :).
Título: Re: Ejercicios en C con un QY4
Publicado por: scientist en 21 de Julio de 2008, 02:31:53
muchas gracias Geo, me ha estado dando lata el ADC, no he podido hacer que funcione con el oscilador interno, no se a  que se deba, ya que configura a mi entender bien los registros de ADCLK, ADSCR, pero nada de nada,si puedes subir un ejemplo muy facil con el qy4, estare muy agradecido
Título: Re: Ejercicios en C con un QY4
Publicado por: Geo en 21 de Julio de 2008, 18:52:16
muchas gracias Geo, me ha estado dando lata el ADC, no he podido hacer que funcione con el oscilador interno, no se a  que se deba, ya que configura a mi entender bien los registros de ADCLK, ADSCR, pero nada de nada,si puedes subir un ejemplo muy facil con el qy4, estare muy agradecido
Ahorita voy a poner unas variaciones del multiplicador de 4 bits, luego pongo un voltímetro, espero que te sirva ese :).

Multiplicador 4 bits (2)

Multiplicador
Código: C
  1. /*********************************************
  2.  * Multiplicador 4 bits.
  3.  * Multiplica un par de datos de 4 bits.
  4.  * Esta versión da el resultado en forma serie
  5.  * en dos líneas, una llama a la interrupción
  6.  * IRQ2 de un segundo microcontrolador indicando
  7.  * que se enviará un bit, y en la otra se coloca
  8.  * el valor del bit.
  9.  *********************************************/
  10.  
  11. #include <MC68HC908QY4.h>   // Se definen los registros de I/O y sus direcciones.
  12. #include <hidef.h>         // Contiene instrucciones en ensamblador.
  13. #include <startup.h>
  14.  
  15. void inicializacion( void );
  16. void delay( unsigned int );
  17.  
  18. int dato_a = 0;
  19. int dato_b = 0;
  20. int resultado;
  21. int aux_a = -1;
  22. int aux_b = -1;
  23.  
  24. /* ----------------------------
  25.  * Entradas *
  26.  * -------- *
  27.  * PTB7 - PTB5: Dato A (4 bits)
  28.  * PTB4 - PTB0: Dato B (4 bits)
  29.  * ----------------------------
  30.  * Salidas *
  31.  * ------- *
  32.  * PTA0: Salida de datos
  33.  * PTA1: Sincronización
  34.  * PTA3: Reset comunicación
  35.  * ----------------------------
  36.  */
  37.  
  38. void main( void ) {
  39.    int i;
  40.    
  41.    inicializacion();
  42.    
  43.    while( 1 ) {
  44.       dato_a = ( PTB >> 4 );
  45.       dato_b = ( PTB & 0x0F );
  46.      
  47.       // Si los datos han cambiado.
  48.       if ( ( aux_a != dato_a ) || ( aux_b != dato_b ) ) {
  49.          // Multiplica
  50.          resultado = dato_a * dato_b;
  51. //         resultado = 15;
  52.          // Actualiza auxiliares
  53.          aux_a = dato_a; aux_b = dato_b;
  54.          
  55.          PTA_PTA3 = 1;
  56.          PTA_PTA1 = 1;
  57.          delay( 10000 );
  58.          PTA_PTA3 = 0;
  59.          PTA_PTA0 = 0;
  60.          // Envío de datos
  61.          for ( i = 7; i >= 0; i-- ) {
  62.             PTA_PTA1 = 1;
  63.             delay( 10000 );
  64.             // Coloca el dato
  65.             PTA_PTA0 = ( resultado >> i );
  66.             delay( 10000 );
  67.             // Indica que el dato está listo
  68.             PTA_PTA1 = 0;
  69.             // Espera un tiempo.
  70.             delay( 10000 );
  71.             PTA_PTA1 = 1;
  72.             delay( 20000 );
  73.          }
  74.          PTA_PTA1 = 0;
  75.       }
  76.    }
  77. }
  78.  
  79.  
  80. void inicializacion() {
  81.    CONFIG1 = 0x09;   // Deshabilita el perro guardián
  82.    OSCTRIM = 0x80;   // Registro de ajuste de oscilador interno
  83.    PTBPUE  = 0xFF;   // Resistencias de pull-up para el puerto B (todos los pines).
  84.    PTAPUE  = 0x04;   // Resistencia de pull-up para el puerto A (solamente el pin PTA2).
  85.    DDRA    = 0x3B;   // Puerto A salidas (excepto el pin PTA2).
  86.    DDRB    = 0x00;   // Puerto B entradas
  87. }
  88.  
  89. /* Retardo de n ciclos de reloj.
  90.  */
  91. void delay ( unsigned int ciclos ){
  92.    int cuenta;
  93.    for ( cuenta = 0; cuenta < ciclos; cuenta++ );
  94. }

Decodificador
Código: C
  1. /********************************************************************
  2.  * Decodificador a tres displays de de 7 segmentos para el multiplicador
  3.  * serie.
  4.  * Recibe 8 bits de forma serie y lo muestra en tres displays.
  5.  ********************************************************************/
  6.  
  7. #include <MC68HC908QY4.h>   // Se definen los registros de I/O y sus direcciones.
  8. #include <hidef.h>         // Contiene instrucciones en ensamblador.
  9. #include <startup.h>
  10.  
  11. // Patrones numéricos a mandar al display de 7 segmentos,
  12. // dígitos del 0 al 9.
  13. const unsigned char numeros[ 10 ]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };
  14.  
  15. void inicializacion( void );
  16. void delay( int );
  17.  
  18. // Dato binario a mostrar.
  19. int dato = 0;
  20. int dato_completo = 0;
  21. int bits = 0;
  22.  
  23. void main( void ) {
  24.    int unidades, decenas, centenas, aux;
  25.    
  26.    inicializacion();
  27.    
  28.    EnableInterrupts;
  29.    
  30.    while( 1 ) {
  31.       centenas = dato_completo / 100;
  32.       aux = dato_completo % 100;
  33.       decenas = aux / 10;
  34.       unidades = aux % 10;
  35.      
  36.       if ( PTA_PTA1 == 1 ) {
  37.          dato = 0;
  38.          bits = 0;
  39.       }
  40.      
  41.       // Habilita el primer display
  42.       PTA_PTA5 = 0;
  43.       PTA_PTA4 = 1;
  44.       PTA_PTA3 = 1;
  45.       PTB = numeros[ unidades ];
  46.       delay( 1000 );
  47.      
  48.       // Habilita el segundo display y envía
  49.       // el número correspondiente a las decenas.
  50.       PTA_PTA5 = 1;
  51.       PTA_PTA4 = 0;
  52.       PTA_PTA3 = 1;
  53.       PTB = numeros[ decenas ];
  54.       delay( 1000 );
  55.      
  56.       // Habilita el tercer display y envía
  57.       // el número correspondiente a las centenas.
  58.       PTA_PTA5 = 1;
  59.       PTA_PTA4 = 1;
  60.       PTA_PTA3 = 0;
  61.       PTB = numeros[ centenas ];
  62.       delay( 1000 );
  63.      
  64.    }
  65. }
  66.  
  67. /* Configura el microcontrolador, puertos de entrada y salida.
  68.  */
  69. void inicializacion() {
  70.    CONFIG1 = 0x09;   // Deshabilita el perro guardián
  71.    OSCTRIM = 0x80;   // Registro de ajuste de oscilador interno
  72.    DDRA    = 0x38;   // Pines 5,4 y 3 salidas, 0 y 2 entradas.
  73.    DDRB    = 0xff;   // Puerto B salidas
  74.  
  75.    CONFIG2 = 0xc0;   // Resistencia de pull-up habilitada para el pin A2 que
  76.                // funciona como IRQ.
  77.    INTSCR = 0x00;   // Habilita interrupción por IRQ.
  78. }
  79.  
  80. interrupt 2 void cargar_dato_serie( void ) {
  81.    if ( bits < 8 ) {
  82.       bits++;
  83.       dato = dato | ( PTA_PTA0 << ( 8 - bits ) );
  84.    }
  85.    else {
  86.       dato_completo = dato;
  87.       bits = 0;
  88.       dato = 0;
  89.    }
  90.    
  91. //   delay( 2000 );
  92.    
  93.    // Borra la bandera del IRQF1
  94.    INTSCR_ACK1 = 1;
  95. }
  96.  
  97. /* Retardo de n ciclos de reloj.
  98.  */
  99. void delay (int ciclos){
  100.    int cuenta;
  101.    for (cuenta=0; cuenta < ciclos; cuenta++);
  102. }
Título: Re: Ejercicios en C con un QY4
Publicado por: Geo en 21 de Julio de 2008, 19:10:50
Multiplicador 4 bits (3)

Multiplicación con un solo microcontrolador, los dos números a multiplicar se introducen alternadamente.

Circuito:
[img=http://img137.imageshack.us/img137/525/06multiplicadorentradaaou0.th.png] (http://img137.imageshack.us/my.php?image=06multiplicadorentradaaou0.png)

Multiplicador:
Código: C
  1. #include <MC68HC908QY4.h>   // Incluye declaraciones de periféricos.
  2. #include <startup.h>   // Inicializa pila, variables, etc.
  3. #include <hidef.h>      // Contiene instrucciones en ensamblador.
  4.  
  5. const unsigned char numeros[ 10 ]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };
  6.  
  7. void inicializacion( void );
  8. void delay( unsigned int );
  9.  
  10. int resultado;
  11. int numeroA, numeroB;
  12. int unidades, decenas, centenas;
  13. int aux;
  14. int ciclosDibujo;
  15.  
  16. void main( void ) {
  17.    inicializacion();
  18.    numeroA = numeroB = 0;
  19.    
  20.    while( 1 ) {
  21.       // Si PTB7 = 0, lee el número A.
  22.       if ( PTB_PTB7 == 0 ) {
  23.          numeroA = PTA & 0x0F;
  24.       }
  25.       // Si es 1, lee el número B.
  26.       else {
  27.          numeroB = PTA & 0x0F;
  28.       }
  29.      
  30.       resultado = numeroA * numeroB;
  31.  
  32.       centenas = resultado / 100;
  33.       aux = resultado % 100;
  34.       decenas = aux / 10;
  35.       unidades = aux % 10;
  36.      
  37.       ciclosDibujo = 0;
  38.       while ( ciclosDibujo < 20 ) {
  39.  
  40.          // Habilita primer display
  41.          PTA_PTA4 = 0;
  42.          PTA_PTA5 = 1;
  43.          PTB = numeros[ centenas ];
  44.          delay( 1000 );
  45.          
  46.          // Segundo display
  47.          PTA_PTA4 = 1;
  48.          PTA_PTA5 = 0;
  49.          PTB = numeros[ decenas ];
  50.          delay( 1000 );
  51.          
  52.          // Tercer display
  53.          PTA_PTA4 = 1;
  54.          PTA_PTA5 = 1;
  55.          PTB = numeros[ unidades ];
  56.          delay( 1000 );
  57.          
  58.          ciclosDibujo++;
  59.       }
  60.    }
  61. }
  62.  
  63. void inicializacion( void ) {
  64.    CONFIG1 = 0x09;      // Deshabilita el perro guardián.
  65.    OSCTRIM = 0x80;      // Oscilador interno.
  66.    DDRA = 0x30;      // Pines 4 y 5 salidas, el resto entradas.
  67.    PTAPUE = 0x0F;      // Resistencias de pull-up pines 0,1,2 y 3.
  68.    DDRB = 0x7F;      // Pin 7 entrada, el resto salidas.
  69.    PTBPUE = 0x80;      // Resistencia de pull-up del puerto B.
  70. }
  71.  
  72. void delay( unsigned int n ) {
  73.    unsigned int i;
  74.    for ( i = 0; i < n; i++ );
  75. }
Título: Re: Ejercicios en C con un QY4
Publicado por: Geo en 21 de Julio de 2008, 19:25:02
Voltímetro

Código: C
  1. #include <MC68HC908QY4.h>   // Definición registros entrada/salida.
  2. #include <hidef.h>         // Instrucciones en ensamblador.
  3. #include <startup.h>      // Inicializa pila, variables, etc.
  4.  
  5. // Patrones numéricos a mandar al display de 7 segmentos,
  6. // dígitos del 0 al 9.
  7. const unsigned char digitos[ 10 ]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };
  8.  
  9. void inicializacion( void );
  10. void delay( unsigned int );
  11.  
  12. unsigned char voltaje;
  13. unsigned char unidades, decimas;
  14. int aux;
  15.  
  16. #define TOTAL_CICLOS 20
  17. unsigned int ciclos;
  18.  
  19.  
  20. void main( void ) {
  21.    inicializacion();
  22.    
  23.    while ( 1 ) {
  24.  
  25.       // Obtiene volts
  26.       // 1 V = 51
  27.       unidades = ADR / 51;
  28.  
  29.       // el resto se usa para calcular las décimas
  30.       aux = ADR % 51;
  31.       decimas = ( aux * 10 ) / 51;
  32.      
  33.       ciclos = 0;
  34.       while ( ciclos < TOTAL_CICLOS ) {
  35.  
  36.          // activa display de volts
  37.          PTA_PTA0 = 0;
  38.          PTA_PTA1 = 1;
  39.          PTB = digitos[ unidades ];
  40.          delay( 1000 );
  41.  
  42.          // activa display de décimas de volts
  43.          PTA_PTA0 = 1;
  44.          PTA_PTA1 = 0;
  45.          PTB = digitos[ decimas ];
  46.          delay( 1000 );
  47.          
  48.          ciclos++;
  49.       }
  50.  
  51.    }
  52. }
  53.  
  54. void inicializacion( void ) {
  55.    CONFIG1 = 0x09;      // Deshabilita el perro guardián.
  56.    OSCTRIM = 0x80;      // Ajusta oscilador interno.
  57.    DDRA = 0x1B;      // Pines A5 (AD3) y AD2 entradas, pines A0, A1, A3 y A4 salidas
  58.                   // (para controlar displays).
  59.    DDRB = 0xFF;      // Puerto B salidas.
  60.    
  61.    ADICLK = 0x40;      // Divisor de velocidad del bus entre 4 para
  62.                   // que el ADC trabaje a 3.2 MHz / 4 < 1 MHz.
  63.    ADSCR = 0x23;      // Conversiones continuas, interrupciones
  64.                   // deshabilitadas. Canal 3 (pin A5).
  65. }
  66.  
  67. void delay( unsigned int n ) {
  68.    unsigned int i;
  69.    for ( i = 0; i < n; i++ );
  70. }
Título: Re: Ejercicios en C con un QY4
Publicado por: scientist en 21 de Julio de 2008, 20:49:48
gracias geo, me has hecho un grandisimo favor, he estado dos dias dandole al adc sin poder hacer chambear, al fin, y es que cuando me queda una espinita, no puedo dejar de pensar en otra cosa que eso,  :D :D :D :D :D
Título: Re: Ejercicios en C con un QY4
Publicado por: wizz en 05 de Agosto de 2008, 23:40:46
excelentes ejemplos Geo!

ya logre aplicar el ejemplo de la secuencia de leds  8) :P!

no se si ya sea mucho pedir, pero me gustaria pedirte que pusieras algun ejemplo donde se manejen las interrupciones. lo que estoy tratando de hacer es contar los pulsos de un encoder de cuadratura y de lo que he leido una de las formas mas sencillas de hacer esto es conectar un canal del encoder, vamos a decir que el canal A, al puerto IRQ para las interrupciones externas, y el canal B a cualquier puerto de entrada. entonces cuando se habilita la interrupcion verifico el estado del canal B en el puerto y si es 1 entonces incremento la cuenta, si es 0 decremento.

esto en teoria suena muy sencillo, pero no he podido lograrlo.... lo que estoy intentando es conectar el canal B al PTA 0, pero creo que eso me esta ocasionando un corto o algo asi, ya intente con la resistencia de pull up activada y desactivada y con ninguna de los dos funciona, ¿ocupo conectarle algo mas? o ¿es correcto conectar directo el canal del encoder al micro? ¿hay algo que tenga que cambiar en los CONFIG 1 o 2?
ahorita mi inicializacion es:
Código: [Seleccionar]
CONFIG1 = 0x09;   // Deshabilita el perro guardián   
OSCTRIM = 0x80;   // Registro de ajuste de oscilador interno
PTAPUE  = 0x3f;   // Resistencias de pull-up   
DDRA    = 0x38;   // Pines 5,4 y 3 salidas, 0, 1 y 2 entradas.   
DDRB    = 0xff;   // Puerto B salidas   
CONFIG2 = 0x40;   // Resistencia de pull-up habilitada para el pin A2 que             
                  // funciona como IRQ.   <-- ultimo cambio, original 0xc0
INTSCR = 0x00;    // Habilita interrupción por IRQ.

¿esta bien eso?

cualquier ayuda la agradeceria mucho...

saludos
Título: Re: Ejercicios en C con un QY4
Publicado por: Geo en 06 de Agosto de 2008, 01:33:26
No estoy al día en esto pues los ejercicios los hice algún tiempo, pero aquí vamos :).

En el segundo ejemplo de multiplicador, el decodificador utiliza la interrupción externa para recibir ocho bits uno a uno del primer microcontrolador que realiza la multiplicación, ese ejemplo te puede servir.
Por lo que mencionas, me parece que el problema podría ser el voltaje que recibes del encoder, confirma los niveles y las señales que recibes por ese lado. Lo que te recomiendo es que primero hagas un programa para probar el uso de la interrupción externa con un pulsador, con eso estarás seguro de que manejas bien esta parte para luego proceder con la otra.

En cuanto al programa, quizá esto te pueda servir:
http://ar.geocities.com/valdezda/microcontroladores/encoderrot.htm
http://www.micropic.es/index.php?option=com_content&task=view&id=18&Itemid=44

Suerte :).
Título: Re: Ejercicios en C con un QY4
Publicado por: tatocasta en 13 de Abril de 2009, 00:49:10
Cordial Saludo a Todos....

Me gustaria saber si alguien tiene un ejemplo del uso del Modulo KBI y el manejo de sus interrupciones, pues estoy tratando de configurarlo y por mas que intento pareciera que el programa ni siquiera llega a la interrupcion... :?

Cualquier ayuda y ejemplo al respecto se agradece...
Título: Re: Ejercicios en C con un QY4
Publicado por: scientist en 13 de Abril de 2009, 01:42:48
checate este link, a lo mejor te pueda servir, saludos

tutorial QY4 (http://freescale.teknoplex.com/index.php?topic=116.0)

 :) :) :)
Título: No logro identificar mi programdor de freescale
Publicado por: Julian84 en 22 de Septiembre de 2009, 15:19:16
pido perdon a todos los que pueda incomodar, soy nuevo en esto de los foros y los microcontroladores freescale. actualemente acabo de adquirrir un programador para micros freescale pero no se como debo configurarlo para poder programar con el. si en algo sirve puedo adjuntar una imagen del programador.

gracias de antemano a todos por su ayuda... :) 
Título: Re: Ejercicios en C con un QY4
Publicado por: LABmouse en 31 de Enero de 2010, 21:19:32
pido perdon a todos los que pueda incomodar, soy nuevo en esto de los foros y los microcontroladores freescale. actualemente acabo de adquirrir un programador para micros freescale pero no se como debo configurarlo para poder programar con el. si en algo sirve puedo adjuntar una imagen del programador.

gracias de antemano a todos por su ayuda... :) 

Dinos cual programador tienes y miramos como lo ponemos a trabajar.

SALUDOS!
Título: Re: Ejercicios en C con un QY4
Publicado por: ipavelek en 19 de Septiembre de 2010, 18:13:54
Muchachos disculpenmen soy nuevo y no quiero meterme para crear lio pero si conectan asi los leds al micro se van a ir muriendo los microcontroladores, por lo menos e freescale esta preparado para funcionar como sumidero y no como fuente, dado a los ets que tiene de salida, por lo tanto los Leds debe n ir conectados con el anodo a vcc y el catodo al micro Ojo que estan al limite en el puerto B le pueden sacar como MAXIMO 10 ma en cambio en el puerto A pueden sacarle maximo 25 ma.  Saludos y cualquier duda con freescale aca estoy hace años que trabajo con estos micros.
Título: Re: Ejercicios en C con un QY4
Publicado por: joelG en 07 de Marzo de 2011, 12:08:38
PERDON POR REVIVIR EL POST PERO HAY UN ERROR EN EL PRIMER DIAGRAMA CORRESPONDITE AL CIRCUITO DE SECUENCIA DE LOS LED!!!


(http://img486.imageshack.us/img486/8920/01secuenciaswa5.png)

vemos que la la patita 1 esta a GND y la 16 a Vdd

pero si vemos la hoja de datos

(http://img172.imageshack.us/img172/4861/qy4st6.png)

16 es gnd y 1 es vdd

habria que corregirlo    :o




P.D: Me deben un micro  :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: xD


Título: Re: Ejercicios en C con un QY4
Publicado por: microcom en 09 de Noviembre de 2011, 00:27:37
me parecieron interesantes los aportes SR GEO tienes algunos ejercicios de conversion analogo digital con fresscale con el   MC9S08SE8 o algunas explicaciones E INSTRUCCIONES.   
saludo y gracias