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

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #720 en: 13 de Agosto de 2011, 10:10:14 »
Desconozco como se realiza la operación en la versión de lenguaje Basic que indicas. Puede realizarse mediante un comando que permita trabajar directamente con Word, o en el peor de los casos, dividiendo el Word en dos partes, esto es byte alto y byte bajo.
Saludos desde Granada, España.

Desconectado jrody

  • PIC10
  • *
  • Mensajes: 25
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #721 en: 21 de Agosto de 2011, 21:15:55 »
hola amigos de TODOPIC.
Solicito su ayuda por favor, tengo el siguiente problema.

Tengo una variable tipo WORD. Es un registro de eventos que necesito almacenar y no perder por cortes de energia. Asi que lo guardo en memoria EEPROM. El problema esta en que solo me guarda hasta 255 y reinicia el conteo de 0.
Como puedo hacer para guardar datos mayores a 255 por ejempo 23456 y poder leerlo cuando quiera..
Anexo una parte de rutina de mi programa: Saludos y gracias



tventas var word    ;Variable que cuenta el total recibidos en monedas
credito var byte    ;Varibale credito
read 10, tventas    ;lee de la EEPROM a una variable tventas (total de ventas)
read 12
read 14

printvtotal:                           
  lcdout $fe, 1                             ;limpia display
  lcdout $fe, $80, "TOTAL VENTAS"           ;escribe en display 1ra fila
  lcdout $fe, $c0, "$", dec tventas, ".00"  ;muestra en display signo $ y total de pesos recibidos

grabatventas:                        ;para incrementar evento
  tventas = tventas + credito        ;sumar a total de ventas la cantidas de credito pesos recibidos
  write 10, tventas                  ;grabar total de ventas en memoria EEPROM direccion 10
  write 12
  write 14
end         

 



.

Hala amigos de TODOPIC aqui les deja la solución de este problema que tenia, con esto ya pude guardar datos hasta 65025

tventas var word                            ;Variable que cuenta el total recibidos en monedas
tventas_l var tventas.lowbyte          ;variable para byte bajo
tventas_h var tventas.highbyte        ;variable para byte alto
.
read 10, tventas_l  ;lee de la EEPROM el total de ventas byte bajo
read 11, tventas_h    ;lee de la EEPROM el total de ventas byte alto
.
.
write 10, tventas_l                ;grabar total de ventas en memoria byte bajo
write 11, tventas_h               ;grabar total de ventas en memoria byte alto




Desconectado jrody

  • PIC10
  • *
  • Mensajes: 25
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #722 en: 21 de Agosto de 2011, 21:19:46 »


hola amigos estoy programando el pic12f675 para controlar la potencia de un lampara de 230 v 0%      a  100% con un potenciometro que esta conectado a la pata 1 del micro12f675 ...cruce por zero pata2    pata0 conectada al optotriac despues del optotriac tenemos triac entonces jugamos del desparo del traic


Define ADC_CLOCK = 3  'Set clock source (3=rc)
Define ADC_SAMPLEUS = 50  'Set sampling time in uS

TRISIO = %00000110
ADCON0 = 0x0e
TRISIO.1 = 1
TRISIO.2 = 1
TRISIO.0 = 0
Dim t2400 As Word
Const con = 396
Dim adval As Byte
Dim voltatge As Word
Dim angle2 As Word
Dim k As Byte
Symbol triac = GP0
ADCON0.7 = 1
ANSEL = %00000010
CMCON = 7

inici: Adcin 1, adval
voltatge = (adval * 500) / 1023  'Equates to: (adval * 500)/1024

If GP2 = 1 And voltatge = 50 Then
GP0 = 1
Endif

   


            Select Case 32

angle2 = angle2 - 960
If angle2 < 0 Then
angle2 = 0
Endif
   
               Select Case 33

angle2 = angle2 + 960
If angle2 > 9000 Then
angle2 = 9000
Endif



Goto inici

End                                               




Hola Amigo sera que puedas mandar el diagrama de coneccion del Opto y el Triac.
Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #723 en: 22 de Agosto de 2011, 09:28:58 »
Si el lenguaje que estáis tratando es estándar, entonces Word se refiere a un numero entero sin signo de longitud 2Bytes=16Bits, por lo tanto, puede tomar números comprendidos entre 0 y 65535, por lo que se deduce que puede contener 65536 números diferentes.
Saludos desde Granada, España.

Desconectado rafael.luc

  • PIC10
  • *
  • Mensajes: 1
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #724 en: 13 de Octubre de 2011, 01:39:37 »
Ola

