Autor Tema: Ejemplos del sensor ds18b20 en pic simulator ide  (Leído 5306 veces)

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

Desconectado andipic

  • PIC10
  • *
  • Mensajes: 9
Ejemplos del sensor ds18b20 en pic simulator ide
« en: 19 de Diciembre de 2013, 16:18:54 »
Hola a todos.
Estoy trasteando con un DS18B20 en pic simulator ide ya que quisiera medir unas temperaturas pero me ocurre que siguiendo los ejemplos de la página del psi http://www.oshonsoft.com/picbasiccompilerexamples.html , la temperatura que me devuelve no es la correcta, por ejemplo sobre 18ºC me marca algo parecido pero si lo subo a 25ºC me marca como 50 no le encuentro ningún tipo de relación. Según he podido leer la temperatura, siendo positiva,  la devuelve en incrementos de 0.5ºC  así que si leemos en el 18B20 40 lo teneomos que dividir entre 2 para obtener la medida correcta. El signo tambien es el equivocado.

He buscado y buscado y no encuentro ningún código que lea bien la temperatura para psi. Sin embargo se que el sensor está bien porque si introduzco un código que tengo en C  si que funciona bien, pero como no entiendo nada de C pues no me sirve.

Les estaría muy agradecido si me pudieran ayudar a medir la temperatura en psi, ya se que teóricamente es bastante sencillo pero estoy atascado.

ejemplo 1

Código: [Seleccionar]
Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 12
AllDigital

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTE
Define LCD_RSBIT = 0
Define LCD_RWREG = PORTE
Define LCD_RWBIT = 1
Define LCD_EREG = PORTE
Define LCD_EBIT = 2
Define LCD_READ_BUSY_FLAG = 1
Lcdinit

Define 1WIRE_REG = PORTA
Define 1WIRE_BIT = 2

Dim temp As Byte
Dim sign As Byte
Dim temp2 As Bit

loop:
DS18S20Start
WaitMs 1000
DS18S20ReadT temp, sign
Lcdcmdout LcdClear
If sign > 0 Then
Lcdout "-"
temp = 255 - temp
temp = temp + 1
Endif
temp2 = temp.0
temp = temp / 2
Lcdout #temp
If temp2 = 1 Then
Lcdout ".5"
Else
Lcdout ".0"
Endif
WaitMs 500
Goto loop


ejemplo 2
Código: [Seleccionar]
Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 12
AllDigital

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTE
Define LCD_RSBIT = 0
Define LCD_RWREG = PORTE
Define LCD_RWBIT = 1
Define LCD_EREG = PORTE
Define LCD_EBIT = 2
Define LCD_READ_BUSY_FLAG = 1
Lcdinit

Define 1WIRE_REG = PORTA
Define 1WIRE_BIT = 2

Dim finish As Bit
Dim temp As Byte
Dim sign As Byte
Dim temp2 As Bit

loop:
1wireInit
1wireSendByte 0xcc, 0x44
WaitMs 1
loop2:
1wireGetBit finish
If finish = 0 Then Goto loop2
1wireInit
1wireSendByte 0xcc, 0xbe
1wireGetByte temp, sign
Lcdcmdout LcdClear
If sign > 0 Then
Lcdout "-"
temp = 255 - temp
temp = temp + 1
Endif
temp2 = temp.0
temp = temp / 2
Lcdout #temp
If temp2 = 1 Then
Lcdout ".5"
Else
Lcdout ".0"
Endif
WaitMs 500
Goto loop


Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Ejemplos del sensor ds18b20 en pic simulator ide
« Respuesta #1 en: 21 de Diciembre de 2013, 07:27:08 »
Ayer me hice de uno y tampoco me va. Estoy haciendo pruebas a ver que pasa.
Saludos desde Granada, España.

Desconectado andipic

  • PIC10
  • *
  • Mensajes: 9
Re: Ejemplos del sensor ds18b20 en pic simulator ide
« Respuesta #2 en: 21 de Diciembre de 2013, 11:27:18 »
Según la información que he recabado con DS18S20Start y DS18S20ReadT debería ser tan simple como  iniciar y leer el dato temperatura y el dato signo. Para hallar la temperatura en ºC  si es positiva la dividimos el dato temperatura entre 2 y si es negativa hallamos el complemento a 2 del dato temperatura. Cada unidad hallada sería 0,5ºC por lo cual lo dividimos entre 2.

En el caso de 1wireInit, 1wireSendByte y 1wireGetBit sería lo mismo solo que en este caso hay que saltear la rom que no nos interesa en el caso de un sensor, si tubiéramos varios sensores la leeríamos  para indicar que sensor vamos a leer cada vez.
Código: [Seleccionar]
Define 1WIRE_REG = PORTA  'puerto al que se conecta el 18b20
Define 1WIRE_BIT = 2  'bit del puerto al que se conecta el 18b20

Dim temp As Byte
Dim signo As Byte  'Cambiamos sign por signo ya que SIGN es una palabra clave de psi y da error al compilar
Dim temp2 As Bit

