Autor Tema: Macros en C18  (Leído 2535 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Macros en C18
« en: 28 de Julio de 2011, 21:50:27 »
Hola que tal, estoy empezando con C18, vengo de CCS y decidí pasarme y me gustaría que me ayudaran con una macro que quiero hacer, estuve leyendo por internet y mas o menos la tengo lista pero no me compila:

Este es el main:

Código: [Seleccionar]
#include <adc.h>
#include <usart.h>
#include <stdio.h>

#include "mylibs.h"

#pragma config WDT = OFF //WDT apagado

int result;

void main (void){
TRISA = 0xFF; TRISB = 0x00; PORTB = 0x00;
OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST,ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS, ADC_1ANA);
SetChanADC(ADC_CH0);
OpenUSART(USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_LOW, 6); //8928 baudios

printf("Programa de prueba en C18 para PIC18F4550\n\r");

while(1){
result = Read_ADC();
PORTB = result;
printf("El valor del ADC = %u \n\r",result);
Set_baud(4000000,9000,0);
}
}

Mylibs.h y Mylibs.c que son librerias que voy haciendo:

Código: [Seleccionar]
#ifndef mylibs
#define mylibs

int Read_ADC (void);

//Macro para el calculo de baudios automatico
#define Set_baud (unsigned long XTAL, unsigned short long baud, char mode){ \
if((((XTAL/baud)/16)-1)<255){ \
return (unsigned int)(((XTAL/baud)/16)-1); \
} \
else if((((XTAL/baud)/64)-1)<255){ \
return (unsigned int)(((XTAL/baud)/64)-1); \
} \
else{ \
//#error No se pudo establecer un baud rate correcto \
} \
}

#endif

Código: [Seleccionar]
/*Librerías varias*/

//Lectura completa del ADC, toma la conersion, espera y
//lee los registros
int Read_ADC (void){
ConvertADC(); //conversion
while(BusyADC()); //espero a que termine
return ReadADC(); //tomo el valor y lo retorno
}

//Macro para el calculo de baudios automatico
#define Set_baud (unsigned long XTAL, unsigned short long baud, char mode){ \
if((((XTAL/baud)/16)-1)<255){ \
return (unsigned int)(((XTAL/baud)/16)-1); \
} \
else if((((XTAL/baud)/64)-1)<255){ \
return (unsigned int)(((XTAL/baud)/64)-1); \
} \
else{ \
//#error No se pudo establecer un baud rate correcto \
} \
}

La macro esta ahí definida y cuando la uso en el main me dice que hay un error de sintaxis y me lleva ahí en el main donde la use y no se que pueda ser. La idea de la macro es usarla para calcular los baudios automaticamente para usarla en la función:

Código: [Seleccionar]
OpenUSART(USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_LOW, 6); //8928 baudios
Que con la macro mi idea seria que quedara por ejemplo:

Código: [Seleccionar]
OpenUSART(USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_LOW, Set_baud(4000000,9000,0));
Por eso necesito que retorne el valor del número que calculé pero no se por qué no me funciona, no se si la tengo que definir en el .h y como hacerlo y si se fijan hay una directiva #error en la macro que esta como comentario porque si la coloco me tira un error el compilador C18 y el proceso como si fallara el programa.

Perdon por tantas preguntos es que recien estoy empezando espero puedan ayudarme gracias!!
« Última modificación: 28 de Julio de 2011, 22:03:11 por dragondgold »
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Macros en C18
« Respuesta #1 en: 28 de Julio de 2011, 23:34:29 »
En los macros no se coloca el tipo de variable, directamente seria:

Código: [Seleccionar]
#define Set_baud (XTAL, baud,mode) {....}
Un macro no es más que expresar en palabras más "sencillas" un conjunto de instrucciones, el compilador al encontrar estas reemplaza texto por texto. Así que utilizar macros como las que indicas, si se usa muchas veces dentro del código, significa usar mucha más memoria de programa que al utilizar funciones.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: Macros en C18
« Respuesta #2 en: 28 de Julio de 2011, 23:47:37 »
Perdón Suky debo tener mal los conceptos pero la macro no es un calculo q hace el compilador y directamente coloca el resultado ?? No quiero q use memoria del pic Sino que me calcule el resultado nomas y lo reemplaze en la funcion
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Macros en C18
« Respuesta #3 en: 29 de Julio de 2011, 12:04:42 »
Pero si es esa la idea lo implementas mal. Para ello se hace de la siguiente manera:

Código: C
  1. #define XTAL 4000000
  2. #define baud 9600
  3.  
  4.  
  5. #if((((XTAL/baud)/16)-1)<255)
  6.      #define MODE 1
  7.      #define VAL_SPBRG (unsigned int)(((XTAL/baud)/16)-1)
  8. #elif((((XTAL/baud)/64)-1)<255)
  9.      #define MODE 0
  10.      #define VAL_SPBRG (unsigned int)(((XTAL/baud)/64)-1)
  11. #else
  12.      //#error No se pudo establecer un baud rate correcto
  13. #endif

Y luego trabajas con las definiciones MODE y VAL_SPBRG


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: Macros en C18
« Respuesta #4 en: 29 de Julio de 2011, 12:55:42 »
Muchas gracias Suky pude hacerlo funcionar y anda perfecto solo me quedo un inconveniente. Lo agregé en el archivo .h y ahora el otro prototipo de función que tengo no me lo toma, osea, compila bien pero me dice que es una función sin prototipo y se queda ahi clavado no avanza el programa. Este es el .h:

Código: [Seleccionar]
#ifndef mylibs
#define mylibs

int Read_ADC (void);

#define XTAL 4000000
#define baud 9600

//Macro para el calculo de baudios automatico
#if((((XTAL/baud)/16)-1)<255)
#define SPEED_MODE USART_BRGH_HIGH
    #define BAUDIOS (unsigned int)(((XTAL/baud)/16)-1)
#elif((((XTAL/baud)/64)-1)<255)
    #define SPEED_MODE USART_BRGH_LOW
    #define BAUDIOS (unsigned int)(((XTAL/baud)/64)-1)
#else
    #error No se pudo establecer un baud rate correcto
#endif

#endif

y este el .c:

Código: [Seleccionar]
/*Librerías varias*/

//Lectura completa del ADC, toma la conersion, espera y
//lee los registros
int Read_ADC (void){
ConvertADC(); //conversion
while(BusyADC()); //espero a que termine
return ReadADC(); //tomo el valor y lo retorno
}

Antes de poner el include de "mylibs.h" ya puse el de "adc.h" pero me dice que no tienen prototipo de función las funciones del ADC como ConvertADC() y las demás. Si saco la macro o coloco las funciones del ADC directamente en el main funciona correctamente por que ?

Muchas gracias Suky y disculpa por tantas preguntas
« Última modificación: 29 de Julio de 2011, 14:32:46 por dragondgold »
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Macros en C18
« Respuesta #5 en: 29 de Julio de 2011, 14:53:39 »
Si dentro de Mylibs.c vas a usar funciones del ADC debes incluir en él a adc.h, o en Mylibs.h.

Si colocas #include "adc.h" en el main, solo le sirve a ese módulo, lo demás no se enteran.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: Macros en C18
« Respuesta #6 en: 29 de Julio de 2011, 14:55:06 »
Haaaaa veo que cambia bastante con repecto a CCS. Pero es raro porque si yo elimino la macro si funciona.

Saludos!!
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder