Autor Tema: Problema con codigo  (Leído 8937 veces)

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

Desconectado cdistri

  • PIC10
  • *
  • Mensajes: 24
Problema con codigo
« en: 11 de Noviembre de 2008, 09:44:24 »
Hola

Tengo el codigo de uno de los ejmplos de proteus. Es un reloj el cual se modifica la hora y los minutos con unos botones.
Mi problema es que miro donde esta el codigo y es un archivo .bas. Este archivo lo abro con pic simulator ide, lo abre perfectamente pero lo intento compilar y me empieza a dar fallos en las lines de las symbol, es el codigo tal y como lo interpreta proteus.
Intento compilarlo con mikrobasic y tambien me da los mismos errores.

Queria saber si me pudieras ayudar a ver que hago mal para que no compile el codigo.

Este codigo lo quiero modificar y adaptarlo a mis necesidades pero si con el codigo de origen no me lo compila no puedo hacer ningun cambio .

Este es el codigo:


'-----------------------------------------------------------------------------
'
' Sample program clock guage
'
'                                                                                                                                                                                                   
'=============================================================================
'
'
SYMBOL   ticks   = B0
SYMBOL   count   = B1
SYMBOL   hours   = B2
SYMBOL   minutes   = B3
SYMBOL   seconds   = B4
SYMBOL   temp   = B5
SYMBOL   prnPos   = B6
SYMBOL   data   = B7
SYMBOL   clocks   = B8
SYMBOL   last   = B9
SYMBOL   I      = 254
SYMBOL   L2      = 192
SYMBOL   clr      = 1
SYMBOL   LCD      = 7
SYMBOL   CLK      = 2
SYMBOL   setRun   = PIN0
SYMBOL   incMin   = PIN1
SYMBOL   incHrs   = PIN2
SYMBOL   clkIn   = PIN3
SYMBOL   set      = 0
SYMBOL   hold    = 1
SYMBOL   run      = 1
SYMBOL   timePos   = 135


'-----------------------------------------------------------------------------
'
'                                                                                                                                                                                                     
'=============================================================================
Begin:
   LET         DIRS = $F0
   PAUSE      200
   
   SEROUT      LCD,N2400,(I,clr)
   SEROUT      LCD,N2400,("Time:")


'-----------------------------------------------------------------------------
'
'                                                                                                                                                                                                     
'=============================================================================   
doTiming:   
   IF setRun = set THEN setClock
   IF clkIn = BIT0 THEN doTiming
'   LET         last = clkIn
   LET         ticks = ticks + 1 & %11
   IF ticks <> 3 THEN doTiming
   GOSUB      incTime
   GOSUB      showTime
   GOTO      doTiming
   
   
'-----------------------------------------------------------------------------
'
'                                                                                                                                                                                                     
'=============================================================================   
setClock:
   IF setRun = run THEN doTiming
   LET         seconds = 0
   IF incMin = hold THEN ckHours
   GOSUB      incMinutes
   GOTO      setDone

ckHours:
   IF incHrs = hold THEN setClock
   GOSUB      incHours
   
setDone:
   GOSUB      showTime
   PAUSE      200
   GOTO      setClock
   
               
'-----------------------------------------------------------------------------
'
'                                                                                                                                                                                                     
'=============================================================================   
showTime:
   SEROUT      LCD,N2400,(I,timepos)
   LET         count = hours
   GOSUB      showDigs
   SEROUT      LCD,N2400,(":")
   LET         count = minutes
   GOSUB      showDigs
   SEROUT      LCD,N2400,(":")
   LET         count = seconds
   GOSUB      showDigs
   RETURN
   
      
