Autor Tema: PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)  (Leído 603790 veces)

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

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #795 en: 10 de Marzo de 2014, 14:34:11 »
Maestros alguna librería para LCD 40x4..

saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #796 en: 11 de Marzo de 2014, 08:35:26 »
No he utilizado ese LCD, pero en teoría, la librería del pic simulator es estándar, debería funcionar también con ese lcd directamente.
Saludos desde Granada, España.

Desconectado allado

  • PIC10
  • *
  • Mensajes: 10
    • Circuitos Impresos
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #797 en: 13 de Abril de 2014, 10:03:01 »
 :-/ Excelente Carlos, veo que tu curso no para!. Quizas no lo sepas Carlos pero mi incursión enserio en desarrollo con micros arranco alla por 2006 con el comienzo de este excelente curso, la didactica que usaste me ayudo muchisimo en mi trabajo diario. Estoy ansioso para ver cuando encaramos algo en ethernet con el ENC28J60..!!! te djo un abrazo.
La humildad es el hilo con el que se encadena la gloria.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #798 en: 14 de Abril de 2014, 18:46:47 »
¡Cuánto tiempo!; me alegro de saber de ti, un abrazo también de mi parte.
Saludos desde Granada, España.

Desconectado zgouki

  • PIC10
  • *
  • Mensajes: 5
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #799 en: 17 de Abril de 2014, 18:15:50 »
Hola de nuevo dogflu, como te va?  ;-)
Estuve viendo los ultimos codigos que publicaste respecto a la USART y los ring buffers y me ha quedado una duda.
Cuando dice:

'Biblioteca de funciones
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesUartRingBuffer.bas"
Include "_FuncionesBasesTimer8_Pic16.bas"


Me tira error al compilar en el PSI debido a que no encuentra dichas funciones. Serias tan amable de indicarme donde las puedo conseguir?
Muchas gracias!  :)

EDIT: Me respondo a mi mismo, estas funciones estan en el primer post de esta pagina! (con extension txt). Eso me pasa por no leer todo atentamente, mil disculpas!  :oops:
« Última modificación: 17 de Abril de 2014, 18:18:08 por zgouki »

Desconectado SYLA0285

  • PIC10
  • *
  • Mensajes: 10
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #800 en: 24 de Agosto de 2014, 18:05:42 »
Hola que tal, me estoy quebrando un poco la cabeza con el ide de PICBASIC ya que quiero programar un pic18f2550 y como tengo la version del compilador 2.5 no me admite las variables tipo long ni tampoco habilita correctamente los bits de configuración marcandome un error en el hexadecimal, alguien me podría ayudar, sorry por desviar un poco el tema pero este es el tema que encontre más a fin a mi problema y no sabía como iniciar uno nuevo :oops:, saludos.

De antemano gracias por la ayuda!!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #801 en: 31 de Agosto de 2014, 10:37:43 »
Estas utilizando una versión muy antigua, no te queda otra que actualizarla.

http://www.oshonsoft.com/licenses.php
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE (Índice en página 1)
« Respuesta #802 en: 02 de Septiembre de 2015, 20:50:00 »
Para el que quiera jugar con un stack (pila) por software le adjunto un programita de ejemplo y su respectivo Include con las funciones:

Código: [Seleccionar]
'Funciones Push/Pop por software
'PIC16F88, PSI v.7.39_02, By DogFlu66
'02/09/2015: Se implementan funciones Push_Single/Pop_Single
'09/2014: Funcion Stack (Push y Pop), trabajando con un software stack
'hay que especificar los tipos asbyte, aswork y aslong
'-------------------------------------------------------------------
Include "FuncionesStack_Push&Pop.bas"
Define CLOCK_FREQUENCY = 8
Define SINGLE_DECIMAL_PLACES = 2
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los Waitms
'-------------------------------------------------------------------
AllDigital  'Pin como digitales
TRISA = %00000000  'Pin como salidas (si lo permiten)
TRISB = %00000000  'Pin como salidas
'Abre puerto serie
Hseropen 4800  'Configura puerto serie harware a 4800baudios
'-------------------------------------------------------------------
'Rutina principal
main:
Dim x As Byte
Dim x1 As Word
Dim x2 As Long
Dim x3 As Single
Dim y As Long
Dim y1 As Single

Call _setup_stack()  'Inicializa la pila Stack por software

x = 101
x1 = 1001
x2 = 910001
x3 = 0.1
Hserout "x = 101, x1 = 1001, x2 = 910001, x3 = 0.1", CrLf, CrLf  'Imprime en el Hyperterminal

Call _stack_buffer()  'Actualiza los bytes libres de la pila
Hserout "Stack_buffer = ", #_stack_buffer, CrLf

Call _push(x, _asbyte)  'Pone un Byte en la pila
Call _push(x1, _asword)  'Pone un Word en la pila
y = _pop(_asword)

