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

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

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #675 en: 12 de Noviembre de 2010, 17:56:14 »
Los registros SSPCON y SSPCON2 si me los reconoce, y compilando no me tira errores.

PD. Con el SSPCON1 si me da error.

Es justo lo que te mencione amigo, aunque me he dado cuenta de que para configurar el modulo SSP en modo I2C esclavo no necesito ese registro.aunque seria bueno lo que mencioné acerca de que se pudiera asignar la direccion del registro a una variable de modo que pudieramos trabajar sin restriccion alguna.
otra cosa mas he estado navegando y me he topado con MIKROBASIC y me ha llamado la atencion, haz trabajado con este compilador??? se ve muy interesante.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #676 en: 13 de Noviembre de 2010, 08:16:00 »
Consulta:
Alguno de ustedes hizo alguna experiencia con caracteres fuera de la tabla ascii? o un grafico, (aunque sea sencillo), con psi? he visto que en otros idiomas hay referencias de un soft que crea tablas para generar caracteres, pero creo que no iria bien con psi.
Desde ya gracias por adelantado a quien pueda aportar algun dato.
Saludos


La verdad es que no me hizo eso falta para nada, si realmente lo necesitas es cuestión de que los generes para Protón (que es muy similar al PSI) y le cambies al código las pequeñas diferencias.
« Última modificación: 13 de Noviembre de 2010, 08:27:39 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #677 en: 13 de Noviembre de 2010, 08:24:57 »
Los registros SSPCON y SSPCON2 si me los reconoce, y compilando no me tira errores.

PD. Con el SSPCON1 si me da error.

Es justo lo que te mencione amigo, aunque me he dado cuenta de que para configurar el modulo SSP en modo I2C esclavo no necesito ese registro.aunque seria bueno lo que mencioné acerca de que se pudiera asignar la direccion del registro a una variable de modo que pudieramos trabajar sin restriccion alguna.
otra cosa mas he estado navegando y me he topado con MIKROBASIC y me ha llamado la atencion, haz trabajado con este compilador??? se ve muy interesante.

Creo que si lo hay, pero no he tenido que utilizarlo,  hare unas pruebas a ver si es posible.
Si veis el hilo veréis que jamás he aconsejado utilizar este u otro BASIC, ni siquiera el PSI.
De todas formas el único Basic que actualmente (desde hace poco, menos de un año con la última versión), me podría permitir trabajar aproximadamente como lo hago con PSI seria el Protón.
Saludos desde Granada, España.

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #678 en: 13 de Noviembre de 2010, 12:18:59 »
bueno lo estoy probando y lo que me gusta esque se puede simular lcd en proteus.

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #679 en: 16 de Noviembre de 2010, 11:29:42 »
A migo dogflu me podrias decir cual es la diferencia entre hserin y hseget, o almenos como puedo ver la libreria del psi para ppoder ver las diferencias yo mismo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #680 en: 16 de Noviembre de 2010, 14:14:09 »
Hserin es una función del sistema que junto con los comandos Goto, Waitms no son recomendados su uso en la programación. También entran pero en menor medida Gosub/Return y las variables globales.

Hserin supuestamente para la ejecución del programa y se queda esperando que llegue un carácter. No se si se le puede programar un tiempo máximo de espera, por si no llega el carácter para que no quede bloqueado el Pic. No la he probado porque no me interesa, pero posiblemente por su forma de trabajar internamente se vería afectada por las interrupciones, posiblemente falle si las interrupciones están activas.

Hserget lee también un byte al igual que Hserin, pero lo que se hace es que cuando el modulo usart activa el BIT de indicación de que hay datos en su búfer, pues se llama a Hserget para que lo lea y mientras hacemos otra cosa. Y si no hay mas datos en el búfer de la usart Hserget borra el BIT de forma automática. Hserin también debería borrar este BIT porque trabajan sobre los mismos registros internos de la usart.

En realidad hay gente que los utiliza de forma indistinta, porque si no se cometen errores y se llama cuando se debe no se nota la diferencia, pero en realidad es Hserget la que se debe de utilizar porque es más segura.

PD. No se puede ver el código porque son funciones directas al compilador, la única forma es compilando unos ejemplos y luego utilizando las herramientas del PSI para hacer un desensamblado a código nemotécnico, y para esto hay que manejarse si no bien por lo menos con cierta soltura en lenguaje maquina. El Basic del PSI permite crearte una especie de librerías utilizando los Includes y las estructuras tipo funciones y procedimientos, junto con las variables locales, esto es realmente útil y muy parecido a las librerías. Así que la estructura interna para trabajar con librerías esta implementada, por lo que no creo que tarde mucho en implementarlas en el compilador de una forma directa.
« Última modificación: 16 de Noviembre de 2010, 14:33:14 por dogflu66 »
Saludos desde Granada, España.

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #681 en: 16 de Noviembre de 2010, 17:43:41 »
Gracias amigo Dogflu, me ha quedado muy claro.

Desconectado Mr.pelax

  • PIC10
  • *
  • Mensajes: 19
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #682 en: 18 de Noviembre de 2010, 01:03:09 »
Hola necesio que me ayuden con el siguiente codigo ya que al compilarle con el pic sumulator ide me da los siguientes errores

Line 7: Unused declaration. Not compiled: Dim j1 As Byte
Line 8: Unused declaration. Not compiled: Dim j2 As Byte
Line 11: Unused declaration. Not compiled: Dim text(16) As Byte
Line 35: Unused declaration. Not compiled: Dim tempeaux(3) As Byte 'Temperatura auxiliar
Line 39: Unused declaration. Not compiled: Dim minu0 As Word 'minutos que lleva apagado el aire

espero que me puedan ayudar ya que BASIC no me llevo tan bien. :oops:



Código: [Seleccionar]
'Ejemplo de programación del sistema de control electrónico de luz y temperatura.
'Versión con pulsador para seleccionar el programa 1,2 o 3'y Pulsador para resetear Max/Min
'-------------------------------------------
'Declaracion de Variables
Dim i As Byte ' Variable tipo Byte multiproposito
Dim j1 As Byte
Dim j2 As Byte
Dim auxw As Word ' Variable tipo Word multiproposito
Dim aux As Word ' Variable tipo Byte multiproposito
Dim text(16) As Byte

