Autor Tema: PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)  (Leído 859234 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 #765 en: 23 de Junio de 2013, 21:35:57 »
Dejo el siguiente código que no he podido probar pero creo que va mejor encaminado.
Lo ideal para este menester es emplear un timer pero por el momento no dispongo de tiempo, más adelante, con más tiempo realizaré una función para el sensor.

Código: [Seleccionar]
Define CLOCK_FREQUENCY = 20
'Define SIMULATION_WAITMS_VALUE = 1
'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 puertos
AllDigital  'Los pin I/O como digitales
TRISA = %00000000  'Puerto A como salidas
TRISB = %00000000  'Puerto B como salidas

Dim rh As Word  'Humedad relativa
Dim tmp As Word  'Temperatura
Dim _bit As Bit  'Auxiliar
Dim n As Byte  'Auxiliar
Dim x As Byte  'Auxiliar

main:
'Puesta a cero
rh = 0
tmp = 0

'Demanda de lectura al sensor
RA0 = 0
WaitUs 2000

'MCU se prepara para recibir datos
TRISA.0 = 1  'Bus como Read
WaitUs 5  'Estabilización
While RA0 = 1  'Esperando respuesta
Wend
While RA0 = 0  'Esperando respuesta
Wend
While RA0 = 1  'Esperando respuesta
Wend

'Read data transmission RH
For n = 0 To 15
x = 0
While RA0 = 0
Wend
While RA0 = 1
WaitUs 1
x = x + 1
Wend
If x < 40 Then rh.0 = 0
If x > 40 Then rh.0 = 1
If n < 15 Then rh = ShiftLeft(rh, 1)
Next n

'Read data transmission TMP
For n = 0 To 15
x = 0
While RA0 = 0
Wend
While RA0 = 1
WaitUs 1
x = x + 1
Wend
If x < 40 Then tmp.0 = 0
If x > 40 Then tmp.0 = 1
If n < 15 Then tmp = ShiftLeft(tmp, 1)
Next n

fin:  'Bucle infinito
Goto fin
Goto main
End


Correción:
   Donde decia If n < 15 Then rh = ShiftRight(rh, 1) ahora dice If n < 15 Then rh = ShiftLeft(rh, 1)

   Donde decia If n < 15 Then tmp = ShiftRight(tmp, 1) ahora dice If n < 15 Then tmp = ShiftLeft(tmp, 1)

« Última modificación: 24 de Junio de 2013, 21:32:34 por dogflu66 »
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #766 en: 23 de Junio de 2013, 21:48:50 »
Graias dogflu... Probare y comentare que tal...

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #767 en: 26 de Junio de 2013, 12:47:49 »
Lleve a cabo la prueba con la programación que has facilitado efectuando la correccion, a excepción de agregar unas lineas de código que me permitieran observar cual es el resultado que otorga el dht22.

los resultados fueron los siguientes, al iniciarlo se observa que la respuesta del sensor tiene un retardo significando, después de transcurrido unos minutos que pueden ser variables desde 3, 5 o hasta 10 min. muestra los resultados.
Mi observación a que este fenómeno suceda es debido a la utilización del ciclo while, pero es solamente una suposición, pues no puedo darme una explicación basado en conocimientos sólidos de programación.
Seguiré haciendo pruebas a ver si se puede mejorar o encontrar una manera de que demore menos...

Saludos y nuevamente te agradezco tu ayuda dogflu..
« Última modificación: 26 de Junio de 2013, 15:29:39 por Evonkc »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #768 en: 26 de Junio de 2013, 17:25:58 »
Al no tener el sensor solo puedo especular con la rutina. De todas formas imagino que probaste con las ultimas correcciones que hice.

Dejo otra versión que tiene tiempo maximo en los Whiles.

Código: [Seleccionar]
Define CLOCK_FREQUENCY = 20
Define SIMULATION_WAITMS_VALUE = 1
'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 puertos
AllDigital  'Los pin I/O como digitales
TRISA = %00000000  'Puerto A como salidas
TRISB = %00000000  'Puerto B como salidas

Dim rh As Word  'Humedad relativa
Dim tmp As Word  'Temperatura
Dim n As Byte  'Auxiliar
Dim x As Byte  'Auxiliar

main:
'Puesta a cero
rh = 0
tmp = 0

'Demanda de lectura al sensor
RA0 = 0
WaitUs 2000

'MCU se prepara para recibir datos
TRISA.0 = 1  'Bus como Read
WaitUs 5  'Estabilización
x = 0
While RA0 = 1 And x < 200  'Esperando respuesta
WaitUs 1
x = x + 1
Wend
x = 0
While RA0 = 0 And x < 200  'Esperando respuesta
WaitUs 1
x = x + 1
Wend
x = 0
While RA0 = 1 And x < 200  'Esperando respuesta
WaitUs 1
x = x + 1
Wend

'Read data transmission RH
For n = 0 To 15
x = 0
While RA0 = 0 And x < 200
WaitUs 1
x = x + 1
Wend
x = 0
While RA0 = 1 And x < 200
WaitUs 1
x = x + 1
Wend
If x < 40 Then rh.0 = 0
If x > 40 Then rh.0 = 1
If n < 15 Then rh = ShiftLeft(rh, 1)
Next n

'Read data transmission TMP
For n = 0 To 15
x = 0
While RA0 = 0 And x < 200
WaitUs 1
x = x + 1
Wend
x = 0
While RA0 = 1 And x < 200
WaitUs 1
x = x + 1
Wend
If x < 40 Then tmp.0 = 0
If x > 40 Then tmp.0 = 1
If n < 15 Then tmp = ShiftLeft(tmp, 1)
Next n

fin:  'Bucle infinito
Goto fin
Goto main
End
« Última modificación: 26 de Junio de 2013, 17:40:32 por dogflu66 »
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #769 en: 26 de Junio de 2013, 19:51:33 »
Saludos Dogflu,

Bueno exactamente como tu dices si hice las correcciones pertinentes y nuevamente te agradezco tu ayuda   :-/..

Con respecto a la nueva recomendación probare y comentare nuevamente que es lo que sucede.



Saludos.. 

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #770 en: 15 de Julio de 2013, 09:00:04 »
Dejo las funciones necesarias para la lectura del sensor de humedad relativa y temperatura RHT03 o DHT22 usando el Timer1:

Código: [Seleccionar]
'**********************************************************************************
'Función de lectura de humedad relativa y temperatura para el sensor RHT03 0 DHT22 con TMR1
'Placa PicEBasic, By dogflu66, 07/2013
'Basic Pic Simulator IDE (PSI), v6.92, 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
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 inicialización del Display
'Configuración Placa Pic 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  'Como salida(RB5,Tx RS232)
TRISB.2 = 1  'Como entrada (RB2, Rx RS232)
TRISB.4 = 1  'Como entrada (RHT03 inicio)
PORTB.3 = 1  'Luz lcd a ON (RB3)
PORTA.7 = 1  'Led amarillo a OFF
PORTB.0 = 1  'Led verde a OFF
PORTB.1 = 0  'LED RHT03 a OFF
'-----------------------------------------
Hseropen 4800  'Inicializa puerto RS232 por hardware a 4800Baudios
Lcdinit  'Inicializa el LCD sin cursor
'Constantes y variables ------------------
Dim hr As Word  'Humedad relativa
Dim tmp As Word  'Temperatura
Dim chk As Byte  'Checksum suministrado por el sensor
'-----------------------------------------
WaitMs 100  'Pausa de 100 mSeg.
Lcdout "Test P. RHT03"  'Imprime el texto en el LCD
Call _rht03ini(8)  'Se comunica a la función del RHT03 la velocidad del reloj en Mhz
WaitMs 2000  'Pausa de 2 Seg.
main:
'Muestra lecturas
Call _rht03read()  'Lee sensor, 500mSeg. minimo entre lectura y lectura
hr = _ped1(_rht03read.HW)  'Asigna humedad relativa, parte entera hr.HB y decimal hr.LB
tmp = _ped1(_rht03read.LW)  'Asigna temperatura, parte entera tmp.HB y decimal tmp.LB
chk = _rht03chk()  'Asigna lectura valida o erronea
Lcdcmdout LcdLine1Home  'Cursor del lcd al principio linea 1
Lcdout "HR:", #hr.HB, ".", #hr.LB, " T:", #tmp.HB, ".", #tmp.LB, "C "  'Salida de datos
Lcdcmdout LcdLine2Home  'Cursor del Lcd al principio linea 2
Lcdout "Checksum: "  'Salida de datos
If chk = 0 Then Lcdout "OK.    "
If chk = 1 Then Lcdout "ERROR. "
WaitMs 500  'Deja que el sensor se prepare para la siguiente lectura, tiempo recomendado 2Seg.
Call _flashled(50)  'Parpadeo led en mSeg.
Goto main
End                                              
Include "Trabajando con bit.bas"
'-------------------------------------------------
'Cambia de formato una variable Word, retorna valor
'Cambia de formato un Word que contiene un decimal
'integrado en la parte entera (151 = 15.1 * 10)
'variable = _ped1(151) o call _ped1(151)
'para _numero = 151, _ped1.HB = 15 y _ped1.LB = 1
Function _ped1(_numero As Word) As Word
_ped1.HB = _numero / 10  'Extrae parte entera
_ped1.LB = _numero - (_ped1.HB * 10)  'Extra parte decimal
End Function                                      
'Inicaliza la función de lectura del RHT03, no retorna valor
'Argumento de entrada _clk = a Mhz del reloj del sistema
'Call _rht03ini(8)  'se trabaja a 8 Mhz
Proc _rht03ini(_clk As Byte)
Call _rht03(0, _clk)
End Proc                                          
'Devuelve el checksum de la ultima lectura, retorna valor
'para _rht03chk = 0 lectura correcta, = 1 fallo en lectura
'checksum = _rht03chk() o Call _rht03chk()
Function _rht03chk() As Byte
_rht03chk = _rht03(1, 0)
End Function                                      
'Pide una lectura de temperatura a la función principal, retorna valor
'_rht03read.HW = tiene la lectura de la humedad relativa con un decimal integrado en la parte entera
'_rht03read.LW = tiene la lectura de la temperatura con un decimal integrado en la parte entera
'hr = _rht03read.HW  'Humedad relativa de la última lectura
'tmp = _rht03read.LW  'Temperatura de la última lectura
Function _rht03read() As Long
_rht03read = _rht03(2, 0)
End Function                                      
'Funcion de lectura y control del sensor RHT03, devuelve valor
'_clk = velocidad del oscilador en Mhz
'para _ctrl = 0, devuelve _rht03 = 0, pone checksum en error, se incializa la función
'para _ctrl = 1, devuelve False o True de la última lectura, True = lectura erronea
'para _ctrl resto valores, devuelve en _rht03 la humedad relativa (_rht03.HW) y la temperatura (_rht03.LW)
Function _rht03(_ctrl As Byte, _clk As Byte) As Long
Symbol t1db = PIR1.TMR1IF  'Se renombra el flag de desbordamiento del Timer
Dim rh As Word
Dim tmp As Word
Dim chk As Byte
Dim chk_aux As Byte
Dim clock As Byte
Dim n As Byte
Dim x As Byte
Dim v_aux(40) As Byte
'Inicializa la función
If _ctrl = 0 Then
'Configuración del TIMER1---------------------------------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
T1CON.TMR1ON = 0  'parado el contador del TMR1
PIE1.TMR1IE = 0  'desactiva las interrupciones del timer1
'Inicializa las variables de la función
chk_aux = 1  'Se activa el checkum de la función como error
chk = 0
clock = _clk * 10  'Calcula y asigna el tiempo que dura el ancho de pulso correspondiente al cero
_rht03 = 0  'Variable de salida de la función a cero
Exit  'Fuerza la salida de la función
Endif
'Devuelve el checksum, 0 = OK, 1 = error de lectura ---------------------
If _ctrl = 1 Then
If chk_aux = chk Then _rht03 = 0  'Dato válido
If chk_aux <> chk Then _rht03 = 1  'Dato no válido
Exit  'Fuerza la salida de la función
Endif
'Puesta a cero --'---------------------------------------------------------
rh = 0
tmp = 0
chk_aux = 1  'Se activa error de checksum por defecto
chk = 0
_rht03 = 0
'Espera que el puerto de comunicaciones del sensor quede libre ----------
Call _initmer()  'Puesta a cero del Timer
While RB4 = 0 And t1db = 0  'Espera cambio de estado del puerto o desborde Timer
Wend
If t1db = True Then Exit  'Termina la función si Timer se desbordo
'Solicitud de una lectura al sensor -------------------------------------
TRISB.4 = 0
RB4 = 0
WaitMs 2
'MCU se prepara para recibir datos --------------------------------------
Call _initmer()  'Puesta a cero del Timer
TRISB.4 = 1  'Bus como Read
While RB4 = 1 And t1db = False  'Esperando respuesta o desborde del Timer
Wend
If t1db = True Then Exit  'Termina la función si Timer se desbordo

Call _initmer()  'Puesta a cero del Timer
While RB4 = 0 And t1db = 0  'Esperando respuesta o desborde del Timer
Wend
If t1db = True Then Exit  'Termina la función si Timer se desbordo

Call _initmer()  'Puesta a cero del Timer
While RB4 = 1 And t1db = False  'Esperando respuesta o desborde del Timer
Wend
If t1db = True Then Exit  'Termina la función si Timer se desbordo
'Read data, recepción RH, TMP y Checksum ---------------------------------
n = 0
While n < 40
Call _initmer()  'Puesta a cero del Timer
While RB4 = 0 And t1db = False  'Esperando que termine sincronismo del dato o desborde Timer
Wend
If t1db = True Then Exit  'Termina la función si tmr se desbordo

Call _initmer()  'Puesta a cero del Timer
While RB4 = 1 And t1db = False  'Midiendo el ancho del pulso de la parte del dato significativa
Wend
v_aux(n) = _tmer()  'Va asignando los tiempos medidos a los elementos del vector contenedor
n = n + 1  'Incrementa el indice del vector contenedor
If t1db = True Then Exit  'Termina la función si tmr se desbordo
Wend
'Transfiere los tiempos capturados a datos -------------------------------
'Humedad relativa
n = 0
x = 15
While n < 16
If v_aux(n) < clock Then rh = _bitfalse(rh, x)
If v_aux(n) > clock Then rh = _bittrue(rh, x)
n = n + 1
x = x - 1
Wend
'Temperatura
n = 16
x = 15
While n < 32
If v_aux(n) < clock Then tmp = _bitfalse(tmp, x)
If v_aux(n) > clock Then tmp = _bittrue(tmp, x)
n = n + 1
x = x - 1
Wend
'Checksum del sensor
n = 32
x = 7
While n < 40
If v_aux(n) < clock Then chk = _bitfalse(chk, x)
If v_aux(n) > clock Then chk = _bittrue(chk, x)
n = n + 1
x = x - 1
Wend
'Comprueba que los checksum son iguales y asigna valores a la variable de salida ----
chk_aux = rh.HB + rh.LB + tmp.HB + tmp.LB  'Checksum calculado
If chk_aux = chk Then  'Si los checksum son iguales...
_rht03.HW = rh  'Asigna la humedad realativa al Word superior
_rht03.LW = tmp  'Asigna la temperatura al Word inferior
Endif
End Function                                      
'Flash led en mSeg., no retorna valor
'Call _flashled(50)  'Flash led de 50 mSeg.
Proc _flashled(_timeflash As Byte)
_timeflash = _timeflash / 2
RB1 = 1
WaitMs _timeflash
RB1 = 0
WaitMs _timeflash
End Proc                                          
'Reinicia y pone a contar al TMR1, no retorna valor
'Call _initmer()
Proc _initmer()
TMR1H = 0x00  'Borra el registro alto del timer1
TMR1L = 0x00  'Borra el registro bajo del timer1
PIR1.TMR1IF = 0  'Flash dosborde a cero
T1CON.TMR1ON = 1  'Activa el contador del TMR1
End Proc                                          
'Devuelve la lectura del TMR1, retorna valor
'Retorna en _tmer el contador del Timer
'valor_contador = _tmer() o Call _tmer()
Function _tmer() As Word
T1CON.TMR1ON = 0  'Para el contador del TMR1
_tmer.HB = TMR1H  'Asigna registro de más peso
_tmer.LB = TMR1L  'Asigna registro de menos peso
End Function                                      
'**************************************************************************
« Última modificación: 13 de Junio de 2015, 13:56:09 por dogflu66 »
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #771 en: 15 de Julio de 2013, 15:01:14 »
Saludos,

he estado un poco alejado de esto, de hecho estaba realizando otras pruebas que han llegado a buen puerto con uno que otro detalle.
Retomando el asunto del DHT22 o RH03. me encuentro con la nueva solución que has brindado la cual se agradece enormemente, sin embargo leyendo las rutinas me he fijado en unas cosas y las cuales comprendo poco, estas son:


1_ en una parte de la programación hay una sentencia que dice include "trabajando con bit.bas"; corrígeme si estoy equivocado pero esta sentencia incluye una programación ya antes realizada por ti.

2_ cuando utilizas un oscilador interno con el timer1 el de 8 mhz, no se ve afectado al utilizar un crystal de 20 Mhz externo.

3_ Hseropen 4800  'Inicializa puerto RS232 por hardware a 4800Baudios; cuando utilizas esta linea de programacion cual es el objetivo.


Gracias por todo nuevamente.   :mrgreen:

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #772 en: 15 de Julio de 2013, 15:14:06 »
1)
Trabajando con bit son funciones anteriores en concreto uso estas dos:

