Autor Tema: Contar 10 pulsos y encender led  (Leído 23061 veces)

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

Desconectado doppel

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1534
RE: Contar 10 pulsos y encender led
« Respuesta #45 en: 27 de Septiembre de 2005, 01:21:00 »
Hola LORDlafebre! y morfeus!

impecable explicacion y ejemplos!! FELICITACIONES!!RebotadoRebotado


SALUDOS

" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Contar 10 pulsos y encender led
« Respuesta #46 en: 27 de Septiembre de 2005, 10:16:00 »
Hola:

Solo una cosa a parte de esto que te queria comentar desde una cosa que lei en unos de tus posts...

Primero no es que preguntes estupideces de hecho es la unica forma de aprender : "preguntando" o almenos eso creo yo. y no te trates de tonto a ti mismo... recuerda que somos humanos y cometemos errores creo que a todos nos pasa ademas recuerda que nadie nace sabiendo, es de los errores de donde se aprende...

Suerte con el codigo...! Sonrisa Gigante

Giovanni Lafebre.

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #47 en: 27 de Septiembre de 2005, 18:41:00 »
Hola Lord,

Pues es excelente el codigo funciona de maravilla, muchas gracias por tu ayuda y recibe de mi parte un gran saludo. A proposito, he estado haciendo el codigo para un cargador de baterias "inteligente" para niquel metal cuando tenga el codigo bien estructurado lo subo para que lo veas y me des tu valiosa opinion.

La idea es un cargador que detecte cuando la bateria este cargada y corte la corriente para que no se sobrecargue, ademas le pienso colocar otras cositas que tengo en mente.


Un gran abrazo

morfeus

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Contar 10 pulsos y encender led
« Respuesta #48 en: 27 de Septiembre de 2005, 18:47:00 »
Hola:

Felicidades... me alegra que el codigo te sirva, por lo que veo esto es todo lo que quieres hacer...! entonces creo que es caso cerrado...! Rebotado

Por lo del cargador de baterias suena bien... cuando quieras puedes abrir un nuevo hilo con ese tema para no mezclar las cosas y asi la demas gente tambien pueda ver y que le sirvan tus aportes...! Sonrisa Gigante

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #49 en: 27 de Septiembre de 2005, 20:43:00 »
Hola Lord,

Pues creo que si podemos decir que es caso cerrado, estoy en la tarea de habilitar un pulsador y 1 led para borrar la memoria y seria asi:

Para borrar los datos en la memoria pongo un pulsador conectado a negativo y en RB7 con una resistencia de 10k conectada a positivo, el led lo conecto en RB6 y para hacer el borrado oprimo el pulsador antes de encender el circuito, lo enciendo y para indicar que  fue un exito hago destellar el led por un segundo.

La idea es que cuando el RB7 reciba un pulso negativo borre la memoria.

Como te parece ?.

morfeus

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Contar 10 pulsos y encender led
« Respuesta #50 en: 27 de Septiembre de 2005, 21:10:00 »
Hola:

esta bien pero eso tienes que hacerlo con el circuito encendido, y lo unico que tienes que hacer es preguntar el estado del pin que estaria conectado al pulsante y dentro de ese condicional haces que salte a la subrrutina gravar...!

Cuentame como te va... ok?

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #51 en: 27 de Septiembre de 2005, 22:28:00 »
Hola Lord,

Le adicione al codigo el boton para borrar la eeprom, oprimes el pulsador con el circuito apagado y al encenderlo y soltar el pulsador la memoria se pone en cero, que otra forma hay para poder borrar la eprom con el pulsador?.



"Contador de 10,20,30,40 pulsos con señalizacion en
"LCD y leds
"Codigo realizado por:
"MORFEUS - Colombia
"Giovanni Lafebre (LordLafebre) - Cuenca - Ecuador

"-----CONFIGURACION DEL LCD
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
"----DEFINICION DEL VALOR DE OSCILADOR A UTILIZAR
define OSC 4

"---------VARIABLES UTILIZADAS
Cont var byte "VARIABLE PARA EL 1º CONTEO
Cont1 var byte"VARIABLE PARA EL 2º CONTEO
Cont2 var byte "VARIABLE PARA EL 3º CONTEO
Cont4 var byte "VARIABLE PARA EL 4º CONTEO
temp var byte "VARIABLE PARA ALMACENAR DATO EN LA EEPROM Y SABER SI EL
              "PROGRAMA SE ESTA EJECUTANDO LA PRIMERA VES
             

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" ESTE BLOQUE SE ENCARGA DE BORRAR LOS VALORES RETENIDOS EN LA    ""
" EEPROM, PARA INICIAR DE NUEVO EL CONTEO EN LAS ENTRADAS SE          ""
" OPRIME EL PULSADOR CON EL CIRCUITO APAGADO Y UNA VEZ ENCENDIDO""
" AL SOLTAR EL PULSADOR LA MEMORIA ESTARA EN CER0.                             ""
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
                                           
