El programa para el Test del DS1624 midiendo temperaturas positivas con dos decimales.
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_EJEMPLO_25
'Descripcion: TEST DE LA PLACA EBasic_I2C (Led y DS1624), Temperatura positiva)
'Micro: PIC16F88 / 8mhz reloj interno
'Fecha/Autor: 29/7/07, 2/08/07, By COS, PSI v7.41
'Version: 1.1
'Se añade TEST para el DS1624 (temperatura)
'*****************************************************************************************
Define CONF_WORD = 0x2f50 'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc 'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8 'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1 'Hace que se ignoren los tiempos de los WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4 'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'Bus de datos sera el puerto A
Define LCD_DBIT = 0 'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7 'RB7 como RS
Define LCD_EREG = PORTB 'Bit de control E sera del puerto B
Define LCD_EBIT = 6 'RB6 como E
Define LCD_COMMANDUS = 2000 'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Tiempo de espera despues de inicializar el Display.
'------------------------------------Definicion de puertos-----------------------------------
AllDigital 'los pin I/O digitales
'ANSEL = %00010000 'los pin I/O digitales y RA4 analogico
CMCON = 0x07 'comparador a off
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff 'Puerto A como salidas
TRISB = 0xff '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.3 = 0 'como salida RB3
TRISA.7 = 0 'como salida RA7
TRISB.0 = 0 'como salida RB0
TRISA.4 = 0 'como salida RA4
PORTB.3 = 1 'luz lcd a on (RB3)
PORTA.7 = 1 'led amarillo a off (RA7), negado
PORTB.0 = 1 'led verde a off (RB0), negado
PORTA.4 = 0 'led EBbasic_I2C a off (RA4)
'------------------------------------Inicio--------------------------------------------
'Reasignacion de nombres------------------------------
Symbol sda = RB1 'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = RB4 'asignamos nombre al pin que hara de SCL del puerto I2C
Symbol led_amarillo = RA7 'led amarillo
Symbol led_verde = RB0 'led verde
Symbol luz_lcd = RB3 'iluminacion del lcd
Symbol s1 = RA6 'tecla S1
Symbol s2 = RA5 'tecla S2
'Variables generales---------------------------------------
Dim temperatura As Word 'temperatura entero .HB, decimales .LB
Dim temperatura_aux As Long 'calculo de los decimales
'--------------------------------------------------------------------------------------
Lcdinit 'inicializa el LCD sin cursor
WaitMs 100 'pausa de 100 mSeg.
Lcdout "Test P. EB_I2C" 'Imprime el texto en el LCD
WaitMs 3000 'pausa de 3Seg.
'--------------------------------Rutina Principal---------------------------------------
main:
temperatura = 0
temperatura_aux = 0
temperatura = d_ds1624(0, 0, 0) 'genera una lectura en el chip ds
WaitMs 1000 'pausa de 1Seg, tiempo maximo de conversion del chip ds
temperatura = d_ds1624(0, 0, 1) 'lee la lectura en dos bytes (13bit)
temperatura.LB = ShiftRight(temperatura.LB, 3) 'elimina bit que no se usan (decimales)
temperatura_aux = (temperatura.LB * 3125) / 1000 'calcula la parte decimal
temperatura.LB = temperatura_aux.LB 'Inserta los decimales
Lcdcmdout LcdLine2Home 'cursor al principio de la linea 2
Lcdout "Temp. +", #temperatura.HB, "." 'imprime en el lcd
If temperatura.LB < 10 Then Lcdout "0" 'mantiene el formato dos decimales
Lcdout #temperatura.LB, " " 'imprime en el lcd
WaitMs 1000 '0 'hace una pausa de 10Seg.
Goto main
End
'------------------------------ Subrutinas y Funciones ----------------------------------
'Funcion de lectura/escritura del DS1624
'ds1624_rw=0 el chip prepara un lectura, ds1624_rw=1 el chip entrega una lectura
'ds1624_rw=2 se hace una lectura del registro de control.
Function d_ds1624(ds1624_h As Byte, ds1624_l As Byte, ds1624_rw As Byte) As Word
'I2CPrepare sda, scl
RA4 = 1 'led placa I2c a On
If ds1624_rw = 0 Then 'solicita una lectura de temperatura
I2CWrite sda, scl, %10010010, 0xac, 0x00 'incializa el registro de control
WaitMs 10 'pausa para que termine la escritura
I2CWrite1 sda, scl, %10010010, 0xee 'comienza una conversion
Endif
If ds1624_rw = 1 Then 'hace la lectura de la temperatura
I2CWrite1 sda, scl, %10010010, 0xaa 'prepara el chip para lectura de temperatura
I2CRead1 sda, scl, %10010011, ds1624_h, ds1624_l 'lee la temperatura
Endif
If ds1624_rw = 2 Then 'hace una lectura del registro de control
I2CRead sda, scl, %10010011, 0xac, ds1624_l 'lee registro de control
ds1624_h = 0 'borra byte alto de antiguos valores
Endif
d_ds1624.HB = ds1624_h 'actualiza la temperatura
d_ds1624.LB = ds1624_l 'actualiza decimales temperatura o indica datos registro control
RA4 = 0 'led placa i2c a Off
End Function
PD. 22/01/09, Inserte esta línea en el código "temperatura.LB = temperatura_aux.LB 'Inserta los decimales".
Sin la línea no interviene el acondicionado y calculo de los decimales. Por algún motivo desconocido la omití al pegar el programa.