Autor Tema: Ayuda con sensor ds18b20 y proton  (Leído 6536 veces)

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

Desconectado dexmax07

  • PIC10
  • *
  • Mensajes: 4
Ayuda con sensor ds18b20 y proton
« en: 16 de Enero de 2010, 21:53:46 »
estimados, he realizado el siguiente programa que hasta el momento funciona muy bien pero solo logro medir hasta los 82 grados y despues de esta temperatura vuelve a cero, no se como hacerlo para seguir midiendo hasta los 125 grados que puede medir este sensor, espero me puedan ayudar, les adjunto el codigo en proton y el circuito en proteus:

DEVICE = 16F877A
XTAL = 4

CONFIG HS_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF
delayms 500
all_digital=true
declare lcd_dtpin portb.4


 
SYMBOL  DQ = PortA.0      ' Place the DS1820 on bit-1 of PORTA 
DIM  Temp  AS   WORD        ' Holds the temperature value
dim grad as word
DIM  C  AS   word          ' Holds the counts remaining value
DIM  CPerD  AS   word        ' Holds the Counts per degree C value   
CLS             ' Clear the LCD before we start
Again:
OWRITE  DQ, 1, [$CC, $44]     ' Send Calculate Temperature command
REPEAT
DELAYMS  25        ' Wait until conversion is complete
OREAD  DQ, 4, [C]        ' Keep reading low pulses until
UNTIL  C <> 0        ' the DS1820 is finished.
OWRITE  DQ, 1, [$CC, $BE]     ' Send Read ScratchPad command
OREAD  DQ, 2,[Temp.LOWBYTE,Temp.HIGHBYTE,C,C,C,C,C,CPerD]  ' Calculate the temperature in degrees Centigrade
Temp = (((Temp >> 1) * 100) - 25) + (((CPerD - C) * 100) / CPerD)
temp = temp/8
print at 1,3,"TEMPERATURA"
Print $FE,$40,$07,$05,$07,$00,$00,$00,$00,$00
PRINT AT 2,6, DEC Temp / 100, ".", DEC2 Temp," ", AT 2,10,0,"C"
GOTO Again

Muchas gracias...

Desconectado Amaro Pargo

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda con sensor ds18b20 y proton
« Respuesta #1 en: 09 de Marzo de 2011, 17:08:02 »
El problema que tienes es que la configuración del scratchpad del DS1820 no es igual que la DS18B20. El primero almacena la temperatura en una variable word, cuyo byte más significativo indica el signo de la medición (del bit 15 al bit 8 ), la temperatura se recoge del bit7 al bit1 y, finalmente, el bit0 indica la parte decimal (resolución de 0,5 grados). En cambio el DS18B20 tiene la siguiente estructura: Del bit15 al bit11 el signo, del bit10 al bit4 la temperatura y del bit3 al bit0 la parte decimal (con una resolución de 0,0625 grados).

Te pongo a continuación un ejemplo realizado con el 18F2550:

Código: [Seleccionar]
'*******************************************************************************
'
'                     LECTURA DE LA ROM DE UN DISPOSITIVO 1-WIRE™
'                     ===========================================
'
' En este proyecto se lee y se muestra en un LCD la temperatura de un
' dispositivo DS18B20 con protocolo de comunicación en bus 1-Wire™
' (Dallas Semiconductor 1-Wire™)
'
' La conexión del pin DQ del dispositivo se realiza a través de RC0 del
' microcontrolador y con una resistencia pull-up de 10K
'
' El LCD alfanumérico (HD 44780) 2x16 se conecta por bus de 4 vías a un PIC
' 18F2550, con cristal de 20 Mhz, de la siguiente forma:
'
'   Display Pin del Microcontrolador
'   -------     ------------------------
' DB4     RB4
' DB5     RB5
' DB6     RB6
' RB7     RB7

' RS     RB0
' E     RB1
'   RW          RB2
'   BL+         RB4

' El contraste del LCD es controlado a través de una resistencia variable de
' 10K conectada en el pin VEE del display.
'
'*******************************************************************************           
'
' Autor: ARM
' Fecha: Marzo, 2011
' Compilador: Basic de Proton IDE
' Archivo: DS18B20_18F2550.BAS
'
' Modificaciones:
' ===============
'
'
'*******************************************************************************
'
' DECLARACIONES [DISPOSITIVO, FUSES, ALIAS, VARIABLES Y CONSTANTES]
'-------------------------------------------------------------------------------