LED   VAR PORTB.6  " LED INDICADOR
borra var PORTB.7  " PULSADOR CONECTADO A GND
low led            " LED=OFF
   
    if borra=0 then " SI PULSADOR ES PRESIONADO BORRA LA MEMORIA
        write 1,0
        write 2,0
        write 3,0
        write 4,0
        high led     " LED = ON
        pause 1000   "
        low led      " LED=OFF
        endif        "
       
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
       
"----CONFIGURACION DEL PUERTO C 4 PRIMEROS BITS COMO ENTRADA LOS 4
"ULTIMOS COMO SALIDA

TRISC=%00001111

"TIEMPO DE ESPERA PARA EL LCD
pause 250


"mensaje para mostrar el estado de los 4 pulsadores
LCDOUT $FE,1,"#01 #02 #03 #04"
LCDOUT $FE,$C0,"000 000 000 000"

"se asigna 0 a la primera posicion de la eeprom(0) sirve para indicar que nunca
"se ha ejecutado este programa
eeprom 0,[0]

"carga el valor de la eeprom de la direccion 0 en la variable temp
read 0,temp

"si el programa nunca ha sido ejecutado salta a la subrutina grabar
if temp=0 then grabar

"lee los estados de la posicion de memoria para saber los valores
"de los contadores
read 1,cont
read 2,cont1
read 3,cont2
read 4,Cont4

"muestra en el lcd los valores de las variables
lcdout $FE,$C0,dec3 cont
lcdout $FE,$C4,dec3 cont1
lcdout $FE,$C8,dec3 cont2
lcdout $FE,$CC,dec3 Cont4

"condicional para saber si ha contado 10 veces
if cont >= 10 then
gosub EncenderLED
endif
"condicional para saber si ha contado 20 veces
if cont1 >= 20 then
gosub EncenderLED1
endif
"condicional para saber si ha contado 30 veces
if cont2 >= 30 then
gosub EncenderLED2
endif
"condicional para saber si ha contado 40 veces
if Cont4 >= 40 then
gosub EncenderLED3
endif
"si estas condiciones se cumplen salta a cada subrutina descrita


"programa principal
loop:
"todos los siguientes condicionales funcionan de la misma manera
"pero con diferentes pines y variables, pero el concepto es el mismo
"--------------------------------------------------------------------
"si el pulsante en C0 ha sido presionado
    if PORTC.0=0 then
"incrementa al contador en 1    
        cont=cont+1
"almacema en la posicion de memoria el valor actual de cont
        write 1,cont
"si cont iguala o supera a 10(que indicaria que el conteo se ha cumplido)
"entonces salta a la subrrutina que enciende el led para mostrar que el
"conteo se ha cumplido
        if cont >= 10 then
            gosub EncenderLED
        endif
"muestra en el display el valor actual de cont, permitiendo ver el conteo
"exacto, es decir el numero de veces que se a pulsado el boton
        lcdout $FE,$C0,dec3 cont
"tiempo de antirrebote de tecla, para que el conteo no se haga de una manera
"muy rapida
        pause 200
    endif
"--------------------------------------------------------------------
"todos los demas condicionales hacen la misma funcion
"--------------------------------------------------------------------
    if PORTC.1=0 then
        cont1=cont1+1
        write 2,cont1
        if cont1 >= 20 then
            gosub EncenderLED1
        endif
        lcdout $FE,$C4,dec3 cont1
        pause 200
    endif

    if PORTC.2=0 then
        cont2=cont2+1
        write 3,cont2
        if cont2 >= 30 then
            gosub EncenderLED2
        endif
        lcdout $FE,$C8,dec3 cont2
        pause 200
    endif

    if PORTC.3=0 then
        Cont4=Cont4+1
        write 4,Cont4
        if Cont4 >= 40 then
            gosub EncenderLED3
        endif
        lcdout $FE,$CC,dec3 Cont4
        pause 200
    endif
goto loop
"-------------------------------------------------------

"subrutina para asignar el valor inicial a la eeprom(en este caso se
"inicia desde 0)
grabar:
"enceramos todos los contadores
    cont=0:cont1=0:cont2=0:Cont4=0
    write 0,1
    write 1,0
    write 2,0
    write 3,0
    write 4,0
    goto loop

"estas subrrutinas son para encender los leds y dejarlos encendidos en caso
"de que el conteo ha llegado a su final para cada caso
"asi mismo se asigna el valor maximo de conteo por ejemplo 10 para que en los
"condicionales donde se pregunta if cont1 >= 10 then salten a la subrutina
"adecuada y mantenga encendido el led
EncenderLED:
    high PORTC.7
    cont=10
    lcdout $FE,$C0,dec3 cont    
    return