Código: [Seleccionar]
'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                                

2)
Da lo mismo si el reloj es interno o externo, tan solo indicar los Mhz, si mis cálculos son correcto debería funcionar también a 20Mhz.
Solo he podido probar la función a 8Mhz, pero en teoría tendría que funcionar porque es proporcional y el Timer1 es de 16Bit y no debe de quedarse corto.

3)
Es la configuración básica de la placa, la utilizo mucho sobretodo para depuración ya que puedo sacar gran cantidad de datos sin limitación.
En este caso no se utiliza, lo mismo que no se utilzan los led, adc, I2c ni teclas de la placa.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #773 en: 15 de Julio de 2013, 15:43:41 »
Dejo una imagen:

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

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #774 en: 15 de Julio de 2013, 17:36:12 »
Dogflu.

Se agradece tu ayuda funciona de maravillas, no puedo dejar una imagen inserta para que puedas ver pero funciona 100% ((:-))




Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #775 en: 03 de Septiembre de 2013, 14:25:54 »
Dogflu,

Te saludo nuevamente, mira espero no incomodarte pero necesito otra vez de tus sabiduría y asistencia si no es mucho pedir.

Te explico, estoy tratando de hacer correr un dispositivo de medición barométrica y temperatura, este dispositivo es el bmp 085, este trabaja con comunicación i2c hasta ahi no tengo problemas, entiendo como trabaja este tipo de comunicaicon, pues ya hecho trabajar algunos dispositivos con este protocolo, Sin embargo me ha estado arrojando problemas este ultimo.

