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

Avatar de reyvilla

Muchas gracias amigo torres.

Hola ferdy575, te recomiendo empezar de cero el código ya que a mi parecer te estas complicando mucho al utilizar la interrupción de esa manera, me explico, para que utilizar interrupción para descrementar 3 variables en el loop de interrupción si puedes con una sola hacer lo mismo en el loop principal, por otro lado debes tener en cuenta que de 0 a 59 hay 60 números por lo cual no se toma en cuenta el valor 60 si no a partir de 59, si estas decrementando y estas en 0 el siguiente numero es 59. Si estas incrementando y llegas a 59 el siguiente numero es 0. Ahora para que puedas programar una base de tiempo debes darle un algoritmo de tal manera que empiece a decrementar solo y solo si por lo menos existe 1 segundo en el reloj. De lo contrario para que vas a decrementar si todo es 00:00:00, no tiene sentido. Ademas debes colocar o te recomiendo una entrada que sea como un start por lo mismo de la programación, solo si necesitas que sea preciso, ya que ir programando el tiempo mientras este se va decremnetando tampoco le veo mucha lógica. Aca tu codigo con unas pequeñas modificaciones.

Código:
@ DEVICE pic16F84A  
@ device xt_osc  
define osc 4 

Define	LCD_DREG	PORTB
Define	LCD_DBIT	0
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	4
Define	LCD_EREG	PORTB
Define	LCD_EBIT	5

Symbol Horas = PORTA.0      ; AJUSTE  HORA
Symbol Minutos = PORTA.1    ; AJUSTE MINUTOS
Symbol Segundos = PORTA.2   ; AJUSTE SEGUNDOS
symbol Out = PORTB.7        ; SALIDA CONTROL 

Pulsos VAR byte 
Hrs VAR byte 
Mts VAR byte 
Sds VAR byte 
Disp VAR byte 
Delay VAR byte 
CLEAR
 
TRISB = %00000000 
TRISA = %00001111 

PAUSE 500 


Hrs = 0
Mts = 0
Sds = 0
pulsos = 0


OPTION_REG = %00000101 ; prescaler = 64
ON INTERRUPT GOTO ISR ; IR A RUTINA ISR 
INTCON = %10100000 
LCDOUT $FE, 1 ;LIMPIA LCD

;INCIO DEL PROGRAMA 

LOOP:

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON HORAS CUANDO ES ACCIONADO

IF Horas = 0 THEN
hrs = hrs + 1
ENDIF
IF hrs = 24 THEN 
hrs = 0
Gosub Debounce
ENDIF

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTOS CUANDO ES ACCIONADO
IF Minutos = 0 THEN
Mts = Mts + 1
ENDIF
IF Mts = 59 THEN 
Mts = 0
Gosub Debounce
ENDIF

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON SEGUNDOS CUANDO ES ACCIONADO
if Segundos = 0 then
Sds = Sds + 1
endif
IF Sds = 59 then 
Sds = 0
Gosub Debounce
ENDIF

;RUTINA PARA DETECCIÓN DE CERO
IF hrs = 0 AND Mts = 0 AND Sds = 0 THEN
out = 1
else 
out = 0
endif

;RUTINA PARA MOSTRAR VLORES EN EL lcd DE H:M:S

IF Disp = 1 THEN
LCDOUT $FE, 2
Lcdout "Tiempo de espera "  
LCDOUT $FE,$C4, DEC2 hrs, ":",DEC2 Mts, ":",DEC2 Sds
Disp = 0
ENDIF
GOTO LOOP

; RUTINA DE RETARDO PARA LEER BOTONES 

Debounce:
FOR Delay = 1 To 200
Pause 1 
NEXT Delay 
Disp = 1 
RETURN
; RUTINA PARA EJECUCION DE UN SEGUNDO

DISABLE
ISR:
;RUTINA PARA DETECCIÓN DE CERO
IF hrs > 0 OR Mts > 0 OR Sds > 0 THEN
pulsos = pulsos + 1
IF pulsos < 59 THEN NoUpdate

;RUTINA DE TIEMPO 

Retro:
pulsos = 0
Sds = Sds - 1
IF Sds = 0 AND Mts => 0 then
Sds = 59
Mts = Mts - 1
endif 
IF Mts = 0 AND hRS > 0 THEN
Mts = 59
hrs = hrs - 1 
ENDIF
ENDIF

Disp = 1 
return

; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION

