Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

02/05/2013 #1

Avatar de EDGAR KAMI

Contador binario con display doble en c usando css pic c
Tengo un problema con este programa necesito hacer que cuente desde el cero hasta 99 y del 99 hasta el cero que con a0 incremente++ y con a1 decremente-- me pueden ayudar esto es lo que tengo hasta ahora.
Código:
#include <16F84A.h>
#fuses NOWDT,XT,NOPUT,NOPROTECT
#use FAST_IO(A)
#use FAST_IO(B)
#use delay(clock=4000000)

   void unidec(con)
   {
      int8 uni=0,dec=0;
    uni=con;
   while (con>9){con=-10;dec++;}
  
   output_b(uni);output_high(pin_b6);delay_us(5);
   output_b(dec);output_high(pin_b7);delay_us(5);
   }

void main()
{
   Set_tris_a(0b00011111);
   Set_tris_b(0b00000000);
   int8 con=0;
   output_b(0b11000000);

{
if(input(pin_a0))
while(input(pin_a0)); 
con++;
unidec(con);
if(con>98) 
con=0; 

if(input(pin_a1))
while(input(pin_a1)); 
con--;
unidec(con);
if(con<0) 
con=99; 
}
}
}
03/05/2013 #2

Avatar de Nuyel

Creo que queda así
Código:
#include <16F84A.h>
#fuses NOWDT,XT,NOPUT,NOPROTECT
#use FAST_IO(A)
#use FAST_IO(B)
#use delay(clock=4000000)


   void unidec(int8 con)
   {
    int8 dec, uni;
    //no estoy seguro de si el PIC soporta estas operaciones, espero que el compilador las resuelva
    dec = con / 10;    //divides el contador en 10 y obtienes las decenas
    uni = con % 10;    //Obtienes el modulo 10 y te quedan las unidades 
   output_b(uni);output_high(pin_b6);delay_us(5);
   output_b(dec);output_high(pin_b7);delay_us(5);
   }

void main()
{
   Set_tris_a(0b00011111);
   Set_tris_b(0b00000000);
   int8 con=0;
   output_b(0b11000000);

   while(1){ //supongo que falto esto
      if(input(pin_a0)){   //¿estas usando resistencia Pull-Down?
         con++;
         if(con >  99){ 
             con=0; 
         }
         unidec(con);
      }
      if(input(pin_a1)){
         con--;
         if(con < 0){
            con=99; 
         }
         unidec(con);
      }
   }
}
Había corchetes que faltaban y un bucle infinito para el código principal, ademas ejecuta la decodificación después del if o intentará decodificar 100 0 -1 sin darse cuenta de que excedió el rango.

Se me olvidaba, en esta configuración por el if para comprobar los pines estas usando Activo=Alto, seria con resistencias pull-down y pulsadores a VDD, o de lo contrario invierte el valor para usar las pull-down, si no al estar los dos arriba va a estar sumando y restando en cada momento.
03/05/2013 #3

Avatar de EDGAR KAMI

Lo que quiero es crear un anti-rebote para que marque solo una señol por pulsacion del push
dejo mi hardware para que me entiendan mejor.
Archivos Adjuntos
Tipo de Archivo: rar PIC16F84A TEK TORRES.rar (17,1 KB (Kilobytes), 61 visitas)
03/05/2013 #4

Avatar de Nuyel

Disculpa pero no uso proteus, ademas voy de viaje con una netbook por lo que tampoco tengo algo para experimentar, este código que puse soluciona lo que dijiste, pero tiene el detalle de que al presionar la secuencia es tan rápida que le da varios avances al numero antes de que sueltes el botón, mi recomendación seria esperar como usando un while(input(pin_a1)){delay(algunos ms);} antes de con++ y con--, con eso el programa esperaría hasta que se suelte el pulsador para continuar la ejecución, es una idea que se me acaba de ocurrir, prueba si te sirve.
26/04/2014 #5


Quisiera que me pudieren ayudar en la programación de un contador estoy usando un PIC16F84, dos displays, dos decodificadores 7447 y un sensor óptico, el MOC70T3.
Lo que quiero que haga es que cuando pases algo por el sensor óptico cuente y si vuelvo a pasar cuente de nuevo y así sucesivamente hasta el 99.

Aquí tengo algo del programa:
A ver si me podrían guiar.
Código:
void main() {
int u,d;
unsigned  short datou=0b00000000;
unsigned  short datod=0b00000000;

TRISB = 0b00000000;
TRISA =0b00000;
PORTA =0;
PORTB =0;
 for (d=0;d<=10;d++)
{      
    datou=0;
    for(u=0;u<=10;u++)
    {
        PortB=datou+datod;
      delay_ms(600);
       datou=datou+0b00000001;

      }
     datod=datod+0b00010000;

 }
}
26/04/2014 #6
Moderador

Avatar de D@rkbytes

jesus123456789 dijo: Ver Mensaje
Quisiera que me pudieren ayudar en la programación de un contador estoy usando un PIC16F84, dos displays, dos decodificadores 7447 y un sensor óptico, el MOC70T3.
Lo que quiero que haga es que cuando pases algo por el sensor óptico cuente y si vuelvo a pasar cuente de nuevo y así sucesivamente hasta el 99.
Si vas a usar un microcontrolador, puedes controlar los 2 displays o más directamente sin usar los 7447,
pero debes usar un método para multiplexar los displays y realizar la visualización del conteo.