Dim tmax As Byte ' Valor de la temperatura Maxima Registrada en el ciclo
Dim tmin As Byte ' Valor de la temperatura Minima Registrada en el ciclo
Dim prog As Byte ' Programa en curso
Dim dias As Byte ' Dias en curso
Dim hora As Byte ' Hora en curso
Dim minu As Byte ' Minuto en curso
Dim segu As Byte ' Minuto en curso
Dim paso As Byte ' Segundos entre lecturas de Temperatura.

Dim pti1(3) As Byte 'Comienzo tiempo 1
Dim pti2(3) As Byte 'comienzo tiempo 2
Dim pte1(3) As Byte 'Temperatura Tiempo 1
Dim pte2(3) As Byte 'Temperatura Tiempo 2
Dim plu1(3) As Byte 'Luces Tiempo 1
Dim plu2(3) As Byte 'Luces Tiempo 2

Dim tiemp As Word 'Tiempo actual: Hora*60+Minutos
Dim aireok As Bit '1 = puedo usar el aire
Dim tiempf0 As Word 'tiempo que hace que prendí el aire

Dim comando As Byte 'Comando a enviar al DS1820
Dim tempe As Word 'Temperatura leida
Dim tempeaux(3) As Byte 'Temperatura auxiliar
Dim tempe1 As Byte 'PArte entera de la temperatura a mostrar
Dim tempe2 As Byte ' Decimales de la tempertatura a mostrar
Dim minua As Word ' minutos que lleva encendido el aire
Dim minu0 As Word ' minutos que lleva apagado el aire

'Valor Inicial de las Variables --------------------------------------------
'tmax = 0 'Valor de la temperatura Maxima Registrada en el ciclo
'tmin = 99 'Valor de la temperatura Minima Registrada en el ciclo
'prog = 1 'Programa en curso
'dias = 0 'Dias en curso
'hora = 0 'Hora en curso
'minu = 0 'Minuto en curso
segu = 0 'Auxiliar, para calcular los minutos
paso = 1 'Segundos entre lecturas de Temperatura.

pti1(1) = 8 'Programa 1, tiempo 1 (Horas)
pti2(1) = 16 'Programa 1, tiempo 2 (Horas)
pte1(1) = 20 'Programa 1, Temperatura Tiempo 1
pte2(1) = 20 'Programa 1, Temperatura Tiempo 2
plu1(1) = 1 'Programa 1, Luces Tiempo 1 (1=ON)
plu2(1) = 0 'Programa 1, Luces Tiempo 2 (1=ON)

pti1(2) = 8 'Programa 2, tiempo 1 (Horas)
pti2(2) = 16 'Programa 2, tiempo 2 (Horas)
pte1(2) = 25 'Programa 2, Temperatura Tiempo 1
pte2(2) = 25 'Programa 2, Temperatura Tiempo 2
plu1(2) = 1 'Programa 2, Luces Tiempo 1 (1=ON)
plu2(2) = 0 'Programa 2, Luces Tiempo 2 (1=ON)

pti1(3) = 8 'Programa 3, tiempo 1 (Horas)
pti2(3) = 16 'Programa 3, tiempo 2 (Horas)
pte1(3) = 20 'Programa 3, Temperatura Tiempo 1
pte2(3) = 30 'Programa 3, Temperatura Tiempo 2
plu1(3) = 1 'Programa 3, Luces Tiempo 1 (1=ON)
plu2(3) = 0 'Programa 3, Luces Tiempo 2 (1=ON)

tiemp = 0 'Tiempo actual: Hora*60+Minutos.
tiempf0 = 0
aireok = 1
minua = 0 'Minutos que lleva encendido el Aire.


'---- Leo los valores de la EEPROM ----
Read 1, prog 'Programa actual
Read 2, dias 'Dias en curso
Read 3, hora 'Hora en curso
Read 4, minu 'Minuto en curso
Read 6, tmax
Read 7, tmin




'Inicializo Puertos
AllDigital

TRISA = %00010000 '0 = salida
TRISB = %11111111 '0 = salida
PORTB = 0 ' PORTB todo en 0

'Declaro los "alias" a usar en el programa:
Symbol ds1820pin = PORTA.4 'Puerto en que se conecta el DS1820
Symbol ds1820rw = TRISA.4 '1=Leer DS1820 / 0=Escribir DS1820
'Estado inicial Reles y Display. -------------------------------------------
Symbol ventilador = PORTA.3
Symbol luz = PORTA.2
Symbol frio = PORTA.0
Symbol calor = PORTA.1
Symbol pprog = PORTB.6
Symbol preset = PORTB.7

ventilador = 0
luz = 0
frio = 0
calor = 0

'Configuro el puerto para el LCD:
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 5
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Define LCD_RWREG = 0
Define LCD_RWBIT = 0

'Inicializo el LCD
Lcdinit 0 'Cursor apagado
WaitMs 500
Lcdout "Cont. automatico"
Lcdcmdout LcdLine2Home
Lcdout "(www.neoteo.com)"
WaitMs 5000
Lcdcmdout LcdClear

'Veo si es la primera vez que se conecta el aparato, para
'poner la eeprom en cero
If prog = 255 Then
prog = 1
Gosub cambioprog
Endif

'Veo si se pulso la tecla de cambio de programa--------

'Lcdout "P", #prog
For i = 1 To 25
Gosub leopulsadores
WaitMs 40
Next i

'----------------------------------------------------------
'-- CUERPO DEL PROGRAMA
'----------------------------------------------------------
loop:
'Calculo la "hora" actual (cantidad de minutos)--------
tiemp = hora * 60 + minu

'Leo la temperatura del sensor ------------------------
Gosub init1820 'Inicializo el sensor y...
comando = 0xcc '..salteo la ROM.
Gosub write1820

comando = 0x44 'Comienzo la conversion A/D de la temperatura
Gosub write1820
WaitUs 2000 ' Espero a que termine la conversion

Gosub init1820 'Inicializo el sensor y...
comando = 0xcc '..salteo la ROM.
Gosub write1820
comando = 0xbe 'Pido que me envie lo que calculo el sensor...
Gosub write1820
WaitMs 750 ' Espero ...
Gosub read1820 'Me lo devuelve en tempe1 y tempe2

