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

Temas similares

16/03/2015 #1


¿Cómo cambiar parámetros en C?
Como dice el titulo, me gustaria saber donde documentarme o ver si alguien puede explicarme como se hace ya que estado mirando y no veo nada que me aclare el como.
Me explico mejor, para que se entienda lo que quiero hacer, por ejemplo yo genero un programa creo unos parametros y se pone en funcionamiento el programa, pero por el motivo que sea necesito hacer unas pequeñas modificaciones para ajustar mejor dicho programa y eso es lo que quisiera aprender. Espero haberme explicado bien.
16/03/2015 #2

Avatar de Daniel Meza

Lo más sencillo (en cuestión de porgramación) es reprogramar la aplicación cada vez que necesites cambiar esos parámetros, pero antes ¿qué hace el programa en cuestión?
16/03/2015 #3

Avatar de papirrin

yo genero un programa creo unos parametros y se pone en funcionamiento el programa, pero por el motivo que sea necesito hacer unas pequeñas modificaciones para ajustar mejor dicho programa y eso es lo que quisiera aprender. Espero haberme explicado bien.
pues utiliza esos "parametros" dentro de variables que segun las circunstacias cambien... de otra manera ya estarias dentron de los terrenos de la inteligencia artificial.
17/03/2015 #4


Daniel Meza dijo: Ver Mensaje
Lo más sencillo (en cuestión de porgramación) es reprogramar la aplicación cada vez que necesites cambiar esos parámetros, pero antes ¿qué hace el programa en cuestión?
Código PHP:
#include <16F877A.h>
#fuses XT,NOWDT,PUT,NOBROWNOUT,NOLVP
#use delay(Clock = 4MHz)


#include <1Wire2.c>
#include <lcd420.c>
#include <DS18B20-2.c>
  
 
float temp1,temp2;
 
int a,b;
  
 
void ajustes(void);
 
void temperaturas(void);
 
void main()
     {
  
 
lcd_init();

   
Setup_ADC_Ports(NO_ANALOGS);
   
Setup_Comparator(NC_NC_NC_NC);
           
       
lcd_gotoxy(1,1);
        
lcd_putc(" SENSOR DIGITAL ");  
         
      
lcd_gotoxy(1,2); 
       
lcd_putc(" SENSOR DIGITAL "); 
        
delay_ms(100);
   
   
temp1 =DS18B20_read(0);  // Lee el sensor DS18B20
   
temp2 =DS18B20_read(1);  // Lee el sensor DS18B20        
     
   
while (true)
       {
   
   if(
input(pin_d0))
       {
   
delay_ms(100);
    
ajustes(); 
       }
      
     
lcd_gotoxy(1,1);
     
printf(lcd_putc,"SENSOR Nß1..%02.0fßC",temp1); //Enseña sensor Nº1 
     
lcd_gotoxy(1,2);
     
printf(lcd_putc,"SENSOR Nß2..%02.0fßC",temp2); //Enseña sensor Nº2 
          
}
        }
   
  
void temperaturas(void)
   
        {
      while(
true)
        {
   
temp1 =DS18B20_read(0);  // Lee el sensor DS18B20                                               
   
temp2 =DS18B20_read(1);  // Lee el sensor DS18B20   
   
    
lcd_gotoxy(1,1);
     
printf(lcd_putc,"SENSOR Nß1..%02.0fßC",temp1); //Enseña sensor Nº1 
     
lcd_gotoxy(1,2);
     
printf(lcd_putc,"SENSOR Nß2..%02.0fßC",temp2); //Enseña sensor Nº2 
   
    
if (temp1>=a)       // Comprueba sensor Nº1
        
{
   
output_high(pin_d1); // Si es igual o mayor que a enciende led
        
}
   else 
        {
     
output_low(pin_d1); // Por el contrario lo tiene apagado
        
}
   
   
    if(
temp2>=b)        // Comprueba sensor Nº2
        
{
     
output_high(pin_d2); // Si es igual o mayor que b enciende led
        
}
    else 
        {
     
output_low(pin_d2); // Por el contrario lo tiene apagado
        
}
       }
      }
   
 
  