NoUpdate:
INTCON.2 = 0 
Resume
ENABLE 
END
END
11/06/2012 #2122

Avatar de ferdy575

Reyvilla dijo:
Hola ferdy575, te recomiendo empezar de cero el código ya que a mi parecer te estas complicando mucho al utilizar la interrupción de esa manera, me explico, para que utilizar interrupción para descrementar 3 variables en el loop de interrupción si puedes con una sola hacer lo mismo en el loop principal.

Hola Reyvilla gracias por responder, a ver te cuento compile el código como tú lo reformaste pero igual no me funciona, no se por que al pulsar el botón segundos no me avanza y sí de pronto lo hace cuando llega a cero sigue titilando entre cero y uno como sí quisiera volver a avanzar, quisiera que al llegar a cero simplemente quede detenido, ó algunas veces retrocede los segundos empezando desde 99, tampoco he podido encontrar la forma de usar un botón de arranque de conteo o START, en resumidas cuentas un caos total:enfadado: por fa ayudame. Lo que etoy tratando de hacer es un temporizador para el horno de la estufa de mi esposa que es aficionada a hacer tortas así podria programar el tiempo de horneado y que el horno se apague cumplido el tiempo
Gracias
11/06/2012 #2123

Avatar de reyvilla

ok una forma sencillas es si revisas que cambie y que cambio hay, no te hice todo, mejore el código, mas aun le falta, si notaste ya decrementa de 59 a 0. Dame un chance y en la tarde revisó
de nuevo...Saludos
11/06/2012 #2124


Hola que tal, gracias por su ayuda, he hecho unas pequeñas correcciones al código y ya quedo al 100%. Aquí les dejo el código.

DEFINE ADC_BITS 8 ' Set number of bits in result
DEFINE ADC_CLOCK 3 ' Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds
R VAR BYTE
trisb=0
Portb=0
'Trisa=1
Trisa= 255 ' Set PORTA to all input
ADCON1 = 2 ' PORTA is analog

inicio:

ADCIN 0, R' Read channel 0 to B0
Portb=R
GOTO inicio

END


salu2
11/06/2012 #2125

Avatar de ferdy575

reyvilla dijo: Ver Mensaje
ok una forma sencilla es si revisas que cambie y que cambio hay, no te hice todo, mejore el código, mas aun le falta, si notaste ya decrementa de 59 a 0. Dame un chance y en la tarde revisó
de nuevo...Saludos
Bien hice lo que dices y ya logre hacer el start el stop y un clear pero sigo sin lograr el correcto conteo regresivo sigo sin poder encontrar donde estará el error:enfadado:
aquí subo el archivo con todas las modificaciones que he hecho a ver como me puedes ayudar.
Archivos Adjuntos
Tipo de Archivo: rar temporizador 16f84a.rar (31,0 KB (Kilobytes), 69 visitas)
11/06/2012 #2126
Moderador

Avatar de D@rkbytes

Timer Descendente Programable
Saludos ferdy575
Hace unos meses hice un timer descendente programable hasta 60 minutos.
No usa interrupciones y según recuerdo no es muy exacto.
Pero para conteos donde no se requiere mucha precisión, este timer funciona bien.
Tiene la opción de guardar el conteo deseado en la eeprom del pic,
para no estarlo estableciendo cada vez que se use el timer.

Lo adjunto, quizas te puede servir.

Edit:
No había visto que existe un bug en el programa en la parte donde se escribe en la memoria.
Esta es la corrección que hay que hacer...
Código:
BUTTON pb_EE,0,255,0,B0,0,Here
WRITE 0,Total
LCDOUT $FE,$C0,DEC2 Total,"MIN. EN EEPROM"
PAUSE 2000
LCDOUT $FE,1," TIMER INACTIVO" ; <--- Agregar este código
LCDOUT $FE,$C3,DEC2 Total," MINUTOS"
Suerte.
Archivos Adjuntos
Tipo de Archivo: rar Timer Programable.rar (24,7 KB (Kilobytes), 161 visitas)
12/06/2012 #2127

Avatar de ferdy575

Darkbytes dijo: Ver Mensaje
Saludos ferdy575
Hace unos meses hice un timer descendente programable hasta 60 minutos.
No usa interrupciones y según recuerdo no es muy exacto.
Pero para conteos donde no se requiere mucha precisión, este timer funciona bien.
Tiene la opción de guardar el conteo deseado en la eeprom del pic,
para no estarlo estableciendo cada vez que se use el timer.

Lo adjunto, quizas te puede servir.

