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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #30 en: 26 de Septiembre de 2005, 12:18:00 »
Hola de nuevo Lord,

Listo ya tengo armado el circuito en el board.



Saludos

morfeusVacilando

Desconectado LordLafebre

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

Bien ahora prueba este codigo para que veas si todo funciona bien:

Codigo:
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4        

TRISC=%00001111

pause 250

LCDOUT $FE,1,"  LCD INICIADO"
inicio:
    if PORTC.0=0 then
        high PORTC.4
    else
        low PORTC.4
    endif  
    if PORTC.1=0 then
        high PORTC.5
    else
        low PORTC.5
    endif  
    if PORTC.2=0 then
        high PORTC.6
    else
        low PORTC.6
    endif  
    if PORTC.3=0 then
        high PORTC.7
    else
        low PORTC.7
    endif  
    goto inicio
end
 

Lo que hace es mostrar un mensaje en el LCD, y cuando pulses un boton se enciende un led, diferentes botones - diferentes leds.

Con esto estamos seguros de que el circuito funciona ok... Sonrisa Gigante

Desconectado morfeus

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


Perfecto, funciona OK.

Desconectado LordLafebre

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

Bien, ahora prueba el programa anterior que hicimos, y cuentame como podrias hacer para el que necesitas, deme las ideas y yo te ayudo...

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #34 en: 26 de Septiembre de 2005, 12:59:00 »
Hola,

Bueno, voy a quemar neuronas y luego pongo el codigo.

morfeus

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Contar 10 pulsos y encender led
« Respuesta #35 en: 26 de Septiembre de 2005, 13:02:00 »
ok, me parece bien, mientras tanto voy a seguir probando yo...!

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #36 en: 26 de Septiembre de 2005, 15:20:00 »
Hola,

A ver como te parece, inicialmente para RC0, RC1 claro que no he puesto nada del LCD.

morfeus


define OSC 4

Cont    var byte   "VARIABLES PARA RC0
temp    var byte   "VARIABLES PARA RC0

cont1   var byte   "VARIABLES PARA RC1
temp1   var byte   "VARIABLES PARA RC1



TRISC=%00000011      "CONFIGURO RC0,RC1 COMO ENTRADAS
PORTC=0

eeprom 0,[0]

read 0,temp


if temp=0 then grabar
read 1,cont
if cont >= 9 then
    gosub EncenderLED
endif



if temp1=0 then grabar
read 1,cont1
if cont1 >= 20 then
    gosub EncenderLED2
endif

loop:
    if PORTC.0=0 then
        cont=cont+1
        write 1,cont
        pause 200
        if cont >= 9 then
            gosub EncenderLED
        endif
    endif
   


    if PORTC.1=0 then
        cont1=cont1+1
        write 1,cont1
        pause 200
        if cont1 >= 20 then
            gosub EncenderLED2
        endif
    endif
    goto loop

grabar:
    write 0,1
    write 1,0
    goto loop  

EncenderLED:
            high 7
            cont=9
            return

EncenderLED2:
            high 6
            cont=20
            return
end

Desconectado LordLafebre

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

Pues mira:

La variable temp la cree para saber si cuando arranca el micro es la primera ves que esta ejecutando la accion de ser asi asigna a la misma posicion de memoria (0) el valor de 1 para en un futuro indicar que el programa ya se a ejecutado y que la proxima ves el contador empiece desde el valor en el que quedo, por lo que temp1 creo que estaria demas a parte de que estas pregunando si es = 0 y temp1 nunca le hemos asignado un valor... trata de hacer el mismo programa solo con temp y una sola subrutina grabar, alli mismo grava los valores iniciales en la eeprom osea 0 porque es desde ese valor que vamos a empezar...

Desconectado LordLafebre

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