void ajustes(void)
      {
      
    while(
true)
        {
      
        
lcd_gotoxy(1,1);
       
printf(lcd_putc,"SENSOR Nß1..%02.0d",a); 
       
       
lcd_gotoxy(1,2);
       
printf(lcd_putc,"SENSOR Nß2..%02.0d",b);
   
  
    if(
input(pin_d4))
      { 
a+=10;delay_ms(200);}  // aumenta a de 10º en 10º
      
    
if(input(pin_d5))
      { 
a+=1delay_ms(200);}  // aumenta a de 1º en 1º
  
    
if (a>60)   // Si al ajustar a pasamos de 60º
         
{
        
a=00;   // Lo pone a 00
         
}
         
    if(
input(pin_d6))
      { 
b+=10;delay_ms(200);}  // aumenta b de 10º en 10º
     
    
if(input(pin_d7))
      { 
b+=1delay_ms(200);}  // aumenta b de 1º en 1º
  
     
if(b>60)  // Si al ajustar b pasamos de 60º
         
{
       
b=00;   // Lo pone a 00
         
}
   
    if(
input(pin_d3))
       {
     
delay_ms(100);  
    
temperaturas();  
        }
       
      }
     } 
Lo que hace el programa es que, si supera una temperatura que, previamente a sido ajustada a cierto rango, se encienda un led.
El programa en si es simple pero me gustaria saber como se hace para, una vez esta en funcionamiento, sin tener que resetear, poder modificar los valores a los que ajustado previamente.
17/03/2015 #5

Avatar de cosmefulanito04

Las alternativas que podrías emplear son:

- Mediante dip switch.

- Implementar un menú que permita modificar el rango.

- Comunicación de algún tipo, USB, RS232 (o alguna de sus variantes diferencial), SPI, I2C, CAN, ethernet, etc. Esto puede incluir la posibilidad de usar un terminal para dicha configuración.

- Mediante la lectura de archivos por ej. en una SD.
17/03/2015 #6

Avatar de chclau

Y yo agregaria... colocar un pote, leer su valor mediante un ADC, y que ese valor sea tu parametro.
17/03/2015 #7

Avatar de Nuyel

Tu programa está mal, usas while(true) en prácticamente todas las funciones, así inicias del main y entras al primer while infinito que manda a ajustes y ahí entra a otro while infinito que manda a temperaturas donde entra a otro while infinito y se queda clavado. el while(true) solo se debe usar una sola ves en el main para lanzar el lazo infinito después de haber configurado todo, los otros usos que se le da es clavar el CPU por algún error (ejecutar una función no controlada y dar como resultado este bucle para evitar que sigua corriendo el programa) pero eso queda a la espera de un reset por el usuario o por el Watchdog Timer, en el remoto caso de que requieras dejar en ciclo hasta cierto evento entonces usa while(variable) no una constante, o mínimo incluye el break; para romper el bucle aunque es recomendado que lo quites.

El resto del programa está bien, en teoría lee el pin (pero para esa configuración deberías usar resistencia pull-down y conectar a VDD el interruptor) y con eso aumenta el valor a comparar, pero como se te atora mientras hace esa operación ya nunca ves el efecto del cambio.

Edito: Viendo que intentas entrar al ajuste como si fuera un menú, si puedes usar el while(true) pero te recomiendo, primero agrega un delay al comienzo, segundo agregar otra comprobación para un botón de salir que lance el break, cámbialo a algo así

Código:
main(){
  ....
  //configurar
  while(true){
    if(botón de ajuste) ajustes();
    temperaturas();
  }
}
Y en tu función ajustes() reemplazas la ultima línea donde dices temperaturas(); por un break; para romper el lazo al presionar el botón y escapar a la ejecución del programa nuevamente. Tendrás que probar con los valores de retraso para ajustarlo, pero esto resuelve tu problema principal.
También elimina el while(true) en temperaturas.
17/03/2015 #8


Vamos por partes Nuyel. Con la programación en C voy poco a poco.
Por vuestras respuestas y más en concreto las tuyas, tengo la impresión de que no me he explicado bien.
El programa me funciona bien, aunque el ejemplo que he puesto es simple.
Lo pregunto porque quiero hacer uno más importante y de ahí mi pregunta.

Dices que sobra el while de temperaturas. Si lo quito, sencillamente no me lee la temperatura.
Si hago lo del break; como dices tú y coloco la función temperaturas dentro del while del main, el resultado es igual que como lo tengo yo.
Vuelvo a repetir que estoy aprendiendo poco a poco.

