Libreria casera en C para PIC
Resultados 1 al 8 de 8

Tema: Libreria casera en C para PIC

  1. #1
    Usuario Avatar de jorgedalesp
    Ubicación
    Donde el Diablo perdio el poncho
    Mensajes
    310
    Gracias
    145
    Agradecido 155 veces en 94 posts

    Libreria casera en C para PIC

    Hola amigos, haber si alguno me puede orientar, hice un programa con el IDE "MPlab X" usando el compilador XC8, ambos que provee Microchips y en C para el clásico (y ya antiguo) PIC16F84A, que consiste en un contador que cuenta de 0 a 99 y lo trasmite de forma serie para visualizarlo con un SDA2131.


    El video para que se entienda mejor:


    El programa:

    Código:
    /*Autor: jorgedalesp
     * e-mail:jorgedalesp@gmail.com
     * Version: 1.0
     * Fecha:26/05/12
     * Titulo: Contador 0-FF con PIC16F84 y SDA2131*/
    
    #include <pic.h>
    #include <pic16f84a.h>
    
    #define _XTAL_FREQ 4000000  //Frec. del osc. en Hz para calculo de delays
    
    __CONFIG (FOSC_XT & WDTE_OFF & PWRTE_ON & CP_OFF);
    
    #define PUERTO PORTB    //Puerto
    #define D RB0           //Linea de dato serie
    #define CLK RB1         //Señal de clock
    #define E RB2           //Señal de habilitacion del modulo SDA2131 (eneable)
    
    
    void send(char pd, char sd); //Envio de par caracteres al display
     char convertir(char comb);   //Conversión de numero 
    
    int main(void){
    
        TRISA=0;
        TRISB=0;
        PORTB=0;
        
        while (1){
             for (char i=0; i<10;i++){
                 for (char j=0;j<10;j++){
                    send(i,j);
                    __delay_ms(1000);
                }
            }
        }
        
        return 0;
    }
    
    void send(char pd, char sd){
        const char mask1=1;
        const char mask2=254;
        
         char aux1=convertir(pd);
         char aux2=convertir(sd);
        unsigned short int dat= aux1*256+aux2; //Concatenar las variables tipo char
        
        aux1=0;
        aux2=0;
        CLK=0;
        E=1;
    
        for (int i=0; i<16; i++){
            aux1=PUERTO & mask2;
            aux2=dat & mask1;
            PUERTO=aux1 | aux2;
            dat=dat>>1;
             __delay_us(500);
            CLK=1;
            __delay_us(100);
            CLK=0;
        }
        E=0;
           return;
    }
    
     char convertir(char comb){
        char aux=0;
        switch (comb){
            case 0:
                aux=0b10110111;
                break;
            case 1:
                aux=0b00100100;
                break;
            case 2:
                aux=0b01110011;
                break;
            case 3:
                aux=0b01110110;
                break;
            case 4:
                aux=0b11100100;
                break;
            case 5:
                aux=0b11010110;
                break;
            case 6:
                aux=0b11010111;
                break;
            case 7:
                aux=0b00110100;
                break;
            case 8:
                aux=0b11110111;
                break;
            case 9:
                aux=0b11110100;
                 break;
            default:
                aux=0b11111111;
                break;
        }
        return aux;
    }
    Mi idea es tomar las funciones "convertir", y "send", junto a los #define D, PUERTO,CLK;E y colocarlos en una libreria de manera de en un futuro proyecto hacer algo asi como:

    #Include <modulo_SDA2131.h>

    -------
    -------
    send (1,9); //enviar al display 19
    -------
    -------
    //resto del programa//

    Demanera de no estar repitiendo el código en cada proyecto sino reutilizarlo de esta manera, imagino es posible pero no logro hacerlo. Alguno idea?
    Desde ya un saludo

    Jorge
    "...y mirándolos a los ojos les dijo: estén atentos a los fanáticos adoradores de nubes, que sus desatinados versos no los quiten de la senda de la razón...no correspondan sus cantos, ellos se nutren de eso...son pues almas condenadas a vagar por las tinieblas del mundo..." - NeoTestamento - José Luis 355:113

  2. #2
    Usuario Avatar de Somacruz
    Ubicación
    Mexico
    Mensajes
    35
    Gracias
    4
    Agradecido 25 veces en 7 posts
    Hola tocayo, supongo que es posible, debe ser lo mismo que en CCS, se hace uso de librerias y puedes crear las tuyas propias siempre y cuando hagas la llamada a la funcion en forma correcta, en el compilador de Microchip debe ser igual, desafortunadamente yo manejo CCS y no podria ayudarte pero tengo un link donde se explica la creacion de librerias en CCS quiza pueda orientarte, te lo pasare mas tarde ya que me encuentro en el laburo, saludos

  3. Los siguientes usuarios agradecen a Somacruz por este post:

    jorgedalesp (03/06/2012)

  4. #3
    Super Moderator Avatar de HJ.0X00
    Ubicación
    Tanti - Córdoba - Argentina
    Mensajes
    2,159
    Gracias
    1,902
    Agradecido 1,572 veces en 940 posts
    Hola , talves los siguientes enlaces a trabajos de Suky te sirvan de orientación, aunque no son para el compilador específico que utilizas.

    http://www.micros-designs.com.ar/lib...¿como-trabajar

    Librerías genéricas en C. CCS, C18, C30, Hi-Tech, CodeVisionAVR,......

    Saludos
    HJ
    "Cuando llegue la inspiración, que me encuentre trabajando."
    ​PICASSO, Pablo

    Consulta el Indice de Montajes NeoTeo

    Esta etapa concluyó, ahora estoy Por aquí...

    No soy mas Moderador aunque figure como tal.

  5. Los siguientes 2 usuarios agradecieron a HJ.0X00 por este post:

    jgrendon04 (31/05/2012), jorgedalesp (01/06/2012)

  6. #4
    Usuario Avatar de jakala
    Mensajes
    361
    Gracias
    120
    Agradecido 273 veces en 139 posts
    Buenas, jorgedalesp:

    De una forma rapida (aunque no muy correcta) puedes copiar unicamente el contenido de las dos funciones, el prototipado y los defines que te interesan y guardarlos en un archivo, por ej: libreria.h

    luego, para incluirla en tu proyecto, tendrias que utilizar:

    #include "libreria.h"

    nota que no utilizas los simbolos <> sino "". los <> son para librerias del entorno, y los "" para librerias propias en el raiz de tu proyecto.

    Ahora bien, si quieres hacerlo mas correctamente, los archivos .h solo deben contener los defines y los prototipos de las funciones, y al final, una instruccion #include que te añada un archivo externo llamado libreria.c que contenga el codigo de las funciones.

    Lo correcto seria:

    archivo libreria.c
    Código PHP:
    void send(char pdchar sd){
        const 
    char mask1=1;
        const 
    char mask2=254;
       
    char aux1=convertir(pd);
       
    char aux2=convertir(sd);
        
    unsigned short int dataux1*256+aux2//Concatenar las variables tipo char
       
    aux1=0;
        
    aux2=0;
        
    CLK=0;
        
    E=1;

        for (
    int i=0i<16i++){
            
    aux1=PUERTO mask2;
            
    aux2=dat mask1;
            
    PUERTO=aux1 aux2;
            
    dat=dat>>1;
             
    __delay_us(500);
            
    CLK=1;
            
    __delay_us(100);
            
    CLK=0;
        }
        
    E=0
          return;
    }

     
    char convertir(char comb){
        
    char aux=0;
        switch (
    comb){
            case 
    0:
                
    aux=0b10110111;            break;
            case 
    1:
                
    aux=0b00100100;            break;
            case 
    2:
                
    aux=0b01110011;            break;
            case 
    3:
                
    aux=0b01110110;            break;
            case 
    4:
                
    aux=0b11100100;            break;
            case 
    5:
                
    aux=0b11010110;            break;
            case 
    6:
                
    aux=0b11010111;            break;
            case 
    7:
                
    aux=0b00110100;            break;
            case 
    8:
                
    aux=0b11110111;            break;
            case 
    9:
                
    aux=0b11110100;             break;
            default:            
               
    aux=0b11111111;           break;    
    }
        return 
    aux; } 
    archivo libreria.h
    Código PHP:
    #define PUERTO PORTB    //Puerto
    #define D RB0           //Linea de dato serie
    #define CLK RB1         //Señal de clock
    #define E RB2           //Señal de habilitacion del modulo SDA2131 (eneable)

    void send(char pdchar sd); //Envio de par caracteres al display
    char convertir(char comb);   //Conversión de numero 
    #include "libreria.c" 
    Por supuesto, esta solución es para proyectos propios y especificos. Si quieres algo mas dinámico, y que te pueda servir para otros lenguajes, integrados, etc, lo mejor sin duda es el manual de Suky que te pone HJ.0X00
    Última edición por jakala; 30/05/2012 a las 23:32
    Dicen que "rectificar" es de sabios...pero hay que tener "capacidad" y soportar la "tension"
    -------------------

    www.jakala.es
    Actualmente disponible dias y horas aleatorias (es decir, cuando enciendo el server)
    -------------------
    Cuatro cosas malas tiene el mundo:

    La boca de Jakala es lo primero;
    el buche del milano lo segundo;
    las manos de los monos es lo tercero;
    y, como nunca logra verse harto
    el ojo humano, siempre fue lo cuarto.

  7. Los siguientes 5 usuarios agradecieron a jakala por este post:

    HJ.0X00 (01/06/2012), jgrendon04 (31/05/2012), jorgedalesp (01/06/2012), Mario (30/05/2012), RDBrot (31/05/2012)

  8. #5
    Usuario Avatar de jorgedalesp
    Ubicación
    Donde el Diablo perdio el poncho
    Mensajes
    310
    Gracias
    145
    Agradecido 155 veces en 94 posts
    Con la sugerencia de Jakala a funcionado a la primera...
    Ahora, dandole una vuelta de tuerca mas a la cuestión...

    Algunos de los #define que estan en el archivo .h no es posible definirlo en el archivo principal donde esta el main para no estar modificando el código de la librería cada vez que quiero cambiar algún parámetro como el PUERTO, D, E, CLK ?

    Osea, algo así como ocurre con la funcion _delay_ms(...) que para usarla tenes que poner #include <pic.h> pero te obliga a especificar en el programa donde la usas un #define _XTAL_FREQ 4000000 que es la frecuencia del micro para calcular los delays.

    Se entiende?

    Yo he probado no hacer los #define en el archivo .h sino en el main.c pero es como que no las "ve" y me dice que no estan definidas..

    Tengan me paciencia muchachos!!!

    Saludos

    Jorge
    "...y mirándolos a los ojos les dijo: estén atentos a los fanáticos adoradores de nubes, que sus desatinados versos no los quiten de la senda de la razón...no correspondan sus cantos, ellos se nutren de eso...son pues almas condenadas a vagar por las tinieblas del mundo..." - NeoTestamento - José Luis 355:113

  9. #6
    Usuario Avatar de jakala
    Mensajes
    361
    Gracias
    120
    Agradecido 273 veces en 139 posts
    Buenas de nuevo:

    jordedalesp,hay varias maneras (como todo en programacion). Cada cual mas correcta o menos (segun lenguajes).
    En lo que se refiere a C utilizado en micros, se suele utilizar mucho los #define para establecer parametros en las funciones. (Yo personalmente utilizaria parametros de funcion, pero eso yo).

    Supongamos en tu caso la función send(). tiene dos parametros (caracter 1 y 2 del display). Pero tambien utilizas los globales definidos con #define.

    Pues bien, una cosa que puedes hacer es comprobar si esta definida una global, y si lo esta, definir los parametros. Por ej:

    archivo libreria.h
    Código PHP:
    #if defined(__USAR_SEND__)
       #define PUERTO PORTB   //Puerto
        #define D RB0           //Linea de dato serie
        #define CLK RB1         //Señal de clock
        #define E RB2           //Señal de habilitacion del modulo SDA2131 (eneable)
        
    void send(char pdchar sd); //Envio de par caracteres al display
    #endif

    char convertir(char comb);   //Conversión de numero 

    #include "libreria.c" 
    en el caso de libreria.c

    Código PHP:

    #if defined(__USAR_SEND__)
         
    void send(char pdchar sd){
              const 
    char mask1=1;
        const 
    char mask2=254;
       
    char aux1=convertir(pd);
       
    char aux2=convertir(sd);
        
    unsigned short int dataux1*256+aux2//Concatenar las variables tipo char
       
    aux1=0;
        
    aux2=0;
        
    CLK=0;
        
    E=1;
        for (
    int i=0i<16i++){
            
    aux1=PUERTO mask2;
            
    aux2=dat mask1;
            
    PUERTO=aux1 aux2;
            
    dat=dat>>1;
             
    __delay_us(500);
            
    CLK=1;
            
    __delay_us(100);
            
    CLK=0;
        }
        
    E=0;
           return;
    }

    #endif

     
    char convertir(char comb){
        
    char aux=0;
        switch (
    comb){
            case 
    0:            aux=0b10110111;            break;
            case 
    1:            aux=0b00100100;            break;
            case 
    2:            aux=0b01110011;            break;
            case 
    3:            aux=0b01110110;            break;
            case 
    4:            aux=0b11100100;            break;
            case 
    5:            aux=0b11010110;            break;
            case 
    6:            aux=0b11010111;            break;
            case 
    7:            aux=0b00110100;            break;
            case 
    8:            aux=0b11110111;            break;
            case 
    9:            aux=0b11110100;             break;
            default:                       
    aux=0b11111111;           break;
        } 
       return 
    aux;
     } 
    Ahora, la función SEND solo se incluiria en tu proyecto si defines en tu main la bandera __USAR_SEND__

    archivo main.c
    Código PHP:
    // inicializaciones anteriores... includes de pic.h, etc...
    //

    #define __USAR_SEND__ true
    include "libreria.h"

    // tu codigo fuente... 
    Fijate que la función convertir, la he dejado fuera del if. Entonces puedes incluir tu libreria.h en tu proyecto, y si no defines __USAR_SEND__ no se declarara en tu proyecto, pero la función convertir si.

    Ojo: todo esto es a nivel teorico, no lo he probado con tu ejemplo


    EDITO: una mejora de la libreria.h podria ser la siguiente:

    Código PHP:
    #if defined(__USAR_SEND__)
       #if !defined(PUERTO) && !defined(D) && !defined(CLK) && !defined(E)
           #define PUERTO PORTB   //Puerto
           #define D RB0           //Linea de dato serie
           #define CLK RB1         //Señal de clock
           #define E RB2           //Señal de habilitacion del modulo SDA2131 (eneable)
        #endif
        
    void send(char pdchar sd); //Envio de par caracteres al display
    #endif

    char convertir(char comb);   //Conversión de numero 
    #include "libreria.c" 
    que pasaria ahora? pues que si en tu programa defines __USAR_SEND__ pero no defines PUERTO, D, CLK y E, entonces POR DEFECTO los declarara al entrar en el .h. Pero si los defines en tu main, entonces utilizará los que has definido...
    Última edición por jakala; 01/06/2012 a las 23:06
    Dicen que "rectificar" es de sabios...pero hay que tener "capacidad" y soportar la "tension"
    -------------------

    www.jakala.es
    Actualmente disponible dias y horas aleatorias (es decir, cuando enciendo el server)
    -------------------
    Cuatro cosas malas tiene el mundo:

    La boca de Jakala es lo primero;
    el buche del milano lo segundo;
    las manos de los monos es lo tercero;
    y, como nunca logra verse harto
    el ojo humano, siempre fue lo cuarto.

  10. Los siguientes 2 usuarios agradecieron a jakala por este post:

    HJ.0X00 (01/06/2012), jorgedalesp (03/06/2012)

  11. #7
    Usuario Avatar de jorgedalesp
    Ubicación
    Donde el Diablo perdio el poncho
    Mensajes
    310
    Gracias
    145
    Agradecido 155 veces en 94 posts
    Para que los #define sean globales llevan una sintaxis especial? porque todo lo que defino en el main.c no los "ve" el resto de los archivos al momento de compilar, yo hice siguiendo tu sugerencia:

    main.c
    Código PHP:
    .....
     
    #define PORT PORTB
     
    .... 
    y en la libreria.h (yo la llamo SDA2131.h) puse
    Código PHP:
    .......
    ........
     
    #ifndef PORT
          #warning "Puerto por defaul: PORB
          #define PORT PORTB
    #endif
    ......
     ...... 
    y compilo me salen los "warning" que definí como que nunca se percato que todo eso estaba definido en el main.c y entro en el bloque "#ifn define" como si no estuviese definido.

    (Para mi que no debe permitir lo que yo quiero)
    Les pongo todos los archivos si quieren darle una mirada. Igual les agradezco a todos el esfuerzo.
    Canas verdes.zip
    Última edición por jorgedalesp; 03/06/2012 a las 19:06
    "...y mirándolos a los ojos les dijo: estén atentos a los fanáticos adoradores de nubes, que sus desatinados versos no los quiten de la senda de la razón...no correspondan sus cantos, ellos se nutren de eso...son pues almas condenadas a vagar por las tinieblas del mundo..." - NeoTestamento - José Luis 355:113

  12. #8
    Usuario Avatar de jakala
    Mensajes
    361
    Gracias
    120
    Agradecido 273 veces en 139 posts
    Buenas de nuevo:

    a ver, cosas por comentar de tu codigo fuente:

    lo primero es que el archivo .h no tiene al final un #include "sda2131.c". La cabecera es la que va a incluir el archivo .c, tu no tienes esa instruccion, por lo que no incluye el codigo .c

    lo segundo, es que en tu codigo main.c, incluyes primero la libreria .h y luego haces los #define. Esto, si el punto primero estuviera solucionado, lo que haria es definir lo primero los elementos por defecto, y luego definiria los tuyos de main. En tu caso, lo logico seria primero hacer los defines, y luego el #include de tu libreria.

    lo tercero, el .c no necesita las cabeceras (ya que el .h, una vez corregido el punto 1) incluiria este archivo. De hecho, no necesitas ni el pic.h.

    En resumen:

    1.- archivo sda2131.h: Finalizar con un #include "sda2131.c"
    2.- archivo sda2131.c: eliminar los include y los define ( el define de xtal ya lo pones en el main, no hace falta)
    3.- archivo main.c: primero includes de PIC, luego Defines, luego include de tu libreria y por ultimo tu codigo.

    Espero que esto te resuelva el problema
    Última edición por jakala; 03/06/2012 a las 22:12
    Dicen que "rectificar" es de sabios...pero hay que tener "capacidad" y soportar la "tension"
    -------------------

    www.jakala.es
    Actualmente disponible dias y horas aleatorias (es decir, cuando enciendo el server)
    -------------------
    Cuatro cosas malas tiene el mundo:

    La boca de Jakala es lo primero;
    el buche del milano lo segundo;
    las manos de los monos es lo tercero;
    y, como nunca logra verse harto
    el ojo humano, siempre fue lo cuarto.

