Autor Tema: CAMBIO DE POSICION DE REGISTROS IZQUIERDA -DERECHA CON PIC 16F84A Y 2 PULSADORES  (Leído 3181 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rino1979

  • PIC10
  • *
  • Mensajes: 2
Buen dia a todos los Picmaniacos, me encuentro en un pequeño problema , tengo trabajando hace mas de un mes con PIC y estoy encasillado en un pequeño incoveniente.
Trato de controlar la direccion de un bit en la salida del puerto B del 16f84A con dos pulsadores , cada ves que presione el pulsador A1 el bit encendido debe correr a la derecha y cada vez que presione el pulsador A2 el mismo bit debe correr a la izquierda sin importar en cual de las salidas del puerto B se encuentro .
Este es el programa que he realizado , pero no me funciona totalmente , cuando presiono el A1 corre por las salidas del puerto hasta el B3 y Cuando presiono el A2 recien enciende el B3 y corre a la izquierda pero ya no enciende el B0.

#include <16f84a.h>                 
#fuses HS,NOWDT,NOPROTECT,PUT       
#use delay (clock=4000000)         
#byte trisa = 0x85
#byte trisb = 0x86
#byte portb = 0x06
#byte OPTION_REG =0x81

void main() {
      int i,reg;           
      disable_interrupts(GLOBAL);    //todas las interrupciones desactivadas
      bit_clear(OPTION_REG,7);
      bit_set(trisa,0);             
      bit_clear(trisb,0);
       bit_clear(trisb,1);
        bit_clear(trisb,2);
         bit_clear(trisb,3);
          bit_clear(trisb,4);

      bit_clear(portb,0);           
         bit_clear(portb,1);
            bit_clear(portb,2);
               bit_clear(portb,3);   
     

do{                           
reg=1;                     
i=1;                         

do{                           //led's on derecha
if(!input(PIN_a0)){                  //¿Se ha pulsado boton A0?
while(!input(PIN_a0));
output_b(reg);               //ilumino led correspondiente
reg=reg*2;
i++;                          //incremento i
}
}while(i<8);

i=1;                       

do{ //led's on izquierda
if(!input(PIN_a1)){           //¿Se ha pulsado boton A1?
while(!input(PIN_a1));
output_b(reg);               //ilumino led correspondiente
reg=reg/2;
i++;                          //aumenta i
}
}while(i<8);

}while(TRUE);                 
}

Cualquier ayuda sera bien recibida , gracias

Desconectado DaYeS

  • PIC16
  • ***
  • Mensajes: 119
   
void main() {
      int i,reg;           
      disable_interrupts(GLOBAL);    //todas las interrupciones desactivadas
      bit_clear(OPTION_REG,7);
      bit_set(trisa,0);             
      bit_clear(trisb,0);
       bit_clear(trisb,1);
        bit_clear(trisb,2);
         bit_clear(trisb,3);
          bit_clear(trisb,4);

      bit_clear(portb,0);           
         bit_clear(portb,1);
            bit_clear(portb,2);
               bit_clear(portb,3);   
     

do{                           
reg=1;                     
i=1;                         

do{                           //led's on derecha
if(!input(PIN_a0)){                  //¿Se ha pulsado boton A0?
while(!input(PIN_a0));
output_b(reg);               //ilumino led correspondiente
reg=reg*2;
i++;                          //incremento i
}
}while(i<8);

i=1;                       

do{ //led's on izquierda
if(!input(PIN_a1)){           //¿Se ha pulsado boton A1?
while(!input(PIN_a1));
output_b(reg);               //ilumino led correspondiente
reg=reg/2;
i++;                          //aumenta i
}
}while(i<8);

}while(TRUE);                 
}

Q tal rino, intente leer el código, pero me pierdo un poco con tantos bucles anidados para un codigo tan sencillo, quiereo decir...

Código: [Seleccionar]

#include <16F84A.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)

void main()
{
   SET_TRIS_A(0x06);    //Todo salidas menos a1 y a2
   SET_TRIS_B(0x00);    //Tadas salidas las del b
   int8 i = 1;
   
   while(1){                        //bucle infinito donde se quedará siempre el programa
      OUTPUT_B(i);
     
      if(!input(PIN_a1) && i < 128){
          delay_ms(500);
          i = i * 2;
      }
   
      if(!input(PIN_a2) && i>1){
           delay_ms(500);
           i = i/2;
      }
   }
}


Por defecto el Global de interrupciones desactivado, por lo tanto ya ta.
Los delays es para los rebotes.
Cuando llega al último se para, tanto del principio como del final.

¿Era eso lo que querias?

Salu2   
Si buscas resultados distintos, no hagas siempre lo mismo. Albert Einstein.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
500ms para los rebotes  :shock:

Generalmente para evitar el efecto del rebote de los pulsadores se espera entre 20 a 30ms y se testea de nuevo:

Código: C
  1. if(input(PIN_A0)==0){
  2.     delay_ms(20);
  3.     if(input(PIN_A0)==0){
  4.  
  5.         // Se ha pulsado...
  6.     }
  7. }

Otro tema es una demora para lograr visualizar algún efecto mediante leds.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado DaYeS

  • PIC16
  • ***
  • Mensajes: 119
500ms para los rebotes  :shock:

Generalmente para evitar el efecto del rebote de los pulsadores se espera entre 20 a 30ms y se testea de nuevo:

Otro tema es una demora para lograr visualizar algún efecto mediante leds.

Saludos!

Jeje, bueno la verdad es que no me explique muy bien, y el código es muy mejorable (era muy tarde  :mrgreen: :mrgreen:).

Efectivamente, no eran rebotes lo que quise decir, es por si dejas pulsado que se vea un efecto y no se haga todo tan rápido que no te de tiempo a verlo, además cumple también para los rebotes.

Como digo el código es muy mejorable, pero quería seguir el patrón de rino y no creo que merezca el ejemplo mucho más.

Gracias por la acaración y salu2
Si buscas resultados distintos, no hagas siempre lo mismo. Albert Einstein.

Desconectado rino1979

  • PIC10
  • *
  • Mensajes: 2
Hola amigo DaYeS, lo que ocurre que cada vez que presione un pulsador debe ir a la izquierda o derecha , segun el pulsador presionado, sin importar la el led encendendido en que posicion se encuentre , no logro hacer eso, gracias por tua amabilidad.


 

anything