'Actualizo y muestro Tempe1, TMax y TMin --------------
If tmax < tempe1 Then
tmax = tempe1
Write 6, tmax
Endif

If tmin > tempe1 Then
tmin = tempe1
Write 7, tmin
Endif



'Actualizo Hora y Minu , y los muestro ----------------
segu = segu + paso
If segu > 59 Then
minu = minu + 1
Write 4, minu
segu = 0
If minu > 59 Then
minu = 0
hora = hora + 1
Write 3, hora
If hora > 23 Then
dias = dias + 1
Write 2, dias
tiempf0 = 0
hora = 0
Endif
Endif
Endif


'Enciendo/Apago la luz, Aire, etc del programa en curso

auxw = pti1(prog) * 60
If tiemp < auxw Then 'Estoy en la primera parte del dia

'Enciendo/Apago la luz-------------------------------------------
If plu1(prog) = 1 Then
luz = 1
Else
luz = 0
Endif

'Enciendo/Apago fuente de calor----------------------------------
If tempe1 < pte1(prog) Then
calor = 1
'ventilador = 1
Endif
If tempe1 = pte1(prog) Then
calor = 0
'ventilador = 0
Endif
If tempe1 > pte1(prog) Then
calor = 0
'ventilador = 0
Endif

'Enciendo/apago fuente de FRIO ------------------------------------------
If tempe1 > pte1(prog) And aireok = 1 Then 'si hace calor....
frio = 1 '..lo enciendo y
ventilador = 0
Endif
If tempe1 < pte1(prog) Then
frio = 0
ventilador = 1
tiempf0 = tiemp 'Tomo nota de la hora de apagado
aireok = 0
Endif



Else 'Estoy en la segunda parte del dia
'Enciendo/Apago la luz-------------------------------------------
If plu2(prog) = 1 Then
luz = 1
Else
luz = 0
Endif

'Enciendo/Apago fuente de calor----------------------------------
If tempe1 < pte2(prog) Then
calor = 1
'ventilador = 1
Endif
If tempe1 = pte2(prog) Then
calor = 0
'ventilador = 0
Endif
If tempe1 > pte2(prog) Then
calor = 0
'ventilador = 0
Endif

'Enciendo/apago fuente de FRIO ------------------------------------------
If tempe1 > pte2(prog) And aireok = 1 Then 'si hace calor....
frio = 1 '..lo enciendo y
ventilador = 0
Endif
If tempe1 < pte2(prog) Then
frio = 0
ventilador = 1
tiempf0 = tiemp 'Tomo nota de la hora de apagado
aireok = 0
Endif


Endif '---Fin analisis Programa -------

'---------------------------------------------------
'Veo si pasaron 5 minutos de la ultima vez que se
'apago el aire

aux = tiempf0 + 4
If tiemp > aux Then
aireok = 1
Endif
If tiemp > 1438 Then 'casi medianoche
aireok = 1
Endif

'---------------------------------------------------
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(1)
Lcdout "P", #prog, " "

If luz = 1 Then
Lcdcmdout LcdLine1Pos(5)
Lcdout "L"
Endif
If frio = 1 Then
Lcdcmdout LcdLine1Pos(6)
Lcdout "F"
Endif
If calor = 1 Then
Lcdcmdout LcdLine1Pos(6)
Lcdout "C"
Endif
If ventilador = 1 Then
Lcdcmdout LcdLine1Pos(7)
Lcdout "V"
Endif

Lcdcmdout LcdLine1Pos(9)
Lcdout "00:00:00"
If minu > 9 Then
Lcdcmdout LcdLine1Pos(15)
Else
Lcdcmdout LcdLine1Pos(16)
Endif
Lcdout #minu

If hora > 9 Then
Lcdcmdout LcdLine1Pos(12)
Else
Lcdcmdout LcdLine1Pos(13)
Endif
Lcdout #hora

If dias > 9 Then
Lcdcmdout LcdLine1Pos(9)
Else
Lcdcmdout LcdLine1Pos(10)
Endif
Lcdout #dias

'Veo si se movio la llave de cambio de programa--------
Gosub leopulsadores
Lcdcmdout LcdLine2Home
Lcdout "T:", #tempe1, " M:", #tmax, " m:", #tmin, " "
WaitMs 180
Goto loop


End
leopulsadores:
'Veo si se pulso la tecla o es un ruido -------
If pprog = 1 Then
WaitMs 50
If pprog = 1 Then
prog = prog + 1
If prog = 4 Then
prog = 1
Endif
Gosub cambioprog
Endif
Endif

'Veo si se resetearon TMax y TMin
If preset = 1 Then
WaitMs 50
If preset = 1 Then
tmax = 0
tmin = 99
Endif

Lcdcmdout LcdLine2Home
Lcdout "T:", #tempe1, " M:", #tmax, " m:", #tmin, " "
Endif
Return

cambioprog:
'Muestro el programa actual en el display
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(1)
Lcdout "P", #prog
Write 1, prog
tmax = 0 'Valor de la temperatura Maxima Registrada en el ciclo
tmin = 99 'Valor de la temperatura Minima Registrada en el ciclo
Write 6, tmax
Write 7, tmin
dias = 0 'Dias en curso
hora = 0 'Hora en curso
minu = 0 'Minuto en curso
Write 2, dias
Write 3, hora
Write 4, minu
segu = 0 'Auxiliar, para calcular los minutos
tiempf0 = 1
ventilador = 0
luz = 0 'Rele Luces
frio = 0 'Rele Frio
calor = 0 'Rele Calor
Return
'-------------------------------------------------
'Inicializa el DS1820
'-------------------------------------------------
init1820:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0 'Pongo en cero el pin del DS1820
WaitUs 500 ' Espero mas de 480 us
ds1820rw = 1 ' Pongo el pin como entrada
WaitUs 100 ' Espero mas de 60 us a que "reaccione"
WaitUs 500 ' Espero a que finalice de enviarme el estado
Return

'-------------------------------------------------
'Envia comandos al DS1820
'-------------------------------------------------
write1820:
For aux = 1 To 8 'Recorro los 8 bits de "Comando"
If comando.0 = 0 Then
Gosub write0
Else
Gosub write1
Endif
comando = ShiftRight(comando, 1)
Next aux
Return

