Cambiar de On a Off cada 30 segundos o minutos

Hola a todos, jeje.
Bueno quiero que comprendais que en esto de programar, en C, llevo poco tiempo intentando aprender ya que me encanta.
Tambien decir que uno ya tiene 51 años por lo que me cuesta mas entender muchisimas cosas.
Y ahora el tema:
He hecho un programa en C para encender y apagar 2 leds, uno primero y a los 30 segundos que se apague y se encienda el segundo y asi sucesivamente, se apague uno se encienda el otro.
Tambien me gustaria que fuese cada 30 minutos, pero claro si con segundos no levanto cabeza pues ni os cuento con 30m.
Pongo el codigo: una cosa si me decis que tengo mal tambien me gustaria comprenderlo

Código:
#include <16f877A.h>
#use delay(clock=4MHz)
#include <time.h>
#include <LCD.c>

int tm_sec;

void main(){
lcd_init();                         //INICIALIZA EL LCD
lcd_putc("RELOJ DE 30 S,M");          //IMPRIME EN PANTALLA
lcd_gotoxy(1,2);                    //COLOCA EL CURSOR EN COLUMNA 1 FILA 2
lcd_putc("CAMBIO A 30 S,M");          //IMPRIME EN PANTALLA
delay_ms(3000);                     //ESPERA  SEGUNDOS
                 
while(1){
   if(tm_sec=30){
      output_high(pin_b3);
   }
   else{
   output_low(pin_b3);
   }
   if(tm_sec=30){
      output_high(pin_b4);
      }
   else{
   output_low(pin_b4);
   }
   for(;;);
}   

}
 
Última edición por un moderador:
Buenas miglo!

Mira no voy a entrar en detalle con lo del manejo del LCD, porque no sé que compilador estás usando. Sin embargo, en lo que respecta a lo de los tiempos te doy el siguiente consejo:

1) Al programar es bueno siempre dar un valor a una variable que vayamos a utilizar, a esto se le llama inicializar una variable. Esto se hace antes de que inicie el programa "Main" ya que de no hacerlo la variable puede tomar cualqueir valor. En este caso, tú usaste la variable "tm_sec" pero no la inicializaste, por lo que sería bueno hacerlo. Esto se hace con solo decir " tm_sec=0; " (sin las comillas) y lo pones entre donde creaste la variable y Main.

2) Recuerda que la línea donde dice " delay_ms(3000); " se trata de milisegundos, o sea estas haciendo una pausa de 3 segundos, para mostrar la pantalla y luego sigues con tu programa.

3) En este punto, mi recomendación es que crees otra variable, para minutos, digamos " tm_min ", pues para los segundos ya la tienes (tm_sec) y recuerda inicializarla también. El objetivo de esto es que hagas un contador y se evalue la variable para ver si llegó al tiempo que queremos o no, para que encienda los LEDS.
Fíjate que pones " if(tm_sec=30){ " <- Aquí el programa no sabe de qué 30 estás hablando, porque " tm_sec " no se está incrementando. Debes incrementar tm_sec para que te vaya contando los segundos. Esto lo puedes hacer así:

tm_sec=tm_sec +1 //Incrementa el valor de tm_sec en 1. Por eso es importante iniciaizar la variable para que inicie en 0
delay_ms(1000) // Retardo de 1 segundo que es lo que queremos, que cada segundo se incremente tm_sec

4) Para los minutos lo que haces es que cuando tm_sec llegue a 60, incremente el valor de tm_min en 1 y tm_sec = 0 para que se repita el ciclo.

5) Ahora sí puedes decir que cuando tm_sec=30 haga tal cosa. Lo mismo con el tm_min.

6) También te aconsejo que antes de "Main" le digas al programa si los puertos del microcontrolador son entradas o salidas y especifiques cuales pines lo son y pongas en low los LEDS. Esto con el fin de que no se encienda ninguno al iniciar el programa (cuando empiece la sección "Main")

Suerte.
 