Edit:
No había visto que existe un bug en el programa en la parte donde se escribe en la memoria.
Esta es la corrección que hay que hacer...
Código:
BUTTON pb_EE,0,255,0,B0,0,Here
WRITE 0,Total
LCDOUT $FE,$C0,DEC2 Total,"MIN. EN EEPROM"
PAUSE 2000
LCDOUT $FE,1," TIMER INACTIVO" ; <--- Agregar este código
LCDOUT $FE,$C3,DEC2 Total," MINUTOS"
Suerte.
gracias esta super tu temporizador pero no le puedo programar segundos no entiendo muy bien como funciona tu programa
12/06/2012 #2128
Moderador

Avatar de D@rkbytes

ferdy575 dijo: Ver Mensaje
gracias esta super tu temporizador pero no le puedo programar segundos no entiendo muy bien como funciona tu programa
De nada ferdy.
Bien, pues ese timer lo hice para probar una rutina de retardos que hice hace para otro programa.
Se me hace que lo complique mucho
Después de ese empecé a programar otro de manera diferente y ya no lo termine.
Déjame ver si lo puedo terminar pronto y lo posteo.

Suerte.
14/06/2012 #2129


hola!

recientemente me he topado con un problema que creo poder solucionar aunque me gustaria contar con
vuestra ayuda.

Estoy haciendo prácticas con las interrupciones y tal ( algo liosas XD) y me ha surgido un pequeño problema porque tengo un circuito al que quiero añadir un encoder incremental para hacer las veces de un
pulsador.

La cosa está en que creía que la conexión y el software sería parecido al de un pulsador normal pero me estoy dando cuenta que no.
Alguien me habló de usar las interrupciones y tal...

Podrían darme algún consejo, ayuda o fragmento de programa?

Gracias de antemano!!!
15/06/2012 #2130

Avatar de arturouc

Deca dijo: Ver Mensaje
hola!

recientemente me he topado con un problema que creo poder solucionar aunque me gustaria contar con
vuestra ayuda.

Estoy haciendo prácticas con las interrupciones y tal ( algo liosas XD) y me ha surgido un pequeño problema porque tengo un circuito al que quiero añadir un encoder incremental para hacer las veces de un
pulsador.

La cosa está en que creía que la conexión y el software sería parecido al de un pulsador normal pero me estoy dando cuenta que no.
Alguien me habló de usar las interrupciones y tal...

Podrían darme algún consejo, ayuda o fragmento de programa?

Gracias de antemano!!!
Yo he utilizado el timer como contador, el modulo de captura CCP para contar los pulsos de un encoder incremental

mira este post Curso de programación de PIC en PICBasic Pro

espero hoy o mañana postear la versión mas actualizada con PID ya casi listo
donde utilizo un PIC con un modulo QEI (modulo para encoder incrementales)
es el 18f4431

Autotronico si andas por ahí espero mires el siguiente proyecto con el 18f4431
15/06/2012 #2131

Avatar de ferdy575

Hola a todos, bueno les cuento que ya logre el correcto conteo regresivo, ya me funcionan correctamente los botones clear, stop y el start y ya puedo programar independientemente las horas minutos y segundos, "Pero" tengo un pequeño error que no logro descifrar:enfadado: quizá uds. me puedan ayudar. resulta que el contador al llegar a 15:01:59 independientemente de la hora que puede ser inferior o superior se resetea y empieza nuevamente en 23:59:59 adicionalmente no logro que llegue a las 00:00:00 horas para que se dispare la alarma, aquí les subo los archivos a ver sí logran descifrar mi error y les agradezco su colaboración
Archivos Adjuntos
Tipo de Archivo: rar temporizador 16f84a.rar (30,6 KB (Kilobytes), 89 visitas)
15/06/2012 #2132

Avatar de reyvilla

Hola ferdy575, estoy de nuevo por aca, debido a un problema personal no habia vuelto a participar, te comento, revise tu circuito y codigo, el problema esta en que le indicaste que si llega a 00 entonces el valor de minutos es igual a 59, no existe la condicion si minutos es menor a 0 ese es un detalle importante, por otro lado, yo realice un temporizador programable esta aqui
Curso de programación de PIC en PICBasic Pro
revisalo y me avisas
17/06/2012 #2133

Avatar de ferdy575