Estou com seguinte problema, preciso enviar através da porta serial uma variável, mas em hexadecimal
Seria como neste exemplo

Hserout 0x01, #variavel, #variavel

Para o primeiro valor fixo tenho o hexadecimal que é exibido corretamente, enquanto que para as variáveis somente é exibido em valores numéricos ( enviado em numeração ascii para rs232).

Como eu poderia resolver?

Gracias

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #725 en: 22 de Octubre de 2011, 06:29:28 »
Si no quieres que te divida el número contenido en la variable en dígitos y, envíe cada dígito como caracteres ASCII, elimina el modificador #.

Hserout 0x01, variavel, variavel
Saludos desde Granada, España.

Desconectado dr cerebro

  • PIC10
  • *
  • Mensajes: 42
    • Solo para la Gloria de Dios
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #726 en: 24 de Octubre de 2011, 02:19:55 »
Hola a todos.

Hasta ahora esto iniciando en el mundo de los pics. y deseo crear un pequeño dispositivo, que resetee el modem/router, cuando no exista conexión a Internet. El primer proyecto lo hice cambiando los leds de estado por optoacopladores. Cuando vinieron a cambiarlo por uno mas moderno, fue un problema regresarlo a su estado anterior :oops:. Casi no me lo cambian. Es siguiente esta sellado y si le quito los sellos tendré problemas. Pensé en poner unas fotoresistencias, fototransistores, etc, frente a las luces de estado, pero no me gusta la idea. Me gustaría emplear un pic que pueda conectarse con Internet y que haga un ping cada cierto tiempo. En el momento que no reciba respuesta del servidor, accione un relé que desconecte y re conecte el router.

Podrían ayudarme?
Inicio:
    Lcdcmdout LcdLine1Clear
    WaitMs 1000
    Lcdout "Hogar, dulce hogar."
    WaitMs 1000
goto inicio

Desconectado dr cerebro

  • PIC10
  • *
  • Mensajes: 42
    • Solo para la Gloria de Dios
Asignar cadena
« Respuesta #727 en: 28 de Octubre de 2011, 19:55:35 »
Hola a todos.

¿Se puede en el basic de PIC BASIC IDE asignar cadenas?

ej

Código: [Seleccionar]
dim nom1(10) as byte
dim nom2(10) as byte
dim nom3(20) as byte

nom1 = "Pepito"
nom2 = "Perez"
nom3 = nom1 + " " + nom2

lcdout "Hola " + nom3 + "!"

o

Código: [Seleccionar]
nom3 = strcat(nom1, nom2)
¿Se puede enviar una cadena a una funcion o procedimiento?

ej.

Código: [Seleccionar]
call Saludar ("Carlos")
call Saludar ("Juan")
call Saludar ("Ana")
end
Proc Saludar (nom(10) As byte)
Lcdcmdout LcdLine1Clear 
Lcdout "Hola ", #nom
WaitMs 900
End Proc   

De paso hay algun tutorial de manejo de cadenas en PIC BASIC IDE?

Saludos.
Inicio:
    Lcdcmdout LcdLine1Clear
    WaitMs 1000
    Lcdout "Hogar, dulce hogar."
    WaitMs 1000
goto inicio

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #728 en: 30 de Octubre de 2011, 09:31:22 »
Por el momento no tiene funciones del sistema que permitan asignar una cadena a una variable. Si quieres trabajar con cadenas de una forma cómoda te tienes que crear la función. Tampoco permite por el momento pasar una variable tipo vector a una función, se tiene que declarar como global para trabajar con ella en las funciones u otro modo seria pasarle la dirección de inicio de la variable para trabajar como punteros, pero el problema que también hay es que aunque tiene una tabla que indica la dirección de cada variable aun no tienen un modificador o símbolo en el código que permita hacer esta operación de forma automática, habría que pasar la dirección de forma manual. He tenido que trabajar pocas veces con cadenas, pero memorizar tramas de datos de entrada por un puerto y después buscar coincidencias con otros textos prememorizados realmente no me ha sido difícil.

Te tienes que crear la función que asigna una cadena de datos a una variable, ya entren por un puerto o se asignen de forma directa de la forma tradicional tipo “Hola mundo” y después una función más para comparar la cadena o buscar coincidencias que son las más utilizadas. Recuerda que todas las cadenas de texto tienen un caracter que indica fin de cadena.

Si estas muy interesado cuando tenga un rato te preparo una función que asigne una cadena a una variable tipo vector. Cuando veas el código observaras que es muy simple desarrollar las funciones para trabajar con cadenas.