Hola, te voy a tratr de responder, pero que quede claro que no solo soy nuevo en microcontroladores sino que tambien soy nuevo en electronica. Ademas nunca programe pic.
Primero te recomendaria que en esta linea
int tm_sec;
le asignes 0. int tm_sec= 0;
luego si es que delay_ms tiene que durar 30 segundos tendrias que poner 30000.
Por ultimo aqui if(tm_sec=30) estas asignando 30 a tm_sec. Tendrias que poner tm_sec==30 para preguntar si es igual.
Te pongo como quedaria mas o menos tu codigo
Código:
#include <16f877A.h>
#use delay(clock=4MHz)
#include <time.h>
#include <LCD.c>

int tm_sec = 0;

void main(){
lcd_init();                         //INICIALIZA EL LCD
lcd_putc("RELOJ DE 30 S,M");          //IMPRIME EN PANTALLA
lcd_gotoxy(1,2);                    //COLOCA EL CURSOR EN COLUMNA 1 FILA 2
lcd_putc("CAMBIO A 30 S,M");          //IMPRIME EN PANTALLA
output_high(pin_b3);  //pongo un led prendido y otro apagado
output_low(pin_b4);
                 
while(1){
   delay_ms(30000);//espero 30 segundos
   output_toogle(pin_b3);  //cambio estado leds
   output_toogle(pin_b4);
}
}

Para los minutos simplemente pones 60000 y contas 30 veces con un for
Código:
while(1){
   for(int i=0;i<30;i++)
       delay_ms(60000);//espero 1 minuto
   output_toogle(pin_b3);
   output_toogle(pin_b4);
}

Saludos
 
Última edición:
Bueno lm555cm
Por lo que te leo ya he aprendido algo mas lo de empezar por =0
Dices, entre la variable que creè y main, quiero entender que lo que dices es quitar la variable que puesto y poner la que dices ¿verdad?.
Para los segundos me funciona bien, con el de loco91,pero hasta cierto punto.
Pero cuando intento hacer los minutos el compilador me compila bien, entre comillas, ya que me saca 5 warning y enciende el leed del pin b4 cuando yo le digo el del b3 y de hay no pasa, ¿Qué hago mal?
Por descontado te doy las gracias por echarme un cable.
Loco91
Tu explicación la he comprendido perfecta, aunque cuando intento, por probar, poner 120000 ms, que debería ser 2 minutos, no tira mas que asta 69 segundos, supongo que es por que el compilador a partir de ciertos segundos interpreta que pasa a minutos.
Una cosa as olvidado cerrar una llave.
También te agradezco tu ayuda.
Este es el que tengo pero no me cambia cada 2 o 3 o mas minutos :
Código:
#include <16f877A.h>
#use delay(clock=4MHz)
#include <time.h>
#include <LCD.c>


int tm_sec= 0;
int tm_min= 0;

void main(void){
  
lcd_init();                         //INICIALIZA EL LCD
lcd_putc("RELOJ DE 30 S,M");          //IMPRIME EN PANTALLA
lcd_gotoxy(1,2);                    //COLOCA EL CURSOR EN COLUMNA 1 FILA 2
lcd_putc("CAMBIO A 30 S,M");          //IMPRIME EN PANTALLA
                 
while(1){
   tm_sec=tm_sec+1;
   delay_ms(1000);
  if (tm_sec==60){
   tm_min=1;
  }
  if (tm_min=1){
         output_high(pin_b3);
         output_low(pin_b4);
         }                          //pongo led de b3 on y b4 off
  
  if  (tm_min=1+1){
         output_low(pin_b3);
          output_high(pin_b4);
         }                          //led de b3 off y b4 on
 
        }
}
 
Última edición por un moderador:
Hola. delay_ms recibe como parametro un entero largo, es decir de 16 bits.
Ahora 2 a la potencia 16 es igual 65536. Entonces puedes poner un valor entre 0 y 65535.
Por eso es que te puse que para los minutos pongas delay_ms(60000) y esto lo pones dentro de un for de x minutos.
Código:
#include <16f877A.h>
#use delay(clock=4MHz)
#include <time.h>
#include <LCD.c>

int tm_sec = 0;