principalmente para poder hacerlo funcionar, se debe de leer la memoria eprom del bmp, el cual tiene en su interior los valores de calibración tanto para la presión como la temperatura, ahi no tengo problema "creo" pues me arroja valores que estimo coherentes. sin embargo cuando deseo leer el registro de valores censados para la presión, UP, me arroja valores incoherentes o nulos. Te adjunto la programacion que he realizado y tambien te adjunto un pdf que explica le funcionamiento del sensor.


http://tienda.tdrobotica.co/download/BST-BMP085-DS000-06.pdf

https://www.sparkfun.com/tutorials/253



Te agradesco tu tiempo y pasiencia Saludos.




Código: [Seleccionar]
AllDigital
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 puerto I2C

Symbol sda = PORTB.0
Symbol scl = PORTB.1

'configuracion de variables

'Dim var_tabla(22) As Byte
Dim ac1 As Word
Dim ac2 As Word
Dim ac3 As Word
Dim ac4 As Word
Dim ac5 As Word
Dim ac6 As Word
Dim b1 As Word
Dim b2 As Word
Dim mb As Word
Dim mc As Word
Dim md As Word
Dim lsb As Byte
Dim xlsb As Byte
Dim msb As Byte
Dim up As Word
Dim up2 As Word
Dim oss As Long
oss = 0
Dim t As Byte
t = 8 - oss
'Gosub leer_memo
Gosub leer_memo
WaitMs 25
Gosub mostrar