Hserout "_Push(x, _asbyte)", CrLf
Hserout "_Push(x1, _asword)", CrLf
Hserout "y = _Pop(_asword)", CrLf
Hserout "Y:", #y, CrLf

Call _stack_buffer()
Hserout "Stack_Buffer = ", #_stack_buffer, CrLf, CrLf

Call _push(x1, _asword)  'Pone un Word en la pila
Call _push(x2, _aslong)  'Pone un Long en la pila
Call _push_single(x3)  'Pone un Single (Float simple) en la pila

Hserout "_Push(x1, _asword)", CrLf
Hserout "_Push(x2, _aslong)", CrLf
Hserout "_Push_single(x3)", CrLf

Call _stack_buffer()
Hserout "Stack_Buffer = ", #_stack_buffer, CrLf, CrLf

y1 = _pop_single()  'Extrae un Single de la pila
Hserout "y1 = _Pop_Single()", CrLf
Hserout "Y1:", #y1, CrLf
y = _pop(_aslong)  'Extrae un long de la pila
Hserout "y = _Pop(_aslong)", CrLf
Hserout "Y:", #y, CrLf
y = _pop(_asword)  'Extrae un Word de la pila
Hserout "y = _Pop(_asword)", CrLf
Hserout "Y:", #y, CrLf
y = _pop(_asbyte)  'Extrae un Byte de la pila
Hserout "y = _Pop(_asbyte)", CrLf
Hserout "Y:", #y, CrLf

Call _stack_buffer()
Hserout "Stack_Buffer = ", #_stack_buffer, CrLf, CrLf

x = 102
x1 = 1002
x2 = 910002
x3 = 0.2
Hserout "x = 102, x1 = 1002, x2 = 910002, x3 = 0.2", CrLf, CrLf

Call _push(x, _asbyte)
Call _push(x1, _asword)
Call _push(x2, _aslong)
Call _push_single(x3)

Call _stack_buffer()
Hserout "Stack_Buffer=", #_stack_buffer, CrLf, CrLf

y1 = _pop_single()
Hserout "Y1:", #y1, CrLf
y = _pop(_aslong)
Hserout "Y:", #y, CrLf
y = _pop(_asword)
Hserout "Y:", #y, CrLf
y = _pop(_asbyte)
Hserout "Y:", #y, CrLf

Call _stack_buffer()
Hserout "Stack_Buffer = ", #_stack_buffer, CrLf

Halt  'Stop
End                                              

