Autor Tema: Que estoy haciendo mal???  (Leído 2439 veces)

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

Desconectado melectro

  • PIC10
  • *
  • Mensajes: 21
Que estoy haciendo mal???
« en: 06 de Julio de 2006, 14:18:37 »
Hola a todos , tengo el siguiente problema , tengo que poder mostrar en un LCD cuatro digitos de 0000 a 9999 , que son mili segundos , y para ello hice un programa en PBP que seleccione las unidades dec cent etc con un boton de un puerto y con otro boton lo desplazo de 0 a 9 pero me suma un digito al ultimo valor donde habia quedado  ej si termino en 0030  y cambio a las centenas me queda 0040 ,alguien e puede ayudar por favor.
Mis conocimientos de programa son muy elementales y recien estoy aprendiendo , pido disculpas si es muy tonto el caso pero el que no  sabe es como el que no ve....
aqui el codigo.

                define LCD_BITS 4
                define LCD_LINES 2
                U VAR BYTE  ;unidad
                D VAR BYTE  ;decena
                C VAR BYTE  ;centena
                UM VAR BYTE ; uniidad de mil 9999 ms.total 10.000 ms  = 10 seg.
                co VAR  BYTE ;  variable selecciona  numero , unid dec cent um .
                cur VAR BYTE 'VARIABLE SELECCIONA MODO.
               
           
            U = 0  :  D = 0 : c = 0 : UM = 0
            co = 0 : cur = 0
            PAUSE 500
            lcdout $fe,1,"Melectro" , $fe,$c0 ," 2006 "
            PAUSE 1500
            Lcdout $fe, 1 , "Seleccio", $fe,$c0  ,"ne Modo"
            pause 1000
                             
curs:           
                cur = cur + 1
                if cur > 4 then cur = 1
                lcdout $fe,1,"cur =  ",#cur
                pause 500
                if cur = 1 then call inicio_u
                if cur = 2 then call inicio_d
                if cur = 3 then call inicio_c
                if cur = 4 then call inicio_um           
                goto  curs
                return
                             
INICIO_U:   IF PORTB.5 = 0 AND  cur = 1 THEN
Lcdout $fe,1,"Mod 1",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
            Pause 500       
            U = U + 1
            IF U > 9 THEN U = 0
            endif
            if portb.6 = 0 then call curs
            GOTO INICIO_U     
            RETURN
           
 INICIO_D:  IF PORTB.5 = 0 AND cur = 2 THEN
 Lcdout $fe, 1 , "Mod 2", $fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U,"  MS"
            Pause 500       
            D = D + 1
            IF D > 9 THEN D = 0
            endif
            if portb.6 = 0 then call curs
            GOTO INICIO_D
            return         
           
 INICIO_C:  IF PORTB.5 = 0 AND cur = 3 THEN
 Lcdout $fe, 1 , "Mod 3", $fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U,"  MS"
            Pause 500       
            C = C + 1
            IF C > 9 THEN C = 0     
            endif
            if portb.6 = 0 then call curs
            GOTO INICIO_C
            return               
           
 INICIO_UM:  IF PORTB.5 = 0 AND cur = 4 THEN
 Lcdout $fe, 1 , "Mod 4", $fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U,"  MS"
            Pause 500       
            UM = UM + 1
            IF UM > 9 THEN UM = 0
            endif
            if portb.6 = 0 then call curs
            GOTO INICIO_UM
            return       
            end   

Gracias por cualquier ayuda.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Que estoy haciendo mal???
« Respuesta #1 en: 06 de Julio de 2006, 14:31:46 »
Hola:

Lo que no nos dices es que problema tienes.

Desconectado melectro

  • PIC10
  • *
  • Mensajes: 21
Re: Que estoy haciendo mal???
« Respuesta #2 en: 06 de Julio de 2006, 15:46:40 »
este es el problema"de 0 a 9 pero me suma un digito al ultimo valor donde habia quedado  ej si termino en 0030  y cambio a las centenas me queda 0040 ,alguien e puede ayudar por favor.


Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Que estoy haciendo mal???
« Respuesta #3 en: 06 de Julio de 2006, 16:54:50 »
No estoy muy seguro de haber comprendido tu problema, pero podría deberse a lo siguiente: fíjate en que primero haces el LCDOUT, luego esperas 500 ms y por último incrementas el valor de la variable en una unidad. Consecuentemente, el valor que estás viendo en el LCD es una unidad menos del verdadero valor almacenado en la variable, que es el que aparece cuando saltas a configurar el siguiente dígito, y por eso se te parece que se imcrementa en una unidad.