reyvilla dijo: Ver Mensaje
Hola ferdy575, estoy de nuevo por acá, debido a un problema personal no había vuelto a participar, te comento, revise tu circuito y código, el problema esta en que le indicaste que si llega a 00 entonces el valor de minutos es igual a 59, no existe la condición si minutos es menor a 0 ese es un detalle importante, por otro lado, yo realice un temporizador programable esta aquí
Curso de programación de PIC en PICBasic Pro
revisalo y me avisas
hola, gracias por revisar mi circuito bueno te cuento reforme la rutina de "TIEMPO" y quedo así:

;TIEMPO
Retro:
pulsos = 0
if hrs < 00 then
hrs = 23
endif
IF Mts < 00 AND hRS => 00 THEN
hrs = hrs - 1
Mts = 59
ENDIF
IF Sds < 00 AND Mts => 00 then
Mts = Mts - 1
Sds = 59
endif
if sds < 00 then
sds = 59
endif
Sds = Sds - 1
Disp = 1
RETURN

pero no obtuve resultados favorables por el contrario se vuelve loco el conteo y no se porque lo segundos me estan empezando en 99 y al llegar a 00 no descuentan el minuto, y los minutos al llegar a 00 resetean el conteo, no descuentan la hora y no llega nunca al 00:00:00 para que se dispare la alarma y se detenga el conteo al mismo tiempo; no se que sera lo que tiene mal hecho mi codigo a ver sí me puedes ayudar, lo que quiero es hacer un temporizador donde pueda programar tiepos exactos incluyendo programar hasta lo segudos para que sea un temporizador multiusos, aqui subo de nuevo el temporizador y gracias de antemano
Archivos Adjuntos
Tipo de Archivo: rar temporizador2 16f84a.rar (31,8 KB (Kilobytes), 78 visitas)
18/06/2012 #2134


arturouc dijo: Ver Mensaje
Yo he utilizado el timer como contador, el modulo de captura CCP para contar los pulsos de un encoder incremental

mira este post Curso de programación de PIC en PICBasic Pro

espero hoy o mañana postear la versión mas actualizada con PID ya casi listo
donde utilizo un PIC con un modulo QEI (modulo para encoder incrementales)
es el 18f4431

Autotronico si andas por ahí espero mires el siguiente proyecto con el 18f4431
No entiendo demasiado lo que quiere decir.

Podrian concretar un poco en el apartado del encoder?

Gracias
20/06/2012 #2135

Avatar de ferdy575

hola a todos, de nuevo por este lado y con el mismo trabajo, no logro descifrar que tengo mal en mi código, a ver sí alguien logra dar con este error y me ayuda para ver cual es el problema, aquí subo nuevamente el archivo para que lo puedan ver y verificar le he hecho miles de reformas linea por linea y no logro que funcione como debe ser, les agradezco su colaboración
Archivos Adjuntos
Tipo de Archivo: rar temporizador3 16f84a.rar (31,8 KB (Kilobytes), 73 visitas)
20/06/2012 #2136

Avatar de Dario

hola gente, yo por aqui de nuevo. bueno, hace tiempo no le daba bolilla pero, de repente se me dio la idea de crear una consola midi para controlar el virtual dj desde afuera programando un pic con pic basic. aqui en el foro, hay una que hizo el amigo fernandoae pero sinceramente no entiendo nada . bueno, la idea es crear una interface para coectar en el puerto serial por ahora, ya que tengo experiencia en conectar un pic al puerto y leerlo en la pc, pero de lo que no tengo idea es, como hacer para vincular el vdj con el pic mediante el puerto serie. ¿alguno de uds me tira una idea como para ir probando? aunque sea unas cuantas liniesitas que me den una idea, o un diagrama de bloques... ¿me ayudan? saludosss
21/06/2012 #2137


Hola amigos!

Estoy elaborando un proyecto que se trata de un reloj calendario con el 16f84a, una lcd y el ds1307, estuve mirando el post #84 que publico cesar_8k en este mismo tema, en el cual me base para adaptarlo al 16f84a y q solo muestre la hora. Pero tengo dos problemas el primero es que se me cuelga el conteo en un momento determinado y el otro es que no logro hacer funcionar los botones para modificar la hora, revise el codigo una y otra vez pero no he dado con los errores.

les pido una ayuda para ver que no estoy tomando encuenta.

les agradezco su colaboracion!


les adjunto el codigo en basic y la simulacion en proteus
Archivos Adjuntos
Tipo de Archivo: rar RELOJ.rar (34,0 KB (Kilobytes), 77 visitas)
21/06/2012 #2138

Avatar de reyvilla

