mantener un valor de un pulsador con pic

Si te refieres un dato en la memoria RAM, pues como te dijo el amigo arriba.

Un ejemplo tonto que hice con un pulsador pero sin uar RAM, ni flags.

Código:
Principal
    btfsc    Pulsador0            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Fin                    ; No. Vuelve a leerlo.
    call    Retardo_20ms        ; Espera que se estabilicen los niveles de tensión.
    btfsc    Pulsador0            ; Comprueba si es un rebote.
    goto    Fin                    ; Era un rebote y sale fuera.
    btfsc    LED0                ; Testea el último estado del LED.
     goto    EstabaEncendido
EstabaApagado
    bsf        LED0                ; Estaba apagado y lo enciende.
    goto    EsperaDejePulsar
EstabaEncendido
    bcf        LED0                ; Estaba encendido y lo apaga.
EsperaDejePulsar
    btfss    Pulsador0            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar    ; No. Espera que deje de pulsar.
Fin
    goto    Principal
 
Hola amigos
Gracias por sus consejos, pero después de un tiempo y echando cabeza pude hacer un código que me funciona como quería el único problema que me quedo es que siempre que comienza la emulación en proteus se prende de una la lámpara la idea es que no prenda hasta que oprima el pulsador……….
Para dar una idea mas clara lo que quiero hacer es un encendido digital con un pulsador (si lo oprimo prende………….si lo vuelvo a pulsar se apaga)

#include <htc.h>
#define _XTAL_FREQ 4000000
__CONFIG(0x2F41);
void main (void){
TRISB=0x00;
TRISD=0x02;
for(;;){
if(RD1==0){
__delay_ms(500);
if (RB0==0){
RB0=1;
}
else RB0=0;
}
}
}
 

Adjuntos

  • uuu.rar
    17.8 KB · Visitas: 38
si quieres que no se prenda la lampara al comienzo del programa entonces después de configurar los puertos enseguida pon rb0=0 y listo, con eso comenzara apagado.
 
Última edición:
Que bueno que lo hallas resuelto, otra forma de hacerlo es con el simbolo de opuesto ~.

haces el if para detectar si se presiono el pulsador y adentro le pones esto:

PORTB.F0 = ~PORTB.F0

Nunca hice esto pero supongo que funcionaria, seria cuestion de probarlo :LOL:.
 
hola

Tengo un proyecto de la universidad y me quede frenado en una parte

quiero que al llegar un 1 en un pin sume solo un numero, es decir haga g++;

El problema esta en que el pin sigue en 1 indefinidamente y el g++; sigue sumando y no es la gracia

quisiera saber una forma para evitar esta suma desmedida ademas, ademas cuando esta en 0 el mismo pin hace otra sumatoria t++ y también quiero evitar la sumatoria desmedida en esta

solo se puede volver a sumar cuando se vuelva a llegar un 1.

Uso PIC 18F4550
ccs
4Mhz
 
Lo que dice Gudino, ni más ni menos.

Puedes guardar el estado del pin en una variable.

Te haces una función que lea el valor del pin. Lo comparas con esa variable. Si es igual, es que no ha cambiado :) y entonces sales de la función. Si ha cambiado, entonces actualizas la variable y haces lo que corresponda con el valor del pin.

Yo la comparación la hago con O exclusivo. Si el valor del pin se mantiene, tengo un cero. Si acaba de cambiar, tengo un uno.

De todas formas, te convendría también implementar un anti-rebotes, si es que el dato lo obtienes de un pulsador. Te vale una simple pausa (con un bucle que no haga nada durante un tiempo) o puedes explorar métodos más complejos (por ejemplo, admitir el dato sólo cuando se haya mantenido un cierto número de ciclos)
 
Última edición:
has algo asi, version asm:

;incrementar registro a cada flanco (SW_A normalmente en 0)
INICIO
btfss PORTA,SW_A
goto $-1
btfsc PORTA,SW_A
goto $-1
incf TEMP
goto INICIO
....................................
sin contar con los rebotes, has primero que lea un 1, y luego espere a q el pulsador vuelva a 0..esa es la idea.
 
hola que tal, busco la forma de presionar un boton muchas veces en un pic y que solo haga el codigo de mi boton una vez no se si me explico es decir validar que el boton solo lo haga una vez si presionas muchas veces el boton, lo unico que eh encontrado es darle un tiempo de retardo al presionar el boton pero no me parece una forma muy eficiente de hacerlo por que si estas mas tiempo dandole muchos botonazos igual falla, mi duda es si hay una forma de lograr validar el boton con un pic? digamos que tengo un boton al RA0 y cada vez que presione el boton me haga mi codigo del boton una vez pero cuando yo presione el boton muchas veces que se haga igualmente solo una vez

Es posible lograr eso con un pic? o solamente se puede depender del tiempo para lograrlo?
 
Hola miguelfgp, claro que se puede. Con que compilador estás trabajando? Puedes inicializar una variable tipo bit y luego cuando detecte el botón y el estado de la variable, le cambias como primera medida el estado a la variable.

ejemplo con Compilador CCS C (asumiendo que al pulsar el botón RA0 va a 1):

int1 var1=true

if(var1 && input(pin_A0))
{
var1 = false;
... resto del código...
}

Luego si más adelante quieres volver a utilizar ese botón, pues vuelves a poner la variable a 1 (true) y listo.

Saludos!
 
Atrás
Arriba