En resumen, en lugar de:

Lcdout $fe,1,"Mod 1",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
            Pause 500       
            U = U + 1

Prueba con:

            U = U + 1
            Pause 500       
Lcdout $fe,1,"Mod 1",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"

Saludos

Desconectado melectro

  • PIC10
  • *
  • Mensajes: 21
Re: Que estoy haciendo mal???
« Respuesta #4 en: 06 de Julio de 2006, 17:47:35 »
Hola ifmateos2 ,gracias por tu respuesta; si es correcto tu cambio pero no me aparecen en 0 el comienzo del display ya que tuve que presionar la tecla y el contador avanzo 1 unidad por lo demas si no me suma mas un digito.

INICIO_U:   IF PORTB.5 = 0 AND  cur = 1 THEN
            U = U + 1
            Pause 500       
Lcdout $fe,1,"Mod 1",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"

  en este caso siempre el valor de u va a ser distinto de cero en el arranque porque ya sumo 1.

Saludos

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Que estoy haciendo mal???
« Respuesta #5 en: 06 de Julio de 2006, 17:55:12 »
OK.
Prueba con esto:
INICIO_U: 
Lcdout $fe,1,"Mod 1",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
if portb.6 = 0 then call curs
IF PORTB.5 = 0 AND  cur = 1 THEN
            Pause 500       
            U = U + 1
            IF U > 9 THEN U = 0
endif           
GOTO INICIO_U     
RETURN

« Última modificación: 06 de Julio de 2006, 18:39:13 por jfmateos2 »

Desconectado melectro

  • PIC10
  • *
  • Mensajes: 21
Re: Que estoy haciendo mal???
« Respuesta #6 en: 12 de Julio de 2006, 20:25:07 »
Gracias ifmateos2 por tu ayuda , ahora funciona bien.
PD perdon por la demora en responderte .
Saludos.
 :-/

Desconectado melectro

  • PIC10
  • *
  • Mensajes: 21
Re: Que estoy haciendo mal???
« Respuesta #7 en: 24 de Julio de 2006, 17:34:20 »
Hola a todos.Finalmente logre que funcione bien , pero la idea es optimizar el programa ya que en cierta forma tendria que repetir el mismo procedimiento tres veces mas.
Lo estipulado seria.
Modo 1 decrementar 9999 Ms.
Modo 2 decrementar 999.9 Ms.
Modo 3 decrementar 99.99 Seg.
 
el programa queda asi:

'MODO 1 EN mS 9999
'MODO 2 EN mS 999.9
'MODO 3 EN SEG 9999
'MODO 4 REPETICION DE N VECES POR XXXX mS.
' 60.000 mS = 1 MINUTO             
' 1.000 uS = 1 SEG.               
'10.000 SEG =                 
               
               
    'DEFINICION DE PINES
    'PORTB.4 = SALIDA  . MAS SALIDA SONORA BEEP
    'PORTB.5 = DIGITO
    'PORTB.6 = POSICION U, D , C ,UM.  MODO MODO1 , ...  MODO4.
    'PORTB.7 = START
    'PORTB.2 = ENTRADA
    'PORTA.0-4 = LCD
    'PORTB.3 = LCD
    'PORTB.4 = SALIDA
    'PORTB.1 = VER DISPARO LED           
               
                define LCD_BITS 4
                define LCD_LINES 2
                U VAR BYTE   ;unidad modo 1
                U2 VAR BYTE  ;unidad modo 2
                U3 VAR BYTE  ;unidad modo 3
                U4 VAR BYTE  ;unidad modo 4
                D VAR BYTE  ;decena 1
                D2 VAR BYTE  ;decena 2
                D3 VAR BYTE  ;decena 3
                D4 VAR BYTE  ;decena 4
                C VAR BYTE  ;centena 1
                C2 VAR BYTE  ;centena 2
                C3 VAR BYTE  ;centena 3
                C4 VAR BYTE  ;centena 4
                UM VAR BYTE ; unidad de mil 1 9999 ms.total 10.000 ms  = 10 seg.
                UM2 VAR BYTE ; unidad de mil 2 9999 ms.total 10.000 ms  = 10 seg.
                UM3 VAR BYTE ; unidad de mil 3 9999 ms.total 10.000 ms  = 10 seg.
                UM4 VAR BYTE ; unidad de mil 4 9999 ms.total 10.000 ms  = 10 seg.
                co VAR  BYTE ;  variable selecciona  numero , unid dec cent um .
                cur VAR BYTE 'VARIABLE SELECCIONA MODO1.
                cur2 VAR BYTE 'VARIABLE SELECCIONA MODO2.
                cur3 VAR BYTE 'VARIABLE SELECCIONA MODO3.
                cur4 VAR BYTE 'VARIABLE SELECCIONA MODO4.
                ST var byte
                mode var byte
                mode2 var byte
                mode3 var byte
                mode4 var byte
                t1 var word
                t2 var byte
                t3 var byte
                t4 var byte
                W0 var word
            U = 0  :  D = 0 : c = 0 : UM = 0
            co = 0 : cur = 0 :cur2 = 0:cur3 = 0 : cur4 = 0
            PAUSE 500
            lcdout $fe,1,"Melectro" , $fe,$c0 ,"Photo 06"
            PAUSE 1500
            Lcdout $fe, 1 , " Modo 1 "

           
           
           
                             

;        ****************** MODO 1 ***************************
                   
   curs:           cur = cur + 1
                if cur > 4 then cur = 1
                'lcdout $fe,1,"cur =  ",#cur
                ;pause 500
                if cur = 1 then call inicio_u
                if cur = 2 then call inicio_d
                if cur = 3 then call inicio_c
                if cur = 4 then call inicio_um           
                goto  curs
                return
               
INICIO_U: 
Lcdout $fe,1," Unid",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
            pause 250
            if portb.7 = 0 then call start
            if portb.6 = 0 then call curs
            IF PORTB.5 = 0 AND  cur = 1 THEN
                                     
     
            U = U + 1
            IF U > 9 THEN U = 0
            endif           
            GOTO INICIO_U     
            RETURN
           
            INICIO_D: 
Lcdout $fe,1,"  Dec",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
            pause 250
            if portb.7 = 0 then call start
            if portb.6 = 0 then call curs
            IF PORTB.5 = 0 AND  cur = 2 THEN
                             
            D = D + 1
            IF D > 9 THEN D = 0
            endif           
            GOTO INICIO_D     
            RETURN
           
            INICIO_C: 
Lcdout $fe,1,"  cen",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
            pause 250
            if portb.7 = 0 then call start
            if portb.6 = 0 then call curs
            IF PORTB.5 = 0 AND  cur = 3 THEN
                   
            C = C + 1
            IF C > 9 THEN C = 0
            endif           
            GOTO INICIO_C     
            RETURN
           
            INICIO_UM: 
Lcdout $fe,1,"Umil",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
            pause 250
            if portb.7 = 0 then call start
            if portb.6 = 0 then call curs
            IF PORTB.5 = 0 AND  cur = 4 THEN
           
                   
            Um = Um + 1
            IF Um > 9 THEN Um = 0
            endif           
            GOTO INICIO_Um     
            RETURN
           
           
start:       
            lcdout $fe,1," ",#UM,#C,#D,#U ," MS"
            pause 100

            Pulsin portb.2,0,W0               
            If W0 <> 0 Then disparo           
            goto start
                       
                     
disparo:    low portb.4   :lcdout $fe,1," ",#UM,#C,#D,#U ," MS" ,$fe,$C0," INICIO"
            T1 = (UM*1000+c*100+d*10+u)
            pause  T1
            high portb.4
            pause 100
            low portb.4 :low portb.1
            return

Es decir esta parte es solo para el modo 1 , y tendria que optimizarla para que ocupe menos espacio en el pic.
Agradeceria tambien si a alguien se le ocurre otra manera de implementar el programa me diera una idea para poder hacerlo ya que este es mi tercer programa en PBP.
Muchas gracias.
Saludos.
Jorge