TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: esteban_santiago83 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
-
Usa el buscador
-
Estuve buscando y encontre varios ejemplos, pero el momento que compilo en mplab me da muchos errores, crees que puedas darme una mano?
-
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:
#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
-
:oops: :oops: :oops: :oops: :oops: :oops: :oops:
No me habia dado cuenta que estaba en lo ASM lo siento.
:D
-
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
-
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
-
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
-
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
-
Muchas gracias.... lo tomare en cuenta para la proxima vez que lo vaya a utilizar... gracias viejo
-
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);
}
}
}
-
Hola.
Prueba conectándolo de la forma Parasity Power, con los dos pines de alimentación a GND.
Saludos
-
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
-
:-/
Que bien que se solucionara !!!
Saludos