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

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #750 en: 20 de Marzo de 2013, 22:47:52 »
Por lo pronto dejo tres funciones que permiten trabajar con bit de las variables o registros:

Código: [Seleccionar]
'******************************************
'Funciones para modificar o leer el Bit ***
'de una variable o registro hasta tipo Long
'By dogflu66, 03/2013 *********************
'Para simulación **************************
'******************************************
Hseropen 4600
Dim variable As Byte
Dim aux As Byte
Dim n As Byte
variable = %10011000
aux = 0

main:
aux = 0
TRISA = 0
TRISA = _bittrue(TRISA, 0)
aux.0 = TRISA.0
Hserout "TRISA.0=", #aux, CrLf

aux = 0
TRISA = _bitfalse(TRISA, 1)
aux.0 = TRISA.1
Hserout "TRISA.1=", #aux, CrLf

Hserout "-------------------", CrLf

aux = 0
variable = _bittrue(variable, 0)
variable = _bitfalse(variable, 3)
For n = 0 To 7
aux.0 = _getbit(variable, n)
Hserout "VARIABLE.", #n, "=", #aux, CrLf
Next n

Halt

End                                               
'Cambia a 1 el valor de un bit especifico de un registro hasta Long
'_reg es la variable o registro de entrada
'_bit es el numero de orden del bit a modificar, de 0 a ...
'Mediante _bittrue se transfiere el valor del bit modificado
Function _bittrue(_reg As Long, _bit As Byte) As Long
Dim _byte As Long
_byte = 1
_byte = ShiftLeft(_byte, _bit)
_reg = _reg Or _byte
_bittrue = _reg
End Function                                     
'Cambia a 0 el valor de un bit especifico de un registro hasta Long
'_reg es la variable o registro de entrada
'_bit es el numero de orden del bit a modificar, de 0 a ...
'Mediante _bitfalse transfiere el valor del bit modificado
Function _bitfalse(_reg As Long, _bit As Byte) As Long
Dim _byte As Long
_byte = 1
_byte = ShiftLeft(_byte, _bit)
_byte = _byte Nand 0xffff
_reg = _reg And _byte
_bitfalse = _reg
End Function                                     
'_getbit es una funcion que nos devuelve el estado
'de un bit de una variable determinada hasta Long.
'_reg es la variable de entrada
'_bit es el numero de orden del bit deseado, de 0 a ...
'Mediante _getbit transfiere el valor del bit deseado
Function _getbit(_reg As Long, _bit As Byte) As Bit
_reg = ShiftRight(_reg, _bit)
_getbit = _reg.0
End Function   
Saludos desde Granada, España.

Desconectado gatruca

  • PIC10
  • *
  • Mensajes: 7
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #751 en: 21 de Marzo de 2013, 10:38:49 »
La verdad es que estoy sorprendido por la celeridad de tu aporte dogflu66, ademas de presicion de tu respuesta, (a veces pienso que eres un ordenador!!! jajajaja). Habia visto una funcion publicada por vos hace tiempo (getbit), pero no me daba idea como para hacer las otras dos funciones que agregaste en este ejemplo.

Infinitas gracias por ayudarme a salir de este embrollo en el que me meti!!!!

Desconectado gatruca

  • PIC10
  • *
  • Mensajes: 7
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #752 en: 21 de Marzo de 2013, 15:46:26 »
Gracias otra vez dogflu66!!!!!!!!

'**************************************************************************************************
'Solo Para simular!!!!!!! (solo es una parte del codigo en el que estoy trabajando, asi que, lo
'estoy publicando solo para simular y ver lo que sucede con las variables.
'si la simulacion se hace en el modo "Extremely fast" puede verse como los bits de la variable
'"valor_a", pasan uno a uno, a tres variables tipo byte y cuando se oprime el portc.3, pasan de los
'bytes uno a uno a una segunda variable, "valor_b"
'ojala les sirva como de manejo de una trama de 26 bits que entrega el protocolo wiegan (aplicado a la lectura
'de tags rfid),
'
'hecho gracias al INVALORABLE APORTE DE DOGFLU66, aclarando un poco el tema de las
'funciones que permiten migrar los bit de una variable hacia otra aunque estas no sean del mismo tipo
'
'**************************************************************************************************
Define CLOCK_FREQUENCY = 4
AllDigital
TRISB.0 = 1
TRISB.1 = 1
TRISC.3 = 1
'**************************************************************************************
Dim valor_a As Long
Dim valor_b As Long
Dim x As Byte
Dim n As Byte
Dim y As Byte
Dim a As Byte
Dim auxbyte(3) As Byte
'************************************************************************************
x = 25
n = 0
y = 0 'esta variable puede set tipo bit, pero es mas comodo tenerla tipo byte e imprimirla por hserout o en el lcd
a = 0
valor_a = %10101010101110101011101011  'trama de 26 bits, el primero y ultimo son start y stop
'************************************************************************************
main:

If x = 25 Then Gosub guardabytes  'a modo de llave para que solo se ejecute una vez

If PORTC.3 = 1 Then
   While PORTC.3 = 1
      Wend
   Gosub leebytes