EncenderLED1:
    high PORTC.6
    cont1=20
    lcdout $FE,$C4,dec3 cont1
    return

EncenderLED2:
    high PORTC.5
    cont2=30
    lcdout $FE,$C8,dec3 cont2
    return

EncenderLED3:
    high PORTC.4
    Cont4=40
    lcdout $FE,$CC,dec3 cont4
    return
end


Que opinas tu?


Saludos

morfeus

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Contar 10 pulsos y encender led
« Respuesta #52 en: 27 de Septiembre de 2005, 22:44:00 »
Hola:

Probaste el codigo...? Hace lo que esperas que haga...?

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #53 en: 28 de Septiembre de 2005, 06:38:00 »
Hola Lord,

Si el codigo funciona y borra la memoria, pero quiero que me expliques la manera en que tu me dices que tambien se puede hacer.

Yo conecte una resietncia de 10 K entre RB7 y positivo y un pulsador entre RB7 y negativo para lograr el pulso bajo que me pide la linea de programa para poder borrar la memoria.


Saludos

morfeus


Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Contar 10 pulsos y encender led
« Respuesta #54 en: 28 de Septiembre de 2005, 09:23:00 »
Hola:

si funciona asi esta bien, depende de como quieras, tambien puedes hacerlo dentro del bucle loop y preguntar el estado de RB7 y cuando sea 0 lo haces saltar a la subrutina grabar.... recuerda que en grabar asignamos tambien cero a todas las variables, prueba esto y cuentame como te va...! Sonrisa Gigante

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #55 en: 28 de Septiembre de 2005, 10:46:00 »
Hola Lord,

Pues anoche hice lo que me dijiste pero no me funciono lo intente de varias maneras y nada, con el codigo que le adicione lo que hace es un reset general y cuando detecta RB7 en cero borra la memoria.

Quisiera conocer otra forma de hacerlo para no tener que hacer un reset general y reiniciar del todo el programa. No he tenido oprtunidad de trabajar mucho con la eeprom pero si muchas ganas de aprender.

saludos

morfeus

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Contar 10 pulsos y encender led
« Respuesta #56 en: 28 de Septiembre de 2005, 11:17:00 »
Hola:

pana morfeus deberia funcionarte mira el codigo que tu pones:

Codigo:
if borra=0 then " SI PULSADOR ES PRESIONADO BORRA LA MEMORIA
    write 1,0
    write 2,0
    write 3,0
    write 4,0
    high led " LED = ON
    pause 1000 "
    low led " LED=OFF
endif  


y mira como es la subrrutina que te decia:

Codigo:
grabar:
"enceramos todos los contadores
    cont=0:cont1=0:cont2=0:Cont4=0
    write 0,1
    write 1,0
    write 2,0
    write 3,0
    write 4,0
    goto loop


es lo mismo solo que falta encender y apagar el led, cosa que no es dificil añadirla.

Prueba a poner esta instruccion en el bucle principal
if borra=0 then " SI PULSADOR ES PRESIONADO BORRA LA MEMORIA
y si se cumple hazla saltar a grabar y tambien ponle el tiempo de encendido del led...

Intentalo si no te funciona pon el codiga para ve que estamos haciendo mal...!



Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Contar 10 pulsos y encender led
« Respuesta #57 en: 28 de Septiembre de 2005, 13:17:00 »
Hola:

Pues ese es el error, recuerda que para que salte a una subrrutina se utiliza GOSUB o GOTO, la diferencia entre las dos es que la primera una ves terminada la subrrutina regresa a la linea siguiente de donde le enviaste a que salte a diferencia de GOTO que continua a linea siguiente de la subrrutina...

Entonces tienes que utilizar:

GOSUB grabar....!

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #58 en: 28 de Septiembre de 2005, 20:59:00 »
Hola Lord,

Listo, ya me funciona muy bien, una última cosa cuando hago el borrado de la eeprom los valores del lcd no van a cero intente borrar el contenido de las cuatro variables pero nada lo que busco es que al borrar la eeprom los contadores del display queden en cero, es como un "refresco" del lcd.

Esto seria lo ultimo.

Gracias


morfeus

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Contar 10 pulsos y encender led
« Respuesta #59 en: 28 de Septiembre de 2005, 21:12:00 »
Hola:

con estas lineas puedes actualizar los datos del lcd....

lcdout $FE,$C0,dec3 cont
lcdout $FE,$C4,dec3 cont1
lcdout $FE,$C8,dec3 cont2
lcdout $FE,$CC,dec3 Cont4

prueba a poner estas lineas en tu codigo y luego me comentas... OK?