void main(){
lcd_init();                         //INICIALIZA EL LCD
lcd_putc("RELOJ DE 30 S,M");          //IMPRIME EN PANTALLA
lcd_gotoxy(1,2);                    //COLOCA EL CURSOR EN COLUMNA 1 FILA 2
lcd_putc("CAMBIO A 30 S,M");          //IMPRIME EN PANTALLA
output_high(pin_b3);  //pongo un led prendido y otro apagado
output_low(pin_b4);
                 
while(1){

   for(int i=0;i<2;i++) //aca decidis cada cuantos minutos cambia, en este caso 2 min
       delay_ms(60000);//espero 1 minuto
   output_toogle(pin_b3);
   output_toogle(pin_b4);
}
}

Cualquier otra duda estoy a tus ordenes. Saludos.
 
Última edición:
ahora si que me perdido, quiero que entiendas que llevo poco tiempo intentando comprender como funciona C, me explico:
si pones la orden (for) y segun dices es para cambiar cada 2 minutos ¿que sentido tiene que luego pongas un retardo de 60 segundos?, y el (for) tal como lo has puesto marca error a la hora de compilar.
Una ultima pregunta
output_toogle(pin_b3);
output_toogle(pin_b4);
lo de output_toogle ¿que es?
 
Última edición:
Hola miglo,
Aquí te adjunto un archivo zip que espero te pueda servir.

1) Programa hecho en C que te muestra en una ventana de DOS el conteo.
2) El programa para que veas la lógica y te puedas guiar.
3) Dos diagramas, uno que describa la lógica del contador y otro que como un desglose gráfico del programa.

Espero te sirva y si no, pregunta.



Saludos.
 

Adjuntos

  • miglo.zip
    848.1 KB · Visitas: 20
Hola. Lo del error del for talves sea porque el compilador no lo acepta de esa forma. puedes pinerlo entre llaves
Código:
for(int i=0;i<2;i++) {
       delay_ms(60000);
}
El for no es el que hace el retardo. Lo que hace el for es repetir dos veces el retardo de un minuto. El primer parametro del mismo es para inicializar la variable. En este caso la pones en 0. El segundo parametro es la condicion para ejecutar el bloque de nuevo. El tercero es el incremento.
Te pongo los pasos que haria el programa.
1-Inicialmente asigna 0 a i;
2-Pregunta si i<2. Como i es igual a 0 ejecuta el bloque e incrementa i en uno.
3-Pregunta si i<2. como i=1 ejecuta el bloque e incrementa i en uno.
4-Pregunta si i<2. como i=2 no ejecuta el bloque.
En total el bloque se ejecuto 2 veces. Como el bloque solo contenia un retardo de 1 minuto y se ejecuto 2 veces, en total te dio un retardo de 2 minutos.
output_toggle cambia el estado de la salida. Es decir si la salida estaba en uno la pone en 0. Si estaba en 0 la pone en uno.
Saludos.
 
Última edición:
Hola y disculpar por no contestaros, estaba ocupado aprendiendo leyendo y haciendo pruebas para intentar comprender, ya que si no comprendes el por que de las cosas no avanzas nada, de hay que pregunte y pregunte, espero que no os incomode con tanta pregunta.
Lm555cn:
He mirado lo que me pasaste y mas o menos eso es lo que quisiera hacer, pero que, por ejemplo, cuando llegue a 51minutos, por referencia a mi edad je jeje, que cambie y se ilumine un led y vuelva a empezar el conteo asta, otra vez 51 y cambie, apagándose ese led y encendiendo el otro y así sucesivamente asta el infinito o cuando yo haga un reset.
Mi interés esta en trasladarlo a C y comprenderlo.
Loco91:
Te explico, por lo que tengo leído ya tengo claro que el for no es un retardo si no una manera de repetición.
En tu sentencia:
for(int i=0;i<2;i++) {
delay_ms(60000);
}
Lo de <2 eso lo entiendo pero i<2 ¿Qué es la i delante de<2? o de ++ o i=0.
Estoy empezando a comprender lo de las variantes, pero tela para quedarme con la copla, ya que por mucho que leo no veo explicación que un principiante como yo le sea fácil de entender, mas aun si cuando lo que leo, luego cuando lo uso en el compilador, para comprender, me da errores asta artarme, que es lo que me ocurre con esa sentencia que tu me pones que me da errores uno tras otro.
Mira este ejemplo que me descargado de un pdf de aprender C y al compilar me da un montón de errores y con la modificación que hecho compila bien con un solo warning.
Si lo hago así:
que se como esta en una lectura
Código:
main(){
int edad;
printf(“Ingrese su edad: \n”); 
scanf(“%d”, &edad);
if (edad>=18)
   {
     printf(“Usted es mayor de edad. \n”); 
   }
else
   {
      printf(“Usted es menor de edad. \n”);
    }
}
no compila y todo es un caos.