Endif
Goto main
End                                               
guardabytes:
'************************************************************************************
'sub rutina que guarda el valor de una variable long,(utilizando los primeros 24 bits
'en tres bytes diferentes para poder guardarlos en la eeprom.
'************************************************************************************
a = 0
n = 0
For x = 1 To 24  '..............excluye la lectura del primero y ultimo bits de la trama
If x = 8 Then n = 1  'una vez que x supera los 8 primeros bits pasa al byte siguiente
If x = 16 Then n = 2  '" "....................16 ".................................
y.0 = _getbit(valor_a, x)  'toma el bit 'x' y lo guarda en el auxiliar 'y.0'
If y.0 = 1 Then auxbyte(n) = _bittrue(auxbyte(n), a)  'escribe 1 en el byte(n) en la posicion 'a'
If y.0 = 0 Then auxbyte(n) = _bitfalse(auxbyte(n), a)  'escribe 0 en el byte(n) en la posicion 'a'
a = a + 1  'amuenta el contador 'a'
If a = 8 Then a = 0  'resetea la cuenta de 'a'
Next x
x = 0

Return                                           
'************************************************************************************
'sub rutina que guarda el valor de una tres variables byte, en una unica variable
'long
'************************************************************************************
leebytes:
valor_b = _bittrue(valor_b, 0)  '.escribe 1 en el primer bit
valor_b = _bittrue(valor_b, 25)  'escribe 1 en el ultimo bit
a = 0
n = 0
For x = 1 To 24  'BUCLE QUE VUELCA LOS BITS DE 3 BYTES EN UNA VARIABLE LONG
If x = 8 Then n = 1  'UNA VEZ QUE X SUPERA 7 CAMBIA DE BYTE EN EL QUE GUARDAR LOS BITS DE LA TRAMA
If x = 16 Then n = 2  'CAMBIA DE BYTE EN EL QUE GUARDAR LOS BITS DE LA TRAMA
y.0 = _getbit(auxbyte(n), a)  'TOMA EL VALOR DEL BIT X DE LA VARIABLE AUXBYTE(N)
If y = 1 Then valor_b = _bittrue(valor_b, x)  '.ESCRIBE 1 EN EL BYTE(n) POSICION a
If y = 0 Then valor_b = _bitfalse(valor_b, x)  'ESCRIBE 0 EN EL BYTE n POSICION a
a = a + 1  'AUMENTA EL CONTADOR DE 0 A 7
If a = 8 Then a = 0  'RESETEA LA CUENTA
Next x
x = 0

Return                                           

Function _bittrue(_reg As Long, _bit As Byte) As Long

'Cambia a 1 el valor de un bit especifico de un registro hasta Long
'_reg es la variable o registro de entrada
'_bit es el numero de orden del bit a modificar, de 0 a ...
'Mediante _bitfalse transfiere el valor del bit modificado

   Dim _byte As Long
   _byte = 1
   _byte = ShiftLeft(_byte, _bit)
   _reg = _reg Or _byte
   _bittrue = _reg
End Function                                     

Function _bitfalse(_reg As Long, _bit As Byte) As Long

'Cambia a 0 el valor de un bit especifico de un registro hasta Long
'_reg es la variable o registro de entrada
'_bit es el numero de orden del bit a modificar, de 0 a ...
'Mediante _bitfalse transfiere el valor del bit modificado

   Dim _byte As Long
   _byte = 1
   _byte = ShiftLeft(_byte, _bit)
   _byte = _byte Nand 0xffff
   _reg = _reg And _byte
   _bitfalse = _reg
End Function                                     

'_getbit es una funcion que nos devuelve el estado
'de un bit de una variable determinada hasta Long.
'_reg es la variable de entrada
'_bit es el numero de orden del bit deseado, de 0 a ...
'Mediante _getbit transfiere el valor del bit deseado
Function _getbit(_reg As Long, _bit As Byte) As Bit
   _reg = ShiftRight(_reg, _bit)
   _getbit = _reg.0
End Function

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #753 en: 21 de Marzo de 2013, 21:17:49 »
Gracias dogflu66, Probe y funciono, Correccion realizada!

Saludos   :-)
Si los escribes como viene en el datasheet del micro si los reconoce.

T2CON.T2OUTPS0 = 0  'TMR2 Postcale
T2CON.T2OUTPS1 = 0  'TMR2 Postcale
T2CON.T2OUTPS2 = 1  'TMR2 Postcale
T2CON.T2OUTPS3 = 0  'TMR2 Postcale

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #754 en: 21 de Marzo de 2013, 23:37:12 »
Ok, veo que os manejais bien.

Para gatruca:

Ya he visto que llevas bien tu codigo, pero de todas formas dejo lo siguiente que tenia escrito pero no puede adjuntarlo con el anterior mensaje.

Bueno hay que ir por partes:

Como las variables de tipo Long trabajan con 32 bit puedes trabar directamente con este tipo de variable porque tiene más resolución de la que necesitas.

La conversión de tipos de variables de datos en este lenguaje es automática, entre tipos Long, Word y Byte, exceptuado la de tipo Bit que hay que realizarla mediante código del usuario.

Al igual que se puede trabajar con los bit de un variable también se pueden dividir en grupos de word y grupos de byte de forma directa. En este caso te interesa trabajar con una variable de paso tipo Long para componer la trama de bit y luego dividirla en Bytes para enviarlos uno a uno a la Eeprom interna. Si solo necesitas 3 bytes el cuarto más significativo de la variable de paso tipo Long lo ignoras. De todas formas es conveniente que lo mantengas limpio simplemente igualando este byte directamente a cero o en toda la variable poniéndola a cero antes de usarla. Esto es:
Dim vpaso as Long
Vpaso = 0 ‘Todos los bit de la variable a cero.
vpaso.4B = 0 'Byte más significativo a cero.