Config_Start
   PLLDIV = 5         ;Divide by 5 (20 MHz oscillator input)
   CPUDIV = OSC1_PLL2 ;[OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
   USBDIV = 2         ;USB clock source comes from the 96 MHz PLL divided by 2
   FOSC = HSPLL_HS    ;XT oscillator, PLL enabled, XT used by USB
   FCMEN = OFF        ;Fail-Safe Clock Monitor disabled
   IESO = OFF         ;Oscillator Switchover mode disabled
   PWRT = On          ;PWRT enabled
   BOR = On           ;Brown-out Reset enabled in hardware only (SBOREN is
                      ;disabled)
   BORV = 3           ;Minimum setting
   VREGEN = On        ;USB voltage regulator enabled
   WDT = OFF          ;HW Disabled - SW Controlled
   WDTPS = 32768      ;1:32768
   MCLRE = On         ;MCLR pin enabled; RE3 input pin disabled
   LPT1OSC = OFF      ;Timer1 configured for higher power operation
   PBADEN = OFF       ;PORTB<4:0> pins are configured as digital I/O on Reset
   STVREN = On        ;Stack full/underflow will cause Reset
   LVP = OFF          ;Single-Supply ICSP disabled
   XINST = OFF        ;Instruction set extension and Indexed Addressing mode
                      ;disabled (Legacy mode)
   Debug = OFF        ;Background debugger disabled, RB6 and RB7 configured as
                      ;general purpose I/O pins
   CP0 = OFF          ;Block 0 (000800-001FFFh) not code-protected
   CP1 = OFF          ;Block 1 (002000-003FFFh) not code-protected
   CP2 = OFF          ;Block 2 (004000-005FFFh) not code-protected
   CP3 = OFF          ;Block 3 (006000-007FFFh) not code-protected
   CPB = OFF          ;Boot block (000000-0007FFh) not code-protected
   CPD = OFF          ;Data EEPROM not code-protected
   WRT0 = OFF         ;Block 0 (000800-001FFFh) not write-protected
   WRT1 = OFF         ;Block 1 (002000-003FFFh) not write-protected
   WRT2 = OFF         ;Block 2 (004000-005FFFh) not write-protected
   WRT3 = OFF         ;Block 3 (006000-007FFFh) not write-protected
   WRTB = OFF         ;Boot block (000000-0007FFh) not write-protected
   WRTC = OFF         ;Configuration registers (300000-3000FFh) not
                      ;write-protected
   WRTD = OFF         ;Data EEPROM not write-protected
   EBTR0 = OFF        ;Block 0 (000800-001FFFh) not protected from table reads
                      ;executed in other blocks
   EBTR1 = OFF        ;Block 1 (002000-003FFFh) not protected from table reads
                      ;executed in other blocks
   EBTR2 = OFF        ;Block 2 (004000-005FFFh) not protected from table reads
                      ;executed in other blocks
   EBTR3 = OFF        ;Block 3 (006000-007FFFh) not protected from table reads
                      ;executed in other blocks
   EBTRB = OFF        ;Boot block (000000-0007FFh) not protected from table
                      ;reads executed in other blocks
Config_End

                                   'Esta declarión indica a PROTON en que
                                   'posición de memoria de programa del PIC debe
                                   'comenzar para evitar sobreescribir el
                                   'bootloader:
Declare PROTON_START_ADDRESS = $1000
Device = 18F2550                   'Dispositivo utilizado
Declare Xtal = 48                  'Frecuencia de oscilación para la CPU en Mhz
Declare All_Digital = True         'Todo digital ( es lo mismo que ADCON1 = 15)
CMCON = 7                          'Desactivar comparadores
PortB_Pullups = Off                'Deshabilita las resistencias pull-up
                                   'internas del puerto B
Declare LCD_Type ALPHA             'Tipo de LCD alfanumérico
Declare LCD_DTPin PORTB.4          'se usa el nibble alto (RB4, RB5, RB6 y RB7)
                                   'para el bus de datos
Declare LCD_ENPin PORTB.1          'Pin E del LCD conectado a RB4
Declare LCD_RSPin PORTB.0          'Pin RS del LCD conectado a RB4
Declare LCD_Interface 4            'Bus de 4 vías
Declare LCD_Lines 2                'LCD de dos líneas
Symbol RW = PORTB.2                'A RB2 se conecta el pin R/W del LCD
Symbol BL = PORTB.3                'A RB3 se conecta la retroiluminación del LCD
Symbol DQ = PORTC.0                'El pin "DQ" del One-wire es el PortC.0
Dim Busy As Bit                    'Bit de ocupado
Dim temp As Word                   'Temperatura leida directamente
Dim Mostrar_int As Word            'Parte entera de la medición
Dim Mostrar_dec As Word            'Parte decimal de la medición
DelayMS 200                        'Pausa de 200 milisegundos para inicializar
                                   'el LCD
Low RW                             'Se conecta a masa el pin RW del LCD para
                                   'habilitar el modo escritura (Write)
High BL                            'Se enciende la retroiluminación (BackLight)                                   
Clear            'Inicializa la RAM (la llena de ceros)                                   
Cls                                'Limpia el LCD y pone el cursor en la prime-
                                   'ra linea y en la primera posición   

'PROGRAMA PRINCIPAL
'-------------------------------------------------------------------------------
   
Convertir:                         'Comienza conversion
   
    OWrite DQ,1,[$CC,$44]          'Salta la ROM y hace la conversion
       
Esperar:                           'Espera...
   
    ORead DQ,4,[Busy]              'Comprueba si esta ocupado
    If Busy = 0 Then Esperar       '¿Ocupado? espera otra vez...
    OWrite DQ,1,[$CC,$BE]          'Omite consultar la ROM y lee la temperatura
                                   'Lee los primeros 2 bytes de la RAM:
    ORead DQ,2,[temp.LowByte,temp.HighByte]
    If temp.11 = 1 Then            'Si el bit11 es 1 la temperatura es negativa
        Mostrar_int = (~temp >> 4)
        Mostrar_dec = (16-(temp.LowByte & %00001111)) * 625
        Print At 1,1,"  Temperatura:" 
        Print At 2,1,"    -",Dec Mostrar_int,".",Dec Mostrar_dec Dig 3,_
        " ",223,"C"
    Else                           'Si el bit11 es 0 la temperatura es positiva
        Mostrar_int = (temp >> 4)
        Mostrar_dec = (temp.LowByte & %00001111) * 625
        Print At 1,1,"  Temperatura:"
        Print At 2,1,"     ",Dec Mostrar_int,".",Dec Mostrar_dec Dig 3,_
        " ",223,"C"
    EndIf
       
GoTo Convertir                     'Repite todo el proceso indefinidamente
 
'SUBRUTINAS
'-------------------------------------------------------------------------------


       
'*******************************************************************************
       
End                                'Fin del programa

'*******************************************************************************

 

Desconectado Noelillo

  • PIC12
  • **
  • Mensajes: 94
Re: Ayuda con sensor ds18b20 y proton
« Respuesta #2 en: 15 de Diciembre de 2012, 18:20:47 »
GRACIAS!!!  :-/ :-/

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
Re: Ayuda con sensor ds18b20 y proton
« Respuesta #3 en: 06 de Julio de 2014, 07:56:27 »
Hola Amaro:

En tu código hay algo en el que el compilador se "atasca" con el error: "Coma missing or command terminated incorrectly!" en las dos líneas Print:

Print At 2,1,"    -",Dec Mostrar_int,".",Dec Mostrar_dec Dig 3, " ",223,"C"

He mirado toda la ayuda de Proteus y no encuentro por ningún lado el comando y/o modificador Dig.
He modificado la línea introduciendo una coma y también quitado Dig 3:

Print At 2,1,"    -",Dec Mostrar_int,".",Dec Mostrar_dec, Dig 3, " ",223,"C"
Print At 2,1,"    -",Dec Mostrar_int,".",Dec Mostrar_dec, " ",223,"C"


En ambos casos compila bien y el programa parece funcionar y no hay diferencia alguna entre poner o no Dig (siempre precedido de una coma).

Por favor, ¿Me podrías decir dónde encuentro información de Dig?.

Gracias y saludos cordiales,
Quod natura non dat Salmantica non praestat