Autor Tema: DS18B20 ayuda asembler  (Leído 2321 veces)

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

Desconectado ENO45

  • PIC10
  • *
  • Mensajes: 42
DS18B20 ayuda asembler
« en: 03 de Abril de 2006, 15:36:00 »
Hola necesito ayuda con el sensor de temperatura DS18B20, si algien tiene un ejemplo de como funciona en asembler el pic que estoy usando es el 16F628a lo que yo encontre es lo siguiente pero tiene errores es que se re3fiere a una lijbreria que yo no tengo ni consigo

DS18B20_Inicializa
   call   Bus1Linea_Reset                       ; Primero los pulsos de Reset y Presence.
   movlw   DS18B20_Skip_ROM_Command              ; Salta los comandos de ROM ya que hay
   call   Bus1Linea_EscribeByte                     ; conectado un único dispositivo al bus.
   movlw   DS18B20_Convert_T_Command               ; Para que comience la conversión de temperatura.
   call   Bus1Linea_EscribeByte      
   return

DS18B20_LeeTemperatura
   call   Bus1Linea_Reset                            ; Primero los pulsos de "Reset" y "Presence".
   movlw   DS18B20_Skip_ROM_Command                      ; Salta los comandos de ROM ya que hay
   call   Bus1Linea_EscribeByte                        ; conectado un único dispositivo al bus.
   movlw   DS18B20_Read_Scratchpad_Command           ; Va a leer la primera posición de memoria,
   call   Bus1Linea_EscribeByte                           ; donde se localiza el valor de la temperatura.
   call   Bus1Linea_LeeByte                                ; Lee la temperatura en
   movwf   DS18B20_Temperatura                         ; complemento a 2.
   call   Bus1Linea_LeeByte                               ; Ahora lee el segundo byte
   movwf   DS18B20_TemperaturaH                        ; de la temperatura.
   call   Bus1Linea_Reset                               ; Y para terminar, resetea el dispositivo.

   movf   DS18B20_Temperatura,W                             ; Se queda con la parte decimal que es el nible
   andlw   b"00001111"               ; bajo del primer byte.
   call   DS18B20_RedondeoDecimal                          ; Obtiene el valor redondeado.
   movwf   DS18B20_TemperaturaDecimal                    ; La parte decimal.
                 
   movlw   b"11110000"                        ; Se queda con el nible alto del primer byte leído.
   andwf   DS18B20_Temperatura,F   
                movlw   b"00001111"                                  ; Ahora el nible bajo del segundo byte leído.
   andwf   DS18B20_TemperaturaH,W
   iorwf   DS18B20_Temperatura,F                   ; Una OR con los dos nibles.
   swapf   DS18B20_Temperatura,F                  ; Se intercambian los nibles.
   movf   DS18B20_Temperatura,W                   ; En (W) la parte entera del valor absoluto de la
   movwf PORTB

a la libreria que hago referencia es INCLUDE  <BUS_1LIN.INC> Subrutinas de control del bus de 1 línea

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: DS18B20 ayuda asembler
« Respuesta #1 en: 03 de Abril de 2006, 17:55:00 »
Escrito originalmente por ENO45
Hola necesito ayuda con el sensor de temperatura DS18B20, si algien tiene un ejemplo de como funciona en asembler el pic que estoy usando es el 16F628a lo que yo encontre es lo siguiente pero tiene errores es que se re3fiere a una lijbreria que yo no tengo ni consigo

DS18B20_Inicializa
   call   Bus1Linea_Reset                       ; Primero los pulsos de Reset y Presence.
   movlw   DS18B20_Skip_ROM_Command              ; Salta los comandos de ROM ya que hay
   call   Bus1Linea_EscribeByte                     ; conectado un único dispositivo al bus.
   movlw   DS18B20_Convert_T_Command               ; Para que comience la conversión de temperatura.
   call   Bus1Linea_EscribeByte      
   return