Nota: Desde hace algun tiempo el lenguaje ya puede trabajar con cadenas o string de forma directa (10/01/2016).
« Última modificación: 10 de Enero de 2016, 17:58:38 por dogflu66 »
Saludos desde Granada, España.

Desconectado dr cerebro

  • PIC10
  • *
  • Mensajes: 42
    • Solo para la Gloria de Dios
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #729 en: 31 de Octubre de 2011, 15:13:19 »
Por el momento no tiene funciones del sistema que permitan asignar una cadena a una variable. Si quieres trabajar con cadenas de una forma cómoda te tienes que crear la función. Tampoco permite por el momento pasar una variable tipo vector a una función, se tiene que declarar como global para trabajar con ella en las funciones u otro modo seria pasarle la dirección de inicio de la variable para trabajar como punteros, pero el problema que también hay es que aunque tiene una tabla que indica la dirección de cada variable aun no tienen un modificador o símbolo en el código que permita hacer esta operación de forma automática, habría que pasar la dirección de forma manual. He tenido que trabajar pocas veces con cadenas, pero memorizar tramas de datos de entrada por un puerto y después buscar coincidencias con otros textos prememorizados realmente no me ha sido difícil.

Te tienes que crear la función que asigna una cadena de datos a una variable, ya entren por un puerto o se asignen de forma directa de la forma tradicional tipo “Hola mundo” y después una función más para comparar la cadena o buscar coincidencias que son las más utilizadas. Recuerda que todas las cadenas de texto tienen un caracter que indica fin de cadena.

Si estas muy interesado cuando tenga un rato te preparo una función que asigne una cadena a una variable tipo vector. Cuando veas el código observaras que es muy simple desarrollar las funciones para trabajar con cadenas.

Hola dogflu66.

Le agradecería la función.

De antemano, muchas gracias por la respuesta y por la función.

Saludos

« Última modificación: 03 de Mayo de 2014, 14:26:15 por dogflu66 »
Inicio:
    Lcdcmdout LcdLine1Clear
    WaitMs 1000
    Lcdout "Hogar, dulce hogar."
    WaitMs 1000
goto inicio

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #730 en: 01 de Noviembre de 2011, 09:20:41 »
Dejo las funciones más significativas para operar con cadenas, he optado por trabajar con direcciones de memoria porque el código sale más reducido.
Si hay alguna duda sobre algo, pues por aquí estaré.

Los vectores se definen en las ultimas posiciones de memoria para que no sean ocupados por las declaraciones normales de variables que tienden a ocupar las primeras posiciones, y tienen que ser direcciones consecutivas. El código de control ASII 0 indica fin de cadena, pues para declarar una variable tipo vector de una longitud de 10 elementos se necesitan 11 bytes para que pueda ser gestionada por las funciones. En realidad todo esto se hace mas o menos de esta forma para cualquier lenguaje lo que ocurre es que el compilador nos lo oculta.

Los elementos de los vectores se nombran de la forma tradicional comenzando con el 0, 1, ..., hasta el final = (strlen-1). Es decir que el 0 cuenta.

Código: [Seleccionar]
'******************************************************************************
'Funciones para operar con cadenas cadenas
'By Dogflu66, 11/11.
'Basic del Pic Simulator IDE (PSI).
'******************************************************************************
'Puertos del LCD para simulador************************************************
Define LCD_BITS = 4  'Bus de datos del lcd a 4bit
Define LCD_DREG = PORTA  'Bus de datos el puerto A
Define LCD_DBIT = 0  'Bus datos los 4 bit menos significativos, puerto A
Define LCD_RSREG = PORTB  'Bit de control RS a puerto B
Define LCD_RSBIT = 7  'Se usa RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E del puerto B
Define LCD_EBIT = 6  'Se usa RB6 como E
Define LCD_COMMANDUS = 100  '2000  'Espera despues de ejecutar comando lcd, uSeg.
Define LCD_DATAUS = 50  'Espera despues de enviar un dato al LCD, uSeg.
Define LCD_INITMS = 5  '50  'Espera despues de inicializar el Display
'******************************************************************************
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
'*****************************************************************
Dim clave As Byte @ 0x12f  'Se declara variable en la dirección establecida
Dim nombre As Byte @ 0x13a  'Se declara variable en la dirección establecida
Dim apellido As Byte @ 0x145  'Se declara variable en la dirección establecida

Dim p_clave As Word  'Variable que apunta a otra variable
Dim p_nombre As Word  'Variable que apunta a otra variable
Dim p_apellido As Word  'Variable que apunta a otra variable