Y para manejarla:
vpaso.LB = ... ‘Byte 0, menos significativo del Long
vpaso.HB = ... ‘Byte 1
vpaso.3B = ... ‘Byte 2
vpaso.4B = ... ‘Byte 3, más significativo

Y para almacenar en la Eeprom:
Write dirección, vpaso.LB
Write dirección + 1, vpaso.HB
Write dirección + 2, vpaso.3B
Write dirección + 3, vpaso.4B

Y para recuperarlos pues el opuesto:
Read dirección, vpaso.LB
Read dirección + 1, vpaso.HB
Read dirección + 2, vpaso.3B
Read dirección + 3, vpaso.4B

Puedes crear unas funciones para  escritura y lectura propias que lo haga todo de una sola vez.

Ejemplo:
Código: [Seleccionar]
'***********************************************
'Funciones para W/R un Long en la Eeprom del pic
'By Dogflu66
'Para simulación
'***********************************************
End                                              
'Escribe una variable tipo Long en la Eeprom del Pic
'_reg = variable tipo Long a guardar en la Eeprom
'_direccion = direccion del Byte menos significativo de _reg
'Ejemplo (WriteLongEeprom):
'Call _wlongeeprom(vpaso, 200)
Proc _wlongeeprom(_reg As Long, _direccion As Word)
Write _direccion, _reg.LB
_direccion = _direccion + 1
Write _direccion, _reg.HB
_direccion = _direccion + 1
Write _direccion, _reg.3B
_direccion = _direccion + 1
Write _direccion, _reg.4B
End Proc
'Lee una variable tipo Long almacenada en la Eeprom del Pic
'_direccion = direccion del Byte menos significativo de la variable
'Ejemplo (ReadLongEeprom):
'vpaso = _rlongeeprom(200)
Function _rlongeeprom(_direccion As Word) As Long
Dim _reg As Long
_reg = 0
Read _direccion, _reg.LB
_direccion = _direccion + 1
Read _direccion, _reg.HB
_direccion = _direccion + 1
Read _direccion, _reg.3B
_direccion = _direccion + 1
Read _direccion, _reg.4B
_rlongeeprom = _reg
End Function           

Para terminar; puedes eliminar todas las funciones del codigo simplemente metiendolas todas en un archivo y luego añadiendolo al programa mediante un "Include" como si fuera una libreria para trabajar con los Bits de los registros. Esto reduce la longitud del programa facilitando su manejo.
« Última modificación: 22 de Marzo de 2013, 10:06:41 por dogflu66 »
Saludos desde Granada, España.

Desconectado gatruca

  • PIC10
  • *
  • Mensajes: 7
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #755 en: 23 de Marzo de 2013, 00:00:02 »
'codigo para leer el protocolo wiegand en 4mhz con la imprescindible ayuda de dogflu66
'autor: yo
'vresion:22/3/2013 23:38 hs
'...
' solo para simular, pero con algunas correcciones se puede grabar en el pic y esta probado, funciona!
' el codigo no tiene waitms ni otro tipo de esperas para la simulacion

Define CLOCK_FREQUENCY = 4
AllDigital
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTA
Define LCD_RSBIT = 2
Define LCD_RWREG = PORTA
Define LCD_RWBIT = 1
Define LCD_EREG = PORTA
Define LCD_EBIT = 0
Define LCD_COMMANDUS = 1000
Define LCD_DATAUS = 50
Define LCD_INITMS = 39
TRISB = %00000000
TRISB.0 = 1
TRISB.1 = 1
Dim lectura_rfid As Long
Dim existe_eeprom As Bit
Dim x As Byte
'..............'estos valores son solo para simular.............................
x = 25  'la variable una vez grabado el pic debe estar a '0'
write 0, 1 ' el banco 0 indica que hay un registro en la memoria
Write 253, 93  'escribe en la eeprom los valores de la variable
Write 254, 85  'long de lectura, (solo los bytes que nos interesan
Write 255, 245  'de la trama wiegand)
lectura_rfid = %11111010101010101010111011  'valor que simula la lectura de la trama
'.......................................................................
Lcdinit
main:
Gosub lee_tag
If x = 25 Then  'si completo la lectura de la trama de bits
lectura_rfid = ShiftRight(lectura_rfid, 1)  'agrega un bit a la variable para eliminar el primer bit del protocolo
lectura_rfid.4B = 0  'pone el byte mas significativo a 0
existe_eeprom = busca_eeprom(lectura_rfid)  'busca si en la eeprom existe este registro leido.
Gosub printlcd  'imprime en la pantalla el resultado de la busqueda
x = 0  'se resetea la variable que pone al programa en espera de una nueva lectura de datos
Endif
Goto main
End                                               