ferdy575 dijo: Ver Mensaje
hola a todos, de nuevo por este lado y con el mismo trabajo, no logro descifrar que tengo mal en mi código, a ver sí alguien logra dar con este error y me ayuda para ver cual es el problema, aquí subo nuevamente el archivo para que lo puedan ver y verificar le he hecho miles de reformas linea por linea y no logro que funcione como debe ser, les agradezco su colaboración
Hola de nuevo veo que sigues sin avanzar mucho, te diria que utilizaras una rutina mas faltible, me explico no "EXISTE" osea no creo que eso exista ni lo entienda el compilador, un "NUMERO", menor a "0", osea no puede hacer esto:

Código:
IF hrs < 0 or Mts < 0 or Sds > 0 THEN   'Ojo sí cambiamos esta función no funciona el conteo
pulsos = pulsos + 1
IF pulsos < 61 THEN NoUpdate
endif
No manejas números negativos para un temporizador, osea como puedes descontar el tiempo, osea que llega a 0 minutos y continua a -1 minutos, no lo creo, no lo veo lógico, por eso te comentaba que tienes lo de menor que 00, Si no funciona en conteo sin esa función es por que tiene que ser 00, no menor a 00. Ahora te subo un ejemplo de como puedes decontar un numero con el incremento del temporizador de tiempo real del microcontrolador...Saludosss

---------- Actualizado después de 21 minutos ----------

harrito89 dijo: Ver Mensaje
Hola amigos!

Estoy elaborando un proyecto que se trata de un reloj calendario con el 16f84a, una lcd y el ds1307, estuve mirando el post #84 que publico cesar_8k en este mismo tema, en el cual me base para adaptarlo al 16f84a y q solo muestre la hora. Pero tengo dos problemas el primero es que se me cuelga el conteo en un momento determinado y el otro es que no logro hacer funcionar los botones para modificar la hora, revise el codigo una y otra vez pero no he dado con los errores.

les pido una ayuda para ver que no estoy tomando encuenta.

les agradezco su colaboracion!


les adjunto el codigo en basic y la simulacion en proteus
Hola amigo, vi tu código y tu circuito, el problema lo tienes en la configuración de los puertos del microcontrolador, si en el esquema vas a utilizar por ejemplo el pin 1 del puerto b como entrada para el botón up, en el código debes conservar la misma configuración, ya que de lo contrario no te va a funcionar...saludosss
22/06/2012 #2139

Avatar de ferdy575

[QUOTE=reyvilla;673095]Hola de nuevo veo que sigues sin avanzar mucho, te diria que utilizaras una rutina mas faltible, me explico no "EXISTE" osea no creo que eso exista ni lo entienda el compilador, un "NUMERO", menor a "0", osea no puede hacer esto:

Código:
IF hrs < 0 or Mts < 0 or Sds > 0 THEN   'Ojo sí cambiamos esta función no funciona el conteo
pulsos = pulsos + 1
IF pulsos < 61 THEN NoUpdate
endif
No manejas números negativos para un temporizador, osea como puedes descontar el tiempo, osea que llega a 0 minutos y continua a -1 minutos, no lo creo, no lo veo lógico, por eso te comentaba que tienes lo de menor que 00, Si no funciona en conteo sin esa función es por que tiene que ser 00, no menor a 00. Ahora te subo un ejemplo de como puedes decontar un numero con el incremento del temporizador de tiempo real del microcontrolador...Saludosss
hola reyvilla, gracias por revisar mi proyecto, tienes razón voy a buscar más información a ver como cambio esta rutina para ver sí logro hacer que me funcione el temporizador
24/06/2012 #2140

Avatar de torres.electronico

Buenas... consulta... alguie vio en "este topico" algun ejemplo de como crear algun GAMEPAD? Me parecio ver algo pero no lo encuentro... Basicamente estoy buscando un ejemplo de como realizarlo un GAMEPAD de 3 ejes analogicos y 6 u 12 pulsadores (en PBP)... Dario, se me ocurrio que esta es la manera mas sencilla de crear la consola pàra el virtual Dj... vistes que hay ejemplo de como crear una consola implementando un GAMEPAD comercial y un software para re definir las funciones de cada pulsador? Bueno, se me ocurre que con esto lo hacemos mucho mas personalizado, ya que contariamos con 3 ejes analogicos para el volumen de cada canal y el fader.... los pulsadores serian para "play-stop-cue" y el resto a definir (efectos-sampler-etc)... Que te parece la idea?
¿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 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.