loop:
DS18S20Start  'Iniciamos protocolo de lectura de 18b20
WaitMs 1000
DS18S20ReadT temp, signo  'leemos el sensor, temp es dato que nos sirve para calcular la temperatura y signo el que sirve para calcular el signo.
Lcdcmdout LcdClear

If signo > 0 Then  'si el bit signo es mayor que 0 entonces es negativo y entonces....
Lcdout "-"
temp = 255 - temp  '....hallamos el complemento...
temp = temp + 1  '...a 2 de temp
Endif
temp2 = temp.0
temp = temp / 2  'si es positivo divimos directamente temp entre dos y si es negativo el complemento a 2 que hallamos lo dividimos entre 2 y nos da la temperatura en ºC
Lcdout #temp
If temp2 = 1 Then  'si el bit 0 de temp es 1 entonces es impar y al dividir...
Lcdout ".5"  '...entre 2 nos quedaria un numero acabado en .5
Else
Lcdout ".0"
Endif
WaitMs 500
Goto loop

« Última modificación: 21 de Diciembre de 2013, 11:37:44 por andipic »

Desconectado RURE

  • PIC10
  • *
  • Mensajes: 5
Re: Ejemplos del sensor ds18b20 en pic simulator ide
« Respuesta #3 en: 21 de Diciembre de 2013, 13:22:56 »
Hola, yo también tengo problemas con el ds18b20 y creo que sé por lo que es, pero no consigo solucionarlo, según el datasheet del 18b20 viene configurado de fabrica a 12 bits de resolución y  el comando  DS18S20ReadT del P.S.I. es para 9 bits, al leer el segundo byte del registro de temperatura, en sign nos dará error porque los tres últimos bits pertenecen a la temperatura. La solución sería configurar el ds para 9 bits, pero yo aún no lo he conseguido.
Se admiten ayudas.
Un Saludo.

Desconectado andipic

  • PIC10
  • *
  • Mensajes: 9
Re: Ejemplos del sensor ds18b20 en pic simulator ide
« Respuesta #4 en: 22 de Diciembre de 2013, 00:10:32 »
hola, yo lo configure  a 9 bits y no se resolvió el problema.
Código: [Seleccionar]
1wireInit
1wireSendByte 0xcc, 0x4e 'salteamos rom y le decimos que vamos a escribir en la  Scratchpad [4Eh]
1wireSendByte 0x00, 0x00, 0x1f 'configuración de resolución a 9 bits sería 00011111 [1fh]. Los dos primeros byte son el byte2 y byte3 que corresponden a las alarmas, el tercero es el byte4 que corresponde a la configuración de resolución.

después leí el byte4 de la Scratchpad y efectivamente era 0x1f. l

Desconectado andipic

  • PIC10
  • *
  • Mensajes: 9
Re: Ejemplos del sensor ds18b20 en pic simulator ide
« Respuesta #5 en: 26 de Diciembre de 2013, 22:32:24 »
Hola, después de dedicarle un poco de tiempo ya he conseguido leer correctamente la temperatura. El truco es que la la instrucción "1wireGetByte temp, sig" lo que devuelve son temp como el byte0  de la SCRATCHPAD y sign como el byte1 de la SCRATCHPAD.
el byte0 conteine los bits 0 a7 y el byte1 los bits 8 a15 del registro de tempertura.
Por lo tanto el signo corresponde a los bits byte1.3 al byte1.7



Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Ejemplos del sensor ds18b20 en pic simulator ide
« Respuesta #6 en: 27 de Diciembre de 2013, 15:34:09 »
Ok, me alegro que cosiguieras solucionarlo por tus propios medios. Si pones el codigo corregido queda para los nuevos.

Volviendo a los ejemplos del principio, ¿entonces no funcionan las funciones especificas?. Es por enviar un correo exponiendo el problema para que lo corrijan en las proxima actualización del PSI.
Saludos desde Granada, España.

Desconectado andipic

  • PIC10
  • *
  • Mensajes: 9
Re: Ejemplos del sensor ds18b20 en pic simulator ide
« Respuesta #7 en: 28 de Diciembre de 2013, 10:51:27 »
Hola dogflu66, aquí os pongo el código. Lee con dos decimales.

Código: [Seleccionar]

'16F877A
'andipic
Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 4
AllDigital
TRISA = %00000000
TRISD = %00000000

Define 1WIRE_REG = PORTC
Define 1WIRE_BIT = 1

Dim finish As Bit
Dim temp As Byte
Dim signo As Byte
Dim tempf As Byte
Dim tempd As Byte

Dim tem0 As Bit
Dim tem1 As Bit
Dim tem2 As Bit
Dim tem3 As Bit
Dim tem4 As Bit
Dim tem5 As Bit
Dim tem6 As Bit
Dim tem7 As Bit
Dim tem8 As Bit
Dim tem9 As Bit
Dim tem10 As Bit
Dim tem11 As Bit

Hseropen 9600

PORTA.0 = 1
PORTA.1 = 1
PORTA.2 = 1
PORTA.3 = 1
PORTA.4 = 1
PORTA.5 = 1