Puedes usar la interrupción por desborde del TMR0 para cargar los displays y generar la conmutación.
El conteo lo puedes realizar en el programa principal para que no afecte la visualización.

La rutina de conteo debe ser de tal forma que sólo cuente una vez el paso de un objeto.

Algo así:
#int_timer0
void tmr0_isr (void)
{
muestro_unidades;
retardo;
apago_display_unidades;
activo_display_decenas;
muestro_decenas;
retardo;
apago_display_decenas;
activo_display_unidades;
}

Y para el conteo por activación H To L:

while(!input(pin_xx))
{
conteo++;
obtener_unidades;
obtener_decenas;
while(!input(pin_xx));
}

Para hacerlo de la forma que te menciono necesitas crear una tabla de conversión a 7 segmentos.

Saludos.
17/02/2016 #7


hola
amigos, yo estoy trabajando en lo mismo, pero en mi caso tengo que hacerlo 2 veces, me explico:

tengo que hacer dos contadores del 0 al 99, con 4 display de 7 segmentos

pulsador 1 , cuenta del 0 al 99 con display 1-2
pulsador 2 , cuenta del 0 al 99 con display 3-4

tengo este avance, pero se queda pegado y solo pude configurar un pulsador,,, alguien me podria decir como puedo incluir otro pulsador
Código PHP:
    #include <16f628A.H>
    #fuses NOMCLR
    #fuses INTRC_IO
    #FUSES NOWDT                    //No Watch Dog Timer
    //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
    #FUSES NOPUT                    //No Power Up Timer
    #FUSES NOPROTECT                //Code not protected from reading
    #FUSES NOBROWNOUT               //No brownout reset
    #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD                    //No EE protection
    #FUSES RESERVED                 //Used to set the reserved FUSE bits
    #use delay (clock=8000000)
    #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
    #define display_1     PIN_B6
    #define display_2     PIN_B5 // ok
    #define display_3     PIN_B4
    #define display_4     PIN_B7
    

    
int8 unidades,decenas,uni,dec;                     //Variables de conteo
    
void alarma(void);   
    
// NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
    
int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
    
int tiempo 20;
    
  
   
void visualiza()
 {
   
   
output_a(Numeros[decenas]);
   
output_b(0x53);
   
delay_ms(1);
   
output_a(Numeros[unidades]);
   
output_b(0xA3);
   
delay_ms(1);   

}

void teclas(){ 

  if(!
input(pin_b0)){                     //Esta cerrado el pulsador?
    
delay_ms(5);                          //Si, elimina rebotes
    
unidades++;                           //incrementa unidades
    
if (unidades>9){                      //hasta que sea 9
      
unidades=0;                         //borra unidades e
      
decenas++;                          //incrementa las decenas
        
if(decenas>9){                    //hasta 9
          
decenas=0;                      //borra las decenas
        
}
    }
  }
  while (
input(pin_b0)==0){           //Espera visualizando datos
  
visualiza();                            //mientras la tecla esta presionada
  
}
     
     }



void main(void){                          //Programa principal

output_low(display_1);//RA0 y RA1 entradas
output_low(display_2);
output_low(display_3);
output_low(display_4);
disable_interrupts(GLOBAL);               //activadas interrupciones 
enable_interrupts(INT_RDA);   //Activa interrupción en la recepción
do{                                       //bucle...
     
visualiza();                         //visualiza datos
     
teclas(); 
     
//verifica estado de teclas
}while(TRUE);                             //...infinito 

21/02/2016 #8

Avatar de albertoxx

Algo asi para que tengan una idea es mas facil:

Código:
//devuelve 1 si se pulso la tecla 1 y 2 si se pulso la 2
int EsperarPulso(){
  while(1){
     if( input(pin_b0) ){  //la tecla esta presionada
       delay_ms(5); //esperar algun tiempo a ver si sigue presionada
       if( input(pin_b0) ){//siguio presionada
          while( input(pin_b0) ); //espera hasta que la suelte
          return(1); //todo bien ahora salirse 
       } 
     }

     if( input(pin_b1) ){  //la tecla esta presionada
       delay_ms(5); //esperar algun tiempo a ver si sigue presionada
       if( input(pin_b1) ){//siguio presionada
          while( input(pin_b1) ); //espera hasta que la suelte
          return(2); //todo bien ahora salirse 
       } 
     }

  }
}

void main(){
   while(1){
       Tecla = EsperarPulso();
       if(Tecla == 1){ Contador1++; }
       if(Tecla == 2){ Contador2++; }
       //aqui actualizar el displays
       Decenas = Contador1 / 10; 
       Unidades = Contador1-(Decenas*10);
       //---------echense aqui el codigo para desplegar el valor 1
       Decenas = Contador2 / 10; 
       Unidades = Contador2-(Decenas*10);
       //---------echense aqui el codigo para desplegar el valor 2

   }
}
21/02/2016 #9


gracias amigo
voy a probar el programa que me enviaste, amigo una consulta... tengo un dilema sobre la comunicacion 485, tu me podrias ayudar
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.