inicio:
Gosub presion
'Gosub cal_press

Goto inicio
End                                               

leer_memo:
I2CRead sda, scl, 0x77, 0xaa, ac1.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xac, ac2.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xae, ac3.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xb0, ac4.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xb2, ac5.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xb4, ac6.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xb6, b1.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xb8, b2.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xba, mb.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xbc, mc.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xbe, md.LB
WaitMs 20
Return                                           

mostrar:
Lcdcmdout LcdClear
Lcdout "ac1:", #ac1, "/", "ac2:", #ac2
Lcdcmdout LcdLine2Home
Lcdout "ac3:", #ac3, "/", "ac4:", #ac4
WaitMs 5000
Lcdcmdout LcdClear
Lcdout "ac5:", #ac5, "/", "ac6:", #ac6
Lcdcmdout LcdLine2Home
Lcdout "b1:", #b1, "/", "b2:", #b2
WaitMs 5000
Lcdcmdout LcdClear
Lcdout "mb:", #mb, "/", "mc:", #mc
Lcdcmdout LcdLine2Home
Lcdout "md:", #md
WaitMs 5000
Return                                           

presion:

I2CWrite sda, scl, 0x77, 0x34, 0xf4
WaitMs 5
I2CRead sda, scl, 0x77, 0xf6, msb
I2CRead sda, scl, 0x77, 0xf7, lsb
I2CRead sda, scl, 0x77, 0xf8, xlsb