Hago la pregunta de otra manera para ver si así se entiende lo que quiero aprender.
Lo que me gustaría saber, es. ¿Cómo hacer que cuando ya está funcionando el programa, supongamos que he programado la variable a para 30º y la variable b para 27º, que pueda entrar y reajustar las variables y que en a pueda poner por ejemplo 25º y en b 32º sin tener que resetear y luego que el programa continúe su funcionamiento?
Más o menos como si se utilizase alguna interrupción para hacer esos reajustes.
17/03/2015 #9

Avatar de Nuyel

Por eso, eliminas el While y llamas la función desde el main, así este realiza la comprobación del botón para ver si el usuario intenta modificar el valor, si lo hace entra a la función para ello y se mantiene el while hasta que el usuario presiona el botón para confirmar los cambios, ahí rompe y vuelve al main donde se había quedado, entonces ejecuta su rutina de temperatura, hace lo que tiene que hacer y la termina, ahí vuelve a main donde había quedado y se vuelve a iniciar el while, si el usuario no presiona el botón para cambiar los parámetros se salta esa parte y vuelve a continuar con la de temperatura, y así indefinidamente.

No se si te lo expliqué bien.
18/03/2015 #10


Ajá. Ahora creo haber entendido tu explicación.
De hecho lo he comprobado y es eso precisamente lo que yo buscaba.
Si no es así, corrígeme.
Código:
#include <16F877A.h>
#fuses XT,NOWDT,PUT,NOBROWNOUT,NOLVP
#use delay(Clock = 4MHz)


#include <1Wire2.c>
#include <lcd420.c>
#include <DS18B20-2.c>
  
 float temp1,temp2;
 int a,b;
  
 void ajustes(void);
 
void main()
     {
  
 lcd_init();

   Setup_ADC_Ports(NO_ANALOGS);
   Setup_Comparator(NC_NC_NC_NC);
           
      lcd_gotoxy(1,1);
      lcd_putc(" SENSOR DIGITAL ");  
      lcd_gotoxy(1,2); 
      lcd_putc(" SENSOR DIGITAL "); 
        delay_ms(100);
   
   temp1 =DS18B20_read(0);  // Lee el sensor DS18B20
   temp2 =DS18B20_read(1);  // Lee el sensor DS18B20        
      delay_ms(3000);
  
   ajustes();
    
 
   while (true)
       {
  
   temp1 =DS18B20_read(0);  // Lee el sensor DS18B20                                               
   temp2 =DS18B20_read(1);  // Lee el sensor DS18B20   
   
  
    lcd_gotoxy(1,1);
     printf(lcd_putc,"SENSOR Nß1..%02.0fßC",temp1); //Enseña sensor Nº1 
     lcd_gotoxy(1,2);
     printf(lcd_putc,"SENSOR Nß2..%02.0fßC",temp2); //Enseña sensor Nº2 
    
 if(input(pin_d0))
       {
   delay_ms(100);
    ajustes(); 
  
       }
  
  
    if (temp1>=a)       // Comprueba sensor Nº1
        {
   output_high(pin_d1); // Si es igual o mayor que a enciende led
        }
   else 
        {
     output_low(pin_d1); // Por el contrario lo tiene apagado
        }
   
   
    if(temp2>=b)        // Comprueba sensor Nº2
        {
     output_high(pin_d2); // Si es igual o mayor que b enciende led
        }
    else 
        {
     output_low(pin_d2); // Por el contrario lo tiene apagado
        }
     
       }
      }
   
 
  void ajustes(void)
      {
      
    while(true)
        {
      
        lcd_gotoxy(1,1);
       printf(lcd_putc,"SENSOR Nß1.. %02.0d ",a); 
       
       lcd_gotoxy(1,2);
       printf(lcd_putc,"SENSOR Nß2.. %02.0d ",b);
   
  
    if(input(pin_d4))
      { a+=10;delay_ms(200);}  // aumenta a de 10º en 10º
      
    if(input(pin_d5))
      { a+=1; delay_ms(200);}  // aumenta a de 1º en 1º
  
    if (a>60)   // Si al ajustar a pasamos de 60º
         {
        a=00;   // Lo pone a 00
         }
         
    if(input(pin_d6))
      { b+=10;delay_ms(200);}  // aumenta b de 10º en 10º
     
    if(input(pin_d7))
      { b+=1; delay_ms(200);}  // aumenta b de 1º en 1º
  
     if(b>60)  // Si al ajustar b pasamos de 60º
         {
       b=00;   // Lo pone a 00
         }
   
    if(input(pin_d3))
       {
     delay_ms(100);  
    break; 
        }
       
      }
     }
Gracias.
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.