'-------------------------------------------------
'Envia un cero al DS1820
'-------------------------------------------------
write0:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 60 'hay que mantener bajo el pin mas 60 us
ds1820rw = 1
Return

'-------------------------------------------------
'Envia un uno al DS1820
'-------------------------------------------------
write1:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 1 'hay que mantener bajo el pin menos de 15 60 us
ds1820rw = 1
WaitUs 60 'espero el resto del tiempo...
Return

'-------------------------------------------------
'Lee temperatura del DS1820
'-------------------------------------------------
read1820:
For aux = 1 To 16 ' los 16 bits de temp (word)
tempe = ShiftRight(tempe, 1)
Gosub readbit
Next aux
'Calculo la temperatura(tempe1) y las decimas (tempe2)
tempe1 = ShiftRight(tempe.LB, 1)
tempe1 = 128 - tempe1

If tempe.0 = 1 Then
tempe2 = 0
Else
tempe2 = 5
Endif
Return

'-------------------------------------------------
'Lee un bit del DS1820
'-------------------------------------------------
readbit:
tempe.15 = 1
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 1
ds1820rw = 1
If ds1820pin = 1 Then
tempe.15 = 0
Endif
WaitUs 60
Return

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #683 en: 18 de Noviembre de 2010, 07:19:05 »
No son errores, son avisos de que declaras unas variables las cuales no usas en el programa y, por lo tanto para ahorrar memoria el compilador ignora el código cuando compilas. Puedes deshabilitar el aviso y que te las compile de todas formas.
A eso se le llama código redundante; que es el código que no hace nada en el programa y si se elimina no afecta, o también aquel que se repite varias veces y simplemente con una sola vez que se declare es suficiente.
Saludos desde Granada, España.

Desconectado Mr.pelax

  • PIC10
  • *
  • Mensajes: 19
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #684 en: 18 de Noviembre de 2010, 12:30:13 »
hola muchas gracias .. ja era una duda tonta a veces me pierdo :mrgreen:pero me surgue la duda no logro hacerlo simular en el pic Simulador IDE. .. si me dan una mano se los agradesco:)

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #685 en: 20 de Noviembre de 2010, 21:10:43 »
Hola necesio que me ayuden con el siguiente codigo ya que al compilarle con el pic sumulator ide me da los siguientes errores

Line 7: Unused declaration. Not compiled: Dim j1 As Byte
Line 8: Unused declaration. Not compiled: Dim j2 As Byte
Line 11: Unused declaration. Not compiled: Dim text(16) As Byte
Line 35: Unused declaration. Not compiled: Dim tempeaux(3) As Byte 'Temperatura auxiliar
Line 39: Unused declaration. Not compiled: Dim minu0 As Word 'minutos que lleva apagado el aire

espero que me puedan ayudar ya que BASIC no me llevo tan bien. :oops:



Código: [Seleccionar]
'Ejemplo de programación del sistema de control electrónico de luz y temperatura.
'Versión con pulsador para seleccionar el programa 1,2 o 3'y Pulsador para resetear Max/Min
'-------------------------------------------
'Declaracion de Variables
Dim i As Byte ' Variable tipo Byte multiproposito
Dim j1 As Byte
Dim j2 As Byte
Dim auxw As Word ' Variable tipo Word multiproposito
Dim aux As Word ' Variable tipo Byte multiproposito
Dim text(16) As Byte

Dim tmax As Byte ' Valor de la temperatura Maxima Registrada en el ciclo
Dim tmin As Byte ' Valor de la temperatura Minima Registrada en el ciclo
Dim prog As Byte ' Programa en curso
Dim dias As Byte ' Dias en curso
Dim hora As Byte ' Hora en curso
Dim minu As Byte ' Minuto en curso
Dim segu As Byte ' Minuto en curso
Dim paso As Byte ' Segundos entre lecturas de Temperatura.

Dim pti1(3) As Byte 'Comienzo tiempo 1
Dim pti2(3) As Byte 'comienzo tiempo 2
Dim pte1(3) As Byte 'Temperatura Tiempo 1
Dim pte2(3) As Byte 'Temperatura Tiempo 2
Dim plu1(3) As Byte 'Luces Tiempo 1
Dim plu2(3) As Byte 'Luces Tiempo 2

Dim tiemp As Word 'Tiempo actual: Hora*60+Minutos
Dim aireok As Bit '1 = puedo usar el aire
Dim tiempf0 As Word 'tiempo que hace que prendí el aire

Dim comando As Byte 'Comando a enviar al DS1820
Dim tempe As Word 'Temperatura leida
Dim tempeaux(3) As Byte 'Temperatura auxiliar
Dim tempe1 As Byte 'PArte entera de la temperatura a mostrar
Dim tempe2 As Byte ' Decimales de la tempertatura a mostrar
Dim minua As Word ' minutos que lleva encendido el aire
Dim minu0 As Word ' minutos que lleva apagado el aire

'Valor Inicial de las Variables --------------------------------------------
'tmax = 0 'Valor de la temperatura Maxima Registrada en el ciclo
'tmin = 99 'Valor de la temperatura Minima Registrada en el ciclo
'prog = 1 'Programa en curso
'dias = 0 'Dias en curso
'hora = 0 'Hora en curso
'minu = 0 'Minuto en curso
segu = 0 'Auxiliar, para calcular los minutos
paso = 1 'Segundos entre lecturas de Temperatura.

pti1(1) = 8 'Programa 1, tiempo 1 (Horas)
pti2(1) = 16 'Programa 1, tiempo 2 (Horas)
pte1(1) = 20 'Programa 1, Temperatura Tiempo 1
pte2(1) = 20 'Programa 1, Temperatura Tiempo 2
plu1(1) = 1 'Programa 1, Luces Tiempo 1 (1=ON)
plu2(1) = 0 'Programa 1, Luces Tiempo 2 (1=ON)

pti1(2) = 8 'Programa 2, tiempo 1 (Horas)
pti2(2) = 16 'Programa 2, tiempo 2 (Horas)
pte1(2) = 25 'Programa 2, Temperatura Tiempo 1
pte2(2) = 25 'Programa 2, Temperatura Tiempo 2
plu1(2) = 1 'Programa 2, Luces Tiempo 1 (1=ON)
plu2(2) = 0 'Programa 2, Luces Tiempo 2 (1=ON)