msb = ShiftRight(msb, 16)
lsb = ShiftRight(lsb, 8)
up = msb + lsb + xlsb
up2 = ShiftLeft(up, t)
WaitMs 5000
Gosub lcd
Return                                           

lcd:
lcd:
Lcdcmdout LcdClear
Lcdout "msb:", #msb, "/", "LSB:", #lsb
Lcdcmdout LcdLine2Home
Lcdout "xlsb:", #xlsb, "/"
WaitMs 5000
Lcdcmdout LcdClear
Lcdout "up:", #up
Lcdcmdout LcdLine2Home
Lcdout "up2:", #up
WaitMs 5000
Return         

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #776 en: 04 de Septiembre de 2013, 10:55:36 »
No he podido ver el datasheet ni ver con detalle el código, pero si hay dos líneas que me llamaron la atención:

msb = ShiftRight(msb, 16)
lsb = ShiftRight(lsb, 8 )

ShiftRight es una función de desplazamiento de bits, cada vez que hace un desplazamiento rellena el lado contrario con un cero.
Así que ShiftRight o ShiftLeft no pueden tener un índice superior al número de bits del registro o variable indicada -1. En este caso msb y lsb están declaradas como variables tipo Byte, que esto es una longitud para cada una de 8bit, por lo tanto el índice de la función es como máximo 8-1=7. Si se coloca un índice tan solo superior en una unidad la variable siempre valdrá cero.

