TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: rino1979 en 03 de Junio de 2011, 18:50:38

Título: CAMBIO DE POSICION DE REGISTROS IZQUIERDA -DERECHA CON PIC 16F84A Y 2 PULSADORES
Publicado por: rino1979 en 03 de Junio de 2011, 18:50:38
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
Título: Re: CAMBIO DE POSICION DE REGISTROS IZQUIERDA -DERECHA CON PIC 16F84A Y 2 PULSADORES
Publicado por: DaYeS en 03 de Junio de 2011, 20:43:41
   
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   
Título: Re: CAMBIO DE POSICION DE REGISTROS IZQUIERDA -DERECHA CON PIC 16F84A Y 2 PULSADORES
Publicado por: Suky en 03 de Junio de 2011, 21:52:39
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!
Título: Re: CAMBIO DE POSICION DE REGISTROS IZQUIERDA -DERECHA CON PIC 16F84A Y 2 PULSADORES
Publicado por: DaYeS en 04 de Junio de 2011, 05:25:01
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
Título: Re: CAMBIO DE POSICION DE REGISTROS IZQUIERDA -DERECHA CON PIC 16F84A Y 2 PULSADORES
Publicado por: rino1979 en 06 de Junio de 2011, 20:29:05
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.