lee_tag:  'rutina que ingresa los datos por el puerto b en protocolo wiegand
If PORTB.0 = 1 Then  'solo para simular, el real valor de este condicional es "if portb.0 = 0 then
While PORTB.0 = 1  'espera forzada para que la lectura no produzca fallos de interpretacion
Wend
lectura_rfid = _bittrue(lectura_rfid, x)  'va a la funcion que pone el bit "x" a 1
x = x + 1  'aumenta el contador x
Endif
If PORTB.1 = 1 Then  'solo para simular, el real valor de este condicional es "if portb.1 = 0 then
While PORTB.1 = 1  'espera forzada para que la lectura no produzca fallos de interpretacion
Wend
lectura_rfid = _bitfalse(lectura_rfid, x)  'va a la funcion que pone el bit "x" a 0
x = x + 1  'aumenta el contador x
Endif
Return                                           

printlcd: ' sin comentarios...................................................................
Lcdcmdout LcdLine1Home
Lcdout "Id: ", #lectura_rfid
If existe_eeprom = 1 Then
   Lcdcmdout LcdLine2Home
   Lcdout "ACTIVADO    "
Else
   Lcdcmdout LcdLine2Home
   Lcdout "DESACTIVADO    "
Endif
Return                                           

'funcion de busqueda en la eeprom. los saltos de a 3 bytes permiten guardar la trama de 24 bits obtenida en la lectura
'del protocolo. el primer banco de memoria se deja libre para utilizarlo como indice y poder agregar registros en la
'direccion adecuada a medida que aumenta el numero de tags que leera el sistema.

Function busca_eeprom(valor_r As Long) As Bit  'la funcion carga en un bit, true o false segun encuentre o no el tag leido

Dim x As Byte,  'variable de la funcion que indexa la direccion de busqueda
Dim busca As Long  'alojara el resultado byte a byte de lo almacenado en la eeprom

x = 1  'se asigna este valor para saltear el banco de memoria '0'

busca.4B = 0  'se pone a '0' el byte mas significativo de la variable

While x < 254  'si x supera este numero, sale del bucle, esto puede producirse por dos motivos: 1 encontro un registro
'......................que coincide el tag leido, o 2 llego al fin de la eprom sin encontrar ninguno coincidente

Read x, busca.LB  'aloja en un byte de la variable el byte que lee de la eeprom
x = x + 1  '.........aumenta el contador para cambiar la direccion de memoria
Read x, busca.HB  'aloja en un byte de la variable el byte que lee de la eeprom
x = x + 1  '.........aumenta el contador para cambiar la direccion de memoria
Read x, busca.3B  'aloja en un byte de la variable el byte que lee de la eeprom

If valor_r = busca Then  'si encuentra el registro arroja 1
busca_eeprom = 1 ' pone a true la variable
x = 252  'pone la variable a 252, para que a continuacion, cuando se ejecute x = x + 3 supere el tope de 254 y salga del bucle
Else  'si no encuentra, arroja 0
busca_eeprom = 0 ' pone a false la variable
Endif
x = x + 3  'aumenta el contador de la variable que lee la direccion de la memoria de tres en tres, (bytes)
Wend

End Function
                                     
'funcion, exelentemente explicada por dogflu66, (nada que agregar)
Function _bittrue(_reg As Long, _bit As Byte) As Long
   Dim _byte As Long
   _byte = 1
   _byte = ShiftLeft(_byte, _bit)
   _reg = _reg Or _byte
   _bittrue = _reg
End Function
                                     
'funcion, exelentemente explicada por dogflu66, (nada que agregar)
Function _bitfalse(_reg As Long, _bit As Byte) As Long
   Dim _byte As Long
   _byte = 1
      _byte = ShiftLeft(_byte, _bit)
   _byte = _byte Nand 0xffff
   _reg = _reg And _byte
   _bitfalse = _reg
End Function                                     




bueh, solo me falta hacer la rutina que graba en la eeprom los tags que van a estar registrados, cuando la termine, la publicare completa y quiza con alguna mejora.

Gracias dogflu66 el codigo, y sobre todo la velocidadde procesamiento aumento infinitamente con tus aportes y consejos! gracias por todo! sobre todo, por el tiempo que has dedicado a explicar las funciones, el manejo de bits con tanta claridad.

la ultima duda que me queda, (si esto ya no es un abuso), es saber si una funcion puede arrojar dos o mas variables como resultado.

Por ejemplo si pudiera saber, (cuando encuentra un registro en la eeprom),  en que posicion de la memoria lo encontro, esto permitiria que un tag especifico tenga acceso a gestionar la base de datos del sistema, altas, bajas etc..... ya seria un lujo.....
Se me ocurrio hacer una variable word en lugar de bit y utilizar un byte para saber si encontro o no, y el otro byte para saber en que banco lo encontro....(hasta ahi llega mi conocimiento).

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #756 en: 23 de Marzo de 2013, 16:03:49 »
Cierto de esa forma se puede hacer, pero utilizando un Pic18 hay otras opciones más intuitivas para el programador. Estas opciones requieren mayores recursos de pila del pic, por lo que la familia 18 con su pila ampliada la permite perfectamente. Básicamente se traba de funciones que llaman a otra función que es la principal, la función auxiliar entra dentro de la principal y activa un mecanismo de selección del dato a extraer, la ventaja de todo esto es que al dato extraído se le puede llamar con el nombre de una función que se asemeja a lo que se desea.

Lo mejor es un ejemplo para entenderlo:

Esta función nos devuelve el cuadrado de un numero pero además queremos saber cuantas veces hemos llamado a la función. Esto se podría intentar realizar como indicas, pero no sabemos si el cuadrado del número será muy grande, esdecir, no sabemos cuantos bytes ocupa, así que no podriamos ubicar el número de veces que se ejecutó la función en el registro de salida.