p_clave = 0x12f  'p_clave apunta a clave
p_nombre = 0x13a  'p_nombre apunta a nombre
p_apellido = 0x145  'p_apellido apunta a apellido

Lcdinit  'Incializa el LCD

main:
Call strclr(p_clave)  'Inicializa/Borra la variable
Call strcdn(p_clave, 0)  'Asigna la cadena 0 a la variable
Call strcdn(p_nombre, 1)  'Asigna la cadena 1 a la variable
Call strcdn(p_apellido, 2)  'Asigna la cadena 2 a la variable
Call strchr(p_nombre, 0)  'Devuelve el caracter indicado en strchr
Call strlen(p_apellido)  'Devuelve en strlen la longitud de la cadena
Call strcpy(p_nombre, p_clave)  'Convierte la primera en la segunda
Call strcmp(p_nombre, p_clave)  'Compara dos cadenas, strcmp = 0 (diferentes), = 1 (iguales)
Lcdout "Clave:"  'Imprime en el LCD
Call strlen(p_nombre)  'Extrae la longitud de la cadena
Call strlcd(p_nombre, 0, strlen)  'Imprime en el LCD la cadena
'Goto main
End                                              
'Asigna la cadena a la variable elegida
Proc strcdn(direccion As Word, valor As Byte)
Dim indice As Byte  'Indica el elemento de la lista
Dim paso As Byte  'Contendrá el elemento de la lista segun el indice
Dim x As Bit  'Variable auxiliar
x = 1
indice = 0
While x = 1  'Bucle de asignación
If valor = 0 Then paso = LookUp("123456", 0), indice
If valor = 1 Then paso = LookUp("Todopic", 0), indice
If valor = 2 Then paso = LookUp("Basic", 0), indice
Pointer(direccion) = paso  'Asigna el valor de paso a la dirección que hace referencia variable
If paso = 0 Then Exit  'Fin del Proc
indice = indice + 1  'Incrementa indice
direccion = direccion + 1  'Apunta a la siguiente dirección del vector seleccionado
Wend
End Proc                                          
'Devuelve el caracter especificado, de izquierda a derecha
'El numero de orden para el primer caracter es el cero
Function strchr(direccion As Word, valor As Byte) As Byte
strchr = 0
direccion = direccion + valor  'Calcula la posición del caracter
strchr = Pointer(direccion)  'Extra el caracter de la posición
End Function                                      
'Devuelve en strlen la longitud de la cadena,
'no incluye el caracter fin de cadena
Function strlen(direccion As Word) As Byte
Dim paso As Byte
Dim x As Bit
x = 1
strlen = 0
While x = 1
paso = Pointer(direccion)  'Lee valor
If paso = 0 Then Exit  'Sale de la Function
strlen = strlen + 1  'Incrementa longuitud
direccion = direccion + 1  'Incrementa posición
Wend
End Function                                      
'Copia la segunda variable en la primera
Proc strcpy(direccion As Word, direccion1 As Word)
Dim paso As Byte
Dim x As Bit
x = 1
While x = 1
paso = Pointer(direccion1)
Pointer(direccion) = paso
If paso = 0 Then Exit
direccion = direccion + 1
direccion1 = direccion1 + 1
Wend
End Proc                                          
'Compara las dos variables, devuelve strcmp = 0 si no son iguales
'devuelve strcmp = 1 si son iguales.
Function strcmp(direccion As Word, direccion1 As Word) As Byte
Dim paso As Byte
Dim paso1 As Byte
Dim x As Bit
strcmp = 0
x = 1
While x = 1
paso = Pointer(direccion)
paso1 = Pointer(direccion1)
If paso = paso1 Then strcmp = 1
If paso <> paso1 Then
strcmp = 0
Exit
Endif
If paso = 0 Or paso1 = 0 Then Exit
direccion = direccion + 1
direccion1 = direccion1 + 1
Wend
End Function                                      
'Borra o inicializa la variable
Proc strclr(direccion As Word)
Pointer(direccion) = 0  'Asigna a la primera posición fin de cadena
End Proc                                          
'Envia la cadena al LCD, apartir de inicio y tantos caracteres como marque numero
'Si numero = 0 es lo mismo = 1.
Proc strlcd(direccion As Word, inicio As Byte, numero As Word)
Dim paso As Byte
Dim x As Bit
x = 1
direccion = direccion + inicio  'Dirección del primer elemento de la variable
While x = 1
paso = Pointer(direccion)  'Lee valor
Lcdout paso
If paso = 0 Then Exit  'Sale de la Function
If numero > 0 Then numero = numero - 1  'Decrementa caracteres pendientes
If numero = 0 Then Exit  'Sale de la Función
direccion = direccion + 1  'Incrementa posición
Wend
End Proc



