ayuda con comunicacion pic pc

estoy tratando de hacer un control de temperatura con el pic 16f877 y visual basic 6.0 tengo problemas con el envio del valor de temperatura al pc (no me envia el valor). estoy ocupando l lm35.
la verdad no tengo idea si es que lo que estoy haciendo esta bien asi que agradeceria su ayuda
aqui va lo que llevo programado a ver si pueden ayudarme con esto ( esta en basic el programa que ocupe es el microcode, pero tambien sirve el pbp

Código:
define osc 4
@ DEVICE PROTECT_OFF,CPD_OFF,WDT_OFF,PWRT_ON,BOD_OFF
INCLUDE "modedefs.bas" ;incluyen los modos de comunicación
DEFINE ADC_BITS 10 ;Fije número de BITS del resultado (5,8,10)
DEFINE ADC_CLOCK 3 ;Fije EL CLOCK (rc = 3)
DEFINE ADC_SAMPLEUS 10 ;Fije el tiempo de muestreo en Us
DEFINE SER2_BITS 8          ; Establecer los Bits de transmisión
;ADC_SAMPLEUS es el número de microsegundos que el programa espera
;entre fijar el canal y comenzar la conversión analogica/digital.
TRISA =%1 ;el puerto A.0 es de entrada
ADCON1 = %00001110 ;el puerto A.0 es conversor los demás Digitales
dato VAR WORD ;crear variable dato para guardar
serial VAR BYTE ;variable de almacenamiento de 255
Temp VAR BYTE ;variable de almacenamiento de 255
x var byte
releF VAR portD.2 ;nombres para los pines
releC VAR portD.3
led var portD.4
SYMBOL TxD = PORTC.6
SYMBOL RxD = PORTC.7
g CON 223 ; g constante 223 este es el ASCII de grados
EEPROM 0,[20,24] ;contenido inicial de la EEPROM
inicio: ;3 parpadeos del led que indica funciona
FOR x =1 TO 3
HIGH led 
PAUSE 200
LOW led
PAUSE 200
NEXT
sensar:
ADCIN 0, Temp ;leer el canal 0 (A0) y guarde en dato     Temp = (AD_Value*150/77)
Temp = (Temp *150/77) 
SEROUT2 TxD,84,[DEC Temp];SEROUT portc.6,T9600,[ dec dato] ;DEC dato,g,"C"
pause 100
GOTO sensar
END
 
Última edición por un moderador:
estoy tratando de hacer un control de temperatura con el pic 16f877 y visual basic 6.0 tengo problemas con el envio del valor de temperatura al pc (no me envia el valor). estoy ocupando l lm35.
la verdad no tengo idea si es que lo que estoy haciendo esta bien asi que agradeceria su ayuda
aqui va lo que llevo programado a ver si pueden ayudarme con esto ( esta en basic el programa que ocupe es el microcode, pero tambien sirve el pbp
Saludos panchoreyes
Te adjunto corregida solo la parte de código de envío serial y configuración ADC
Código:
DEFINE OSC 4
@ DEVICE PIC16F877
@ DEVICE PROTECT_OFF,CPD_OFF,WDT_OFF,PWRT_ON,BOD_OFF
DEFINE ADC_BITS 8           ; Resultado de 8 Bits
DEFINE ADC_CLOCK 3          ; Fuente de reloj (RC_Int_Osc)
DEFINE ADC_SAMPLEUS 50      ; Tiempo de muestreo

ADCON0 = %11000000          ; RC_Int_Osc,AN(0)

TRISA = $FF
TRISC = $BF

Dato VAR BYTE
Temp VAR BYTE

SYMBOL TxD = PORTC.6
SYMBOL RxD = PORTC.7

SEROUT TxD,2,[0] ; Estabilizar puerto de transmisión

Sensar:
    ADCIN 0,Dato
    Temp = (Dato *150/77)       ; Conversión a °C
    SEROUT2 TxD,84,[DEC Temp,"°C",13,10]; Temperatura + CR+LF
    PAUSE 1000
    GOTO Sensar
    END
Ahora realiza los cambios necesarios en tu programa.

Suerte.
 
Última edición:
no entiendo lo de la multiplicacion, por que dices que conviertes en ºC si el lm35 lee asi?
Saludos panchoreyes
Esa parte del código esta en el programa que dejaste, pero use la variable Dato
que en ese programa no se esta usando. Así que esa respuesta la tendrías que saber tu.
Sin embargo, por acá hice un comentario acerca de eso.
Hay otras formas de obtener el resultado de la temperatura del LM35 pero esa funciona bien.
Y se dice que la conversión es para grados centígrados, porque para grados Fahrenheit se usa otra.

Suerte.
 
Última edición:
este es el programa completo para que lo veas, y me des tu opinion :

Código:
DEFINE OSC 4
@ DEVICE PIC16F877A
@ DEVICE PROTECT_OFF,CPD_OFF,WDT_OFF,PWRT_ON,BOD_OFF
DEFINE ADC_BITS 8           ; Resultado de 8 Bits
DEFINE ADC_CLOCK 3          ; Fuente de reloj (RC_Int_Osc)
DEFINE ADC_SAMPLEUS 50      ; Tiempo de muestreo
 INCLUDE "modedefs.bas" ;incluyen los modos de comunicación
ADCON0 = %11000000          ; RC_Int_Osc,AN(0)

TRISA = $FF
TRISC = $BF

Dato VAR BYTE
Temp VAR BYTE
serial VAR BYTE ;variable de almacenamiento de 255
x var byte
a var byte
b var byte
c var byte
d var byte
releF VAR portd.2 ;nombres para los pines
releC VAR portd.3
led var portd.4
led1 var portb.0
led2 var portb.1
led3 var portb.2
led4 var portb.3
minim var byte
maxima var byte
minim = 22
maxima= 25
SYMBOL TxD = PORTC.6
SYMBOL RxD = PORTC.7
inicio: ;3 parpadeos del led que indica funciona
FOR x =1 TO 3
HIGH led 
PAUSE 200
LOW led
PAUSE 200
NEXT
recibir:
SERIN RxD,T9600,serial ; comparar con pruebaredes
if serial= "A" then tminbajar
if serial = "B" then tminsubir
if serial= "C" then tmaxbajar
if serial = "D" then tmaxsubir
if serial = "E" then comparar
if serial =  "S"   then sensar
goto recibir

Sensar:
SEROUT TxD,2,[0] ; Estabilizar puerto de transmisión
ADCIN 0,Dato
Temp = (Dato *150/77)       ; Conversión a °C
SEROUT2 TxD,84,[DEC Temp,13,10]; Temperatura + CR+LF
PAUSE 1000
GOTO recibir
comparar:
if Temp <= minim then calentar
if Temp >= maxima then enfriar
goto recibir
tminbajar:
FOR a =1 TO 2
HIGH led1 
PAUSE 200
LOW led1
PAUSE 200
NEXT
minim= minim-1
goto recibir
tminsubir:
FOR b =1 TO 2
HIGH led2 
PAUSE 200
LOW led2
PAUSE 200
NEXT
minim=minim+1
goto recibir
tmaxbajar:
FOR c =1 TO 2
HIGH led3 
PAUSE 200
LOW led3
PAUSE 200
NEXT
maxima= maxima-1
goto recibir
tmaxsubir:
FOR d =1 TO 2
HIGH led4 
PAUSE 200
LOW led4
PAUSE 200
NEXT
maxima= maxima+1
goto sensar
calentar:
 high relec
 pause 100
 low relef
 goto recibir
 enfriar:
 high relef
 pause 100
 low relec
 goto recibir
END



Última Edición por D@rkbytes; Hace 26 Minutos a las 03:48; Razón: Por favor envolver código con la etiqueta CODE

a que te refieres?
 
Última edición:
A que utilices las herramientas de la barra superior del editor.
En este caso el botón que tiene un icono con un #
Pegas tu código, lo seleccionas y presionas el botón
De esta manera es más fácil y cómodo para los usuarios leer, seleccionar y separar el código del post.

Gracias.
 
este es el programa completo para que lo veas, y me des tu opinion :
OK.
Le hice algunos cambios a tu programa.
Te falto configurar he inicializar los puertos, también modifique la parte de recepción,
por la forma en que el microcontrolador interpreta los caracteres que recibe.
Todo lo puedes cambiar a tu gusto conforme el tipo de interfaz que uses.
Yo use una que desarrolle para estos asuntos precisamente.
Adjunto el código más la simulación y una foto de como respondió el programa con los cambios.

Realiza los cambios que creas convenientes para adaptar el programa a tus necesidades.

Suerte y hasta luego.
 

Adjuntos

  • prueba 16F877A LM35.rar
    16.6 KB · Visitas: 11
  • LM35_RS232.gif
    LM35_RS232.gif
    32 KB · Visitas: 13
Última edición:
Atrás
Arriba