Gracias por los elojios pero yo tambien soy principiante, y no trates de aprender de memoria el codigo sino mas bien de entender que es lo que hace...! lo probaste ya?

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #39 en: 26 de Septiembre de 2005, 19:00:00 »
Tienes toda la razon sobre "no aprender de memoria" debo entender muy bien que hace cada linea.


morfeus

Desconectado morfeus

  • PIC12
  • **
  • Mensajes: 78
RE: Contar 10 pulsos y encender led
« Respuesta #40 en: 26 de Septiembre de 2005, 21:57:00 »
Hola Lord,

Pues te comento que logre en parte agregar la linea del codigo para el #03 esta salida la configure para 30 pulsos el cual me enciende el RC5 pero una vez se visualiza el 30 si sigo pulsando sigue 31,32,33 etc, porque sucede esto?.

Con el #04 lo intente pero no me funciona bien.

Este es el codigo que llevo hasta ahora.

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4        
define OSC 4

Cont     var byte
Cont1     var byte
Cont2    var byte
Cont4    var byte
temp     var byte

TRISC=%00001111
PORTC=0

pause 250

LCDOUT $FE,1,"#01 #02 #03 #04"
LCDOUT $FE,$C0,"000 000 000 000"

eeprom 0,[0]

read 0,temp

if temp=0 then grabar

read 1,cont
read 2,cont1
read 3,cont2
read 4,Cont4


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


if cont >= 10 then
    gosub EncenderLED
endif
if cont1 >= 20 then
    gosub EncenderLED1
endif
if cont2 >= 30 then
    gosub EncenderLED2
endif
if Cont4 >= 40 then
    gosub EncenderLED3
endif


loop:
    if PORTC.0=0 then
        cont=cont+1
        write 1,cont
        if cont >= 10 then
            gosub EncenderLED
        endif
        lcdout $FE,$C0,dec3 cont
        pause 200
    endif
     
    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,$C10,dec3 Cont4
        pause 200
    endif
   
         
    goto loop

grabar:
    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
   
   
EncenderLED:
    high PORTC.7
    cont=10
    return
EncenderLED1:
    high PORTC.6
    cont1=20
    return
   
EncenderLED2:
    high PORTC.5
    cont1=30
    return
   
EncenderLED3:
    high PORTC.4
    Cont4=30
    return
   

end



Desconectado LordLafebre

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

La primera falla esta aqui:

Codigo:
EncenderLED2:
    high PORTC.5
    cont1=30
    return


sigue contando mas de 30 porque no le estas asignando a la variable correcta, tu estas utilizando cont1 cuando deveria ser cont2

Codigo:
EncenderLED2:
    high PORTC.5
    cont2=30
    return


La otra tienes dos pequeños problemas:

lcdout $FE,$C10,dec3 Cont4

esta en esta parte, te comento que el simbolo $ se refiere a numeros hexadecimales y en Hexadecimal no existe el numero C10... la numeracion se maneja asi en hex:

0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F

por lo que corresponderia a $CC que es cuatro espacios mas que $C8 que es en donde imprime el valor anterior.

lcdout $FE,$CC,dec3 Cont4

asi quedaria.

la otra es que debes contar hasta 40 y estabas contando hasta 30

Codigo:
EncenderLED3:
    high PORTC.4
    Cont4=30
    return


por lo que tienes que hacer solamente que cuente hasta 40 y listo:

Codigo:
EncenderLED3:
    high PORTC.4
    Cont4=40
    return


Ahora has los cambio como te lo he mensionado y cuentame como te va....! Sonrisa Gigante

Desconectado LordLafebre

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

Aqui te pongo el programa tratando de describir que es lo que hace cada parte, si no entiendes algo o esta confuso hazmelo saber para aclarartelo....

Codigo:
"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

"----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

Desconectado LordLafebre

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

y como imaginaba el simulador no sirve con la eeprom pero con lo demas si, fue de mucha ayuda...!




Desconectado LordLafebre

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

y aqui una fotito del circuito funcionando OK...!