pti1(3) = 8 'Programa 3, tiempo 1 (Horas)
pti2(3) = 16 'Programa 3, tiempo 2 (Horas)
pte1(3) = 20 'Programa 3, Temperatura Tiempo 1
pte2(3) = 30 'Programa 3, Temperatura Tiempo 2
plu1(3) = 1 'Programa 3, Luces Tiempo 1 (1=ON)
plu2(3) = 0 'Programa 3, Luces Tiempo 2 (1=ON)

tiemp = 0 'Tiempo actual: Hora*60+Minutos.
tiempf0 = 0
aireok = 1
minua = 0 'Minutos que lleva encendido el Aire.


'---- Leo los valores de la EEPROM ----
Read 1, prog 'Programa actual
Read 2, dias 'Dias en curso
Read 3, hora 'Hora en curso
Read 4, minu 'Minuto en curso
Read 6, tmax
Read 7, tmin




'Inicializo Puertos
AllDigital

TRISA = %00010000 '0 = salida
TRISB = %11111111 '0 = salida
PORTB = 0 ' PORTB todo en 0

'Declaro los "alias" a usar en el programa:
Symbol ds1820pin = PORTA.4 'Puerto en que se conecta el DS1820
Symbol ds1820rw = TRISA.4 '1=Leer DS1820 / 0=Escribir DS1820
'Estado inicial Reles y Display. -------------------------------------------
Symbol ventilador = PORTA.3
Symbol luz = PORTA.2
Symbol frio = PORTA.0
Symbol calor = PORTA.1
Symbol pprog = PORTB.6
Symbol preset = PORTB.7

ventilador = 0
luz = 0
frio = 0
calor = 0

'Configuro el puerto para el LCD:
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 5
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Define LCD_RWREG = 0
Define LCD_RWBIT = 0

'Inicializo el LCD
Lcdinit 0 'Cursor apagado
WaitMs 500
Lcdout "Cont. automatico"
Lcdcmdout LcdLine2Home
Lcdout "(www.neoteo.com)"
WaitMs 5000
Lcdcmdout LcdClear

'Veo si es la primera vez que se conecta el aparato, para
'poner la eeprom en cero
If prog = 255 Then
prog = 1
Gosub cambioprog
Endif

'Veo si se pulso la tecla de cambio de programa--------

'Lcdout "P", #prog
For i = 1 To 25
Gosub leopulsadores
WaitMs 40
Next i

'----------------------------------------------------------
'-- CUERPO DEL PROGRAMA
'----------------------------------------------------------
loop:
'Calculo la "hora" actual (cantidad de minutos)--------
tiemp = hora * 60 + minu

'Leo la temperatura del sensor ------------------------
Gosub init1820 'Inicializo el sensor y...
comando = 0xcc '..salteo la ROM.
Gosub write1820

comando = 0x44 'Comienzo la conversion A/D de la temperatura
Gosub write1820
WaitUs 2000 ' Espero a que termine la conversion

Gosub init1820 'Inicializo el sensor y...
comando = 0xcc '..salteo la ROM.
Gosub write1820
comando = 0xbe 'Pido que me envie lo que calculo el sensor...
Gosub write1820
WaitMs 750 ' Espero ...
Gosub read1820 'Me lo devuelve en tempe1 y tempe2

'Actualizo y muestro Tempe1, TMax y TMin --------------
If tmax < tempe1 Then
tmax = tempe1
Write 6, tmax
Endif

If tmin > tempe1 Then
tmin = tempe1
Write 7, tmin
Endif



'Actualizo Hora y Minu , y los muestro ----------------
segu = segu + paso
If segu > 59 Then
minu = minu + 1
Write 4, minu
segu = 0
If minu > 59 Then
minu = 0
hora = hora + 1
Write 3, hora
If hora > 23 Then
dias = dias + 1
Write 2, dias
tiempf0 = 0
hora = 0
Endif
Endif
Endif


'Enciendo/Apago la luz, Aire, etc del programa en curso

auxw = pti1(prog) * 60
If tiemp < auxw Then 'Estoy en la primera parte del dia

'Enciendo/Apago la luz-------------------------------------------
If plu1(prog) = 1 Then
luz = 1
Else
luz = 0
Endif

'Enciendo/Apago fuente de calor----------------------------------
If tempe1 < pte1(prog) Then
calor = 1
'ventilador = 1
Endif
If tempe1 = pte1(prog) Then
calor = 0
'ventilador = 0
Endif
If tempe1 > pte1(prog) Then
calor = 0
'ventilador = 0
Endif

'Enciendo/apago fuente de FRIO ------------------------------------------
If tempe1 > pte1(prog) And aireok = 1 Then 'si hace calor....
frio = 1 '..lo enciendo y
ventilador = 0
Endif
If tempe1 < pte1(prog) Then
frio = 0
ventilador = 1
tiempf0 = tiemp 'Tomo nota de la hora de apagado
aireok = 0
Endif



Else 'Estoy en la segunda parte del dia
'Enciendo/Apago la luz-------------------------------------------
If plu2(prog) = 1 Then
luz = 1
Else
luz = 0
Endif

'Enciendo/Apago fuente de calor----------------------------------
If tempe1 < pte2(prog) Then
calor = 1
'ventilador = 1
Endif
If tempe1 = pte2(prog) Then
calor = 0
'ventilador = 0
Endif
If tempe1 > pte2(prog) Then
calor = 0
'ventilador = 0
Endif

'Enciendo/apago fuente de FRIO ------------------------------------------
If tempe1 > pte2(prog) And aireok = 1 Then 'si hace calor....
frio = 1 '..lo enciendo y
ventilador = 0
Endif
If tempe1 < pte2(prog) Then
frio = 0
ventilador = 1
tiempf0 = tiemp 'Tomo nota de la hora de apagado
aireok = 0
Endif


Endif '---Fin analisis Programa -------

'---------------------------------------------------
'Veo si pasaron 5 minutos de la ultima vez que se
'apago el aire

aux = tiempf0 + 4
If tiemp > aux Then
aireok = 1
Endif
If tiemp > 1438 Then 'casi medianoche
aireok = 1
Endif