PD. También se pueden declarar los vectores de la forma tradicional, ejemplo: Dim clave(10) as byte, y con una rutina al inicio los rastrea hasta que les encuentra su ubicación en la memoria y, les extrae sus direcciones de memoria de inicio asignandolas posteriormente de forma automatica. Pero el problema que tiene esta rutina es que es muy larga y consume mucha memoria de código, es muy simple pero usa mucho código redundante para cada variable, eso si, solo habría que ejecutarla una solo vez al principio.


Nota: (10/12/2011) De aquí se puede descargar la última versión:
http://www.todopic.com.ar/foros/index.php?topic=14917.msg307598#msg307598
« Última modificación: 03 de Mayo de 2014, 14:26:42 por dogflu66 »
Saludos desde Granada, España.

Desconectado dr cerebro

  • PIC10
  • *
  • Mensajes: 42
    • Solo para la Gloria de Dios
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #731 en: 04 de Noviembre de 2011, 19:52:43 »
Dejo las funciones más significativas para operar con cadenas, he optado por trabajar con direcciones de memoria porque el código sale más reducido.
Si hay alguna duda sobre algo, pues por aquí estaré.

Los vectores se definen en las ultimas posiciones de memoria para que no sean ocupados por las declaraciones normales de variables que tienden a ocupar las primeras posiciones, y tienen que ser direcciones consecutivas. El código de control ASII 0 indica fin de cadena, pues para declarar una variable tipo vector de una longitud de 10 elementos se necesitan 11 bytes para que pueda ser gestionada por las funciones. En realidad todo esto se hace mas o menos de esta forma para cualquier lenguaje lo que ocurre es que el compilador nos lo oculta.

Los elementos de los vectores se nombran de la forma tradicional comenzando con el 0, 1, ..., hasta el final = (strlen-1). Es decir que el 0 cuenta.

Código: [Seleccionar]
'******************************************************************************
'Funciones para operar con cadenas cadenas
'By Dogflu66, 11/11.
'Basic del Pic Simulator IDE (PSI).
'******************************************************************************
'Puertos del LCD para simulador************************************************
Define LCD_BITS = 4  'Bus de datos del lcd a 4bit
Define LCD_DREG = PORTA  'Bus de datos el puerto A
Define LCD_DBIT = 0  'Bus datos los 4 bit menos significativos, puerto A
Define LCD_RSREG = PORTB  'Bit de control RS a puerto B
Define LCD_RSBIT = 7  'Se usa RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E del puerto B
Define LCD_EBIT = 6  'Se usa RB6 como E
Define LCD_COMMANDUS = 100  '2000  'Espera despues de ejecutar comando lcd, uSeg.
Define LCD_DATAUS = 50  'Espera despues de enviar un dato al LCD, uSeg.
Define LCD_INITMS = 5  '50  'Espera despues de inicializar el Display
'******************************************************************************
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
'*****************************************************************
Dim clave As Byte @ 0x12f  'Se declara variable en la dirección establecida
Dim nombre As Byte @ 0x13a  'Se declara variable en la dirección establecida
Dim apellido As Byte @ 0x145  'Se declara variable en la dirección establecida

Dim p_clave As Word  'Variable que apunta a otra variable
Dim p_nombre As Word  'Variable que apunta a otra variable
Dim p_apellido As Word  'Variable que apunta a otra variable

p_clave = 0x12f  'p_clave apunta a clave
p_nombre = 0x13a  'p_nombre apunta a nombre
p_apellido = 0x145  'p_apellido apunta a apellido

Lcdinit  'Incializa el LCD