DS18B20_LeeTemperatura
   call   Bus1Linea_Reset                            ; Primero los pulsos de "Reset" y "Presence".
   movlw   DS18B20_Skip_ROM_Command                      ; Salta los comandos de ROM ya que hay
   call   Bus1Linea_EscribeByte                        ; conectado un único dispositivo al bus.
   movlw   DS18B20_Read_Scratchpad_Command           ; Va a leer la primera posición de memoria,
   call   Bus1Linea_EscribeByte                           ; donde se localiza el valor de la temperatura.
   call   Bus1Linea_LeeByte                                ; Lee la temperatura en
   movwf   DS18B20_Temperatura                         ; complemento a 2.
   call   Bus1Linea_LeeByte                               ; Ahora lee el segundo byte
   movwf   DS18B20_TemperaturaH                        ; de la temperatura.
   call   Bus1Linea_Reset                               ; Y para terminar, resetea el dispositivo.

   movf   DS18B20_Temperatura,W                             ; Se queda con la parte decimal que es el nible
   andlw   b"00001111"               ; bajo del primer byte.
   call   DS18B20_RedondeoDecimal                          ; Obtiene el valor redondeado.
   movwf   DS18B20_TemperaturaDecimal                    ; La parte decimal.
                 
   movlw   b"11110000"                        ; Se queda con el nible alto del primer byte leído.
   andwf   DS18B20_Temperatura,F   
                movlw   b"00001111"                                  ; Ahora el nible bajo del segundo byte leído.
   andwf   DS18B20_TemperaturaH,W
   iorwf   DS18B20_Temperatura,F                   ; Una OR con los dos nibles.
   swapf   DS18B20_Temperatura,F                  ; Se intercambian los nibles.
   movf   DS18B20_Temperatura,W                   ; En (W) la parte entera del valor absoluto de la
   movwf PORTB

a la libreria que hago referencia es INCLUDE  <BUS_1LIN.INC> Subrutinas de control del bus de 1 línea


Suena a que es el código de otra persona y está incompleto.  Con la información que acabas de pasar no es suficiente para reconstruir lo que está haciendo el software.

No hay posibilidad que consigas ese .inc?

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado ENO45

  • PIC10
  • *
  • Mensajes: 42
RE: DS18B20 ayuda asembler
« Respuesta #2 en: 03 de Abril de 2006, 18:06:00 »
si el codigo es sacado de una pagina pero me hace falta ese .inc es que no tengo ni la minima idea de como hacer el programa si sabes algo por favor me gustaria que me ayudes es que tengo que entregar este trabajo y se me acaba el tiempo
ENO45

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: DS18B20 ayuda asembler
« Respuesta #3 en: 03 de Abril de 2006, 18:30:00 »
Escrito originalmente por ENO45
si el codigo es sacado de una pagina pero me hace falta ese .inc es que no tengo ni la minima idea de como hacer el programa si sabes algo por favor me gustaria que me ayudes es que tengo que entregar este trabajo y se me acaba el tiempo
ENO45


Amigo no conozco ese sensor , pero fijate lo siguiente

Hay varios call a estas rutinas.

Bus1Linea_EscribeByte
Bus1Linea_LeeByte
Bus1Linea_Reset

Además varias constantes que no se que valor tendrán, y como puedo saber yo esas cosas?  No hay forma!

Creo que si el código está en dicha página en algun lugar debiera aparecer el archivo .inc sino  que sentido tiene postear un codigo a medias?


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado xrom

  • PIC10
  • *
  • Mensajes: 10
Re: DS18B20 ayuda asembler
« Respuesta #4 en: 26 de Abril de 2006, 14:26:45 »
Un codigo muy parecido lo encontraras en www.pic16f84a.com . esta pàgina corresponde al libro "Microcontrolador PIC16F84" y si te vas al apartado de Proteus, veràs que puedes bajarte los ejemplos que se encuentran en el libro, mira el capitulo 28 que hace referencia a la comunicación con un DS18B20.

Tambien es verdad que hay una libreria que no aparece y que curisamente se llama BUS_1LIN.INC...