'---------------------------------------------------
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(1)
Lcdout "P", #prog, " "

If luz = 1 Then
Lcdcmdout LcdLine1Pos(5)
Lcdout "L"
Endif
If frio = 1 Then
Lcdcmdout LcdLine1Pos(6)
Lcdout "F"
Endif
If calor = 1 Then
Lcdcmdout LcdLine1Pos(6)
Lcdout "C"
Endif
If ventilador = 1 Then
Lcdcmdout LcdLine1Pos(7)
Lcdout "V"
Endif

Lcdcmdout LcdLine1Pos(9)
Lcdout "00:00:00"
If minu > 9 Then
Lcdcmdout LcdLine1Pos(15)
Else
Lcdcmdout LcdLine1Pos(16)
Endif
Lcdout #minu

If hora > 9 Then
Lcdcmdout LcdLine1Pos(12)
Else
Lcdcmdout LcdLine1Pos(13)
Endif
Lcdout #hora

If dias > 9 Then
Lcdcmdout LcdLine1Pos(9)
Else
Lcdcmdout LcdLine1Pos(10)
Endif
Lcdout #dias

'Veo si se movio la llave de cambio de programa--------
Gosub leopulsadores
Lcdcmdout LcdLine2Home
Lcdout "T:", #tempe1, " M:", #tmax, " m:", #tmin, " "
WaitMs 180
Goto loop


End
leopulsadores:
'Veo si se pulso la tecla o es un ruido -------
If pprog = 1 Then
WaitMs 50
If pprog = 1 Then
prog = prog + 1
If prog = 4 Then
prog = 1
Endif
Gosub cambioprog
Endif
Endif

'Veo si se resetearon TMax y TMin
If preset = 1 Then
WaitMs 50
If preset = 1 Then
tmax = 0
tmin = 99
Endif

Lcdcmdout LcdLine2Home
Lcdout "T:", #tempe1, " M:", #tmax, " m:", #tmin, " "
Endif
Return

cambioprog:
'Muestro el programa actual en el display
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(1)
Lcdout "P", #prog
Write 1, prog
tmax = 0 'Valor de la temperatura Maxima Registrada en el ciclo
tmin = 99 'Valor de la temperatura Minima Registrada en el ciclo
Write 6, tmax
Write 7, tmin
dias = 0 'Dias en curso
hora = 0 'Hora en curso
minu = 0 'Minuto en curso
Write 2, dias
Write 3, hora
Write 4, minu
segu = 0 'Auxiliar, para calcular los minutos
tiempf0 = 1
ventilador = 0
luz = 0 'Rele Luces
frio = 0 'Rele Frio
calor = 0 'Rele Calor
Return
'-------------------------------------------------
'Inicializa el DS1820
'-------------------------------------------------
init1820:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0 'Pongo en cero el pin del DS1820
WaitUs 500 ' Espero mas de 480 us
ds1820rw = 1 ' Pongo el pin como entrada
WaitUs 100 ' Espero mas de 60 us a que "reaccione"
WaitUs 500 ' Espero a que finalice de enviarme el estado
Return

'-------------------------------------------------
'Envia comandos al DS1820
'-------------------------------------------------
write1820:
For aux = 1 To 8 'Recorro los 8 bits de "Comando"
If comando.0 = 0 Then
Gosub write0
Else
Gosub write1
Endif
comando = ShiftRight(comando, 1)
Next aux
Return

'-------------------------------------------------
'Envia un cero al DS1820
'-------------------------------------------------
write0:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 60 'hay que mantener bajo el pin mas 60 us
ds1820rw = 1
Return

'-------------------------------------------------
'Envia un uno al DS1820
'-------------------------------------------------
write1:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 1 'hay que mantener bajo el pin menos de 15 60 us
ds1820rw = 1
WaitUs 60 'espero el resto del tiempo...
Return

'-------------------------------------------------
'Lee temperatura del DS1820
'-------------------------------------------------
read1820:
For aux = 1 To 16 ' los 16 bits de temp (word)
tempe = ShiftRight(tempe, 1)
Gosub readbit
Next aux
'Calculo la temperatura(tempe1) y las decimas (tempe2)
tempe1 = ShiftRight(tempe.LB, 1)
tempe1 = 128 - tempe1

If tempe.0 = 1 Then
tempe2 = 0
Else
tempe2 = 5
Endif
Return

'-------------------------------------------------
'Lee un bit del DS1820
'-------------------------------------------------
readbit:
tempe.15 = 1
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 1
ds1820rw = 1
If ds1820pin = 1 Then
tempe.15 = 0
Endif
WaitUs 60
Return

Imagino que no puedes simularlo por culpa de los Waitms. Para que puedas simular un Pic en tiempo real necesitas un súper ordenador. El Basic del PSI  contiene "Simulation_Waitms_Value" que insertado en el codigo acelera los Waitms, permitiendo la simulación.

'Ejemplo de programación del sistema de control electrónico de luz y temperatura.
'Versión con pulsador para seleccionar el programa 1,2 o 3'y Pulsador para resetear Max/Min
'-------------------------------------------
Define SIMULATION_WAITMS_VALUE = 1
'Declaracion de Variables
Dim i As Byte  'Variable tipo Byte multiproposito
Dim j1 As Byte
Dim j2 As Byte
Dim auxw As Word  'Variable tipo Word multiproposito
Dim aux As Word  'Variable tipo Byte multiproposito
Dim text(16) As Byte

.
.
.
« Última modificación: 26 de Noviembre de 2010, 15:21:29 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #686 en: 21 de Diciembre de 2010, 19:56:11 »
Varias veces me preguntaron si se pueden tener arrays (vectores) de varias dimensiones en el Basic del PSI. Lo que es el lenguaje hasta ahora no lo tiene implementado, pero podemos construirnos una función que nos simule el proceso, no queda tan lucida como una función interna del sistema, ya que necesitamos una variable de paso e indicar si escribiremos o leeremos el array, pero el caso es que la función nos permite trabajar con array de dos dimensiones.

La rutina esta declarada en el ejemplo como array(2,5).