main:
Call strclr(p_clave)  'Inicializa/Borra la variable
Call strcdn(p_clave, 0)  'Asigna la cadena 0 a la variable
Call strcdn(p_nombre, 1)  'Asigna la cadena 1 a la variable
Call strcdn(p_apellido, 2)  'Asigna la cadena 2 a la variable
Call strchr(p_nombre, 0)  'Devuelve el caracter indicado en strchr
Call strlen(p_apellido)  'Devuelve en strlen la longitud de la cadena
Call strcpy(p_nombre, p_clave)  'Convierte la primera en la segunda
Call strcmp(p_nombre, p_clave)  'Compara dos cadenas, strcmp = 0 (diferentes), = 1 (iguales)
Lcdout "Clave:"  'Imprime en el LCD
Call strlen(p_nombre)  'Extrae la longitud de la cadena
Call strlcd(p_nombre, 0, strlen)  'Imprime en el LCD la cadena
'Goto main
End                                               
'Asigna la cadena a la variable elegida
Proc strcdn(direccion As Word, valor As Byte)
Dim indice As Byte  'Indica el elemento de la lista
Dim paso As Byte  'Contendrá el elemento de la lista segun el indice
Dim x As Bit  'Variable auxiliar
x = 1
indice = 0
While x = 1  'Bucle de asignación
If valor = 0 Then paso = LookUp("123456", 0), indice
If valor = 1 Then paso = LookUp("Todopic", 0), indice
If valor = 2 Then paso = LookUp("Basic", 0), indice
Pointer(direccion) = paso  'Asigna el valor de paso a la dirección que hace referencia variable
If paso = 0 Then Exit  'Fin del Proc
indice = indice + 1  'Incrementa indice
direccion = direccion + 1  'Apunta a la siguiente dirección del vector seleccionado
Wend
End Proc                                         
'Devuelve el caracter especificado, de izquierda a derecha
'El numero de orden para el primer caracter es el cero
Function strchr(direccion As Word, valor As Byte) As Byte
strchr = 0
direccion = direccion + valor  'Calcula la posición del caracter
strchr = Pointer(direccion)  'Extra el caracter de la posición
End Function                                     
'Devuelve en strlen la longitud de la cadena,
'no incluye el caracter fin de cadena
Function strlen(direccion As Word) As Byte
Dim paso As Byte
Dim x As Bit
x = 1
strlen = 0
While x = 1
paso = Pointer(direccion)  'Lee valor
If paso = 0 Then Exit  'Sale de la Function
strlen = strlen + 1  'Incrementa longuitud
direccion = direccion + 1  'Incrementa posición
Wend
End Function                                     
'Copia la segunda variable en la primera
Proc strcpy(direccion As Word, direccion1 As Word)
Dim paso As Byte
Dim x As Bit
x = 1
While x = 1
paso = Pointer(direccion1)
Pointer(direccion) = paso
If paso = 0 Then Exit
direccion = direccion + 1
direccion1 = direccion1 + 1
Wend
End Proc                                         
'Compara las dos variables, devuelve strcmp = 0 si no son iguales
'devuelve strcmp = 1 si son iguales.
Function strcmp(direccion As Word, direccion1 As Word) As Byte
Dim paso As Byte
Dim paso1 As Byte
Dim x As Bit
strcmp = 0
x = 1
While x = 1
paso = Pointer(direccion)
paso1 = Pointer(direccion1)
If paso = paso1 Then strcmp = 1
If paso <> paso1 Then
strcmp = 0
Exit
Endif
If paso = 0 Or paso1 = 0 Then Exit
direccion = direccion + 1
direccion1 = direccion1 + 1
Wend
End Function                                     
'Borra o inicializa la variable
Proc strclr(direccion As Word)
Pointer(direccion) = 0  'Asigna a la primera posición fin de cadena
End Proc                                         
'Envia la cadena al LCD, apartir de inicio y tantos caracteres como marque numero
'Si numero = 0 es lo mismo = 1.
Proc strlcd(direccion As Word, inicio As Byte, numero As Word)
Dim paso As Byte
Dim x As Bit
x = 1
direccion = direccion + inicio  'Dirección del primer elemento de la variable
While x = 1
paso = Pointer(direccion)  'Lee valor
Lcdout paso
If paso = 0 Then Exit  'Sale de la Function
If numero > 0 Then numero = numero - 1  'Decrementa caracteres pendientes
If numero = 0 Then Exit  'Sale de la Función
direccion = direccion + 1  'Incrementa posición
Wend
End Proc



PD. También se pueden declarar los vectores de la forma tradicional, ejemplo: Dim clave(10) as byte, y con una rutina al inicio los rastrea hasta que les encuentra su ubicación en la memoria y, les extrae sus direcciones de memoria de inicio asignandolas posteriormente de forma automatica. Pero el problema que tiene esta rutina es que es muy larga y consume mucha memoria de código, es muy simple pero usa mucho código redundante para cada variable, eso si, solo habría que ejecutarla una solo vez al principio.

Muchas gracias dogflu66

Voy a probarlas.

Saludos.
Inicio:
    Lcdcmdout LcdLine1Clear
    WaitMs 1000
    Lcdout "Hogar, dulce hogar."
    WaitMs 1000
