Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

30/01/2014 #1


Funciones varias para PIC en C.
Hola a todos, como les va?

Bueno, la idea de este tema es que cada uno vaya poniendo funciones propiamente dichas, cualquiera que tengan, hayan usado y sepan que funcione bien.

A qué me refiero con cualquiera? Controladores de display de 7 segmentos, LCD, PWM, lectores de ADC, conversores de unidades, escritura y lectura de memorias, transmisión de datos por distintos protocolos, lectores de teclado, DAC, etc. TODO, TODO a cualquiera le puede servir.

Lo ideal sería que sean funciones lo más universales posibles, cosa que uno la pueda usar en un programa propio sin modificar nada, o casi nada de ellas. De esta forma cada uno puede venir y buscar una que necesite y le sirva, copiar, pegar y seguir trabajando en lo suyo.
Que estén optimizadas lo máximo posible en cuanto a memoria y tiempo de procesamiento (sobre todo con el tema de los "delay").

Las funciones tienen que ser en C, yo preferiría que para el compilador CCS, aunque también puede ser para otros, ya que no es el único que hay. Que sean en C es indispensable, primero porque ya mucha gente lo conoce o se está adaptando a este lenguaje, y segundo que al ser de alto nivel, permite programar más fácilmente, y adaptar los programas a otras marcas de microcontroladores como ATMEL (avr), Freescale, ST, y otros.

Para subir alguna función, se tiene que poner en formato "CODE" así no hay que descargar nada y gente de afuera del foro puede usarlas también.
En el nombre del mensaje se tiene que poner básicamente el nombre de la función, y en el mensaje para qué sirve, es decir, qué recibe, qué hace y que devuelve.

Yo acá pongo una de prueba, medio boba pero es para dar una idea...

Función: binario a 7 segmentos --> Esto va en el nombre del mensaje.

Lo que hace esta función es recibir un número decimal (de 0 a 9), y devolver mediante un switch un número codificado a 7 segmentos, que más adelante se puede plasmar en un puerto de 7 bits o más para mostrar en un display.

Usa muy poca memoria y en pocas instrucciones devuelve el número codificado.

Código:

Código:
char bin_7seg (char bin)      //Decodifica un número en BCD a 7seg.
{
switch (bin)
{
   {
   case 0:
   {
   return(0b01111110);
   break;
   }
   case 1:
   {
   return(0b00110000);
   break;
   }
   case 2: 
   {
   return(0b01101101);
   break;
   }
   case 3:
   {
   return(0b01111001);
   break;
   }
   case 4:
   {
   return(0b00110011);
   break;
   }
   case 5:
   {  
   return(0b01011011);
   break;
   }
   case 6:
   {
   return(0b01011111);
   break;
   }
   case 7:
   {   
   return(0b01110000);
   break;
   }
   case 8: 
   {
   return(0b01111111);
   break;
   }
   case 9:
   {
   return(0b01111011);
   break;
   }
}  
}
Espero que les guste la idea y que cada uno aporte sus líneas...

Un saludo.
30/01/2014 #2

Avatar de cosmefulanito04

Alternativa a tu código (no verifiqué las salida que pusiste, pero la idea se entiende):

Código PHP:
...
unsigned char codificar_a_7_seg[10]={0b01111110,0b00110000....,0b01111011};
... 
Requiere 10 bytes de RAM, nada terrible.
31/01/2014 #3


La idea es que los códigos sean en C.

Y según entiendo, ahí estás declarando un vector e insertando los números, pero no convierte (salvo que esté ententiendo mal el código).
31/01/2014 #4

Avatar de cosmefulanito04

BrunoARG dijo: Ver Mensaje
La idea es que los códigos sean en C.

Y según entiendo, ahí estás declarando un vector e insertando los números, pero no convierte (salvo que esté ententiendo mal el código).
Lo que puse es C, como vos decís es simplemente un vector.

Pero el truco está en que el vector funciona como codificador, ya que da la casualidad que el índice coincide con los valores de entradas del codificador y su salida será simplemente en el contenido del vector, ejemplo si quisiera obtener el código en 7 segmentos del nº 1:

Código PHP:
...
salida_puerto=codificar_a_7_seg[1];
... 
Si se está corto de memoria RAM, se podría almacenar dicho vector en la memoria de código del uC.
03/02/2014 #5

Avatar de TRILO-BYTE

como que cada persona aporte un algoritmo generico de programacion y que ese codigo sea casi casi portable a cada compilador de diferente micro o marca
si es asi puedo aportar varios deja los busco y los pego
03/02/2014 #6


Saludos y excelente idea. Para facilitar la lectura y comprensión de las funciones propuestas seria bueno que se establezca algún tipo de formato. Por ejemplo y retomando el ejemplo sencillo con el que se inicia este hilo se podría incluir lo siguiente:

1. nombre y descripción
2. ejemplo de como usar la función
3. librerías adicionales que se necesitan
4. etc.
Código PHP:
// descripción: 
//     Decodifica un número en BCD a 7-segmentos
//     utilizando una "lookup table" almacenada 
//     en la memoria de programa
// ejemplo de uso: 
//     salida_puerto = bcd_a_7seg[numero_en_bcd];

unsigned char bcd_a_7seg(const unsigned char bcd)      
    {
    
// tabla para displays tipo catodo comun
    
const unsigned char 7seg_tbl[] = 
        {
        
//-abcdefg
        
0b01111110,  // 0
        
0b00110000,  // 1
        
0b01101101,  // 2
        
0b01111001,  // 3
        
0b00110011,  // 4
        
0b01011011,  // 5
        
0b01011111,  // 6
        
0b01110000,  // 7
        
0b01111111,  // 8
        
0b01111011   // 9
        
};
        
    return 
7seg_tbl[bcd];
    } 
Y cuando sea necesario agregar algo de código para control de errores, por ejemplo en este caso podría ser algo así:

Código PHP:
    if (bcd 10)
        return 
7seg_tbl[bcd];
    else
        return 
0b01001111;  // "E" error 
Nuevamente saludos y espero colaborar con unas cuantas funciones una vez que se defina el formato a utilizar.
03/02/2014 #7

Avatar de cosmefulanito04

carferper dijo: Ver Mensaje
...
Y cuando sea necesario agregar algo de código para control de errores, por ejemplo en este caso podría ser algo así:

Código PHP:
    if (bcd 10)
        return 
7seg_tbl[bcd];
    else
        return 
0b01001111;  // "E" error 
Nuevamente saludos y espero colaborar con unas cuantas funciones una vez que se defina el formato a utilizar.
Eso se llama ser prolijo, aunque la contra es que requiere llamar a una función para devolver un vector estático.
03/02/2014 #8


Efectivamente en este caso habría que evaluar si en realidad conviene usar una función para la conversión pues eso implica mayor uso de memoria, sin embargo muchas veces es mas claro escribir código de esta forma. En todo caso, este ejemplo sirve unicamente para establecer un formato común para presentar las funciones y no necesariamente significa la mejor forma.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.