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

Temas similares

17/09/2011 #1


Busco ejemplo cambio de rutinas con pulsadores
Hola amigos, ando buscando un ejemplo en C para CCS de cambio de rutinas con dos pulsadores, uno incrementa y el otro decrementa.
Seria algo asi:

inicio en rutina 0:
activo salida x
espero x tiempo
apago salida x

si se pulsa un pulsador, avanzo a retrocedo.

rutina 1:
activo salida x
espero x tiempo
apago salida x

si se pulsa un pulsador, avanzo a retrocedo.

Hice una con switch, case y break, pero se repite la rutina una y otra vez hasta pasar a la siguiente o anterior.
Espero me tiren algo como para ver. Saludos y gracias.
17/09/2011 #2

Avatar de johncaro12

marcelo2112 dijo: Ver Mensaje
Hola amigos, ando buscando un ejemplo en C para CCS de cambio de rutinas con dos pulsadores, uno incrementa y el otro decrementa.
Seria algo asi:

inicio en rutina 0:
activo salida x
espero x tiempo
apago salida x

si se pulsa un pulsador, avanzo a retrocedo.

rutina 1:
activo salida x
espero x tiempo
apago salida x

si se pulsa un pulsador, avanzo a retrocedo.

Hice una con switch, case y break, pero se repite la rutina una y otra vez hasta pasar a la siguiente o anterior.
Espero me tiren algo como para ver. Saludos y gracias.
Aqui hay un ejemplo de como manejar los botones:

Código:
do {
  if (Button(&PORTB, 0, 1, 1)) oldstate = 1;
  if (oldstate && Button(&PORTB, 0, 1, 0)) {
    PORTD = ~PORTD;
    oldstate = 0;
  }
} while(1);
En este ejemplo se lee RB0, en donde esta conectado una botonera; En la transicion de 1 a 0 (cuando se suelta la botonera), PORTD se invierte.

Si puedes postea lo que hiciste, para ayudarte mas.

Saludos
17/09/2011 #3


Gracias por tu ayuda.
Aca pongo parte del codigo, no lo tenia en el momento:



void main() {
char item;
char n_menus = 3;
lcd_init();

while(1){
if(input(pin_a0)){
item++;
delay_ms (300);
lcd_putc("\f"); }

if(input(pin_a2)){
item--;
delay_ms (300);
lcd_putc("\f"); }

if (item>(n_menus-1)){
item=0; }



switch (item) {

case 0:

lcd_gotoxy(1,1);
lcd_putc (" primera ");
lcd_gotoxy(4,2);
lcd_putc ("xxxx");
output_c(0b00100100);
delay_ms(500);
output_c(0b00100000);
delay_ms(500);
output_c(0b00000000); /
break;
case 1:

lcd_gotoxy(4,1);
lcd_putc (" segunda ");
lcd_gotoxy(4,2);
lcd_putc ("xxxx");
output_c(0b00000101);
delay_ms(500);
output_c(0b00100000);
delay_ms(500);
output_c(0b00000000);
break;
case 2:

lcd_gotoxy(4,1);
lcd_putc ("tercera");
lcd_gotoxy(4,2);
lcd_putc ("xxccc");
output_c(0b00000110);
delay_ms(500);
output_c(0b00100000);
delay_ms(500);
output_c(0b00000000);
break;
}

Como decia, la secuencia se repite en lugar de ejecutarce solo una ves como quiero, hasta que se oprima un pulsador + o -.
17/09/2011 #4

Avatar de Basalto

Esas cosas son mejor hacerlas por interrupción, para eso están.
18/09/2011 #5


Eso es lo que creo, pero nunca trabaje con ellas, si tenes algo que me pueda servir como base, te agradecere por ella.Saludos.
18/09/2011 #6

Avatar de johncaro12

con interrupciones se puede hacer... pero si ninca has trabajado con ellas pueden ser un dolor de cabeza..
mira que tienes un lazo infinito while(1) que la verdad, no se donde termina xq le faltan parentesis... si especificas que es lo que quieres que se repita y que no.. seria mejor
18/09/2011 #7


No me percate de eso del while, voy a chequearlo.
No quiero que se repita nada, solo que ejecute cualquier CASE y se detenga en break al a espera de que se presione un pulsador.
Edit, lo del parentesis es un error del copy paste.
18/09/2011 #8

Avatar de johncaro12

creo que ya se porque se repite... lo que pasa es que a lo que se llena un valor al item, ya sea 0,1 o 2, se ejecuta el case, pero el valor de item sigue manteniendose por lo que vuelve a entrar en el mismo case una y otra vez, trata de ponerle un valor default al switch y al salir del switch, cambia el valor de item por uno que sea default para que no entre en ningun case.. me entiendes?
19/09/2011 #9


Entiendo lo de por que se repite, pero no lo de darle un valor default. Como es eso??
Gracias por tu ayuda.
19/09/2011 #10

Avatar de johncaro12

revisa este link:
http://www.aquihayapuntes.com/progra....html?start=16

Ese ejemplo lo sacaste de algun lado o lo hiciste tu?
de todas formas, habra que "optimizarlo"
que programa usas?
19/09/2011 #11


Lo hice yo. No me preocupa que sea un codigo feo, solo quiero que funcione como yo quiero.Uso el ccs.
Lei el enlace, pero no le encuentro uso al default.
Estoy viendo de utilizar GOTO.
Gracias.
21/09/2011 #12

Avatar de johncaro12

si puedes trata de agregar comentarios a lo que hayas hecho para asi entender mejor, si usas proteus, puedes pasarme el esquematico con el archivo .hex para revisar y poder ayudarte mejor..
saludos
26/09/2011 #13


Ok. Gracias por ofrecer tu ayuda.
Aca subo los archivos, las salidas parecen un arbolito de navidad, yo quiero que enciendan solo una ves y quede leyendo los pulsadores.
El encendido de las salidas es cualquier cosa, solo estan a modo de ejemplo.
Archivos Adjuntos
Tipo de Archivo: rar secue.rar (14,5 KB (Kilobytes), 19 visitas)
27/09/2011 #14

Avatar de johncaro12

No te entiendo todavia, lo que quieres es que se borre la pantalla del LCD y que no permanezca encendida mostrando el resultado anterior??? es eso???
Podrias poner exactamente lo que quieres que haga el circuito???
27/09/2011 #15


No. El displey que quede marcando el resultado(en realidad luego lo voy a reemplazar por uno led 7seg), pero que las salidas se enciendan en la secuencia predeterminada solo una vez, que al llegar al break queden apagadas y no que vuelvan a encenderce una y otra y otra vez. Saludos.
28/09/2011 #16

Avatar de johncaro12

De cual salida hablas???? de que puerto???
Si puedes ir avanzando anda haciendo el cambio de LCD a lo del display de 7 seg...
Todavia no me aclaras bien lo que quieres hacer...
Segun parece una simulacion de un automovil...
28/09/2011 #17


Los puertos C.
Nunca maneje un 7 seg, por eso lo dejo para el final.
Es para manejar la caja de cambios de un automovil.
28/09/2011 #18

Avatar de johncaro12

ya... eso se hace con el default en el switch... ahora te pregunto... es necesario que al principio este en neutro???
29/09/2011 #19


Si,es necesario. No entiendo como aplicar el default en el switch. Saludos.
29/09/2011 #20

Avatar de johncaro12

Mira, estoy de apuro... no se si esto funcione.... y no es la forma mas elegante de hacerlo...
No lo compil porque no tengo ese programa, y lo programe a ciegas y bien rapido, asi que no se si funcione como tu quieres, pero pruebalo, y si no funciona, mandame la simulacion a ver que mismo salio...
Saludos

Código:
#include <16f886.h>
#fuses NOWDT,MCLR,PUT,NOLVP,INTRC_IO,PROTECT,
#use delay(clock=4000000)
 #include <LCD3.c>
    

    #use standard_io (C)
    #use standard_io (A)
    
    
     void main() {
     char item;
     char n_menus = 4;
     bit b=1; //Si b=1 nos va a indicar que es la primera vez, si b=0 no es la primera vez
     lcd_init();
     
 while(true){
  if(input(pin_a0)){
   item++;
   delay_ms (300);
   lcd_putc("\f");
   b=1; }
  
  if(input(pin_a2)){
   item--;
   delay_ms (300);
   lcd_putc("\f");
   b=1; }
  
   
   if(item>4){item=4;}
   //if(item<255){item=0;}
   if (item>(n_menus-1)){
   item=0;  }
  
 
   
 switch (item) {
  
   case 0:
   
   lcd_gotoxy(1,1);
   lcd_putc ("  neutro   ");
    lcd_gotoxy(4,2);
    lcd_putc ("xxxx");
    if(b==1){
    output_c(0b00011000); //
    delay_ms(500);
    output_c(0b00000000); //
    }
   break;
   
   case 1:
    
   lcd_gotoxy(1,1);
   lcd_putc ("   primera    ");
    lcd_gotoxy(4,2);
    lcd_putc ("xxxx");
    if(b==1){
    output_c(0b00000100); //
    delay_ms(500);
    output_c(0b00100000); //
    delay_ms(500);
    output_c(0b00000000); //
    }
    break;
    case 2:
    
    lcd_gotoxy(4,1);
    lcd_putc (" segunda ");
    lcd_gotoxy(4,2);
    lcd_putc ("xxxx");
    if(b==1){
    output_c(0b11000000);
    delay_ms(500);
    output_c(0b00000000);
    delay_ms(500);
    }
    break;
    case 3:
    
    lcd_gotoxy(4,1);
    lcd_putc ("tercera");
    lcd_gotoxy(4,2);
    lcd_putc ("xxccc");
    if(b==1){
    output_c(0b11000111);
    delay_ms(500);
    output_c(0b00000000);
    delay_ms(500);
    }
    break;
    
     }
     b=0;
   }
   }
¿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.