TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: cdistri en 11 de Noviembre de 2008, 09:44:24

Título: Problema con codigo
Publicado por: cdistri 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
         
Título: Re: Problema con codigo
Publicado por: stk500 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
Título: Re: Problema con codigo
Publicado por: cdistri 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 (http://www.oshonsoft.com/picexample9.png)

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
Título: Re: Problema con codigo
Publicado por: stk500 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

Título: Re: Problema con codigo
Publicado por: cdistri 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
Título: Re: Problema con codigo
Publicado por: stk500 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
Título: Re: Problema con codigo
Publicado por: dogflu66 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.

Título: Re: Problema con codigo
Publicado por: cdistri 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
Título: Re: Problema con codigo
Publicado por: navaismo 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
Título: Re: Problema con codigo
Publicado por: cdistri 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
Título: Re: Problema con codigo
Publicado por: navaismo en 12 de Noviembre de 2008, 17:02:05
Si, es exactamente asi.
Título: Re: Problema con codigo
Publicado por: cdistri 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
Título: Re: Problema con codigo
Publicado por: navaismo 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




Título: Re: Problema con codigo
Publicado por: cdistri en 13 de Noviembre de 2008, 07:48:22
Hola

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

Un saludo
Título: Re: Problema con codigo
Publicado por: cdistri 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.

Título: Re: Problema con codigo
Publicado por: navaismo en 17 de Noviembre de 2008, 16:14:48
Checa si este tema te sirve (http://www.todopic.com.ar/foros/index.php?topic=15103.msg93871#msg93871)

Saludos.
Título: Re: Problema con codigo
Publicado por: cdistri en 17 de Noviembre de 2008, 17:08:30
Hola

Gracias navaismo por el link. De hecho he sacado de ese tema la idea.

Lo que necesito es que el keypad y el LCD esten conectados al mismo puerto. Los dos al puerto RB. Si se puede. Asi de esa manera tengo los puertos RD puertos y RC para salidas a relés.

A ver si me puedes hechar una mano.


Gracias
Título: Re: Problema con codigo
Publicado por: navaismo en 17 de Noviembre de 2008, 17:36:52
Si se puede pero tienes que desactivar el LCD cuando uses el KEYPAD y viceversa, asi pues cuando quieras mostrar el dato:

1ro.- Desactivas el LCD, Activas el Keypad y metes la tecla, a estas alturas guardas la tecla en una variable
2do.- Desactivas el KEYPAD, activas el LCD y mandas el valor de la variable que contiene el valor de la tecla.
Título: Re: Problema con codigo
Publicado por: cdistri en 17 de Noviembre de 2008, 17:38:28
Hola

A que te refieres con activar o desactivar. Como desactivo o activo el LCD y keypad.

Un saludo
Título: Re: Problema con codigo
Publicado por: navaismo en 17 de Noviembre de 2008, 18:02:40
A que puedes usar el pin ENABLE o R/W del LCD, o bien esperar un tiempo antes de escribir en el lcd
Título: Re: Problema con codigo
Publicado por: navaismo en 17 de Noviembre de 2008, 19:30:44
cdistri estuve revisando esto que deseas y por lo visto la libreria KEYPAD si genera problemas para controlar el LCD ya que esta barriendo todo el Puerto para saber que tecla se presiona, tienes dos opciones que se me ocurren:

Modificar este pobre intento:

Código: FreeBasic
  1. program Key_LCD
  2.  
  3. dim key1, dum as byte
  4. dim keyt as string[5]
  5.  
  6. sub procedure writelcd(dim byref key1 as byte)
  7.  delay_ms(1000)
  8.  lcd_config(portb,4,5,6,7,portb,0,1,2)
  9.  lcd_cmd(lcd_clear)
  10.  lcd_cmd(lcd_cursor_off)
  11.  ByteToStr(key1,keyt)
  12.  delay_ms(50)
  13.  lcd_out(1,1,"Tecla #: ")  'ver la tecla en el lcd
  14.  lcd_out_cp(keyt)
  15. end sub
  16.  
  17. sub procedure key()
  18. keypad_init(portb)
  19. end sub
  20. main:
  21. dum=0
  22.  leek:
  23.   key
  24.   while key1 = dum
  25.    key1=keypad_read
  26.   wend
  27.   delay_ms(50)
  28.   writelcd(key1)
  29.   dum=key1
  30. goto leek
  31. end.

Que finalmente no se que tan bueno andar iniciando el lcd a cada rato.

O bien hacer tu propia rutina para leer el keypad si no mal recuerdo al amigo RALF2 hizo eso para manejar  un LCD y un KEYPAD, a reserva de que me corrigan de quien es el codigo aqui lo pongo es facil migrarlo a MKB

Código: FreeBasic
  1. ....
  2. L1 CON %01110000
  3. L2 CON %10110000
  4. L3 CON %11010000
  5. L4 CON %11100000
  6. .....
  7.  
  8. '******************************
  9. TECLADO:
  10. FLAG=0
  11. TECLA=$FF
  12. PORTB = L1
  13. SELECT CASE PORTB & $0F
  14. CASE %1110
  15.         TECLA="*"
  16.         FLAG = 1
  17. CASE %1101
  18.         TECLA="0"
  19.         FLAG = 1
  20. CASE %1011
  21.         TECLA="#"
  22.         FLAG = 1
  23. END SELECT
  24.  
  25. PORTB = L2      'Lin 120
  26. SELECT CASE PORTB & $0F
  27. CASE %1110
  28.         TECLA="1"
  29.         FLAG = 1
  30. CASE %1101
  31.         TECLA="2"
  32.         FLAG = 1
  33. CASE %1011
  34.         TECLA="3"
  35.         FLAG = 1
  36. END SELECT
  37.  
  38. PORTB = L3
  39. SELECT CASE PORTB & $0F
  40. CASE %1110
  41.         TECLA="4"
  42.         FLAG = 1
  43. CASE %1101
  44.         TECLA="5"
  45.         FLAG = 1
  46. CASE %1011
  47.         TECLA="6"
  48.         FLAG = 1
  49. END SELECT
  50.  
  51. PORTB = L4
  52. SELECT CASE PORTB & $0F
  53. CASE %1110
  54.         TECLA="7"
  55.         FLAG = 1
  56. CASE %1101
  57.         TECLA="8"
  58.         FLAG = 1
  59. CASE %1011
  60.         TECLA="9"
  61.         FLAG = 1
  62. END SELECT
  63. PAUSE 50
  64. RETURN

Saludos