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

Temas similares

07/08/2012 #1

Avatar de cmontoya

mantener un valor de un pulsador con pic
Hola amigos
Tengo una duda
Como puedo mantener un valor de un pulsador?? Con pic en C
08/08/2012 #2

Avatar de Scooter

Guardalo en un flag o en una variable
08/08/2012 #3

Avatar de Meta

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
09/08/2012 #4

Avatar de cmontoya

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;
}
}
}
Archivos Adjuntos
Tipo de Archivo: rar uuu.rar (17,8 KB (Kilobytes), 31 visitas)
09/08/2012 #5

Avatar de thenot

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.
09/08/2012 #6

Avatar de cmontoya

thenot dijo: Ver Mensaje
pon rb0=0 y listo
Gracias ya funciono perfecto.....a seguir estudiando mi PIC16f877A
09/08/2012 #7

Avatar de Meta

cmontoya dijo: Ver Mensaje
Gracias ya funciono perfecto.....a seguir estudiando mi PIC16f877A
Diría el sustituto del PIC16F877A, que este ya no se fabrica y salió noticias de la propia Microchip, el fabricante.

El sustituto del 16F877A es el 16F886.

Mirar a partir de la página 71.
10/08/2012 #8

Avatar de cmontoya

Meta dijo: Ver Mensaje
Diría el sustituto del PIC16F877A, que este ya no se fabrica y salió noticias de la propia Microchip, el fabricante.

El sustituto del 16F877A es el 16F886.

Mirar a partir de la página 71.
No lo sabia....... pero aqui en colombia todavia lo vende
11/08/2012 #9

Avatar de Meta

Es bueno saberlo. Aquí en España se vende los dos, claro que el 16F877A cada vez cuesta más conseguirlo. Ya no los fabrican.
12/08/2012 #10


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 xD.
27/09/2012 #11


Duda sobre Pulsadores
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
27/09/2012 #12

Avatar de Gudino Roberto duberlin

Hola Amigo, lo que debes armar es, una subrutina que detecte el flanco o cambio de estado del pin.
27/09/2012 #13

Avatar de Melghost

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)
27/09/2012 #14

Avatar de BKAR

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.
21/12/2012 #15


Duda con un boton en pic16f877a
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?
21/12/2012 #16


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!
22/12/2012 #17


ok muchas gracias compilo en C con el compilador Hi-tech voy a probar lo que me comentas
Respuesta
¿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.