Código: [Seleccionar]
'Para simulación
Hseropen 4600
Call _intcuadrado()  'Inicializa la función cuadrado de un número

main:
Dim numero As Long
Dim contador As Long
Dim x As Byte

For x = 0 To 50
numero = _cuadrado(x)  'Calcula el cuadrado de x
contador = _nvcuadrado()  'Retorna el número de veces que se ejecutó la función cuadrado
Hserout #x, "*", #x, "=", #numero, " Veces ejecutó la función =", #contador, CrLf
Next x

Halt
Goto main
End                                              
'Inicializa la función cuadrado de un número
'Esta función no retorna valor
Proc _intcuadrado()
Call _pcuadrado(0, 1)
End Proc                                          
'Retorna el numero de veces que se ejecutó la función cuadrado
'Retorna un numero tipo Long
Function _nvcuadrado() As Long
_nvcuadrado = _pcuadrado(0, 2)
End Function                                      
'Calcula el cuadrado de un número dado
'Se le suministra un número
'Retorna un numero tipo Long
Function _cuadrado(_numero As Long) As Long
_cuadrado = _pcuadrado(_numero, 0)
End Function                                      
'Función principal cuadrado
'Se le suministran dos numero:
'_numero = a calcular el cuadrado
'_ctrl = para el control de la función
'Retorna un número tipo Long
Function _pcuadrado(_numero As Long, _ctrl As Byte) As Long
Dim _contador As Long

If _ctrl = 1 Then
_contador = 0
Exit
Endif

If _ctrl = 2 Then
_pcuadrado = _contador
Exit
Endif
_numero = _numero * _numero
_pcuadrado = _numero
_contador = _contador + 1
End Function  

PD: El ejemplo creo que es más ilustrativo que interesante.
« Última modificación: 23 de Marzo de 2013, 16:12:12 por dogflu66 »
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #757 en: 27 de Marzo de 2013, 17:37:26 »
Código: [Seleccionar]
OPTION_REG.T0CS = 0  'selecciona reloj interno
OPTION_REG.PSA = 0  'asigna el prescales al timer0
OPTION_REG.PS0 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS1 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS2 = 0  'bits de la seleccion del factor de division,prescaler 16
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales
INTCON.TMR0IF = 0  'borra el flag de desbordamiento del timer0
TMR0 = 130  'cargo el registro del tmr0 para que desborde cada 1mS


Hola denuevo Dogflu66, una vez mas estoy aquí para realizarte una nueva consulta el cual es relacionado al timer0,
primero que todo, como calculas el tiempo en que se ejecutara el tmr0, es decir si en el codigo anterior que he anexado tu colocas que funcione cada 1ms, es posible que pueda yo hacer que este funcione cada 60 segundos, existe una formula para hacer  este calculo.

La segunda y ultima consulta, como llegaste al valor de 130 para tmr0. Eso me tiene confundido :P... Bueno sin mas animos de molestarte me despido..
Saludos a todos.


Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #758 en: 28 de Marzo de 2013, 16:59:57 »
Sale de aquí:

Tseg = 1mSeg = 0.001Seg.
Fosc = 8000000hz
Vreg. = 256 – ((Tseg / (1 / (Fosc / 4))) / prescaler )
Vreg. = 256 – ((0.001 / (1 / 2000000)) / 16)
Vreg. = 256 – (2000 / 16)
Vreg. = 131

Formula para los Timer:

Para los de 8Bits:
Vreg. = 256 – ((Tseg / (1 / (Fosc / 4))) / prescaler )

Para los de 16Bits:
Vreg. = 65536 – ((Tseg / (1 / (Fosc / 4))) / prescaler)

Aplicando el máximo preescaler (256) y la frecuencia del reloj a 4Mhz, me sale que no se puede conseguir los 60Seg., es un tiempo demasiado grande.
« Última modificación: 30 de Mayo de 2013, 20:50:14 por dogflu66 »
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #759 en: 28 de Mayo de 2013, 12:33:29 »
Saludos dogflu66,

tengo una duda y espero que puedas extenderme una mano si no es mucha la molestia, es posible indicar un valor de variable que tenga signo negativo por ejemplo:
Dim mb as long, pero el valor de esta es negativa..

la razon de esta consulta es que debo de hacer funcionar un sensor bmp085 que es de presión y temperatura, sin embargo hay variables que este sensor deben de ser consultadas antes de hacerla partir, debido a que vienen calibradas desde fabrica, pero como no se como nombrar las variables con valor negativo "pues me tiene confundido"  :shock: , necesito de tu consejo de como hacerlo si no es mucha la molestia.


saludos....

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #760 en: 30 de Mayo de 2013, 20:54:42 »
No tiene signo este lenguaje, no se me ha planteado trabajar con signo, tengo que pensarlo...

Normalmente los números negativos se guardan como complemento a dos y el bit más significativo es igual a 1, bit de signo.
Para simplifica solo he considerado que las variables con signo negativo llevan este en el bit más significativo del registro, si es 1 la variable es negativa y por lógica de perogrullo si no lo lleva es positiva. Como se deduce las variables con signo tienen que contener números de menor longitud al quedar reservado el bit de signo. Hay que realizar unas funciones matemáticas para poder trabajar con signo, si es que se necesita realizar cálculos con signo. En el caso que no hagan falta y solo se requiere representarlo, sería mucho más sencillo realizar una función que controle el signo de los registros requeridos, esto último si que es más habitual.

