TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: fanloeb en 11 de Mayo de 2016, 22:41:16
-
Hola buenas noches, soy muy novato en el tema de programación de pics. Estoy haciendo un marcador de puntos para Ping Pong, lo que logré hacer es el propio marcador, con un pic 16F628A, un LCD 16x2, y los tres pulsadores (2 para sumar puntos y uno para reset). El código funciona correctamente (o eso creo), lo que quisiera agregarle es: que muestre en la pantalla que jugador tiene el "servicio", que empieza sacando un jugador (por ejemplo Azul) y a los 5 servicios marque en la pantalla que el otro jugador (rojo) tiene el saque. El código que hice es este:
; Definición de pines para la pantalla.
Define LCD_DREG PORTA ; Puerto de datos.
Define LCD_DBIT 0 ; Bit de inicio de datos.
Define LCD_RSREG PORTB ; Puerto de RS (Register Select)
Define LCD_RSBIT 1 ; Pin para RS
Define LCD_EREG PORTB ; Puerto de E (Enable)
Define LCD_EBIT 3 ; Pin para E
; Declaración de variables.
Contador Var byte
contador1 var byte
Inicio:
CMCON = 7 ; Comparadores analógicos OFF
Clear
LCDOut $FE,$80 ,"AZUL ROJO "
TMR0 = 0
Programa:
if portb.5=0 then
ENDIF
pause 250 ;este es el retardo o tiempo de gracia
if portb.5=0 then
ENDIF
If PORTB.5 = 0 Then ; Si RB5 = 0, el conteo será ascendente.
Contador = Contador + 1 ; Incrementar "Contador"
endif
Programa1:
if portb.4 = 0 then
contador1 = contador1 + 1
endif
LCDOut $FE,$C0,$14,Dec2 Contador, " ", $14,$14,$14,$14,$14,$14,$14,$14, dec2 contador1, " "
GoTo Programa
End
Es posible lo que planteo??
Muchas gracias. Y perdón si no quedó muy entendible lo que escribí.
-
Hola Fanloeb,
respecto a tu programa le faltan condiciones para el contador, por lo que entiendo es que cuando el contador llegue a 5 cambie al otro jugador y en tu programa no estas monitoreando los contadores, por ejemplo:
If contador = 5 then
LCDOut $FE,$C0,$14,Dec2 Contador
endif
Otra observación, no veo para que estas usando los dos if portb.5=0 then endif.
-
Muchas gracias por la respuesta. Sí efectivamente cada 5 puntos se cambia el servicio, pero esos 5 puntos es entre los dos, es decir por ejemplo: 3 del azul y 2 del rojo cambia el servicio. Ahí es donde no sé como hacer esa instrucción..
No había observado que estaba dos veces esa línea. Muchas gracias.
-
Vas bien en el código, solo te falta sumar ambos contadores y la respuesta es la que monitoreas, por ejemplo:
if portb.5 = 0 then contador = contador + 1
if portb.4 = 0 then contador1 = contador1 + 1
cont_total = contador + contador1
if cont_total = 5 then
...
...
endif
-
Vas bien en el código, solo te falta sumar ambos contadores y la respuesta es la que monitoreas, por ejemplo:
if portb.5 = 0 then contador = contador + 1
if portb.4 = 0 then contador1 = contador1 + 1
cont_total = contador + contador1
if cont_total = 5 then
...
...
endif
Hola Steban. Me da error syntax ban expression. Y probe usando count también. Con mismo resultado..
Esta noche voy a ver puedo hacerlo con otros comandos..
Esta pensando y en vez de hacer que indique el cambio de jugador en el LCD, encienda un led por ejemplo. En ese caso sería más simple.
Podría ser así:
Led VAR portb.2
if contador + contador1 = 5 then high led
Estoy con el celular, después lo tipeo bien. Obviamente hay que armsrlo en su lugar. Que opinás?
Un abrazo.
-
Me imagino que nadamas pusiste Count y no Count_total, si es asi es porque Count es un comando de Basic y no lo puedes usar como variable, pero en fin, estaba de oceoso y haber que te parece este programa...
'****************************************************************
'* Name : Ping_Pong.BAS *
'* Author : [EJM] *
'* Notice : Copyright (c) 2016 [EJM] *
'* : All Rights Reserved *
'* Date : 13/05/2016 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
; Definición de pines para la pantalla.
CMCON = 7 ; Comparadores analógicos OFF
Define LCD_DREG PORTA ; Puerto de datos.
Define LCD_DBIT 0 ; Bit de inicio de datos.
Define LCD_RSREG PORTB ; Puerto de RS (Register Select)
Define LCD_RSBIT 1 ; Pin para RS
Define LCD_EREG PORTB ; Puerto de E (Enable)
Define LCD_EBIT 3 ; Pin para E
; Declaración de variables.
Contador0 Var byte
Contador1 var byte
Cont_total var byte
Rebote var bit
flag_azul var bit
flag_rojo var bit
clear
LCDOut $FE, $80, "AZUL",$FE, $8A, "ROJO"
flag_azul = 1: flag_rojo = 0
Inicio:
LCDOut $FE, $C1, Dec2 Contador0, " ", $FE, $CB, dec2 contador1, " "
cont_total = contador0 + contador1
if cont_total = 5 and flag_azul = 1 then
LCDOut $FE, $C5, "ROJO"
cont_total =0: contador0 = 0: contador1 = 0
flag_azul = 0: flag_rojo = 1
endif
if cont_total = 5 and flag_rojo = 1 then
LCDOut $FE, $C5, "AZUL"
cont_total =0: contador0 = 0: contador1 = 0
flag_azul = 1: flag_rojo = 0
endif
gosub contar
GoTo inicio
Contar:
If PORTB.5 = 0 Then ; Si RB5 = 0, el conteo será ascendente.
if rebote = 0 then return
Contador0 = Contador0 + 1
rebote = 0
return
endif
if portb.4 = 0 then
if rebote = 0 then return
contador1 = contador1 + 1
rebote = 0
return
endif
rebote = 1
return
End
-
Me imagino que nadamas pusiste Count y no Count_total, si es asi es porque Count es un comando de Basic y no lo puedes usar como variable, pero en fin, estaba de oceoso y haber que te parece este programa...
'****************************************************************
'* Name : Ping_Pong.BAS *
'* Author : [EJM] *
'* Notice : Copyright (c) 2016 [EJM] *
'* : All Rights Reserved *
'* Date : 13/05/2016 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
; Definición de pines para la pantalla.
CMCON = 7 ; Comparadores analógicos OFF
Define LCD_DREG PORTA ; Puerto de datos.
Define LCD_DBIT 0 ; Bit de inicio de datos.
Define LCD_RSREG PORTB ; Puerto de RS (Register Select)
Define LCD_RSBIT 1 ; Pin para RS
Define LCD_EREG PORTB ; Puerto de E (Enable)
Define LCD_EBIT 3 ; Pin para E
; Declaración de variables.
Contador0 Var byte
Contador1 var byte
Cont_total var byte
Rebote var bit
flag_azul var bit
flag_rojo var bit
clear
LCDOut $FE, $80, "AZUL",$FE, $8A, "ROJO"
flag_azul = 1: flag_rojo = 0
Inicio:
LCDOut $FE, $C1, Dec2 Contador0, " ", $FE, $CB, dec2 contador1, " "
cont_total = contador0 + contador1
if cont_total = 5 and flag_azul = 1 then
LCDOut $FE, $C5, "ROJO"
cont_total =0: contador0 = 0: contador1 = 0
flag_azul = 0: flag_rojo = 1
endif
if cont_total = 5 and flag_rojo = 1 then
LCDOut $FE, $C5, "AZUL"
cont_total =0: contador0 = 0: contador1 = 0
flag_azul = 1: flag_rojo = 0
endif
gosub contar
GoTo inicio
Contar:
If PORTB.5 = 0 Then ; Si RB5 = 0, el conteo será ascendente.
if rebote = 0 then return
Contador0 = Contador0 + 1
rebote = 0
return
endif
if portb.4 = 0 then
if rebote = 0 then return
contador1 = contador1 + 1
rebote = 0
return
endif
rebote = 1
return
End
Hola Stban, excelente este programa, lo simulé y va genial. Sólo tengo que encontrar la forma en la que no se reinicie el puntaje al llegar al cambio del jugador. Si bien el cambio se hace cada 5 puntos el puntaje vuelve a cero. Entendes?
Muchas gracias por tu tiempo..
Un abrazo..
-
Me olvidaba, usé count y count_total y no funcionaron :s :s..
-
Puedes crear otro contador total para los puntos, por ejemplo "cont_total_puntos".
Este se incrementara cada vez que se incrementa el contador0 o el contador1, pero no
se verá borrado hasta que comience una partida nueva.
contar:
If PORTB.5 = 0 Then 'si RB5 = 0, el conteo será ascendente.
If rebote = 0 Then Return
contador0 = contador0 + 1
cont_total_puntos = cont_total_puntos + 1
rebote = 0
Return
Endif
If PORTB.4 = 0 Then
If rebote = 0 Then Return
contador1 = contador1 + 1
cont_total_puntos = cont_total_puntos + 1
rebote = 0
Return
Endif
rebote = 1
Return
-
También tendrás que pensar en colocar algún tipo de anti-rebote en las teclas, recuerda que el microcontrolador se mueve a nivel de uSeg. y nosotros a nivel de docenas o centenares de mSeg., si pulsamos una tecla por muy rápido que realicemos esa operación el micro la leerá muchas veces en un mSeg., e incrementará los contadores muchas veces con una única pulsación.
Endif
Gosub contar
WaitMs 300 'Pausa despues de pulsar tecla
Goto inicio
End
contar:
If PORTB.5 = 0 Then 'si RB5 = 0, el conteo será ascendente.
While RB.5 = 0 'Espero hasta soltar tecla
Wend
If rebote = 0 Then Return
contador0 = contador0 + 1
cont_total_puntos = cont_total_puntos + 1
rebote = 0
Return
Endif
If PORTB.4 = 0 Then
While RB.4 = 0 'Espero hasta soltar tecla
Wend
If rebote = 0 Then Return
contador1 = contador1 + 1
cont_total_puntos = cont_total_puntos + 1
rebote = 0
Return
Endif
rebote = 1
Return
-
De hecho la variable rebote hace esa función, ya no es necesario otra función
-
Pense que "REBOTE" era para otra cosa, si ya está contemplado pues mejor. ((:-))
-
Hola muchachos, muchas gracias por responder.. Logré modificar el código y llegué al resultado que buscaba.. Para solucionarlo agregué mas lineas de las que Stban puso en el código, simplemente que cambié los valores.
if cont_total = 5 and flag_azul = 1 then
LCDOut $FE, $C5, "ROJO"
cont_total =0: contador0 = 0: contador1 = 0
flag_azul = 0: flag_rojo = 1
endif
if cont_total = 10 and flag_rojo = 1 then
LCDOut $FE, $C5, "AZUL"
cont_total =0: contador0 = 0: contador1 = 0
flag_azul = 1: flag_rojo = 0
endif
if cont_total = 15 and flag_azul = 1 then
LCDOut $FE, $C5, "ROJO"
cont_total =0: contador0 = 0: contador1 = 0
flag_azul = 20: flag_rojo = 1
endif
if cont_total = 25 and flag_rojo = 1 then
LCDOut $FE, $C5, "AZUL"
cont_total =0: contador0 = 0: contador1 = 0
flag_azul = 1: flag_rojo = 0
endif
Y así sucesivamente.
Sinceramente fue la única forma que logré lo que quería, no sé si sea lo más corto, pero creo que va a entrar..
Otra consulta, para usar oscilador interno (4 mhz) como lo configuro? Desde el código o desde el winpic800??
Muchas graciad por su tiempo..
-
En realidad en picbasic pro se puede de tres maneras:
- desde archivo .INC
- desde el código y
- desde el programador.
Para el primero: los valores por defecto de configuración para un dispositivo en particular ,están en el archivo .INC con el mismo nombre del dispositivo .Estos valores pueden ser cambiados en el mismo momento en que el dispositivo es programado.
El segundo solo colocando al principio del programa antes de todo el resto del código: @ device intrc_osc_noclkout
Y el tercero en el area de configuración de tu programador.
-
En realidad en picbasic pro se puede de tres maneras:
- desde archivo .INC
- desde el código y
- desde el programador.
Para el primero: los valores por defecto de configuración para un dispositivo en particular ,están en el archivo .INC con el mismo nombre del dispositivo .Estos valores pueden ser cambiados en el mismo momento en que el dispositivo es programado.
El segundo solo colocando al principio del programa antes de todo el resto del código: @ device intrc_osc_noclkout
Y el tercero en el area de configuración de tu programador.
Excelente muchas gracias por tu ayuda.. Me quedó claro. Cierro el tema..