Temas similares

  1. libreria en eagle para este conector
    Por hermesalexis en el foro Electrónica
    Respuestas: 5
    Último mensaje: 14/12/2011, 03:33
  2. Crear una librería
    Por alejandrocoria en el foro Programación
    Respuestas: 6
    Último mensaje: 03/12/2011, 03:53
  3. ¿Alguien me pude ayudar a crear una libreria para MPLAB?
    Por mecatroyer en el foro Programación
    Respuestas: 4
    Último mensaje: 27/04/2011, 03:15
  4. Fotocelula casera con LDR
    Por Zerg en el foro Electrónica Analógica
    Respuestas: 10
    Último mensaje: 19/12/2010, 01:46
  5. Respuestas: 6
    Último mensaje: 15/11/2010, 10:41

Los visitantes encuentran esta página buscando por:

librerias para pic c compiler

mplab xc8 crack

microchip xc8 crack

libreria xc8

contador de 0 a 99 con pic 16f84a

mplab xc 8 crack

cuales son las librerias de un pic en c

contador de 0 a 99 con pic

contador en c para pic

contador de 0 a 99 con pic16f84amplab xc crack pic16f84a pic c compilerprograma de pic que cuente del 0 al 99contador del 0 al 99 con piccrack mplab xc8crack xc8 microchipxc8 __delay_mstutorial mplab xc8mplab xc8librerias para pic 16f84 tutorialmanejar mplab xc8CONTADOR DE 0 A 99 CON PIC EN Ccontador de 0 a ff en c para microcontroladoresxc8 cracklenguaje C en xc8 mplab

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37