Lectura de temperatura negativa y positiva con LM35:
http://www.pickey.es/uso-practico-del-pic12f675--v-.html

Nota: Actualmente si se puede trabajar con números negativos.
« Última modificación: 24 de Febrero de 2025, 12:49:16 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #761 en: 10 de Junio de 2013, 20:05:38 »
Siguiendo con el signo, he escrito unas funciones para trabajar con números enteros con signo de 8bit y 16bit. Las dejo para el que quiera jugar con ellas.

Código: [Seleccionar]
'***************************************************************
'Funciones para trabajar con números con signo tipo Byte y Word.
'By dogflu66
'***************************************************************
Hseropen 4800
Dim sig_word As Word
Dim sig_word1 As Word
Dim sig_byte As Byte
Dim sig_aux As Word
'--------------------------
sig_word = _sigset16("-", 1)
sig_word1 = _sigset16("+", 0)
sig_byte = _sigset8("-", 50)

main:

Call _sigsprint16(sig_word)
Call _sprintcrlf()
Call _sigsprint16(sig_word1)
Call _sprintcrlf()

Call _sprintcrlf()
Hserout "Suma: "
sig_aux = _sigadd16(sig_word, sig_word1)
Call _sigsprint16(sig_aux)
Call _sprintcrlf()

Call _sprintcrlf()
Hserout "Resta: "
sig_aux = _sigsub16(sig_word, sig_word1)
Call _sigsprint16(sig_aux)
Call _sprintcrlf()

Call _sprintcrlf()
Hserout "División: "
sig_aux = _sigdiv16(sig_word, sig_word1)
Call _sigsprint16(sig_aux)
Call _sprintcrlf()

Call _sprintcrlf()
Hserout "Multiplicación: "
sig_aux = _sigmul16(sig_word, sig_word1)
Call _sigsprint16(sig_aux)
Call _sprintcrlf()

Call _sprintcrlf()
Hserout "Comparación: "
sig_aux = _sigcmp16(sig_word, sig_word1)
Call _sigsprint16(sig_word)
If sig_aux = 0 Then Hserout " < "
If sig_aux = 1 Then Hserout " > "
If sig_aux = 2 Then Hserout " = "
Call _sigsprint16(sig_word1)
Call _sprintcrlf()

End                                              
'División con signo 16Bit, entera.
Function _sigdiv16(_op2 As Word, _op1 As Word) As Word
Dim _sigop1 As Bit
Dim _sigop2 As Bit
Dim _sigaux As Word

_sigop1 = _sigget16(_op1)
_sigop2 = _sigget16(_op2)
_op2 = _sigmod16(_op2)
_op1 = _sigmod16(_op1)

If _op1 > 0 Then
_sigaux = _op2 / _op1

If _sigop2 = 1 And _sigop1 = 0 Then
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif

If _sigop2 = 0 And _sigop1 = 1 Then
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif
Endif
If _op1 = 0 Then _sigaux = 32768  'E = -0
_sigdiv16 = _sigaux
End Function                                      
'Multiplicación con signo 16Bit, entera.
Function _sigmul16(_op2 As Word, _op1 As Word) As Word
Dim _sigop1 As Bit
Dim _sigop2 As Bit
Dim _sigaux As Word

_sigop1 = _sigget16(_op1)
_sigop2 = _sigget16(_op2)
_op2 = _sigmod16(_op2)
_op1 = _sigmod16(_op1)

_sigaux = _op2 * _op1

If _sigop2 = 1 And _sigop1 = 0 Then
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif

If _sigop2 = 0 And _sigop1 = 1 Then
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif

_sigmul16 = _sigaux

End Function                                      
'Resta con signo 16Bit,entera.
Function _sigsub16(_op2 As Word, _op1 As Word) As Word
Dim _sigop1 As Bit
_op1 = _sigcpl16(_op1)
_sigsub16 = _sigadd16(_op2, _op1)
End Function                                      
'Suma con signo 16Bit, entera.
Function _sigadd16(_op2 As Word, _op1 As Word) As Word
Dim _sigop1 As Bit
Dim _sigop2 As Bit
Dim _sigaux As Word

_sigop1 = _sigget16(_op1)
_sigop2 = _sigget16(_op2)
_op2 = _sigmod16(_op2)
_op1 = _sigmod16(_op1)

If _sigop2 = 0 And _sigop1 = 0 Then _sigaux = _op1 + _op2

If _sigop2 = 1 And _sigop1 = 0 Then
If _op2 > _op1 Then
_sigaux = _op2 - _op1
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif
If _op2 < _op1 Then _sigaux = _op1 - _op2
If _op2 = _op1 Then _sigaux = 0
Endif

If _sigop2 = 0 And _sigop1 = 1 Then
If _op2 > _op1 Then
_sigaux = _op2 - _op1
Endif
If _op2 < _op1 Then
_sigaux = _op1 - _op2
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif
If _op2 = _op1 Then _sigaux = 0
Endif

If _sigop2 = 1 And _sigop1 = 1 Then
_sigaux = _op2 + _op1
_sigaux = _sigcpl16(_sigaux)
Endif

