Autor Tema: Modificar código.  (Leído 4695 veces)

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

Desconectado fanloeb

  • PIC10
  • *
  • Mensajes: 8
Modificar código.
« 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í.

Desconectado Stban

  • PIC12
  • **
  • Mensajes: 78
Re:Modificar código.
« Respuesta #1 en: 12 de Mayo de 2016, 11:50:23 »
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.

Desconectado fanloeb

  • PIC10
  • *
  • Mensajes: 8
Re:Modificar código.
« Respuesta #2 en: 12 de Mayo de 2016, 14:20:26 »
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.

Desconectado Stban

  • PIC12
  • **
  • Mensajes: 78
Re:Modificar código.
« Respuesta #3 en: 12 de Mayo de 2016, 18:19:03 »
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

Desconectado fanloeb

  • PIC10
  • *
  • Mensajes: 8
Re:Modificar código.
« Respuesta #4 en: 13 de Mayo de 2016, 14:48:03 »
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.

Desconectado Stban

  • PIC12
  • **
  • Mensajes: 78
Re:Modificar código.
« Respuesta #5 en: 13 de Mayo de 2016, 22:06:52 »
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...

Código: [Seleccionar]
'****************************************************************
'*  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

Desconectado fanloeb

  • PIC10
  • *
  • Mensajes: 8
Re:Modificar código.
« Respuesta #6 en: 13 de Mayo de 2016, 23:05:15 »
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...

Código: [Seleccionar]
'****************************************************************
'*  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..

Desconectado fanloeb

  • PIC10
  • *
  • Mensajes: 8
Re:Modificar código.
« Respuesta #7 en: 13 de Mayo de 2016, 23:40:24 »
Me olvidaba, usé count y count_total y no funcionaron :s :s..

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Modificar código.
« Respuesta #8 en: 15 de Mayo de 2016, 13:09:49 »
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                                           
« Última modificación: 15 de Mayo de 2016, 13:12:00 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Modificar código.
« Respuesta #9 en: 15 de Mayo de 2016, 13:41:25 »
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     
Saludos desde Granada, España.

Desconectado Stban

  • PIC12
  • **
  • Mensajes: 78
Re:Modificar código.
« Respuesta #10 en: 16 de Mayo de 2016, 00:38:17 »
De hecho la variable rebote hace esa función, ya no es necesario otra función

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Modificar código.
« Respuesta #11 en: 16 de Mayo de 2016, 06:55:11 »
Pense que "REBOTE" era para otra cosa, si ya está contemplado pues mejor.  ((:-))
Saludos desde Granada, España.

Desconectado fanloeb

  • PIC10
  • *
  • Mensajes: 8
Re:Modificar código.
« Respuesta #12 en: 16 de Mayo de 2016, 14:40:00 »
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..

Desconectado Stban

  • PIC12
  • **
  • Mensajes: 78
Re:Modificar código.
« Respuesta #13 en: 16 de Mayo de 2016, 21:01:54 »
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.

Desconectado fanloeb

  • PIC10
  • *
  • Mensajes: 8
Re:Modificar código.
« Respuesta #14 en: 16 de Mayo de 2016, 21:17:24 »
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..


 

anything