Código: Visual Basic
  1. 'Rutina para trabajar con array de dos dimensiones (Vectores)
  2. 'By dogflu66
  3. '********************************************************************
  4. Dim x As Byte
  5. Dim y As Byte
  6. Dim n As Byte
  7.  
  8. AllDigital
  9. TRISA = 0
  10. TRISB = 0
  11.  
  12. main:
  13.         n = 0
  14.         For x = 0 To 1
  15.                 For y = 0 To 4
  16.                         max = n  'Valor a guardar
  17.                         Call max(x, y, "W")  'Actualiza array
  18.                         n = n + 1  'Valor a guardar
  19.                 Next y
  20.         Next x
  21.         Serout RB0, 9600, CrLf  'Linea en blanco
  22.         For x = 0 To 1
  23.                 For y = 0 To 4
  24.                         Call max(x, y, "R")  'Lee array
  25.                         Serout RB0, 9600, "max(", #x, ",", #y, ")=", #max, CrLf  'Imprime valores
  26.                 Next y
  27.         Next x
  28. 'Goto main
  29. End                                              
  30. 'Rutina para trabajar con arrays de dos dimensiones
  31. 'max = variable de paso
  32. 'i1 = Primer indice del array
  33. 'i2 = Segundo indice del array
  34. 'rw = "W" o "w" o 1 => Escribe en array
  35. 'rw = "R" o "r" o 0 => Lee del array
  36. Function max(i1 As Byte, i2 As Byte, rw As Byte) As Byte
  37.         Const ind2 = 5  'Valor del indice2
  38.         Dim array(10) As Byte  'Se declara vector de longitud Indice1*indice2
  39.         Dim ind As Byte  'Indice del vector de trabajo
  40.         Dim aux As Byte  'Variable auxiliar
  41.         aux = ind2 - 1  'Valor de ajuste
  42.         If i1 > 0 Then aux = i1 * aux  'Ajuste si i1>0
  43.         If i1 = 0 Then aux = 0  'Ajuste si i1=0
  44.         ind = i1 + i2 + aux  'Calcula indice array
  45.         If rw = "R" Or rw = "r" Or rw = 0 Then max = array(ind)  'Lee array
  46.         If rw = "W" Or rw = "w" Or rw = 1 Then array(ind) = max  'Escribe array
  47. End Function

Dejo la foto de la simulacion:


Para seguir trabajando con vectores, en este caso, propongo una pequeña modificación a la función anterior. Esta modificación nos permitirá trabajar con la EEProm interna del Pic usando el clásico formato de tabla de 16 columnas por 16 filas o también 16 filas de 16 elementos cada una:




La función:

Código: vb.net
  1. 'Función para trabajar con la EEProm interna del Pic como si fuera
  2. 'la clasica tabla de 16 columnas x 16 filas, o si preferimos
  3. '16 filas de 16 elementos cada una.
  4. 'By dogflu66
  5. '********************************************************************
  6. Dim x As Byte
  7. Dim y As Byte
  8. Dim n As Byte
  9. AllDigital
  10. TRISA = 0
  11. TRISB = 0
  12. main:
  13.         n = 0
  14.         For x = 00h To fh
  15.                 For y = 00h To fh
  16.                         max = n  'Valor a guardar
  17.                         Call max(x, y, "W")  'Actualiza array
  18.                         n = n + 1  'Valor a guardar
  19.                 Next y
  20.         Next x
  21.         Serout RB0, 9600, CrLf  'Linea en blanco
  22.         For x = 00h To fh
  23.                 For y = 00h To fh
  24.                         Call max(x, y, "R")  'Lee array
  25.                         Serout RB0, 9600, "max(", #x, ",", #y, ")=", #max, CrLf  'Imprime valores
  26.                 Next y
  27.         Next x
  28. 'Goto main
  29. End                                              
  30. 'Rutina para trabajar con la tipica tabla de memoria de 0xh a Fxh to x0h a xFh
  31. 'Se considera que la memoria EEProm del Pic es un vector de 256 elementos.
  32. 'max = variable de paso
  33. 'i1 = Primer indice del array
  34. 'i2 = Segundo indice del array
  35. 'rw = "W" o "w" o 1 => Escribe en array
  36. 'rw = "R" o "r" o 0 => Lee del array
  37. Function max(i1 As Byte, i2 As Byte, rw As Byte) As Byte
  38.         Const ind2 = 16  'Número de columnas o también número de elementos por fila
  39.         Dim ind As Byte  'Indice del vector de trabajo
  40.         ind = i1 + i2 + (i1 * (ind2 - 1))  'Calcula indice array, se considera que la EEProm es un vector de 256 elementos
  41.         If rw = "R" Or rw = "r" Or rw = 0 Then Read ind, max  'Lee array, dirección memoria EEProm
  42.         If rw = "W" Or rw = "w" Or rw = 1 Then Write ind, max  'Escribe array, dirección memoria EEProm
  43. End Function

PD. He simplificado la función.

PD. Se me fue la mano en el numero de elementos del array 01/2011

« Última modificación: 03 de Mayo de 2014, 14:35:16 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #687 en: 28 de Diciembre de 2010, 11:31:56 »
Otra de vectores:

Como sabéis el Basic del PSI tiene limitado la longitud de los vectores (declaraciones de array de variables con Dim), a la longitud del banco de memoria donde será alojado (128 byte), esto no es así por capricho,  sencillamente se ajusta a la arquitectura del Pic, la memoria ram del PIC esta dividida en paginas o bancos de memoria y, estos a su vez están divididos en zonas donde encontramos los registros reservados que se utilizan para configurar periféricos del PIC entre otras cosas. Que dando los registros de propósito general, los cuales quedan a nuestra disposición salvo algunos que ocupa la estructura interna del Basic del PSI para poder ejecutar nuestro programa sin perderse.

Así que siguiendo con el tipo de funciones anteriores, la he modificado para crear un array unidimensional que utiliza los dos últimos bancos de memoria Ram (Bank 2 y Bank 3), la rutina los ensambla permitiéndonos tener un array de 224 elementos de un Byte cada uno que va desde el 0 al 223.

Para poder realizar la tarea hay que trabajar directamente con direcciones de memoria, he utilizado la función de programación avanzada del Basic PSI que nos lo permite “Pointer”.

El Programa:

Código: vb.net
  1. 'Rutina para trabajar con array de una dimensión (Vectores)
  2. 'Une los bancos de memoria de datos 2 y 3 para usar los registros
  3. 'de proposito general de estos bancos como si fueran un unico vector.
  4. 'By dogflu66
  5. '********************************************************************
  6. Dim x As Byte
  7. Dim n As Byte
  8.  
  9. AllDigital
  10. TRISA = 0
  11. TRISB = 0
  12.  
  13. main:
  14.         n = 0
  15.         For x = 0 To 223
  16.                 max = n  'Valor a guardar
  17.                 Call max(x, "W")  'Actualiza array
  18.                 n = n + 1  'Valor a guardar
  19.                 If n > 15 Then n = 0
  20.         Next x
  21.         Serout RB0, 9600, CrLf  'Linea en blanco
  22.         For x = 0 To 223
  23.                 Call max(x, "R")  'Lee array
  24.                 Serout RB0, 9600, "max(", #x, ")=", #max, CrLf  'Imprime valores
  25.         Next x
  26. 'Goto main
  27. End                                              
  28. 'Rutina para trabajar con arrays de una dimension para Pic16F88
  29. 'Une los registros de proposito general de dos bancos
  30. 'de memoria de datos en un solo vector de 224 elementos (Bank 2 + Bank3)
  31. 'max = variable de paso
  32. 'i1 = Primer indice del array
  33. 'rw = "W" o "w" o 1 => Escribe en array
  34. 'rw = "R" o "r" o 0 => Lee del array
  35. Function max(i1 As Word, rw As Byte) As Byte
  36.         Const ini = 110h  'Principio del primer banco de memoria, en este caso Bank 2
  37.         Const dis = 32  'Numero de elementos discontinuos entre los bancos -1
  38.         Dim ind As Word  'Indice del array
  39.         ind = i1 + ini  'Calcula indice array (0 to 223)
  40.         If ind > 16fh And ind < 190h Then ind = ind + dis  'Une los bancos de memoria
  41.         If rw = "R" Or rw = "r" Or rw = 0 Then max = Pointer(ind)  'Lee dato
  42.         If rw = "W" Or rw = "w" Or rw = 1 Then Pointer(ind) = max  'Escribe dato
  43. End Function
« Última modificación: 06 de Enero de 2011, 22:25:35 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #688 en: 30 de Diciembre de 2010, 21:11:21 »
Y aquí dejo el penúltimo programa sobre vectores y vectores de vectores (listas), en este caso la función que complementa el anterior ejemplo con dos dimensiones.
Definido en el ejemplo como array(14, 14):

Código: vb.net
  1. 'Rutina para trabajar con array de dos dimensiones (Vectores)
  2. 'Une los bancos de memoria de datos 2 y 3 para usar los registros
  3. 'de proposito general de estos bancos como si fueran un unico vector.
  4. 'By dogflu66
  5. '********************************************************************
  6. Dim x As Byte
  7. Dim y As Byte
  8. Dim n As Byte
  9.  
  10. AllDigital
  11. TRISA = 0
  12. TRISB = 0
  13.  
  14. main:
  15.         n = 0
  16.         For x = 0 To 13
  17.                 For y = 0 To 13
  18.                         max = n  'Valor a guardar
  19.                         Call max(x, y, "W")  'Actualiza array
  20.                         n = n + 1  'Valor a guardar
  21.                         If n > 13 Then n = 0
  22.                 Next y
  23.         Next x
  24.         Serout RB0, 9600, CrLf  'Linea en blanco
  25.         For x = 0 To 13
  26.                 For y = 0 To 13
  27.                         Call max(x, y, "R")  'Lee array
  28.                         Serout RB0, 9600, "max(", #x, ",", #y, ")=", #max, CrLf  'Imprime valores
  29.                 Next y
  30.         Next x
  31. 'Goto main
  32. End                                              
  33. 'Rutina para trabajar con arrays de dos dimensiones para Pic16F88
  34. 'Une los registros de proposito general de dos bancos de
  35. 'memoria de datos en un solo vector de 224 elementos (Bank 2 + Bank3)
  36. 'max = variable de paso
  37. 'i1 = Primer indice del array
  38. 'i2 = Segundo indice del array
  39. 'rw = "W" o "w" o 1 => Escribe en array
  40. 'rw = "R" o "r" o 0 => Lee del array
  41. Function max(i1 As Word, i2 As Byte, rw As Byte) As Byte
  42.         Const ind2 = 14  'Valor del indice2, numero de elementos por fila
  43.         Const ini = 110h  'Principio del primer banco de memoria, en este caso Bank 2
  44.         Const dis = 32  'Numero de elementos discontinuos entre los bancos -1
  45.         Dim ind As Word  'Indice del array
  46.         ind = (i1 + i2 + (i1 * (ind2 - 1))) + ini  'Calcula indice array (0 to 223)
  47.         If ind > 16fh And ind < 190h Then ind = ind + dis  'Une los bancos de memoria
  48.         If rw = "R" Or rw = "r" Or rw = 0 Then max = Pointer(ind)  'Lee dato
  49.         If rw = "W" Or rw = "w" Or rw = 1 Then Pointer(ind) = max  'Escribe dato
  50. End Function

« Última modificación: 14 de Septiembre de 2013, 09:41:52 por dogflu66 »
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #689 en: 07 de Enero de 2011, 09:37:47 »
Ya se que estoy siendo un poquito pesado, pero esto es lo que tiene por querer aprender.
Asi que aprovechando de su amabilidad, tengo una pregunta mas:

Tengo una señal de entrada por un pin de un puerto (al fin y al cabo es un bit de un puerto) y lo quiero comparar con una constante que es un bit(y por tanto solo toma valores 0 y 1, lo mismo que el la señal de entrada).

El caso es que si hago:If estado_presostato(que es la constante)= presostato_secado(que es la entrada del pin) Then... Entonces el compilador PSI me da le siguiente error: "Argument 'presostato_secado' is not valid bit constant"

Pensé que se podia realizar esa comparación , pero evidentemente "presostato_secado" no es una constante, ya que es un bit que pertenece al byte del puerto entero.

¿Alguna sugerencia, de como comparar esos valores?
Gracias de antemano
« Última modificación: 07 de Enero de 2011, 09:39:53 por Fer_TACA »
Todos los días se aprende algo nuevo.