_sigadd16 = _sigaux
End Function                                      
'Compara dos números con signo de 16bit
'0 = op2 < op1
'1 = op2 > op1
'2 = op2 = op1
Function _sigcmp16(_op2 As Word, _op1 As Word) As Byte

Dim _sigop2 As Bit
Dim _sigop1 As Bit

_sigop2 = _sigget16(_op2)
_sigop1 = _sigget16(_op1)
_op1 = _sigmod16(_op1)
_op2 = _sigmod16(_op2)

If _sigop2 = 0 And _sigop1 = 0 Then
If _op2 < _op1 Then _sigcmp16 = 0
If _op2 > _op1 Then _sigcmp16 = 1
If _op2 = _op1 Then _sigcmp16 = 2
Endif

If _sigop2 = 0 And _sigop1 = 1 Then
_sigcmp16 = 1
Endif

If _sigop2 = 1 And _sigop1 = 0 Then
_sigcmp16 = 0
Endif

If _sigop2 = 1 And _sigop1 = 1 Then
If _op2 > _op1 Then _sigcmp16 = 0
If _op2 < _op1 Then _sigcmp16 = 1
If _op2 = _op1 Then _sigcmp16 = 2
Endif

End Function                                      
'Devuelve el signo variables 16bit, 1 = -, 0 = +
Function _sigget16(_op As Word) As Bit
_sigget16 = _op.15
End Function                                      
'Devuelve el signo variables 8bit, 1 = -, 0 = +
Function _sigget8(_op As Byte) As Bit
_sigget8 = _op.7
End Function                                      
'Invierte el signo de una variable 16Bit
Function _sigcpl16(_op As Word) As Word
Toggle _op.15
_sigcpl16 = _op
End Function                                      
'Invierte el signo de una variable 8Bit
Function _sigcpl8(_op As Byte) As Byte
Toggle _op.7
_sigcpl8 = _op
End Function                                      
'Devuelve el modulo de una variable con signo 16Bit
Function _sigmod16(_op As Word) As Word
_op.15 = 0
_sigmod16 = _op
End Function                                      
'Devuelve el modulo de una variable con signo 8Bit
Function _sigmod8(_op As Byte) As Byte
_op.7 = 0
_sigmod8 = _op
End Function                                      
'Asigna signo a las variables 16Bit
Function _sigset16(sig As Byte, _op As Word) As Word
If _op = 0 Then sig = "+"
If sig = "+" Then _sigset16 = _op
If sig = "-" Then
_op.15 = 1
_sigset16 = _op
Endif
End Function                                      
'Asigna signo a las variables 8Bit
Function _sigset8(sig As Byte, _op As Byte) As Byte
If _op = 0 Then sig = "+"
If sig = "+" Then _sigset8 = _op
If sig = "-" Then
_op.7 = 1
_sigset8 = _op
Endif
End Function                                      
'Extender signo tipo 8bit a tipo 16bit
Function _sigextw16(op As Byte) As Word
Dim sig_op As Bit
sig_op = op.7
op.7 = 0
_sigextw16 = op
_sigextw16.15 = sig_op
End Function                                      
'Funciones de salida de datos por el puerto serie UART.
'--------------------------------------------------
'Envia al puerto serie una variable con signo 16Bit
Proc _sigsprint16(_op As Word)
Dim _sigop As Bit
_sigop = _op.15
_op.15 = 0
If _sigop = 1 And _op = 0 Then
Hserout "E"
Exit
Endif
If _sigop = 1 Then Hserout "-"
Hserout #_op
End Proc                                          
'Envia al puerto serie una variable con signo 8Bit
Proc _sigsprint8(op As Byte)
If op.7 = 1 Then Hserout "-"
op.7 = 0
Hserout #op
End Proc                                          
'Linea nueva al puerto serie
Proc _sprintcrlf()
Hserout CrLf
End Proc

Salida de datos del ejemplo:


PD: Con un poco más de tiempo iré ampliando los comentarios del código.
« Última modificación: 03 de Mayo de 2014, 14:13:44 por dogflu66 »
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #762 en: 20 de Junio de 2013, 00:54:16 »
Saludos dogflu66, un crack por tus respuestas. Mira recurro tu sabiduria, otra vezzz, pero con mi programación, que incluyo mas adelante, a ver si me puedes aconsejar para poder optimizarlo y bueno obtener el resultado esperado. Vamos al grano, estoy configurando un dht22 para leer humedad y temperatura, actualmente en la red no existe nada  de programaciones ejemplos o de apoyo excepto en c o arduino, los cuales entiendo poco. entonces aqui esta la novedad yo intente hacer algo, pero adivina me arroja inconsistencias, entonces aqui es donde pido tu sabia experiencia y apoyo para este pequeño. Te adjunto una imagen de cuales son los valores que me arroja en el display, ademas del datasheet o el enlace donde se encuentra y lo mas importante la programacion.


Código: [Seleccionar]
Define CLOCK_FREQUENCY = 20
'configuracion de display

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 2
Define LCD_RWREG = PORTB
Define LCD_RWBIT = 3
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Lcdinit

'configuracion de entradas
AllDigital  'todas las entradas como digital
TRISA = %00000000  'entrasdas puerto a como salidas
TRISB = %00000000  'entradas puerto b como salidas

Symbol dht_11 = PORTA.1  'puerto a0 se conportara bidireccionalmente, es decir enviara pulso para pedir datos y recibir informacion