Nota : Aqui tienes una copia completa de la libreria, no se si tiene copyright ????.  De todos modos si tienes posibilidad de hacerte con el libro te lo recomiendo por que vale la pena.


;**************************** Librería "BUS_1LIN.INC" *********************************
;
;   ===================================================================
;     Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;     E. Palacios, F. Remiro y L. López.
;      Editorial Ra-Ma.  www.ra-ma.es
;   ===================================================================
;
; Estas subrutinas permiten realizar las tareas básicas de control del bus de una sola línea
; según el protocolo del fabricante de semiconductores Dallas Semiconductors.
;
; ZONA DE DATOS **********************************************************************

   CBLOCK
   Bus1Linea_Dato             ; Guarda dato a transmitir o recibir por el bus.
   Bus1Linea_ContadorBits      ; Cuenta los bits a transmitir o a recibir.
   ENDC

#DEFINE  Bus1Linea   PORTB,3      ; Línea donde se conecta el DS1820.

; Subrutina "Bus1Linea_AltaImpedancia" --------------------------------------------------
;
; Configura la línea única de 1-Wire Bus como entrada. Lo pone en alta impedancia.

Bus1Linea_AltaImpedancia
   bsf   STATUS,RP0
   bsf   Bus1Linea         ; La línea como entrada, por tanto, en alta
   bcf   STATUS,RP0      ; impedancia.
   return

; Subrutina "Bus1Linea_Bajo" ------------------------------------------------------------
;
; Mantiene el pin de datos del Bus de 1 línea en bajo.
 
Bus1Linea_Bajo
   bsf   STATUS,RP0
   bcf   Bus1Linea      ; La línea como salida.
   bcf   STATUS,RP0
   bcf   Bus1Linea      ; Pasa a bajo.
   return

; Subrutina "Bus1Linea_Reset" -----------------------------------------------------------
;
; Envía un impulso de Reset al dispositivo conectado en el bus de 1 línea y después
; espera recibir un impulso de Presence". Esto consiste en:
; 1º.   El PIC manda un impulso en bajo durante unos 500 µs. (El protocolo permite entre 480
;   y 960 µs).
; 2º.    El PIC pasa a modo entrada, espera 20 µs. (El protocolo fija entre 15 y 60 µs).
; 3º.    El PIC lee la línea de entrada y si es bajo está correcto (pulso de "Presence").
;   Se interpreta como que el procedimiento está correctamente inicializado.

Bus1Linea_Reset
   call   Bus1Linea_AltaImpedancia   ; Empieza en alto para conseguir el flanco de
                                      ; bajada con la siguiente instrucción.
   call   Bus1Linea_Bajo                    ; El bus de 1 línea en bajo durante 500 µs.
   call   Retardo_500micros
   call   Bus1Linea_AltaImpedancia   ; Permanece en alta impedancia (nivel alto por
   call   Retardo_20micros                ; las resistencias de Pull-Up) durante unos µs.
Bus1Linea_EsperaLeerBajo
   btfsc   Bus1Linea                      ; Espera a que el dispositivo le envíe el pulso
   goto   Bus1Linea_EsperaLeerBajo   ; en bajo de "Presence".
Bus1Linea_EsperaLeerAlto
   btfss   Bus1Linea                     ; Y ahora el dispositivo lo debe poner en alto.
   goto   Bus1Linea_EsperaLeerAlto
   return

; Subrutina "Bus1Linea_EscribeByte" -----------------------------------------------------
;
; El maestro escribe un byte al esclavo conectado al bus de 1 línea comenzando por el bit LSB.
; Consiste en enviar 8 bits, repitiendo 8 veces la siguiente secuencia:
; 1º   El PIC manda un impulso en bajo durante unos microsegundos. (El protocolo fija un
;   mínimo de 1 µs y sin exceder con lo que viene a continuación de 60 µs) A continuación:
;   - Si va a enviar un "0" permanece en bajo durante 50 µs.
;   - Si va a escribir un "1" se pone en alta impedancia durante 50 µs. (El protocolo
;     permite unos valores entre 15 y 60 µs para ambos casos).
; 2º    Para escribir otro bit se pone en alta impedancia durante unos µs. (El protocolo
;   establece un mínimo de 1 µs).
;
; Entrada:   En (W) el dato a enviar.