Ahora si lo hago así: 
Este ejemplo me lo he hecho yo

main(){
   int edad=17;
   lcd_init();
lcd_putc("\fIngrese su edad: \n");
delay_ms(1000);
printf(lcd_putc"\f%d",edad);
delay_ms(1000);

if (edad>=18)
   {
     lcd_putc("\fUsted es mayor de edad. \n");
     output_high(pin_b3);
   }
else
   {
     lcd_putc("\fUsted es menor de edad. \n");
     output_high(pin_b4);
    }
}

Entonces si compila bien
 
Última edición por un moderador:
Hola nuevamente miglo, al leer tu último mensaje creo que tienes una confusión y es mejor aclararla para que no creas que estás haciendo las cosas mal y te frustres.

1) El programa que te envié, así como este último ejemplo que pones que viste en una lectura están hechos en lenguaje C.

2) Existen varios compiladores, que son programas que traducen el programa que tú creas para que lo entienda la máquina, que pueden tener algunas variaciones entre unos y otros. En este caso, la lectura que utilizas, así como lo que te envié y el ejemplo que te ha puesto loco91 sirven perfectamente para los compiladores de una computadora personal sin problema. Pero en tu caso, tú estás haciendo un programa para un microcontrolador, por lo que hay ciertas funciones que no te van a servir, porque o no las entiende el compilador, porque se pueden escribir diferente o porque el compilador utiliza alguna función o comando que es el equivalente de la función que quieres usar. Por ejemplo el printf te muestra en pantalla (monitor) de computadora el texto que escribas, pero en tu caso falla al compilarlo, porque tú no vas a mostrar en un monitor ese texto, lo vas a mostrar en una pantalla LCD, por lo que la situación cambia, por eso te da errores, pero cuando tú utilizas lcd_putc el compilador si lo entiende y el programa te funciona, pues te muestra el texto en la pantalla LCD.

3) Cada programador tiene su estilo de programar, así que hay más de una manera de pelar al gato como dicen. Por lo que yo tengo una forma, loco91 tiene otra y tú también tienes la propia.

Espero haberme explicado, y te aclare un poco más el por qué los ejemplos de la lectura no te dan el resultado esperado y por eso te muestra errores al compilar.

Sí te digo que sería de gran ayuda que indiques el nombre del compilador que estás utilizando y su versión y leas el manual que traía el compilador que utilizas para que veas cómo se escriben y cuáles funciones entiende tu compilador. Ya con el nombre y si existiera un manual en PDF que se pueda descargar, estoy seguro que más de uno en la comunidad te puede ayudar más fácilmente, incluso hasta pueden haber otras personas que utilizan el mismo compilador.