Dim colector(31) As Byte
Dim humedad As Byte
Dim humedad1 As Byte
Dim temperatura As Byte
Dim temperatura1 As Byte
Dim temp As Byte
Dim temp1 As Byte
Dim hume As Byte
Dim hume1 As Byte
inicio:

'leer DHT11
Config dht_11 = Output
High dht_11  'enviamos un 1 al sensor
WaitUs 1  '10
Low dht_11  'enviamos un 0 para indicarle al sensor
WaitMs 18
High dht_11  'enviamos un 1 para completar la peticon de comunicacion
WaitUs 30  '30
Config dht_11 = Input
WaitUs 180
Dim i As Byte
For i = 31 To 0 Step -1
'dht_11 = colector(1)
'WaitUs 2.5
'Next i
Define COUNT_MODE = 2
Count dht_11, 1, colector(i)
WaitUs 3
Next i
'transofrmacion humedad parte entera
If colector(31) > 3 Then
humedad.7 = 1
Else
humedad.7 = 0
Endif
If colector(30) > 3 Then
humedad.6 = 1
Else
humedad.6 = 0
Endif
If colector(29) > 3 Then
humedad.5 = 1
Else
humedad.5 = 0
Endif
If colector(28) > 3 Then
humedad.4 = 1
Else
humedad.4 = 0
Endif
If colector(27) > 3 Then
humedad.3 = 1
Else
humedad.3 = 0
Endif
If colector(26) > 3 Then
humedad.2 = 1
Else
humedad.2 = 0
Endif
If colector(25) > 3 Then
humedad.1 = 1
Else
humedad.1 = 0
Endif
If colector(24) > 3 Then
humedad.0 = 1
Else
humedad.0 = 0
Endif

'transformacion humedad parte decimal
If colector(23) > 3 Then
humedad1.7 = 1
Else
humedad1.7 = 0
Endif
If colector(22) > 3 Then
humedad1.6 = 1
Else
humedad1.6 = 0
Endif
If colector(21) > 3 Then
humedad1.5 = 1
Else
humedad1.5 = 0
Endif
If colector(20) > 3 Then
humedad1.4 = 1
Else
humedad1.4 = 0
Endif
If colector(19) > 3 Then
humedad1.3 = 1
Else
humedad1.3 = 0
Endif
If colector(18) > 3 Then
humedad1.2 = 1
Else
humedad1.2 = 0
Endif
If colector(17) > 3 Then
humedad1.1 = 1
Else
humedad1.1 = 0
Endif
If colector(16) > 3 Then
humedad1.0 = 1
Else
humedad1.0 = 0
Endif

'transformacion temperatura parte entera
If colector(15) > 3 Then
temperatura.7 = 1
Else
temperatura.7 = 0
Endif
If colector(14) > 3 Then
temperatura.6 = 1
Else
temperatura.6 = 0
Endif
If colector(13) > 3 Then
temperatura.5 = 1
Else
temperatura.5 = 0
Endif
If colector(12) > 3 Then
temperatura.4 = 1
Else
temperatura.4 = 0
Endif
If colector(11) > 3 Then
temperatura.3 = 1
Else
temperatura.3 = 0
Endif
If colector(10) > 3 Then
temperatura.2 = 1
Else
temperatura.2 = 0
Endif
If colector(9) > 3 Then
temperatura.1 = 1
Else
temperatura.1 = 0
Endif
If colector(8) > 3 Then
temperatura.0 = 1
Else
temperatura.0 = 0
Endif

'temperatura parte decimal
If colector(7) > 3 Then
temperatura1.7 = 1
Else
temperatura1.7 = 0
Endif
If colector(6) > 3 Then
temperatura1.6 = 1
Else
temperatura1.6 = 0
Endif
If colector(5) > 3 Then
temperatura1.5 = 1
Else
temperatura1.5 = 0
Endif
If colector(4) > 3 Then
temperatura1.4 = 1
Else
temperatura1.4 = 0
Endif
If colector(3) > 3 Then
temperatura1.3 = 1
Else
temperatura1.3 = 0
Endif
If colector(2) > 3 Then
temperatura1.2 = 1
Else
temperatura1.2 = 0
Endif
If colector(1) > 3 Then
temperatura1.1 = 1
Else
temperatura1.1 = 0
Endif
If colector(0) > 3 Then
temperatura1.0 = 1
Else
temperatura1.0 = 0
Endif

Gosub calculo

Gosub lcd

Goto inicio
End                                               

calculo:

temp = temperatura + temperatura1
temp1 = temp / 10

hume = humedad + humedad1
hume1 = hume / 10

Return                                           
lcd:
Lcdcmdout LcdClear
Lcdout "hum:", #hume, "/", #humedad, "/", #humedad1
Lcdcmdout LcdLine2Home
Lcdout "temp:", #temp, "/", #temperatura, "/", #temperatura1
WaitMs 5000
Return

Datasheet dht22


Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #763 en: 20 de Junio de 2013, 19:57:56 »
No he utilizado el componente, mirare el código a ver si veo algo raro.
--------------------------------------
¿Que micro es el que estas utilizando?.
« Última modificación: 20 de Junio de 2013, 20:27:41 por dogflu66 »
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #764 en: 20 de Junio de 2013, 22:24:52 »

Gracias por revisar estimado, Utilizo el pic 18f4550 y para programarlo uso el pic18simulator ide.