loop:

tempf = 0
tempd = 0

1wireInit
1wireSendByte 0xcc, 0x44  'salteamos rom y le decimos que vamos a escribir en la  Scratchpad [4Eh]

WaitMs 1
loop2:
1wireGetBit finish
If finish = 0 Then Goto loop2
1wireInit
1wireSendByte 0xcc, 0xbe
1wireGetByte temp, signo

tem0 = temp.0
tem1 = temp.1
tem2 = temp.2
tem3 = temp.3
tem4 = temp.4
tem5 = temp.5
tem6 = temp.6
tem7 = temp.7

tem8 = signo.0
tem9 = signo.1
tem10 = signo.2
tem11 = signo.3


If tem0 = 1 Then
tempd = tempd + 625 / 100
Endif

If tem1 = 1 Then
tempd = tempd + 125 / 10
Endif

If tem2 = 1 Then
tempd = tempd + 250 / 10
Endif

If tem3 = 1 Then
tempd = tempd + 500 / 10
Endif

If tem4 = 1 Then
tempf = tempf + 1
Endif

If tem5 = 1 Then
tempf = tempf + 2
Endif

If tem6 = 1 Then
tempf = tempf + 4
Endif

If tem7 = 1 Then
tempf = tempf + 8
Endif

If tem8 = 1 Then
tempf = tempf + 16
Endif

If tem9 = 1 Then
tempf = tempf + 32
Endif

If tem10 = 1 Then
tempf = tempf + 64
Endif





Hserout "temperatura = "

If tem11 = 1 Then
Hserout "-"
tempf = 128 - tempf
tempd = 100 - tempd
If tempd = 100 Then
tempd = 0
Endif

Else
Hserout "+ "
Endif


Hserout #tempf, ","
If tempd < 10 Then
Hserout "0"
Endif
Hserout #tempd, " ", 0xf8, "C", CrLf, Lf




WaitMs 1000



Goto loop

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Ejemplos del sensor ds18b20 en pic simulator ide
« Respuesta #8 en: 28 de Diciembre de 2013, 23:41:32 »
Gracias ANDIPIC; dejo tu código adaptado para la placa PicEBasic.

Código: [Seleccionar]
'**********************************************************************************
'Programa de ejemplo para la lectura de temperatura mediante el sensor DS18B20
'Placa PicEBasic, 12/2013
'Basic Pic Simulator IDE (PSI), v6.96_02, Pic16F88
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8  'Oscilador a 8Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-----------------------------------------
Call _setupebasic()  'Inicializa la placa entrenadora PicEBasic.
Hseropen 38400  'Inicializa puerto RS232 por hardware a 38400Baudios
Lcdinit  'Inicializa el LCD sin cursor
WaitMs 100  'Pausa de 100 mSeg.
Lcdout "Test T. DS18B20"  'Imprime el texto en el LCD
WaitMs 1000  'Pausa de 1 Seg.
'-----------------------------------------
void_main:  '{

Define 1WIRE_REG = PORTA
Define 1WIRE_BIT = 4

Dim finish As Bit
Dim temp As Word
Dim tempf As Byte
Dim tempd As Byte
Dim main As Bit
        Const ascii_grados = 0xf8  'Codigo ASCII que corresponde al simbolo de grados

Symbol signo = temp.11

While main = main  '{
tempf = 0
tempd = 0
finish = 0

1wireInit
1wireSendByte 0xcc, 0x44  'salteamos rom y le decimos que vamos a escribir en la  Scratchpad [4Eh]

WaitMs 1
While finish = 0
1wireGetBit finish
Wend
1wireInit
1wireSendByte 0xcc, 0xbe
1wireGetByte temp.LB, temp.HB

If temp.0 = 1 Then tempd = tempd + 625 / 100
If temp.1 = 1 Then tempd = tempd + 125 / 10
If temp.2 = 1 Then tempd = tempd + 250 / 10
If temp.3 = 1 Then tempd = tempd + 500 / 10
If temp.4 = 1 Then tempf = tempf + 1
If temp.5 = 1 Then tempf = tempf + 2
If temp.6 = 1 Then tempf = tempf + 4
If temp.7 = 1 Then tempf = tempf + 8
If temp.8 = 1 Then tempf = tempf + 16
If temp.9 = 1 Then tempf = tempf + 32
If temp.10 = 1 Then tempf = tempf + 64

Hserout "Temperatura = "
If signo = 1 Then
Hserout "-"
tempf = 128 - tempf
tempd = 100 - tempd
If tempd = 100 Then tempd = 0
Else
Hserout "+ "
Endif
Hserout #tempf, ","
If tempd < 10 Then Hserout "0"
Hserout #tempd, " ", ascii_grados, "C", CrLf, Lf
WaitMs 1000
Wend  '}
End  '}                                          
'Bibliotecas usadas:
Include "_ProcSetUpEBasic.bas"
« Última modificación: 29 de Diciembre de 2013, 09:38:14 por dogflu66 »
Saludos desde Granada, España.


 

anything