TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ipurple en 13 de Julio de 2005, 10:17:00
-
Hola amigos,
Les felicito por este gran espacio...quisiera pedirles un poquito de ayuda con un programita que trato de hacer para medir una presion a partir de un voltaje. Estoy ocupando el compilador CCS y el mensaje que aparece es: "Error(71): Out of ROM, A segment or the program is too large", la verdad que no entiendo demasiado a que se debe, he tratado de corregir algunas secuencias pero no pasa nada...bienvenidas las sugerencias y gracias!
///////////////////////////// DIRECTIVAS DE PREPROCESADO /////////////////////////////
#include <16F870.h>
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=4000000)
#include "lcd.c"
#include <math.h>
#use fast_io(B)
////////////////////////////////////// GLOBALES //////////////////////////////////////
const int v_max=5;
const int escala=1023;
const float ctte=1.667;
const float mbar=11.33;
////////////////////////////////////// RUTINAS ////////////////////////////////////////
void borra_lcd()
{
lcd_putc("f"
; // Borra el lcd
}
void calcula_voltaje(float valor,float &voltaje)
{
voltaje = valor*v_max/escala*2; //Calcula el voltaje desde ADC
desde y multiplica *2 para
compensar la entrada
}
void calcula_value(float voltaje,float &value)
{
value=ctte*voltaje-mbar; //Calcula value
}
void calcula_pressure(float value, float &pressure)
{
pressure=pow(10,value); //Calcula presion segun algoritmo 10
elevado a value
}
/////////////////////////////////////// PRINCIPAL //////////////////////////////////////
void main()
{
float valor,voltaje,value,pressure;
set_tris_B(0b00000000); // Puerto B configurado como salida
port_b_pullups(FALSE); // Desactiva pull-ups puerto B
setup_adc_ports(RA0_RA1_RA3_ANALOG); //Configura A0,A1 y A3 como entradas analógicas y Vdd como voltaje de referencia
setup_adc(ADC_CLOCK_INTERNAL); // Reloj para el conversor
set_adc_channel(0); // Selecciona el canal 0 (RA0)
for(valor=0;1.82<voltaje<8.6
// Bucle
{
valor = read_adc();
calcula_voltaje(valor,voltaje); // Entrada parámetro "valor" y
devuelve "voltaje"
calcula_value(voltaje,value); // Entrada parametro "voltaje" y
devuelve "vale"
calcula_pressure(value,pressure); // Entrada parametro "value" y
devuelve "pressure"
lcd_init(); // Inicializa LCD
borra_lcd(); // Borra LCD
printf(lcd_putc,"%f",pressure); // Muestra en el lcd el contenido de la variable "pressure"
delay_ms(100); // Retardo de un 100 ms
}}
-
Escrito originalmente por ipurple
Hola amigos,
Les felicito por este gran espacio...quisiera pedirles un poquito de ayuda con un programita que trato de hacer para medir una presion a partir de un voltaje. Estoy ocupando el compilador CCS y el mensaje que aparece es: "Error(71): Out of ROM, A segment or the program is too large", la verdad que no entiendo demasiado a que se debe, he tratado de corregir algunas secuencias pero no pasa nada...bienvenidas las sugerencias y gracias!
///////////////////////////// DIRECTIVAS DE PREPROCESADO /////////////////////////////
#include <16F870.h>
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=4000000)
#include "lcd.c"
#include <math.h>
#use fast_io(B)
////////////////////////////////////// GLOBALES //////////////////////////////////////
const int v_max=5;
const int escala=1023;
const float ctte=1.667;
const float mbar=11.33;
////////////////////////////////////// RUTINAS ////////////////////////////////////////
void borra_lcd()
{
lcd_putc("f" ); // Borra el lcd
}
void calcula_voltaje(float valor,float &voltaje)
{
voltaje = valor*v_max/escala*2; //Calcula el voltaje desde ADC
desde y multiplica *2 para
compensar la entrada
}
void calcula_value(float voltaje,float &value)
{
value=ctte*voltaje-mbar; //Calcula value
}
void calcula_pressure(float value, float &pressure)
{
pressure=pow(10,value); //Calcula presion segun algoritmo 10
elevado a value
}
/////////////////////////////////////// PRINCIPAL //////////////////////////////////////
void main()
{
float valor,voltaje,value,pressure;
set_tris_B(0b00000000); // Puerto B configurado como salida
port_b_pullups(FALSE); // Desactiva pull-ups puerto B
setup_adc_ports(RA0_RA1_RA3_ANALOG); //Configura A0,A1 y A3 como entradas analógicas y Vdd como voltaje de referencia
setup_adc(ADC_CLOCK_INTERNAL); // Reloj para el conversor
set_adc_channel(0); // Selecciona el canal 0 (RA0)
for(valor=0;1.82<voltaje<8.6; ) // Bucle
{
valor = read_adc();
calcula_voltaje(valor,voltaje); // Entrada parámetro "valor" y
devuelve "voltaje"
calcula_value(voltaje,value); // Entrada parametro "voltaje" y
devuelve "vale"
calcula_pressure(value,pressure); // Entrada parametro "value" y
devuelve "pressure"
lcd_init(); // Inicializa LCD
borra_lcd(); // Borra LCD
printf(lcd_putc,"%f",pressure); // Muestra en el lcd el contenido de la variable "pressure"
delay_ms(100); // Retardo de un 100 ms
}}
-
coloca la sgte linea:
#device *=16
out rom significa que el codigo es muy largo, cosa extraña si el codigo que usas es todo lo que pusiste.
prueba y comenta.
saludos
-
Ok, gracias.
Lo probare y te aviso.
-
Bueno, probe con #device*=16 pero se mantuvo el mismo error... pero podrias explicarme un poco que significa este comando???...y si se te ocurren otras soluciones, bienvenidas!!!!
Muchas gracias de antemano...
-
mira, entiendo que define los punteros en 16bit, crei que optimizaba tanto RAM como ROM, pero no, solo optimiza RAM. Intenete compilar tu codigo pero me da error en el "lcd.c". Si encuentro algo te aviso.
slds