Finalmente, con lo que pusiste en el primer mensaje te pongo el siguiente código. La idea es que los LEDs prendan y apaguen de forma alterna cada 30 segundos y te muestre en el LCD los segundos y minutos. No sé si te sirva, es una prueba, si te da error por los comentarios (empiezan por // ) quítalos.

#include <16f877A.h>
#use delay(clock=4MHz)
#include <time.h>
#include <LCD.c>

// DEFINIMOS LAS VARIABLES Y LES ASIGNAMOS UN VALOR

int seg=0;
int min=0;

// INICIALIZAMOS LA PANTALLA LCD

lcd_init();

//Encendemos un LED y el otro lo apagamos

output_high(pin_b3);
output_low(pin_b4);

// EMPEZAMOS EL PROGRAMA PRINCIPAL

void main()
{

CONTADOR: //CONTADOR ES UNA ETIQUETA PUEDES USAR CUALQUIER OTRO QUE QUIERAS
{
seg=seg+1;
lcd_putc("Segundos: %d", seg);
lcd_gotoxy(1,2);
lcd_putc("Minutos: %d, min);
delay_ms(1000);

if (seg==30) goto seg_30;
if (seg==60) goto seg_60;

goto CONTADOR; }

seg_30: {
output_low(pin_b3);
output_high(pin_b4);
goto CONTADOR
}

seg_60: {
output_high(pin_b3);
output_low(pin_b4);
seg=0;
min=min+1;
goto CONTADOR
}

}


Felicidades porque has avanzado bastante, no te des por vencido! ;)
 
Hola. Primero aclaro que coincido con lm555 con que seria mejor que pongas el compilador que utilizas asi te podemos ayudar.
Segundo te digo que i es una variable auxiliar que uso para el for.
for(int i=0; i<2;i++){
...
}

Cuando pongo int i=0 estoy creando una variable tipo entero e iniciandola en 0. Esta variable dejara de existir al salir del for.
i<2 quiere decir que el bloque del for (lo que esta entre llaves ) se va a ejecutar siempre que se cumpla esa condicion. Por ultimo poner i++ incrementa la variable i en 1.
Seria lo mismo que poner
for(int i=0; i<2;i=i+1){
...
}
Te sugiero que releas lo que te escribi anteriormente que ahi te pongo los pasos que ejecutaria tu programa en el for.

Otra cosa es que me parece raro que tu compilador no acepte alguna de las instrucciones que te puse en mi mensaje anterior, por lo que seria mejor que nos digas cual es tu compilador.

Otra cosa es que como te dice lm555cn c es un lenguaje que sirve para programar un monton de cosas como pc, tablets, celulares, micros, etc. Lo que nunca varia de programar entre un dispositivo u otro es la sintaxis basica de c. Por ejemplo los ciclos for,repeat,while o los condicionales if,else. Pero lo que tenes que tener en cuenta es que lo que mas suele variar entre los distintos dispositivos y compiladores son las funciones. Por ejemplo printf es una funcion para programar en pc.

Te aliento a que sigas con esto ya que si bien al principio es medio dificil, luego se te va a hacer mas facil y cuando lo entiendas vas a darte cuenta la cantidad de cosas que podes hacer.

tal vez el problema sea el output_toggle

pone asi a ver si funca.
Código:
#include <16f877A.h>
#use delay(clock=4MHz)
#include <time.h>
#include <LCD.c>



void main(){
lcd_init();                         //INICIALIZA EL LCD
lcd_putc("RELOJ DE 30 S,M");          //IMPRIME EN PANTALLA
lcd_gotoxy(1,2);                    //COLOCA EL CURSOR EN COLUMNA 1 FILA 2
lcd_putc("CAMBIO A 30 S,M");          //IMPRIME EN PANTALLA

boolean b3_encendido = 0;

while(1){

   if(b3_encendido){
       output_low(pin_b3);    //apago b3
       output_high(pin_b4);  //enciendo b4
   }
   else{
       output_high(pin_b3);    //enciendo b3
       output_low(pin_b4);  //apago b4
   }
   b3_encendido = !b3_encendido;
  
   for(int i=0;i<2;i++){ //aca decidis cuantas veces repetis el retardo, en este caso 2
       delay_ms(60000);//espero 1 minuto
   }

}
}


Saludos y aca estaremos ante cualquier duda.
 
Última edición:
Hola, loco91
Espero que no canses de explicarme mis dudas que sigo teniendo y mas aun cuanto mas leo.
El compilador es CCS C Compiler V.4, que pienso que va bien para aprender.
Con la explicación que me has dado sobre “for(int i=0; i<2;i++){…}, he visto que estoy mas verde que una alcachofa sobre programación en C, ahora que como bien dices cuanto mas leo mas me encanta. Creo que para llegar a, por ejemplo hacer el programa que has puesto anterior no hubiese sido capaz, así de simple. Estoy muy verde todavía.
Te comento: el compilador que tengo en el pc instalado si pongo por ejemplo:
lcd_putc (“segundo:%d”, seg); como has puesto tu, me dice que pa mi tía, pero si pongo
printf (lcd_putc,”segundos:%d, seg); entonces perfecto , si es para escribir texto, el que sea con poner lcd_putc(“texto”);, perfecto pero si he de poner cosas como: (“segundos:%d”,seg) debe ser con: printf( lcd_putc, “segundos:%d”,seg) sino error al canto.
Otro ejemplo: si pongo como has puesto tu,

lcd_init (); // INICIALIZAMOS LA PANTALLA LCD
output_high (pin_b3); //Encendemos un LED y el otro lo apagamos
output_low (pin_b4);

antes de iniciar el programa de void main me marca error, pero si lo pongo después de iniciado el programa de void main entonces tira perfecto, corrigiendo, eso si, y espero que no te moleste lo de lcd_putc para el tema de lcd y que después de goto CONTADOR en un par de ellos se te olvido poner ; punto y coma y me marcaba error.
Fíjate si estoy verde que por ejemplo, la sentencia if (seg = =30) goto seg_30; o goto CONTADOR es nuevo para mi.
Te quiero hacer 2 ultimas preguntas que espero no te importen, goto ¿que quiere decir?,
Por que lo traduzco y me sale goto, lo de la i en el for empiezo a comprenderlo, aunque me va a costar, y la otra pregunta es: el programa tal y como lo has puesto tira, pero no para, continua contando visto en proteus, y claro si yo lo que quiero, por ejemplo, es que cada 8 o 12 o 20 minutos, los que sean, comience el ciclo de nuevo ¿como lo hago?, los segundos si se reinician de 0 pero los minutos continúan sumando.
Gracias por estar hay y creo que ya vale de preguntarte y voy a leer más sobre el tema.
 
Tu problema es el entendimiento basico del lenguaje C, te recomiendo que busques algun tutorial sobre ANSI C que es la base para ese tipo de programacion, tambien puedes encontrar tutoriales en este foro que explican cada una de las sentencias:

https://www.forosdeelectronica.com/f24/curso-programacion-c-microcontroladores-pic-10796/
https://www.forosdeelectronica.com/f24/programas-pic-c-compiler-tutorial-21770/

if, for, goto, while y switch, son estructuras de control, deciden a donde dirigir el programa en base al resultado de una ecuacion logica:

if es para toma de decisiones if(x) {} ejecutara todo lo que se encuentre entre las llaves cuando X es verdadero, si pones if(x) {} else {} se ejecutara todo dentro del primer juego de llaves si x es verdadero, pero si es falso se ejecutara lo que este en el segundo juego de llaves

for es para contadores, for(exp1,exp2,exp3) {} crea un contador con exp1, ejecutara todo lo que encuentre dentro de las llaves mientras exp2 sea verdadera, e incrementara el contador conforme a lo que le indiques en exp3

while (x) {} y do {} while(x) ejecutaran todo lo que se encuentre dentro de las llaves mientras x sea veradera

finalmente switch (x): case (a), case (b), case (c), ...., case (else) evaluara x y si es igual a alguna de las condiciones case (x=a por ejemplo) ejecutara todo lo que se encuentre dentro del case hasta encontrar una instruccion break, si x no es igual a ningun valor ejecutara lo que se encuentre en case else

la instruccion goto se incluye por compatibilidad pero en realidad esta prohibida por el estandar C, basicamente es un salto incondicional a cualquier parte del programa, pero no se debe usar ya que rompe con la base de la programacion estructurada, el encontrarla dentro de algun codigo significa que el programador no supo como estructurar esa parte del programa
 
Coincido con chico3001 que deberias aprender la sintaxis de c. El conteo de los minutos y segundos se puede lograr de muchas maneras y todo depende de lo que quieras hacer y la precision que necesites.
En cuanto al manejo del lcd yo copie y pegue tu codigo, asi que no se si esto esta bien. Igual aunque yo no programo pic a simple vista no veo error en el manejo del lcd. De todas maneras te recomiendo que como estas empezando no intentes hacer todo a la vez. Por otra parte como dice chico3001 trata de no usar el goto. Ademas todo lo que se puede hacer con goto se puede hacer con funciones y ciclos.
Saludos
 
Última edición:
Hola chico3001,
Estoy contigo con lo de que, lo que me falta es leer mas, ya he leido y reeleido los dos documentos que me indicas, me encanta leer temas de electronica, seguro que lo que me pasa es lo mismo que cuando estudie electronica en tv video y demas, ya que aunque no tengo titulo soy tecnico en electronica, (de hecho trabajaba en ello), en estos momentos un poco retirado por circustancias de crisis, aunque afortunadamente, y toco madera, tengo trabajo, con la que esta cayendo, que tenia que leeerme una leccion, aveces, asta 5 veces, jejeje, uno que es duro de mollera, pero fijate, entendido ciertos aspectos mejor como lo has explicado tu que como lo leo, por ejemplo, de los temas que me indicas mas arriva, voy a seguir tu consejo y me voy a meter un tiempo de lleno con ASCI C que por cierto no habia leido nada.
loco91 gracias por estar hay, y haberme hechado un cable para intentar comprender C, te comento que en lo referente a lcd me defiendo, creo yo, vastante bien, y eso que al principio cuando veia, por ejemplo, dentro de un texto los simbolos &d u otros similares, se me hacia oscuro, lo primero que me preguntaba era ¿y eso que quiere decir, por que se pone hay?, ahora con el paso del tiempo y lo que que voy aprendiendo,con la lectura y la ayuda vuestra, ya si que se lo que significa y el por que esta hay, de hecho, tengo hecho el termostato con DS18B20 que lo uso para controlar la temperatura en el proceso de biodiesel, que me hago para mi uso particular, que si os interesa os expicare mas adelante lo sencillo que es hacerlo y la alta pureza del mismo, mejor que el que se vende, modestia aparte.
Bueno lo dicho gracias y a leer, espero que si en el futuro tengo dudas podais estar hay, si no os molesta.
 
Bueno miglo, en tu anterior mensaje parece que me confundiste con loco91, ja ja ja.
Y en lo que resepcta a los errores que encontraste, no me molesta para nada, por el contrario, felicidades! Eso indica que logras comprender un poco mejor el lenguaje y puedes detectar ciertos errores y corregirlos.
Como te había dicho anteriormente, hay más de una forma de pelar al gato, y cada quien tiene su forma de programar. Es por ello que como indican loco91 y chico3001 se pueden usar estructaras if-else, while, etc. para realizar una misma función, afortunadamente en programación hay muchas formas de lograr un mismo objetivo. Es cierto lo que indica chico3001 respecto al goto, no es conveniente utilizarlo si se sigue el estándar. Yo te lo puse como una alternativa, ya que es más común al lenguaje que utilizamos diariamente, la función goto significa "ir a" y me pareció que como estabas empezando pues te podría resultar más fácil entender el programa, en fin, a seguir adelante y suerte!

Saludos.
 
Bueno, aunque con un poco de retraso, pero como mas vale tarde que nunca, pues al final consegui lo que pretendia :
"Cambiar de On a Off cada 30 segundos o minutos", en este caso queria que fuese minutos, por que asi el cambio lo hago, en principio, cada 30 minutos, luego mi idea es que sea cada hora.

Código:
#include <16f877A.h>
#use delay(clock=4MHz)
#include <stdio.h>
#include <LCD.c>

                        // Definimos las variables de segundos y 
                        // minutos y asignamos valor de 0
int seg=0;
int min=0;


void main()             // Empezamos el programa principal

{
lcd_init();             // Iniciamos la pantalla lcd

output_high(pin_b3);    // Encendemos el led de B3
output_low(pin_b4);     // Apagamos el led de B4

CONTADOR:               //Ponemos la etiqueta de contador
{
seg=seg+1;
lcd_gotoxy(1,1);        // Iniciamos el lcd en columna 1 fila 1

printf(lcd_putc,"   Segundos: %d   ",seg);
delay_ms(1000);
lcd_gotoxy(1,2);        // Iniciamos el lcd en columna 2 fila 1

printf(lcd_putc,"    Minutos: %d   ",min);
delay_ms(1000);


if (seg==60) goto seg_60;
if (min==30) goto min_30;
if (min==60) goto min_60;

goto CONTADOR; }

seg_60: {
seg=0;
min=min+1;}

goto CONTADOR;

min_30:{
output_high(pin_b4);       // Encendemos el led de B4
output_low(pin_b3);        // Apagamos el led de B3
seg=0;
min=min+1;}

goto CONTADOR;

min_60:{
output_high(pin_b3);       // Encendemos el led de B3
output_low(pin_b4);        // Apagamos el led de B4
seg=0;
min=0;}

goto CONTADOR;
}
 
Última edición por un moderador:
Atrás
Arriba