Bus1Linea_EscribeByte
   movwf   Bus1Linea_Dato      ; Guarda el byte a transmitir.
   movlw   0x08         ; 8 bits a transmitir.
   movwf   Bus1Linea_ContadorBits
   call   Bus1Linea_AltaImpedancia   ; Empieza en alta impedancia.
Bus1Linea_EnviaBit
   call   Bus1Linea_Bajo      ; Flanco de bajada.
;
; Pregunta por el valor del bit a transmitir.
;
   rrf   Bus1Linea_Dato,F      ; Lleva el bit de menor peso LSB al Carry.
   btfss   STATUS,C      ; ¿Es un "1" el bit a transmitir?.
   goto   Bus1Linea_EnviaCero   ; No, pues envía un "0".   
Bus1Linea_EnviaUno
   call   Bus1Linea_AltaImpedancia   ; Transmite un "1".
   goto   Bus1Linea_Espera50us
Bus1Linea_EnviaCero
   call   Bus1Linea_Bajo      ; Transmite un "0".
Bus1Linea_Espera50us
   call   Retardo_50micros
   call   Bus1Linea_AltaImpedancia   ; Flanco de subida.
   decfsz   Bus1Linea_ContadorBits,1   ; Comprueba que es el último bit.
   goto   Bus1Linea_EnviaBit   ; Como no es el último bit repite la operación.
   return
;
; Subrutina "Bus1Linea_LeeByte" ---------------------------------------------------------
;
; El microcontrolador maestro lee un byte del dispositivo esclavo conectado al bus de
; 1 línea. Consiste en leer 8 bits, repitiendo 8 veces la siguiente secuencia:
; 1º   El PIC manda un pulso en bajo durante unos µs. (El protocolo fija un mínimo de 1 µs).
; 2º    El PIC se pone en entrada (alta impedancia) durante otros 10 µs (con un total de 15 µs
;   desde el flanco de bajada) para proceder a la lectura de la línea.
; 3º   El PIC espera 50 µs para realizar la siguiente lectura (total unos 65 µs desde el
;   flanco de bajada). El protocolo fija que las lecturas se harán cada 60 µs ó más.
;
; Salida:   En (W) el dato leído.

Bus1Linea_LeeByte
   movlw   0x08         ; 8 bits a recibir.
   movwf   Bus1Linea_ContadorBits
   call   Bus1Linea_AltaImpedancia   ; Empieza en alta impedancia.
Bus1Linea_LeeBit
   call   Bus1Linea_Bajo      ; Flanco de bajada.
   call   Bus1Linea_AltaImpedancia
   call   Retardo_10micros      ; Añadiendo las instrucciones anteriores, supone
               ; un total de 15 µs desde el flanco de bajada.
   bcf   STATUS,C      ; Ahora lee el pin. En principio supone que es 0.
   btfsc   Bus1Linea      ; ¿Realmente es cero?.
   bsf   STATUS,C      ; No, pues cambia a uno.
   rrf   Bus1Linea_Dato,1      ; Introduce el bit en el registro.
   call   Retardo_50micros      ; Espera.
   call   Bus1Linea_AltaImpedancia   ; Flanco de subida del pulso positivo.
   decfsz    Bus1Linea_ContadorBits,1   ; Comprueba que es el último bit.
   goto   Bus1Linea_LeeBit      ; Si no es el último bit pasa a leer el siguiente.
   movf   Bus1Linea_Dato,W      ; El resultado en el registro W.
   return
   
;   ===================================================================
;     Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;     E. Palacios, F. Remiro y L. López.
;      Editorial Ra-Ma.  www.ra-ma.es
;   ===================================================================