Autor Tema: Hola ayuda con el ds18b20 y 16f628a  (Leído 6988 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado esteban_santiago83

  • PIC10
  • *
  • Mensajes: 10
Hola ayuda con el ds18b20 y 16f628a
« en: 13 de Mayo de 2008, 20:32:57 »
Hola estoy haciendo mi tesis y me gustaria que me ayuden con la parte final, tengo que medir la temperatura una habitación y enviar ese dato al pic descrito, nose si usar un lm35 o un ds18b20, pero me gustaria con información de un programa que mida temperaturas con el ds18b20 y si pueden con el lm35 para el 16f628a en lenguaje assembler.
Gracias lo necesito de forma urgente.
Esteban

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #1 en: 13 de Mayo de 2008, 21:03:44 »
Usa el buscador
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado esteban_santiago83

  • PIC10
  • *
  • Mensajes: 10
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #2 en: 14 de Mayo de 2008, 12:40:18 »
Estuve buscando y encontre varios ejemplos, pero el momento que compilo en mplab me da muchos errores, crees que puedas darme una mano?

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #3 en: 20 de Mayo de 2008, 19:39:15 »
Hola.

Esta es para el DS18S20, es lo mismo pero con menor resolucion ( cada 0.5 C ), pero creo que te puede servir ya que los cambios de T en una pieza no van a ser tan criticos no???  :mrgreen:

Código: [Seleccionar]
#include <16F873A.h>
#fuses XT

#use delay(clock=4M)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)

#define TOUCH_PIN pin_a0
#include <touch.c>

void main (void)
{
   int8 buffer[2];

   setup_adc(ADC_OFF);
   setup_adc_ports(NO_ANALOGS);

 while (TRUE)
  {
     if(touch_present())
    {
        touch_write_byte(0xCC);
        touch_write_byte (0x44);
        output_high(TOUCH_PIN);
        delay_ms(800);

        touch_present();
        touch_write_byte(0xCC);
        touch_write_byte (0xBE);
        buffer[0] = touch_read_byte();
        buffer[1] = touch_read_byte();

        printf ("Temperature: %c%3.1f C\r\n", (buffer[1])?'-':' ', (float)buffer[0]/2);
        delay_ms (1000);
     }
 }
}

El resultado de la medicion de T lo envio por el serial, debes conectar el micro al puerto COM del PC por medio de un MAX232 y ya. Debes cambiar el micro y revisar si los pines Tx y Rx son los mismos.

Esta compilado con CCS 4.057.

Saludos
El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #4 en: 20 de Mayo de 2008, 19:40:14 »
 :oops: :oops: :oops: :oops: :oops: :oops: :oops:

No me habia dado cuenta que estaba en lo ASM lo siento.

 :D
El papel lo aguanta todo

Desconectado esteban_santiago83

  • PIC10
  • *
  • Mensajes: 10
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #5 en: 23 de Mayo de 2008, 20:37:19 »
Hola amigos de este foro, ahora realiza el programa para el pic 16f628a y el ds18b20 usando un programa propio del fabricante del ds18b20.
El programa es el siguiente:
    list p=16F628a
      #include <p16F628.inc>
;---------------------------------------------------------
; Assign the PORTB with Constants
      constant DQ=4                             ; Use RB0 (pin9) for 1-Wire
;--------------------------------------------------------
; These constants are standard 1-Wire ROM commands REVISAR
      constant RDROM=0xBE
      constant CONVERT=0x44
      constant SKPROM=0xCC
;---------------------------------------------------------
; These constants are used throughout the code

      cblock        0x20
             IOBYTE
             TMPO                               ; Address 0x23
             COUNT                              ; Keep track of bits
             TEMP
            TEMP1
            TEMP2
            PDBYTE                             ; Presence Detect Pulse
      endc
;---------------------------------------------------------
      __config 0x3F38
;---------------------------------------------------------
; Set the program origin for subsequent code.

      org 0x00
     ;---------------------------------------------------------
; Option Register bits
; ____
; RBPU,INTEDG,TOCS,TOSE,PSA,PS2,PS1,PS0
; 7=PORTB Pullup Enable, 6=Interrupt Edge Select, 5=TMR0 Source,
; 4=TMR0 Source Edge, 3=Prescaler Assign, 2-0=Prescaler Rate Select

; 11010111
; PORTB pullups disabled,rising edge,internal,hightolow,TMR0,1:256
     
      BCF           STATUS,RP1
      BSF           STATUS,RP0                  ; Select Bank 1 of data memory
      movlw    b'11111111'
      movwf    TRISA      
      MOVLW         0xD7
      MOVWF         OPTION_REG
      BCF           STATUS,RP0                  ; Select Bank 0 of data memory
      GOTO          START
;---------------------------------------------------------
; Include the 1-Wire communication routines and macros

      #INCLUDE <1WIRE.inc>
;---------------------------------------------------------
START:
;---------------------------------------------------------
      CALL   INICIALIZA
      CALL   LEETEMP
      MOVF   TEMP1,W                             ; Se queda con la parte decimal que es el nible
      MOVLW   b'11110000'                        ; Se queda con el nible alto del primer byte leído.
      ANDWF   TEMP1,F   
      MOVLW   b'00001111'                                  ; Ahora el nible bajo del segundo byte leído.
      ANDWF   TEMP2,W
      IORWF   TEMP1,F                   ; Una OR con los dos nibles.
      SWAPF   TEMP1,F                  ; Se intercambian los nibles.
      MOVF    TEMP1,W                   ; En (W) la parte entera del valor absoluto de la
      MOVWF   TEMP
      MOVWF   PORTA

INICIALIZA:
      CALL   RESET
      MOVLW  SKPROM                       ; Primero los pulsos de Reset y Presence.
      CALL   TXBYTE                     ; conectado un único dispositivo al bus.
      MOVLW  CONVERT              ; Para que comience la conversión de temperatura.
      CALL   TXBYTE     
      RETURN

LEETEMP:
      CALL   RESET                            ; Primero los pulsos de "Reset" y "Presence".
      MOVLW  SKPROM                      ; Salta los comandos de ROM ya que hay
      CALL   TXBYTE                        ; conectado un único dispositivo al bus.
      MOVLW  RDROM           ; Va a leer la primera posición de memoria,
      CALL   TXBYTE                          ; donde se localiza el valor de la temperatura.
      CALL   RXBYTE                                ; Lee la temperatura en
      MOVF   IOBYTE,W
      MOVWF  TEMP1                         ; complemento a 2.
      CALL   RXBYTE                               ; Ahora lee el segundo byte
      MOVF   IOBYTE,W
      MOVWF  TEMP2                        ; de la temperatura.
      CALL   RESET
      RETURN                               ; Y para terminar, resetea el dispositivo.

      end

Aqui incluyo un archivo .inc que define las subrtinas básicas de la comunicación 1Wire, esta libreria es la siguiente:
; *******************************************************
;
; Protocolo de comunicación 1-Wire de Dallas para PIC16F628
;
; *******************************************************

; *******************************************************
; MACROS
; *******************************************************
ALTO:MACRO
      BSF           STATUS,RP0                  ; Select Bank 1 of data memory
      BSF           TRISB,DQ                   ; Make DQ pin High Z
      BCF           STATUS,RP0                  ; Select Bank 0 of data memory
      ENDM
; --------------------------------------------------------
BAJO:MACRO
      BCF           STATUS,RP0                  ; Select Bank 0 of data memory
      BCF           PORTB, DQ                   ; Clear the DQ bit
      BSF           STATUS,RP0                  ; Select Bank 1 of data memory
      BCF           TRISB, DQ                   ; Make DQ pin an output
      BCF           STATUS,RP0                  ; Select Bank 0 of data memory
      ENDM
; --------------------------------------------------------
WAIT:MACRO TIME
;Delay for TIME µs.
;Variable time must be in multiples of 5µs.
      MOVLW         (TIME/5)-1                  ;1µs
      MOVWF         TMPO                        ;1µs
      CALL          WAIT5U                      ;2µs
      ENDM


; *******************************************************
;       Dallas Semiconductor 1-Wire ROUTINES
; *******************************************************
WAIT5U:
;This takes 5µS to complete
      NOP                                       ;1µs
      NOP                                       ;1µs
      DECFSZ        TMPO,F                      ;1µs or 2µs
      GOTO          WAIT5U                      ;2µs
      RETLW         0                                 ;2µs
; --------------------------------------------------------
RESET:
      ALTO                                    ; Start with the line high
      CLRF       PDBYTE                               ; Clear the PD byte
      BAJO
      WAIT          .500                        ; Drive Low for 500µs
      ALTO
      WAIT          .70                         ; Release line and wait 70µs for PD Pulse
      BTFSS         PORTB,DQ                    ; Read for a PD Pulse
      INCF          PDBYTE,F                    ; Set PDBYTE to 1 if get a PD Pulse
      WAIT          .400                        ; Wait 400µs after PD Pulse
      RETLW       0
; --------------------------------------------------------
RXBYTE: ; Byte read is stored in IOBYTE
      MOVLW         .8
      MOVWF         COUNT                       ; Set COUNT equal to 8 to count the bits
     ALTO
RXLP:
      BAJO
      NOP
      NOP
      NOP
      NOP
      NOP
      NOP                                       ; Bring DQ low for 6µs
      ALTO
      NOP
      NOP
      NOP
      NOP                                       ; Change to HiZ and Wait 4µs
      BCF           STATUS,C
     BTFSC          PORTB,DQ
     BSF         STATUS,C
     RRF           IOBYTE,1                    ; Shift C into IOBYTE
      WAIT          .50                         ; Wait 50µs to end of time slot
      ALTO
     DECFSZ        COUNT,F                     ; Decrement the bit counter
      GOTO          RXLP
      RETLW         0
; --------------------------------------------------------
TXBYTE:                                       ; Byte to send starts in W
      MOVWF         IOBYTE                      ; We send it from IOBYTE
      MOVLW         .8
      MOVWF         COUNT                       ; Set COUNT equal to 8 to count the bits
TXLP:
      BAJO
      NOP
      NOP
      NOP                                       ; Drive the line low for 3µs
      RRF           IOBYTE,F
      BSF           STATUS,RP0                  ; Select Bank 1 of data memory
      BTFSC         STATUS,C                    ; Check the LSB of IOBYTE for 1 or 0
      BSF           TRISB,DQ                    ; HiZ the line  if LSB is 1
      BCF           STATUS,RP0                  ; Select Bank 0 of data memory
      WAIT          .60                         ; Continue driving line for 60µs
      ALTO                                    ; Release the line for pullup
      NOP
      NOP                                       ; Recovery time of 2µs
      DECFSZ        COUNT,F                     ; Decrement the bit counter
      GOTO          TXLP
      RETLW         0
; --------------------------------------------------------

Ahora, la nota es que cuando simulo el programa en PROTEUS este no me produce ningun valor, quisiera que me ayuden analizando cual podria ser la posible causa. Gracias

Desconectado piccar56

  • PIC10
  • *
  • Mensajes: 10
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #6 en: 17 de Julio de 2008, 18:50:13 »
hola  esteban_santiago83
yo programo es CCS y use  el DS18b20 con una  libreria, y simulando en el proteus me  funciono perfecto y cuando lo implemente tambien; pero como tu quieres prograrmar en asembler  estube revisando unos archivos encontre una libreria para el DS18b20 en asm; solo que nunca  la probe, pero igual te la paso haber  si te sirve de algo

Desconectado esteban_santiago83

  • PIC10
  • *
  • Mensajes: 10
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #7 en: 21 de Julio de 2008, 16:03:17 »
Gracias amigo pero ya logre solucionar mi problema... la verdad me jale con el ds18b20 porq cuando iba a probar todo lo polarice al reves y no se si funciona o no y para comprar otro me toca importarlo.. mejor use un lm35dz con el pic 16f876 y converti la señal analoga en sigital y listo...con todo muchisimas gracias por interesarte en el tema y prestarme ayuda

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #8 en: 21 de Julio de 2008, 23:29:21 »
Hola.

 :? El DS se puede polarizar como Parasity Power, asi se conecta Vdd y GND a GND. Cuando comence con ese sensor cometi el mismo error tuyo, pero al probar la conexion Parasity Power me di cuenta que no se habia dañado  :-/ , no olvides la resistencia de pullup entre el pin de salida y Vdd.

Saludos
El papel lo aguanta todo

Desconectado esteban_santiago83

  • PIC10
  • *
  • Mensajes: 10
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #9 en: 24 de Julio de 2008, 18:43:57 »
Muchas gracias.... lo tomare en cuenta para la proxima vez que lo vaya a utilizar... gracias viejo

Desconectado marturetjulio

  • PIC10
  • *
  • Mensajes: 44
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #10 en: 12 de Abril de 2010, 00:39:37 »
HOLA AMIGOS DEL FORO YA QUE ESTE TEMA ESTABA ABIERTO DECIDI SOLICITAR AYUDA EN ESTE LINK RESULTA QUE COPIE EL CODIGO ESCRITO POR MLO DE LA COMUNICACION ONE WIRE ENTRE EL DS18S20  Y EL PIC 16F873A Y BUENO AL PRINICIPIO NO LA ENTENDIA NADA PORQUE NO SABIA QUE ERAN ESOS COMANDOS PERO ME BAJE EL DATASHEETS DEL DS18S20 Y PUDE ENTENDER LO QUE HACE CADA LINEA PERO LO PROBE CON OTRO MICRONCONTROLADOR Y NO ME FUNCIONA TENGO PROTEUS 7.4 Y EL CCS 4.065.. CUANDO LO SIMULO SOLO MARCA -126.5 y por mas que cambio el valor del ds18s20 no cambia el valor...me podrían ayudar con esto.

gracias MLO por postear ese ejemplo aunque no me ha funcionado me ha servido para leer mas sobre el tema y aprender mas sobre este tipo de comunicación ONE WIRE.

saludos y gracias de antemano les adjunto la simulacion y el codigo del pic

codigo:
#include <16F877.h>
#fuses XT,nowdt, nolvp,noprotect
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#define TOUCH_PIN   pin_a0
#include <touch2.c>
int16 temp;
void main (void)
{
   int8 buffer[2];

   setup_adc(ADC_OFF);
   setup_adc_ports(NO_ANALOGS);

 while (TRUE)
  {
     if(touch_present())
    {
       
        touch_write_byte(0xCC);
        touch_write_byte (0x44);
        output_high(TOUCH_PIN);
        delay_ms(750);
        touch_present();
       
        touch_write_byte(0xCC);
        touch_write_byte (0xBE);
        buffer[0] = touch_read_byte();
        buffer[1] = touch_read_byte();
        printf ("Temperature: %c%3.1f C\r\n", (buffer[1])?'-':' ',(float)buffer[0]/2);
 
       delay_ms (1000);
     }
 }
}
Expeciencia es simplemente el nombre que le damos a nuestros errores!!!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #11 en: 12 de Abril de 2010, 02:07:16 »
Hola.

Prueba conectándolo de la forma Parasity Power, con los dos pines de alimentación a GND.

Saludos
El papel lo aguanta todo

Desconectado marturetjulio

  • PIC10
  • *
  • Mensajes: 44
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #12 en: 12 de Abril de 2010, 11:09:49 »
hola MLO gracias por tu ayuda si le hice eso y funciono perfectamente ahora voy a intentar con otros medidores de temperatura y sabes yo pense que parasity power es que se alimenta por medio del mismo voltaje del pin DQ por eso lo que hacia era alimentar el vcc a 5v y el gnd a tierra. y entonces lei lo del parasity power y como creia que se alimentaba por el mismo pin DQ y  luego de leer eso lo que hacia era alimentar el pin DQ con su respectiva resistencia pull up de 2k y los otros 2 no los conectaba... pero bueno ya aprendi algo nuevo

gracias por la ayuda amigo saludos
Expeciencia es simplemente el nombre que le damos a nuestros errores!!!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Hola ayuda con el ds18b20 y 16f628a
« Respuesta #13 en: 12 de Abril de 2010, 11:55:20 »
 :-/

Que bien que se solucionara !!!

Saludos
El papel lo aguanta todo