'-----------------------------------------------------------------------------
'
'                                                                                                                                                                                                     
'=============================================================================   
showDigs:
   LET         temp = count / 10
   SEROUT      LCD,N2400,(#temp)
   LET         temp = count // 10
   SEROUT      LCD,N2400,(#temp)
   RETURN
   
   
'-----------------------------------------------------------------------------
'
'                                                                                                                                                                                                     
'=============================================================================   
incTime:
   LET         seconds = seconds + 1
   IF seconds < 60 THEN done
   LET         seconds = 0
incMinutes:
   LET         minutes = minutes + 1
   IF minutes < 60 THEN done
   LET         minutes = 0
incHours:
   LET         hours = hours + 1
   IF hours < 13 THEN done
   LET         hours = 1
done:
   RETURN
            

A ver si me podeis ayudar

Un saludo
         
« Última modificación: 12 de Noviembre de 2008, 10:43:59 por cdistri »

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Problema con codigo
« Respuesta #1 en: 11 de Noviembre de 2008, 09:51:40 »
Hola si no le pone el pic que va a usar al compilador nunca te va a funcionar y para ayudarte por aqui asi lo veo dificil si nos no pones que pic usa, y tambien que compilador de picbasic usa.
Saludo

Desconectado cdistri

  • PIC10
  • *
  • Mensajes: 24
Re: Problema con codigo
« Respuesta #2 en: 11 de Noviembre de 2008, 13:49:08 »
Hola

Tienes razon stk500.

Antes de nada me he equivocado de codigo ya que este codigo esta hecho para el chip BS1-IC y un LCD MILFORD-2x16-BKP.

El chip que yo voy a utilizar el el 16f877A y un LCD de 16x2

Este es el codigo:

Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 12
AllDigital

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTE
Define LCD_RSBIT = 0
Define LCD_RWREG = PORTE
Define LCD_RWBIT = 1
Define LCD_EREG = PORTE
Define LCD_EBIT = 2
Define LCD_READ_BUSY_FLAG = 1
Lcdinit

Symbol scl = PORTC.3
Symbol sda = PORTC.4

Dim addr As Byte
Dim data As Byte
Dim sec As Byte
Dim min As Byte
Dim hour As Byte
Dim day As Byte
Dim month As Byte
Dim year As Byte
Dim d_hi As Byte
Dim d_lo As Byte

WaitMs 1000

addr = 2
I2CWrite sda, scl, 0xa2, addr, 0
addr = 3
I2CWrite sda, scl, 0xa2, addr, 0x55
addr = 4
I2CWrite sda, scl, 0xa2, addr, 0x23
addr = 5
I2CWrite sda, scl, 0xa2, addr, 0xb1
addr = 6
I2CWrite sda, scl, 0xa2, addr, 0x12

loop:

addr = 2
I2CRead sda, scl, 0xa2, addr, sec
addr = 3
I2CRead sda, scl, 0xa2, addr, min
addr = 4
I2CRead sda, scl, 0xa2, addr, hour
addr = 5
I2CRead sda, scl, 0xa2, addr, day
year = 0
year.0 = day.6
year.1 = day.7
day.6 = 0
day.7 = 0
addr = 6
I2CRead sda, scl, 0xa2, addr, month
month.5 = 0
month.6 = 0
month.7 = 0

Lcdcmdout LcdClear
Lcdout "Time: "
data = hour
Gosub print
Lcdout ":"
data = min
Gosub print
Lcdout ":"
data = sec
Gosub print
Lcdcmdout LcdLine2Home
Lcdout "Date: "
data = day
Gosub print
Lcdout "/"
data = month
Gosub print
Lcdout "/200", #year

WaitMs 200
Goto loop
End

print:
d_hi = data / 16
d_lo = data Mod 16
If d_hi < 10 Then
Lcdout #d_hi
Else
Lcdout "X"
Endif
If d_lo < 10 Then
Lcdout #d_lo
Else
Lcdout "X"
Endif
Return


y este es el diseño: 

Diseño

A la hora de compilarlo en cualquier programa pic simulator ide, pbp, mikrobasic me da errores en las variables.

A ver si me podeis ayudar

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Problema con codigo
« Respuesta #3 en: 11 de Noviembre de 2008, 15:53:17 »
ese codigo esta muy mal hecho te aconsejo que busque informacion y use el buscador del foro hay muchas informacion de esos.
Saludo


Desconectado cdistri

  • PIC10
  • *
  • Mensajes: 24
Re: Problema con codigo
« Respuesta #4 en: 11 de Noviembre de 2008, 16:36:15 »
Hola

Pues este codigo esta sacado de la pagina oficial de pic simulatio ide.

Un saludo

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Problema con codigo
« Respuesta #5 en: 11 de Noviembre de 2008, 18:38:35 »
entonce amigo te acosnsejo que comience desde Cero, copia un codigo si saber lo que hace no es ningun plan.
Lee, Lee lee y si tiene dudas ven hacer preguntas.
Saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Problema con codigo
« Respuesta #6 en: 11 de Noviembre de 2008, 19:51:56 »
El código compila correctamente con el Basic del PSI.
Es código solo es un ejemplo para iniciarse con el RTC.

Código: vb.net
  1. '***PARA SIMULACION ****
  2. Define CONF_WORD = 0x3d32
  3. Define CLOCK_FREQUENCY = 12
  4. '******Pic16F877A*******************
  5. Define SIMULATION_WAITMS_VALUE = 1
  6. AllDigital
  7. '----------------------------------
  8. Define LCD_BITS = 8
  9. Define LCD_DREG = PORTD
  10. Define LCD_DBIT = 0
  11. Define LCD_RSREG = PORTE
  12. Define LCD_RSBIT = 0
  13. Define LCD_RWREG = PORTE
  14. Define LCD_RWBIT = 1
  15. Define LCD_EREG = PORTE
  16. Define LCD_EBIT = 2
  17. Define LCD_READ_BUSY_FLAG = 1
  18. Lcdinit
  19. '----------------------------------
  20. Symbol scl = PORTC.3
  21. Symbol sda = PORTC.4
  22. '----------------------------------
  23. Dim addr As Byte
  24. Dim data As Byte
  25. Dim sec As Byte
  26. Dim min As Byte
  27. Dim hour As Byte
  28. Dim day As Byte
  29. Dim month As Byte
  30. Dim year As Byte
  31. Dim d_hi As Byte
  32. Dim d_lo As Byte
  33. '----------------------------------
  34. WaitMs 1000
  35. '----------------------------------
  36. addr = 2
  37. I2CWrite sda, scl, 0xa2, addr, 0
  38. addr = 3
  39. I2CWrite sda, scl, 0xa2, addr, 0x55
  40. addr = 4
  41. I2CWrite sda, scl, 0xa2, addr, 0x23
  42. addr = 5
  43. I2CWrite sda, scl, 0xa2, addr, 0xb1
  44. addr = 6
  45. I2CWrite sda, scl, 0xa2, addr, 0x12
  46. '----------------------------------
  47. loop:
  48.         addr = 2
  49.         I2CRead sda, scl, 0xa2, addr, sec
  50.         addr = 3
  51.         I2CRead sda, scl, 0xa2, addr, min
  52.         addr = 4
  53.         I2CRead sda, scl, 0xa2, addr, hour
  54.         addr = 5
  55.         I2CRead sda, scl, 0xa2, addr, day
  56.         year = 0
  57.         year.0 = day.6
  58.         year.1 = day.7
  59.         day.6 = 0
  60.         day.7 = 0
  61.         addr = 6
  62.         I2CRead sda, scl, 0xa2, addr, month
  63.         month.5 = 0
  64.         month.6 = 0
  65.         month.7 = 0
  66.         Lcdcmdout LcdClear
  67.         Lcdout "Time: "
  68.         data = hour
  69.         Gosub print
  70.         Lcdout ":"
  71.         data = min
  72.         Gosub print
  73.         Lcdout ":"
  74.         data = sec
  75.         Gosub print
  76.         Lcdcmdout LcdLine2Home
  77.         Lcdout "Date: "
  78.         data = day
  79.         Gosub print
  80.         Lcdout "/"
  81.         data = month
  82.         Gosub print
  83.         Lcdout "/200", #year
  84.  
  85.         WaitMs 200
  86. Goto loop
  87. End                                              
  88. print:
  89.         d_hi = data / 16
  90.         d_lo = data Mod 16
  91.         If d_hi < 10 Then
  92.                 Lcdout #d_hi
  93.         Else
  94.                 Lcdout "X"
  95.         Endif
  96.         If d_lo < 10 Then
  97.                 Lcdout #d_lo
  98.         Else
  99.                 Lcdout "X"
  100.         Endif
  101. Return

PD. Todo lo que esta publicado en la pagina del PSI esta totalmente probado por el autor.

« Última modificación: 11 de Noviembre de 2008, 19:54:29 por dogflu66 »
Saludos desde Granada, España.

Desconectado cdistri

  • PIC10
  • *
  • Mensajes: 24
Re: Problema con codigo
« Respuesta #7 en: 11 de Noviembre de 2008, 22:28:10 »
Hola

Teneis razon, tengo que empezarlo desde cero.

Tengo una duda en este codigo:

program LCD

main:

  Lcd_Config(PORTB,7,6,5,4,PORTA,0,1,2)

 
    Lcd_Cmd(LCD_CLEAR)
    Lcd_Cmd(LCD_CURSOR_OFF)
    Lcd_Out(1, 1, "hola")
    DELAY_MS (100)

end.

Como podria hacer para que en vez de que me salga en pantalla LCD "hola" me saliera un numero el cual fuera una variable la que yo pueda modificar como por ejemplo esto:


program LCD2

DIM  num as byte

main:
  Lcd_Config(PORTB,7,6,5,4,PORTB,0,1,2)

Repetir:

    Lcd_Cmd(LCD_CLEAR)
    Lcd_Cmd(LCD_CURSOR_OFF)
    Lcd_Out(1, 1, num)
    DELAY_MS (100)

end.

A ver si me podeis ayudar

Un saludo

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Problema con codigo
« Respuesta #8 en: 11 de Noviembre de 2008, 22:35:16 »
Eso es Mikrobasic, para mostrar la variable tienes que convertirla a string primero de los Basic que conozco es el unico que lo hace, lo que tienes que hacer es:

program LCD2

DIM  num  as byte
DIM  numt as char[3]

main:
  Lcd_Config(PORTB,7,6,5,4,PORTB,0,1,2)
  num=0 ' o el valor que tengas

Repetir:
    bytetostr(num,numt) ' pasas el valor de num a numt siendo este ultimo una cadena o caracter
    Lcd_Cmd(LCD_CLEAR)
    Lcd_Cmd(LCD_CURSOR_OFF)
    Lcd_Out(1, 1, numt) ' Muestras la cadena que correponde a num
    DELAY_MS (100)

end.

Ojo que cambia para bytes, Word y Long.

Saludos
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado cdistri

  • PIC10
  • *
  • Mensajes: 24
Re: Problema con codigo
« Respuesta #9 en: 12 de Noviembre de 2008, 07:04:40 »
hola

Tengo una duda. Con este codigo ( bytetostring(num,numt)) lo que hacemos es cambiar el 0 que esta grabado en num a texto que es grabado en numt y luego con este codigo  Lcd_Out(1, 1, numt) motramos en el Lcd el valos que se almacena en numt que es 0.

Es asi.

Un saludo

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Problema con codigo
« Respuesta #10 en: 12 de Noviembre de 2008, 17:02:05 »
Si, es exactamente asi.
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado cdistri

  • PIC10
  • *
  • Mensajes: 24
Re: Problema con codigo
« Respuesta #11 en: 12 de Noviembre de 2008, 17:58:18 »
hola

Una pregunta mas.

Si quisiera que apareciera en el LCD en la misma linea 2 o mas variables, me explico. Poner esto en la miam linea de LCD:

T:12 T:20 T:21  Los numeros son variables por ejemplo numt, numt1, numt2. Seria asi el codigo:

Lcd_out(1,1, "T: "numt, "T :"numt1, "T :"numt2)

Un saludo

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Problema con codigo
« Respuesta #12 en: 12 de Noviembre de 2008, 18:09:56 »
No el LCD_OUT de Mikrobasic no soporta la concatenacion como lo hace PBP Y proton tienes para hacer 2 cosas:

1.- Cada variable ya convertida la anexas mediante el cursor por ejemplo ya tienes numt1 y numt2 en string para mostrarlas podrias hacer:
  Lcd_out(1,1,"T1")
  Lcd_out(1,4,numt1) 'aqui te vas a la posicion 4 del LCD
  Lcd_out(1,6,"T2")
  Lcd_out(1,9,numt1) 'aqui te vas a la posicion 9 del LCD

Y asi para todo sin sobrepasar los 16 caracteres y suponiendo que cada numero sea de 2 digitos.

2.- Crear una variable tipo string que sea de 16 caracteres y concatenar los valores de tus variables, algo asi:

Dim text as string[16]
............
..............
' Aqui ya tienes todos tus valores convertidos y lo que haces es:

text = "T1" ' A continuacion concatenas el texto
strcat(text,numt1)
strcat(text,"T2")
strcat(text,numt2)
strcat(text,"T3")
strcat(text,numt3)

Lcd_out(1,1,text)

Eso es lo que podrias hacer.

Saludos




"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado cdistri

  • PIC10
  • *
  • Mensajes: 24
Re: Problema con codigo
« Respuesta #13 en: 13 de Noviembre de 2008, 07:48:22 »
Hola

Gracias navaismo lo voy a probar a ver si me funciona.

Un saludo

Desconectado cdistri

  • PIC10
  • *
  • Mensajes: 24
Re: Problema con codigo
« Respuesta #14 en: 17 de Noviembre de 2008, 13:15:44 »
Hola

He probado la concatenacion del texto para mostrarlo en el LCD y funciona correctamente.

Un pregunta:

Quiero poner un teclado numerico  para que cuando se pulsa la tecla aparezca ese numero mostrado en el LCD.Poniendo el LCD al puerto b  y el teclado al puerto d me funciona correctamente pero necesito el puerto del teclado para poner salidas.
He intentado ponerlos al mismo puerto pero cuando pulso una tecla aparecen simbolos raros en el LCD.

Este es el codigo que uso ( esta hecho en mikrobasic y simulado en proteus) :

program keypad

dim key as byte
dim keyt as string[5]

main:                'inicializacion de lcd y keypad
delay_ms(1000)

'keypad_init(portb)
lcd_config(portb,7,6,5,4,portb,0,1,2)
lcd_cmd(lcd_clear)
lcd_cmd(lcd_cursor_off)

 leek:
   key = keypad_read    ' lee la tecla que se apreto
   ByteToStr(key,keyt)
   lcd_out(1,1,"Tecla #: ")  'ver la tecla en el lcd
   lcd_out_cp(keyt)
 goto leek
end.

Si uso keypad_init (portb) ni el teclado ni el LCD funciona. Si lo queito es cuando salen numeros raros.

Adjunto fichero en proteus y codigo en mikrobasic.

A ver si me podeis ayudar.