msb = ShiftRight(msb, 16) = 0.
lsb = ShiftRight(lsb, 8 ) = 0.

Saludos desde Granada, España.

Desconectado zgouki

  • PIC10
  • *
  • Mensajes: 5
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #777 en: 17 de Octubre de 2013, 14:21:47 »
Estimado dogflu66. Primero ante todo debo agradecerte por tus aportes desinteresados a este foro, la verdad que desde que comencé con los pics siempre me resulto de mucha ayuda esta guía de PSI. No poseo conocimientos de assembler, pero si de basic por lo tanto ya hace bastante que me manejo con este lenguaje del PSI para programar microcontroladores.

En este momento tengo en mente un programa para comunicar 2 microcontroladores iguales (16f628a) por medio de la USART que poseen. Me he manejado con los ejemplos que da la misma guía que viene con el programa y me han funcionado dentro de todo. El problema se presenta recién ahora en donde el microcontrolador receptor (hay uno que envia TX y otro que recibe RX, NO viceversa) ademas de recibir datos también debe atender un timer interno (0,1 o 2, nose cual seria mas adecuado en este caso) para realizar una acción cada un intervalo de tiempo determinado (unos 300 microsegundos aproximadamente). Pero es aquí en donde deja de funcionar la recepción de datos o recibe datos erróneos. Es posible implementar un codigo que realice esto? Ya he probado el timer1 y timer2 con exito sin habilitar la USART, pero se cuelga cuando le agrego dicha parte del código.

Un saludo cordial y espero tu respuesta.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #778 en: 18 de Octubre de 2013, 06:03:35 »
Si, eso lo tienes en el ejemplo "EJEMPLO 6, RS232 (Respuesta 196)" del indice.
Lo que quieres hacer se realiza fucionando las "Bases de tiempos" con el "Ring bufer" del hilo, y si añades las funciones para trabajar con cadenas puedes comparar tramas de datos completas. :mrgreen:
Saludos desde Granada, España.

Desconectado zgouki

  • PIC10
  • *
  • Mensajes: 5
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #779 en: 18 de Octubre de 2013, 20:54:36 »
Muchas gracias por tu rápida respuesta. Efectivamente gracias a ese ejemplo donde estan habilitadas las 2 interrupciones el timer1 y la usart por lo menos ahora puedo recibir 1 byte perfectamente. Pero se me complica cuando el micro transmisor envía mas de 1 byte... lee con error, la verdad que nose como manejarlos, he probado enviar cada byte con una pausa de 3ms entre ellos y la cosa mejora un poco, pero no me conforma ya que se me el tiempo es critico en esta aplicacion. Seguramente la solución este en lo que vos llamas ¨ring buffer¨. Buscare mas informacion al respecto. Un saludo cordial.