goto inicio

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #732 en: 10 de Diciembre de 2011, 12:09:22 »
Dejo adjuntado la última versión de funciones para trabajar con cadenas de caracteres y números (string and numbers) en el Basic del Pic Simulator IDE (PSI).
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #733 en: 10 de Diciembre de 2011, 12:18:07 »
(Ejemplo_2 de números grandes sin funciones: http://www.todopic.com.ar/foros/index.php?topic=14917.msg384712#msg384712)

Ejemplo_1 números grandes con funciones:
Dejo un ejemplo para el que quiera trabajar con números grandes en un LCD alfanumerico.
Recordar que para que funcione necesita las funciones para trabajar con cadenas y numeros.

Lo que hago es aprovechar las funciones para trabajar con cadenas (string), que escribí hace poco, y convierto el número a cadena, de esta manera la función de números grandes permite trabajar con cualquier longitud de linea de display sin necesidad de configuración. La rutina necesita que se le indique  posición a imprimir en el LDC y, también si el cursor quedará listo para imprimir a continuación de la parte superior o inferior de los números grandes. La función devuelve un valor que indica la próxima posición a imprimir en el LCD.

Código: [Seleccionar]
'******************************************************************
'Escribiendo números grandes en LCD de dos líneas
'Para placa PicEBasic, By dogflu66, 12/11
'Basic Pic Simulator IDE (PSI), v6.91, Pic16F88
'******************************************************************
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'Puerto del LCD----------------------------------------------------
Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
Define LCD_DREG = PORTA  'Bus de datos, puerto A
Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E, puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 100  'Espera despues inicializar Display
'*******************************************************************
'Configuración Placa EBasic ----------------------------------------
ANSEL = 0x00  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1  'RB2 (Rx, RS232)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'*********************************************************************
Lcdinit  'Inicializa el LCD sin cursor
'*********************************************************************
Call p_word01()  'Inicializa cadena y puntero para trabajar con caractes
Call _intstrngrandes()  'Incializa caracteres CGRam del LCD, números grandes
'Variables------------------------------------------------------------
Dim numero As Long
Dim linea As Bit
numero = 0
'********************************************************************
Lcdout "Patrones:"
Lcdcmdout LcdLine2Home
Lcdout 0, 1, 2, 3, 4, 5, 6, 7  'Se imprimen los nuevos chr
WaitMs 5000  'Pausa de 3Seg
Lcdcmdout LcdClear  'Borrar el LCD
'********************************************************************
'Ejemplo: agranda el número contenido en la variable "numero"
'********************************************************************
main:
Call _nmrstr(numero, p_word01)  'Convierte un número a cadena
Call _strngrandes(p_word01, 4, linea)  'Escribe números grandes
Lcdout #numero
numero = numero + 1
Toggle linea
WaitMs 400
Lcdcmdout LcdClear
Goto main
End                                               
Include "_FuncionesCadenasNumeros.bas"
'*********************************************************************
'****************Función Numeros Grandes******************************
'Guarda los patrones de bits en laCG Ram
'Call _intstrngrandes() 'Poner al principio
Proc _intstrngrandes()
Lcddefchar 0, 16, 24, 24, 24, 24, 24, 24, 16  'Media barra lateral derecha.
Lcddefchar 1, 1, 3, 3, 3, 3, 3, 3, 1  'Media barra lateral izquierda.
Lcddefchar 2, 31, 31, 0, 0, 0, 0, 0, 0  'Barra superior sola.
Lcddefchar 3, 0, 0, 0, 0, 0, 0, 31, 31  'Barra inferior sola
Lcddefchar 4, 31, 31, 0, 0, 0, 0, 31, 31  'Barra superior e inferior.
Lcddefchar 5, 2, 6, 14, 30, 14, 6, 2, 0  'Flecha Izquierda.
Lcddefchar 6, 8, 12, 14, 15, 14, 12, 8, 0  'Flecha Derecha.
Lcddefchar 7, 0, 0, 0, 0, 0, 0, 0, 0  'Todo vacio.
Lcdcmdout LcdClear  'Se borra el LCD despues de guardar los chr
End Proc                                         
'**********************************************************************
'Función que agranda los caracteres numéricos de una cadena
'No está limitada en longitud, escrita para lcd de 2 líneas
'Parámetro de entrada: cadena tipo numérica
'Parámetro de entrada: posición en el LCD
'dirección: dirección en memoria de comienzo de la cadena
'xpos: posición de comienzo a imprimir en el LCD
'linea: indica la linea activa despues de escribir los números grandes
'linea = 0: linea activa inferior, linea=1: linea activa superior
'_strngrandes: devuelve la proxima posición a imprimir
'Call _strngrandes(dirección Ram cadena, posición a imprimir)
'*********************************************************************
Function _strngrandes(direccion As Word, xpos As Byte, linea As Bit) As Byte
Dim data As Byte  'Mascara
Dim index As Byte  'Indice mascara
Dim line As Bit  'Linea
Dim xx As Byte  'Contador caracteres de la cadena
Dim fin0 As Bit  'Control exit bucle linea
Dim fin As Bit  'Control bucle mascaras
Dim wline As Bit  'Se puede escribir mascara inferior
Dim strlen As Byte  'Longitud cadena
Dim strchr As Byte  'Exrae digito tipo cadena o ASCII
Dim cnt0 As Byte  'Indica la posición siguiente a imprimir
cnt0 = 0
line = False  'Se comienza con las mascaras superiores
wline = False  'No se puede imprimir mascaras inferiores
fin0 = False  'Bucle control lineas
fin = False  'Bucle imprime mascaras
xx = 0  'Contador digitos
strlen = _strlen(direccion)  'Asigna la longitud de la cadena
Lcdcmdout LcdLine1Pos(xpos)  'Establece posición en la linea 1
While fin0 = 0  'Bucle control líneas
strchr = _strchr(direccion, xx)  'Extrae caracter a agrandar de la cadena
index = 0  'Indica mascara a imprimir
wline = False  'No permite escribir mascara inferior, la mascara es superior
fin = 0  'Fin línea superior o inferior
While fin = False  'Bucle control de ipresión mascaras superior e inferior
If strchr = "0" Then data = LookUp(1, 2, 0, ".", 1, 3, 0, "*"), index  'Mascaras del 0
If strchr = "1" Then data = LookUp(0, ".", 0, "*"), index  'Mascaras del chr 1
If strchr = "2" Then data = LookUp(" ", 4, 0, ".", 1, 3, " ", "*"), index  'M. chr 2
If strchr = "3" Then data = LookUp(2, 0, ".", 4, 0, "*"), index  'M. chr 3
If strchr = "4" Then data = LookUp(1, 3, 0, ".", " ", " ", 0, "*"), index  'M. chr 4
If strchr = "5" Then data = LookUp(1, 4, " ", ".", " ", 3, 0, "*"), index  'M. chr 5
If strchr = "6" Then data = LookUp(1, 2, " ", ".", 1, 4, 0, "*"), index  'M. chr 6
If strchr = "7" Then data = LookUp(2, 0, ".", " ", 0, "*"), index  'M. chr 7
If strchr = "8" Then data = LookUp(1, 2, 0, ".", 1, 4, 0, "*"), index  'M. chr 8
If strchr = "9" Then data = LookUp(1, 4, 0, ".", " ", " ", 0, "*"), index  'M. chr 9
If data <> "." Or data <> "*" Then index = index + 1  'Selecciona mascara del mismo número
If line = False Then  'Mascaras línea superior
If data <> "." Then Lcdout data  'Imprime mascara actual
If data <> "." Then cnt0 = cnt0 + 1
If data = "." Then fin = True  'Fin mascaras superior del número seleccionado
Endif
If line = True Then  'Mascaras línea inferior
If data <> "*" And wline = True Then Lcdout data  'Imprime mascara actual
If data = "." Then wline = True  'Permite escribir mascara inf., mascara es inferior
If data = "*" Then fin = True  'Fin mascaras inferior del número seleccionado
Endif
Wend
xx = xx + 1  'Indica el proximo caracter a imprimir
If xx >= strlen And line = True Then fin0 = True  'Fin, todos impresos
If xx >= strlen And line = False Then Lcdcmdout LcdLine2Pos(xpos)  'Cambia a línea inferior
If xx >= strlen Then line = True  'Selecciona linea inferior
If xx >= strlen Then xx = 0  'Principio de línea
Wend
_strngrandes = cnt0 + xpos  'Siguiente posición a imprimir en el lcd
If linea = 0 Then Lcdcmdout LcdLine2Pos(_strngrandes)  'Establece línea inferior
If linea = 1 Then Lcdcmdout LcdLine1Pos(_strngrandes)  'Establece línea superior
End Function                                     
'**************************************************************************

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

Desconectado pcr314

  • PIC10
  • *
  • Mensajes: 3
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #734 en: 11 de Diciembre de 2011, 02:33:36 »
Hola gente, soy nuevo aquí, estoy trabajando bastante con los usart pero bajo PSI no me ubico bien para emprender una comunicación via rs485, si alguien sabe algo les estare agradecido. saludos