Nota: se ha añadido la extensión ".bas" al anexo de los archivos fuente (03/09/2015).
« Última modificación: 03 de Septiembre de 2015, 05:22:55 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
« Respuesta #803 en: 13 de Marzo de 2016, 14:39:31 »
(Ejemplo_1 números grandes con funciones: http://www.todopic.com.ar/foros/index.php?topic=14917.msg307599#msg307599)

Ejemplo_2 números grandes sin funciones:
Hace varios años que realice una función para trabajar con números grandes, pero solo fue como algo anecdótico, después de ver lo que se han popularizado en la red los números grandes (bigfont) para display no gráficos (LCD), he decido actualizarla y realizar una nueva versión simplificada con los números proporcionales y más vistosos.
Para hacerla más popular esta es una versión realizada en lenguaje basic tradicional, o sea con subrutinas y no con funciones.
El código esta explicado línea por línea y tan solo indicar que al utilizar subrutinas en la mayoría de los casos es necesario trabajar con variables globales. Este lenguaje utiliza variables globales y variables locales, las variables globales una ves que se declaran en la subrutina main, inicio o con el nombre que se tenga habitualmente costumbre de nombrarla son visibles desde cualquier parte del código del programa, mientras que el resto de variables que se declaran dentro del resto de subrutinas o funciones del programa son locales, y solo se pueden utilizar dentro de la zona de código donde se declararon. Esto es fundamental tenerlo en cuenta porque hace el código más transportable, sobre todo si se usan funciones en ves de subrutinas.

El programa funciona perfectamente en el simulador del IDE del PSI, tan solo hay que recompilar activando la línea "Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación"


Código: Visual Basic
  1. '*********************************************************************
  2. 'Escribiendo números grandes en LCD de dos líneas
  3. 'con programación tradicional (subrutinas)
  4. 'Para placa PicEBasic, By COS, 03/2016, 12/13, 12/11
  5. 'Basic Pic Simulator IDE (PSI), v7.40, Pic16F88
  6. '*********************************************************************
  7. 'Se modifican los patrones
  8. 'Se hace los numeros proporcionales 2x3 digitos
  9. 'El espacio de separación entre digitos se minimisa
  10. 'Se simplifica la función de impresión de numeros grandes
  11. '---------------------------------------------------------------------
  12. Define CONFIG = 0x2f70  'Fuses
  13. Define CONFIG2 = 0x3ffc
  14. Define CLOCK_FREQUENCY = 8  'Oscilador a 8Mhz
  15. Define STRING_MAX_LENGTH = 11  'Longitud variables string por defecto
  16. 'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
  17. '---------------------------------------------------------------------
  18. '*********************************************************************
  19. 'Configuración de la placa entrenadora Pic EBasic ********************
  20. 'LCD con linea de datos a 4 Bit sin Bit R/W **************************
  21. 'Puerto serie RS232 a 38400baudios ***********************************
  22. '*********************************************************************
  23. 'Puerto del LCD ------------------------------------------------------
  24. Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
  25. Define LCD_DREG = PORTA  'Bus de datos, puerto A
  26. Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto
  27. Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
  28. Define LCD_RSBIT = 7  'RB7 como RS
  29. Define LCD_EREG = PORTB  'Bit de control E, puerto B
  30. Define LCD_EBIT = 6  'RB6 como E
  31. Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
  32. Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
  33. Define LCD_INITMS = 50  'Espera inicialización del Display
  34. '---------------------------------------------------------------------
  35. Symbol ledv = RB0  'Etiqueta el led verde
  36. Symbol leda = RA7  'Etiqueta el led amarillo
  37. Symbol blcd = RB3  'Etiqueta el backlight del lcd
  38. Symbol adc = RA4  'Etiqueta la entrada analogica de la R. ajustable
  39. Symbol sw1 = RA6  'Etiqueta la tecla S1
  40. Symbol sw2 = RA5  'Etiqueta la tecla S2
  41. AllDigital  'ANSEL = 0x00  'Los pin I/O digitales
  42. CMCON = 0x07  'Comparador a off
  43. OSCCON = 0x7e  'Reloj interno a 8Mhz
  44. TRISA = 0x00  'Puerto A como salidas
  45. TRISB = 0x00  'Puerto B como salidas
  46. TRISA.4 = 1  'Como entrada (RA4, adc)
  47. TRISA.6 = 1  'Como entrada (RA6, tecla S1)
  48. TRISA.5 = 1  'Como entrada (RA5, tecla S2)
  49. TRISB.5 = 0  'Como salida(RB5,Tx RS232)
  50. TRISB.2 = 1  'Como entrada (RB2, Rx RS232)
  51. TRISB.4 = 1  'Como entrada (RHT03 inicio)
  52. PORTB.3 = 1  'Luz lcd a ON (RB3)
  53. PORTA.7 = 1  'Led amarillo a OFF
  54. PORTB.0 = 1  'Led verde a OFF
  55. PORTB.1 = 0  'LED RHT03 a OFF
  56. Hseropen 38400  'Inicializa puerto RS232 por hardware a 38400Baudios
  57. Lcdinit  'Inicializa el LCD sin cursor
  58. '---------------------------------------------------------------------
  59. 'Variables globales
  60. Dim _word01 As String  'Declara cadena
  61. Dim _xpos As Byte  'Posición a imprimir el digito
  62. void_main:
  63.         Gosub _intstrngrandes  'Configura nuevos caracteres y los muestra
  64.         'Variables
  65.         Dim numero As Long
  66.         Dim main As Bit
  67.         numero = 0
  68.         While main = main  'Bucle principal
  69.                 _word01 = #numero  'Convierte un número a cadena
  70.                 _xpos = 1
  71.                 Gosub _strngrandes  'Escribe números grandes
  72.                 Lcdcmdout LcdLine2Pos(_xpos)  'Se escribirá en la línea dos en tal posición
  73.                 Lcdout #numero  'Escribe el número en formato normal
  74.                 numero = numero + 1  'Incrementa el número a imprimir
  75.                 WaitMs 1000  'Pausa de un segundo
  76.         Wend
  77. End                                              
  78. '*********************************************************************
  79. '****************Subrutinas Números Grandes***************************
  80. '*********************************************************************
  81. 'Configura los patrones de bits en la CGRam del LCD y los muestra en el LCD
  82. 'Gosub _intstrngrandes 'Poner al principio
  83. _intstrngrandes:
  84.         Lcddefchar 0, %11111, %11111, %11111, 0, 0, 0, 0, 0  'Barra horizontal superior.
  85.         Lcddefchar 1, 0, 0, 0, 0, 0, %11111, %11111, %11111  'Barra horizontal inferior.
  86.         Lcddefchar 2, %11111, %11111, %11111, 0, 0, 0, %11111, %11111  'Barras h. sup. e inf.
  87.         Lcddefchar 3, %11100, %11110, %11110, %11110, %11110, %11110, %11110, %11100  'Flecha derecha
  88.         Lcddefchar 4, %00111, %01111, %01111, %01111, %01111, %01111, %01111, %00111  'Flecha izq.
  89.         Lcddefchar 5, 0, 0, 0, 0, 0, %00011, %00111, %01111  'Terminación superior izquierda.
  90.         Lcddefchar 6, %00011, %00111, %01111, 0, 0, 0, 0, 0  'Terminación inferior izquierda.
  91.         Lcddefchar 7, 0, 0, 0, 0, 0, %11000, %11100, %11110  'Terminación inferior derecha.
  92.         Lcdcmdout LcdClear  'Se borra el LCD despues de guardar los chr
  93.         'Muestra los caracteres CGRam del LCD, números grandes
  94.         Lcdout "Patrones:"
  95.         Lcdcmdout LcdLine2Home
  96.         Lcdout 0, 1, 2, 3, 4, 5, 6, 7, 255  'Se imprimen los nuevos caracteres
  97.         WaitMs 3000  'Pausa de 3Seg
  98.         Lcdcmdout LcdClear  'Borrar el LCD
  99. Return                                            
  100. '*********************************************************************
  101. 'Subrutina que agranda los caracteres numéricos de una cadena
  102. 'Limitada a la longitud de la cadena, escrita para LCD de 2 líneas
  103. 'xpos: Posición de comienzo a imprimir en el LCD
  104. 'Gosub _strngrandes
  105. '*********************************************************************
  106. _strngrandes:
  107.         Dim _data As Byte  'Mascara del digito a dibujar
  108.         Dim _index As Byte  'Indice mascara
  109.         Dim _cdigito As Byte  'Contador caracteres de la cadena
  110.         Dim _bucle As Bit  'Control exit bucle linea
  111.         Dim _strchr As Byte  'Cotendrá el digito a dibujar
  112.         _bucle = True  'Bucle de control
  113.         _cdigito = 0  'Contador digitos
  114.         _strchr = _word01(_cdigito)  'Extrae el caracter a agrandar
  115.         While _bucle = True  'Bucle control
  116.                 Lcdcmdout LcdLine1Pos(_xpos)  'Establece la posición inicial a escribir en el LCD
  117.                 For _index = 0 To 5  'Bucle control de ipresión mascaras superior e inferior (digito grande)
  118.                         If _strchr = "0" Then _data = LookUp(4, 0, 3, 4, 1, 3), _index  'Mascaras del 0
  119.                         If _strchr = "1" Then _data = LookUp(6, 255, " ", 5, 255, 7), _index  'Mascaras del 1
  120.                         If _strchr = "2" Then _data = LookUp(6, 2, 3, 4, 1, 7), _index  'Mascaras del chr 2
  121.                         If _strchr = "3" Then _data = LookUp(6, 2, 3, 5, 1, 3), _index  'M. chr 3
  122.                         If _strchr = "4" Then _data = LookUp(4, 1, 255, " ", " ", 255), _index  'M. chr 9
  123.                         If _strchr = "5" Then _data = LookUp(4, 2, 0, 5, 1, 3), _index  'M. chr 5
  124.                         If _strchr = "6" Then _data = LookUp(4, 2, " ", 4, 1, 3), _index  'M. chr 6
  125.                         'If _strchr = "7" Then _data = LookUp(6, 0, 3, " ", 255, " "), _index  'M. chr 7
  126.                         If _strchr = "7" Then _data = LookUp(6, 0, 255, " ", " ", 255), _index  'M. chr 7
  127.                         If _strchr = "8" Then _data = LookUp(4, 2, 3, 4, 1, 3), _index  'M. chr 8
  128.                         If _strchr = "9" Then _data = LookUp(4, 2, 3, " ", " ", 255), _index  'M. chr 9
  129.                         Lcdout _data  'Imprime mascara actual
  130.                         If _index = 2 Then  'Hace los cambios para dibujar la parte inferior del digito grande
  131.                                 Lcdcmdout LcdLine2Pos(_xpos)  'Establece posición en la linea 2
  132.                                 _xpos = _xpos + 3  'Posición del nuevo digito
  133.                         Endif
  134.                 Next _index
  135.                 _cdigito = _cdigito + 1  'Indica la proxima posición a imprimir
  136.                 _strchr = _word01(_cdigito)  'Extrae el caracter a agrandar
  137.                 If _strchr = 0 Then _bucle = False  'Fin, se sale del bucle
  138.         Wend
  139. Return                                            
  140. '**************************************************************************


El video:

« Última modificación: 05 de Abril de 2020, 13:11:10 por dogflu66 »
Saludos desde Granada, España.

Desconectado Resistencio

  • PIC12
  • **
  • Mensajes: 82
Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
« Respuesta #804 en: 17 de Mayo de 2016, 01:45:18 »
No tenía experiencia con PSI...lo intenté compilar con la V6.91, y me tira error en linea 12, 13, 15, 60, 69, 114, 136...Alguna idea ??? No estará en algún lado este mismo ejercicio para PB ??? Saludos.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
« Respuesta #805 en: 17 de Mayo de 2016, 10:29:04 »
Las líneas 12 y 13 van directamente relacionadas con el tipo de microcontrolador.
El resto de errores según parece es porque no tienes habilitado el modulo para trabajar con cadenas o string.
Lo ideal sería que actualizaras a una versión completa, de todas formas voy a ver si puedo modificar el código para que te funcione.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
« Respuesta #806 en: 17 de Mayo de 2016, 21:09:05 »
A ver que tal con esta otra versión:

Código: Visual Basic
  1. '*********************************************************************
  2. 'Escribiendo números grandes en LCD de dos líneas
  3. 'en programación tradicional (subrutinas)
  4. 'Para placa PicEBasic, By COS, 18/05/2019, 03/16, 12/13, 12/11
  5. 'Basic Pic Simulator IDE (PSI), v7.41, Pic16F88
  6. '*********************************************************************
  7. 'Se modifican los patrones
  8. 'Se hace los numeros proporcionales 2x3 digitos
  9. 'El espacio de separación entre digitos se minimisa
  10. 'Se simplifica la función de impresión de numeros grandes
  11. '---------------------------------------------------------------------
  12. 'Define CONFIG = 0x2f70  'Fuses
  13. 'Define CONFIG2 = 0x3ffc
  14. Define CLOCK_FREQUENCY = 8  'Oscilador a 8Mhz
  15. Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
  16. '---------------------------------------------------------------------
  17. '*********************************************************************
  18. 'Configuración de la placa entrenadora Pic EBasic
  19. 'LCD con linea de datos a 4 Bit sin Bit R/W
  20. 'Puerto serie RS232 a 38400baudios
  21. '*********************************************************************
  22. 'Puerto del LCD ------------------------------------------------------
  23. Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
  24. Define LCD_DREG = PORTA  'Bus de datos, puerto A
  25. Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto
  26. Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
  27. Define LCD_RSBIT = 7  'RB7 como RS
  28. Define LCD_EREG = PORTB  'Bit de control E, puerto B
  29. Define LCD_EBIT = 6  'RB6 como E
  30. Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
  31. Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
  32. Define LCD_INITMS = 50  'Espera inicialización del Display
  33. '---------------------------------------------------------------------
  34. Symbol ledv = RB0  'Etiqueta el led verde
  35. Symbol leda = RA7  'Etiqueta el led amarillo
  36. Symbol blcd = RB3  'Etiqueta el backlight del lcd
  37. Symbol adc = RA4  'Etiqueta la entrada analogica de la R. ajustable
  38. Symbol sw1 = RA6  'Etiqueta la tecla S1
  39. Symbol sw2 = RA5  'Etiqueta la tecla S2
  40. AllDigital  'ANSEL = 0x00  'Los pin I/O digitales
  41. CMCON = 0x07  'Comparador a off
  42. OSCCON = 0x7e  'Reloj interno a 8Mhz
  43. TRISA = 0x00  'Puerto A como salidas
  44. TRISB = 0x00  'Puerto B como salidas
  45. TRISA.4 = 1  'Como entrada (RA4, adc)
  46. TRISA.6 = 1  'Como entrada (RA6, tecla S1)
  47. TRISA.5 = 1  'Como entrada (RA5, tecla S2)
  48. TRISB.5 = 0  'Como salida(RB5,Tx RS232)
  49. TRISB.2 = 1  'Como entrada (RB2, Rx RS232)
  50. TRISB.4 = 1  'Como entrada (RHT03 inicio)
  51. PORTB.3 = 1  'Luz lcd a ON (RB3)
  52. PORTA.7 = 1  'Led amarillo a OFF
  53. PORTB.0 = 1  'Led verde a OFF
  54. PORTB.1 = 0  'LED RHT03 a OFF
  55. 'Hseropen 38400  'Inicializa puerto RS232 por hardware a 38400Baudios
  56. Lcdinit  'Inicializa el LCD sin cursor
  57. '---------------------------------------------------------------------
  58. 'Variables globales
  59. Dim _word01(15) As Byte  'Declara cadena
  60. Dim _xpos As Byte  'Posición a imprimir el digito
  61. void_main:
  62.         Gosub _intstrngrandes  'Configura nuevos caracteres y los muestra
  63.         'Variables
  64.         Dim numero As Long
  65.         Dim main As Bit
  66.         numero = 0
  67.         While main = main  'Bucle principal
  68.                 Gosub _nmrstr  'Convierte un número a cadena
  69.                 _xpos = 1
  70.                 Gosub _strngrandes  'Escribe números grandes
  71.                 Lcdcmdout LcdLine2Pos(_xpos)  'Se escribirá en la línea dos en tal posición
  72.                 Lcdout #numero  'Escribe el número en formato normal
  73.                 numero = numero + 1  'Incrementa el número a imprimir
  74.                 WaitMs 1000  'Pausa de un segundo
  75.         Wend
  76. End                                              
  77. '*********************************************************************
  78. '****************Subrutinas Números Grandes*******************************
  79. '*********************************************************************
  80. 'Configura los patrones de bits en la CGRam del LCD y los muestra en el LCD
  81. 'Gosub _intstrngrandes 'Poner al principio
  82. _intstrngrandes:
  83.         Lcddefchar 0, %11111, %11111, %11111, 0, 0, 0, 0, 0  'Barra horizontal superior.
  84.         Lcddefchar 1, 0, 0, 0, 0, 0, %11111, %11111, %11111  'Barra horizontal inferior.
  85.         Lcddefchar 2, %11111, %11111, %11111, 0, 0, 0, %11111, %11111  'Barras h. sup. e inf.
  86.         Lcddefchar 3, %11100, %11110, %11110, %11110, %11110, %11110, %11110, %11100  'Flecha derecha
  87.         Lcddefchar 4, %00111, %01111, %01111, %01111, %01111, %01111, %01111, %00111  'Flecha izq.
  88.         Lcddefchar 5, 0, 0, 0, 0, 0, %00011, %00111, %01111  'Terminación superior izquierda.
  89.         Lcddefchar 6, %00011, %00111, %01111, 0, 0, 0, 0, 0  'Terminación inferior izquierda.
  90.         Lcddefchar 7, 0, 0, 0, 0, 0, %11000, %11100, %11110  'Terminación inferior derecha.
  91.         Lcdcmdout LcdClear  'Se borra el LCD despues de guardar los chr
  92.         'Muestra los caracteres CGRam del LCD, números grandes
  93.         Lcdout "Patrones:"
  94.         Lcdcmdout LcdLine2Home
  95.         Lcdout 0, 1, 2, 3, 4, 5, 6, 7, 255  'Se imprimen los nuevos caracteres
  96.         WaitMs 3000  'Pausa de 3Seg
  97.         Lcdcmdout LcdClear  'Borrar el LCD
  98. Return                                            
  99. '*********************************************************************
  100. 'Convierte un número tipo Long a cadena alfanumerica
  101. 'numero = número a convertir
  102. 'La transformación se guarda en el vector "_word01(indice)"
  103. _nmrstr:
  104.         Dim _indice As Byte
  105.         _indice = 0
  106.         Dim _char As Byte
  107.         Dim _len As Byte
  108.         Dim _flag As Bit
  109.         Dim _nn As Byte
  110.         Dim _x As Byte
  111.         Dim _numero1 As Long
  112.         _len = 9  'Número máximo de digitos a convertir -1
  113.         _flag = 0  'Si =0 indica que son ceros a la izquierda, no se procesan
  114.         If numero = 0 Then  'Marca que se procese el cero a la izquierda y Exit
  115.                 _flag = 1  'Se procesa el cero a la izquierda
  116.                 _len = 0  'Fin de la transformación
  117.         Endif
  118.         _x = 1
  119.         While _x = 1  'Bucle de control
  120.                 _numero1 = numero  'Se hace una imagen del número a transformar
  121.                 For _nn = _len To 1 Step -1  'Selecciona el digito a extraer
  122.                         _numero1 = _numero1 / 10
  123.                 Next _nn
  124.                 _char = _numero1 Mod 10  'Extrae el digito
  125.                 If _char > 0 Then _flag = 1  'Marca procesar ceros
  126.                 _char = _char + 48  'Pasa valor numérico a cadena, Acsii 48 = "0".
  127.                 _word01(_indice) = _char  'Pointer(_indice) = _char  'Se asigna elemento a la cadena
  128.                 If _flag = 1 Then _indice = _indice + 1  'Selecciona siguiente caracter de la cadena
  129.                 'No hay más digitos
  130.                 If _len = 0 Then _word01(_indice) = 0  'pointer(_indice) = 0  'Se asigna el cararcter fin de cadena a la cadena
  131.                 If _len = 0 Then Return  'Exit
  132.                 _len = _len - 1  'Cifra siguiente, hasta terminar
  133.         Wend
  134. Return                                            
  135. 'Subrutina que agranda los caracteres numéricos de una cadena
  136. 'Limitada a la longitud de la cadena, escrita para LCD de 2 líneas
  137. 'xpos: Posición de comienzo a imprimir en el LCD
  138. 'Gosub _strngrandes
  139. '*********************************************************************
  140. _strngrandes:
  141.         Dim _data As Byte  'Mascara del digito a dibujar
  142.         Dim _index As Byte  'Indice mascara
  143.         Dim _cdigito As Byte  'Contador caracteres de la cadena
  144.         Dim _bucle As Bit  'Control exit bucle linea
  145.         Dim _strchr As Byte  'Cotendrá el digito a dibujar
  146.         _bucle = True  'Bucle de control
  147.         _cdigito = 0  'Contador digitos
  148.         _strchr = _word01(_cdigito)  'Extrae el caracter a agrandar
  149.         While _bucle = True  'Bucle control
  150.                 Lcdcmdout LcdLine1Pos(_xpos)  'Establece la posición inicial a escribir en el LCD
  151.                 For _index = 0 To 5  'Bucle control de ipresión mascaras superior e inferior (digito grande)
  152.                         If _strchr = "0" Then _data = LookUp(4, 0, 3, 4, 1, 3), _index  'Mascaras del 0
  153.                         If _strchr = "1" Then _data = LookUp(6, 255, " ", 5, 255, 7), _index  'Mascaras del 1
  154.                         If _strchr = "2" Then _data = LookUp(6, 2, 3, 4, 1, 7), _index  'Mascaras del chr 2
  155.                         If _strchr = "3" Then _data = LookUp(6, 2, 3, 5, 1, 3), _index  'M. chr 3
  156.                         If _strchr = "4" Then _data = LookUp(4, 1, 255, " ", " ", 255), _index  'M. chr 9
  157.                         If _strchr = "5" Then _data = LookUp(4, 2, 0, 5, 1, 3), _index  'M. chr 5
  158.                         If _strchr = "6" Then _data = LookUp(4, 2, " ", 4, 1, 3), _index  'M. chr 6
  159.                         'If _strchr = "7" Then _data = LookUp(6, 0, 3, " ", 255, " "), _index  'M. chr 7
  160.                         If _strchr = "7" Then _data = LookUp(6, 0, 255, " ", " ", 255), _index  'M. chr 7
  161.                         If _strchr = "8" Then _data = LookUp(4, 2, 3, 4, 1, 3), _index  'M. chr 8
  162.                         If _strchr = "9" Then _data = LookUp(4, 2, 3, " ", " ", 255), _index  'M. chr 9
  163.                         Lcdout _data  'Imprime mascara actual
  164.                         If _index = 2 Then  'Hace los cambios para dibujar la parte inferior del digito grande
  165.                                 Lcdcmdout LcdLine2Pos(_xpos)  'Establece posición en la linea 2
  166.                                 _xpos = _xpos + 3  'Posición del nuevo digito
  167.                         Endif
  168.                 Next _index
  169.                 _cdigito = _cdigito + 1  'Indica la proxima posición a imprimir
  170.                 _strchr = _word01(_cdigito)  'Extrae el caracter a agrandar
  171.                 If _strchr = 0 Then _bucle = False  'Fin, se sale del bucle
  172.         Wend
  173. Return                                            
  174. '**************************************************************************
« Última modificación: 17 de Mayo de 2016, 21:33:27 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
« Respuesta #807 en: 10 de Junio de 2016, 10:44:28 »
Trabajando con parte decimal:
Para el que quiera experimentar un rato la parte decimal.
En el caso de no tener funciones en el lenguaje que trabajen con números reales o en el caso de tenerlos pero no
interesa su uso por ahorro de memoria, he escrito una función que extrae la parte decimal de una división, hasta 8 dígitos.
Se llama mediante:
  Call _Dec8(dividendo, divisor, numero decimales)
Los dígitos quedan almacenador en la variable de cadena (string) _Dec8, se usa una variable de cadena para que
no se pierdan los ceros iniciales.
Esto es:
En una variable numérica no se puede guardar el valor, por ejemplo: 04
Dim variable as Long
variable = 04 es simplificado de forma automática por variable = 4
Así que para mantener los ceros a la izquierda hay que usar una variable tipo String que no entiende de números, solo de codigos ASCII
y que cada codigo corresponde a un cararter.

Código: Visual Basic
  1. 'Funcion extrae parte decimal de un numero
  2. 'Basic PSI, v.7.41, By COS, 06/2016.
  3. 'Para simulación
  4. '********************************************************
  5. Define CLOCK_FREQUENCY = 4
  6. Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
  7. 'Puerto del LCD ----------------------------------------------------------
  8. Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
  9. Define LCD_DREG = PORTA  'Bus de datos, puerto A
  10. Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto
  11. Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
  12. Define LCD_RSBIT = 7  'RB7 como RS
  13. Define LCD_EREG = PORTB  'Bit de control E, puerto B
  14. Define LCD_EBIT = 6  'RB6 como E
  15. Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
  16. Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
  17. Define LCD_INITMS = 50  'Espera inicialización del Display
  18. Lcdinit
  19. AllDigital
  20. 'Declaracion de variables
  21. Dim dividendo As Long  'Dividendo
  22. Dim divisor As Long  'Divisor
  23. Dim decimales As Byte
  24. Dim numero As Long
  25. Dim n As Byte
  26. dividendo = 25
  27. divisor = 24
  28. decimales = 8
  29. 'Rutina principal y bucle principal
  30. main:
  31.         'Bucle decimales
  32.         For n = 1 To decimales
  33.                 numero = dividendo / divisor  'Parte entera
  34.                 Call _dec8(dividendo, divisor, n)  'Dividendo, divisor y numero de decimales
  35.                 Lcdcmdout LcdLine1Home  'Linea 1 y al principio de la linea
  36.                 Lcdout "Decimales:", #n  'Escribe valores en el lcd
  37.                 Lcdcmdout LcdLine2Home  'Linea 2 y al principio de la linea
  38.                 Lcdout #numero, ".", _dec8, "         "  'Escribe valores en el lcd
  39.                 WaitMs 2000  'Espera 2 segundos
  40.         Next n
  41. Goto main
  42. End                                              
  43. 'Extrae la parte decimal de un numero, hasta 8 digitos.
  44. '_dec8 tendra los digitos decimales en formato cadena (string)
  45. 'Call _Dec8(dividendo, divisor, numero decimales)
  46. Function _dec8(_dividendo As Long, _divisor As Long, _decimales As Byte) As String
  47.         Dim _resto As Long
  48.         Dim _n As Byte
  49.         Dim _aux As Long
  50.         _dec8 = ""  'Borra la cadena
  51.         If _decimales > 8 Then _decimales = 8  'Maximo 8 digitos de salida
  52.         If _decimales = 0 Then _decimales = 1  'Minimo 1 digito de salida
  53.         _resto = _dividendo Mod _divisor  'Resto
  54.         'Bucle que extrae la parte decimal
  55.         For _n = 1 To _decimales
  56.                 _resto = _resto * 10
  57.                 _aux = _resto / _divisor
  58.                 'Asigna los ceros a la izquierda
  59.                 If _aux = 0 Then
  60.                         _dec8 = _dec8 + "0"
  61.                 Endif
  62.         Next _n
  63.         If _aux > 0 Then _dec8 = _dec8 + #_aux  'Concatena los ceros a la izquierda con los otros digitos
  64. End Function
« Última modificación: 11 de Junio de 2016, 07:39:37 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
« Respuesta #808 en: 10 de Junio de 2016, 11:10:07 »
Y para el que no se maneje con funciones pego la versión tradicional con subrutina:

Código: Visual Basic
  1. 'Subrutina extrae parte decimal de un numero
  2. 'Basic PSI, v.7.41, By COS, 06/2016
  3. 'Para simulación
  4. '********************************************************
  5. Define CLOCK_FREQUENCY = 4
  6. Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
  7. 'Puerto del LCD ----------------------------------------------------------
  8. Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
  9. Define LCD_DREG = PORTA  'Bus de datos, puerto A
  10. Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto
  11. Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
  12. Define LCD_RSBIT = 7  'RB7 como RS
  13. Define LCD_EREG = PORTB  'Bit de control E, puerto B
  14. Define LCD_EBIT = 6  'RB6 como E
  15. Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
  16. Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
  17. Define LCD_INITMS = 50  'Espera inicialización del Display
  18. Lcdinit
  19. AllDigital
  20. 'Declaracion de variables globales
  21. Dim _dec8 As String
  22. Dim dividendo As Long  'Dividendo
  23. Dim divisor As Long  'Divisor
  24. Dim decimales As Byte
  25. Dim numero As Long
  26. dividendo = 25
  27. divisor = 24
  28. decimales = 0
  29. 'Rutina principal y bucle principal
  30. main:
  31.         decimales = decimales + 1
  32.         If decimales > 8 Then decimales = 1
  33.         numero = dividendo / divisor  'Parte entera
  34.         Gosub _dec_8  'Dividendo, divisor y numero de decimales
  35.         Lcdcmdout LcdLine1Home  'Linea 1 y al principio de la linea
  36.         Lcdout "Decimales:", #decimales  'Escribe valores en el lcd
  37.         Lcdcmdout LcdLine2Home  'Linea 2 y al principio de la linea
  38.         Lcdout #numero, ".", _dec8, "         "  'Escribe valores en el lcd
  39.         WaitMs 2000  'Espera 2 segundos
  40. Goto main
  41. End                                              
  42. 'Extrae la parte decimal de un numero, hasta 8 digitos.
  43. '_dec8 tendra los digitos decimales en formato cadena (string)
  44. _dec_8:
  45.         Dim _resto As Long
  46.         Dim _n As Byte
  47.         Dim _aux As Long
  48.         _dec8 = ""  'Borra la cadena
  49.         If decimales > 8 Then decimales = 8  'Maximo 8 digitos de salida
  50.         If decimales = 0 Then decimales = 1  'Minimo 1 digito de salida
  51.         _resto = dividendo Mod divisor  'Resto
  52.         'Bucle que extrae la parte decimal
  53.         For _n = 1 To decimales
  54.                 _resto = _resto * 10
  55.                 _aux = _resto / divisor
  56.                 'Asigna los ceros a la izquierda
  57.                 If _aux = 0 Then
  58.                         _dec8 = _dec8 + "0"
  59.                 Endif
  60.         Next _n
  61.         If _aux > 0 Then _dec8 = _dec8 + #_aux  'Concatena los ceros a la izquierda con los otros digitos
  62. Return
« Última modificación: 10 de Junio de 2016, 11:17:11 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
« Respuesta #809 en: 31 de Agosto de 2016, 21:11:10 »
« Última modificación: 31 de Agosto de 2016, 21:27:37 por dogflu66 »
Saludos desde Granada, España.


 

anything