[Tutorial] y manejo de proton IDE

Hola. estoy desarrollando un proyecto para medir temperatura utilizando un lm35 y PIC 16f877a.
soy nuevo en esto y es i primer proyecto. quisiera saber como cambio el estado de un puerto. por ejemplo tengo un el portc.5 = 0 y quiero ponerte un switch que al apretarlo me coloque ese mismo puerto en 1 y así prender un led para decir que mi lm35 esta funcionando. o si hay otra forma de hacerlo

si alguien me pudiera ayudar estaría muy agradecido
Para saber como se cambia de estado un pin, deberías leer el tema desde el principio "Ahí está explicado"
Normas del Foro 16) Antes de preguntar algo en un post. ¡ Lee (Y mira) todo el contenido !

En cuanto a qué con encender un LED ya quiera significar que el LM35 esté funcionando, Nop.
Quizás eso te sirva para indicar que estás encendiendo el termómetro, más no que funcione.
Eso necesita cierta rutina. Podrías hasta incluir comparaciones de temperatura, etc.

Adjunto un sencillo ejemplo con el LM35 a 10 Bits y un LCD 16x2

Lo que le quieras agregar ya corre por tu cuenta.

Suerte.
 

Adjuntos

oye gracias por tu ayuda. pero si no es mucho pedir me puedes explicar algo.
la parte de la formula que utilizas en tu ejemplo: 19712 es el valor leído por el ADC a 1.5V (Voltaje máximo a 150°C). me puedes decir que es ADC? según lo que entiendo es el valor que recibe el puerto cuando entran 1.5v? estoy en lo cierto?

gracias
 
19712 es el valor leído por el ADC a 1.5V (Voltaje máximo a 150°C). me puedes decir que es ADC?
ADC = Analog Digital Converter.
Son las siglas en ingles de Conversor Analógico Digital.
según lo que entiendo es el valor que recibe el puerto cuando entran 1.5v? estoy en lo cierto?
Sip. Al configurar la conversión a 10 Bits, ese es el valor leído por el ADC.
 
Oye gracias entendí.

Ahora tengo un pequeño problemita, el programa no hace lo que quiero, el programa que quiero hacer es sensar la temperatura con el lm35, si la temperatura es menor o igual a 18 que prenda el segundo led y apague los otros 2, y si esta entre 19 y 34 osea que si es mayor que 18 y menor que 35 encienda el tercer led, y si es mayor que 35 encienda el 4t0 y apague los demás, el led 1 lo utilizo para indicar que el lm35 esta funcionando,

Código:
Device = 16F877A
XTAL 4



'parámetros del conversor analógico
Declare ADIN_RES = 10       ; 10 bits de resolución
Declare ADIN_TAD = FRC      ; Seleccionar RC OSC
Declare ADIN_STIME = 50     ; 50uS para tiempo de muestreo

Dim ADC_Value As Word     
Dim Temperatura As Float 

TRISC = 0

INICIO:
               
  PORTC.5 = 1
  PORTC.0 = 0
  
  ADC_Value = ADIn 0 
  Temperatura = ADC_Value * 150 / 19712 
  
     If Temperatura <= 18 Then 
     PORTC.2 = 1
     PORTC.3 = 0
     PORTC.4 = 0
     End If
      
     If Temperatura > 18 And Temperatura < 35 Then
     
     PORTC.3 = 1
     PORTC.2 = 0
     PORTC.4 = 0
     
     End If
     
     If Temperatura >= 35 Then
     
     PORTC.4 = 1
     PORTC.2 = 0
     PORTC.3 = 0
     End If
     
  DelayMS 500  

    
  GoTo INICIO
Estoy utilizando proton ide y el simulador en proteus con un PIC16f877A


Ajunto lo que he hecho para me ver si tengo algo mal o alguna sugerencia de como lo puedo arreglar.

Gracias por su tiempo.
 

Adjuntos

Última edición por un moderador:
ahora tengo un pequeño problemita el programa no hace lo que quiero, el programa que quiero hacer es sensar la temperatura con el lm35, si la temperatura es menor o igual a 18 que prenda el segundo led y apague los otros 2, y si esta entre 19 y 34 osea que si es mayor que 18 y menor que 35 encienda el tercer led, y si es mayor que 35 encienda el 4t0 y apague los demas , el led 1 lo utilizo paa indicar que el lm35 esta funcionando,
Código:
Device = 16F877A
XTAL 4



'parámetros de conversor analógico
Declare ADIN_RES = 10       ; 10 bits de resolución
Declare ADIN_TAD = FRC      ; Seleccionar RC OSC
Declare ADIN_STIME = 50     ; 50uS para tiempo de muestreo

Dim ADC_Value As Word     
Dim Temperatura As Float 

TRISC = 0
'Puedes agrega TRISA = 1 o TRISA.0 = 1 ya que utilizaras el ADC0 

INICIO:
               
  PORTC.5 = 1' [COLOR=Blue]Puedes implementar el commando Toggle PortC.5 y el led parpadeara cada vez que pase por aquí el programa[/COLOR] [COLOR=Blue]en vez de quedar permanentemente encendido[/COLOR]
  PORTC.0 = 0 '[COLOR=Red]Lo usas como entrada aun que mal ya que el ADC no esta en ese pin y NO DEBES poner a cero[/COLOR] [COLOR=Red]una entrada ya que solo toma el valor externo[/COLOR].

  ADC_Value = ADIn 0 
  Temperatura = ADC_Value * 150 / 19712 
  
     If Temperatura <= 18 Then 
     PORTC.2 = 1
     PORTC.3 = 0
     PORTC.4 = 0
     End If
      
     If Temperatura > 18 And Temperatura < 35 Then
     
     PORTC.3 = 1
     PORTC.2 = 0
     PORTC.4 = 0
     
     End If
     
     If Temperatura >= 35 Then
     
     PORTC.4 = 1
     PORTC.2 = 0
     PORTC.3 = 0
     End If
     
  DelayMS 500  

    
  GoTo INICIO
estoy utilizando proton ide y el simulador en preteus con un PIC16f877a


ajunto lo que he hecho para me ver si tengo algo mal o alguna sugerencia de como lo puedo arreglar

GRACIAS POR SU TIEMPO
Hola...Verifica el esquema que te adjunto ya que en el tuyo colocabas el LM35 donde NO esta el ADC del PIC...debes leer la hoja de datos del pic a utilizar ya que no todos los PIC tienen las mismas soluciones de hardware en el mismo lugar.
Envuelve si vas a pegar código aquí en la etiqueta que dice CODE que es mas fácil para transportar y respeta la estructura de lo escrito.
El pin MCLR debes mandarlo a estado estado alto si no no arranca el programa.
Revisa las aclaraciones que realice al código que esta mas arriba en este mensaje resaltado en colores.
La lógica esta bien pero se puede simplificar.

Saludos.

Ric.
 

Adjuntos

gracias por tu ayuda me a servido mucho. :apreton:

pero tengo en problemas en abrir tu simulacion me sale este error: (archivo adjunto)
me gustaria verlo

utilizo el proteus 7 professional
 

Adjuntos

Última edición:
buenas tardes amigos de la comunidad, estoy probando un buzzer y no he podido cambiar el tono sigue igual a pesar de los camandos que le coloque, espero me puedan decir que estoy haciendo mal o que esta mal, este es el programa:
adjunto tambien el pic en proteus.
edito: ah otra cosa cuando le coloco que si el pulsador sea igual 1, suena como un ruido en blanco. =)

Código:
device 16f877
Config XT_OSC,CP_OFF,CPD_OFF,WDT_OFF,PWRTE_ON,BODEN_OFF,LVP_OFF
xtal=20 

TRISB = 1
TRISC = 0
Dim a As Byte
symbol buzzer=portC.0
SYMBOL BOTON=PORTB.0
all_digital=1

inicio:
FOR A=1 TO 120  STEP -1
SOUND BUZZER,[a,50]
next a
end
;IF BOTON=1 THEN
;DELAYMS 300
;Sound buzzer,[10,50]
;DELAYMS 1000
;Sound buzzer,[78,200]
;DELAYMS 1000
;Sound buzzer,[88, 100]
;DELAYMS 1000
;Sound buzzer,[119, 100]
;ELSE
;BUZZER=0
;END IF
END INICIO
 

Adjuntos

Última edición por un moderador:
excelente!! GRACIAS!!, estaba probando con un speaker segun la ayuda de proton al usar el comando "freqout", pero sonaba super bajito. espero que con el sounder pueda hacer mi programa completo, por fin. jiji :oops::D
 
Que tal foro, buenas tardes, bueno pues los 2 comentarios anteriores a este me sirvieron mucho, ya que estoy en un proyecto, al ver el programa proporcionado por D@rkbytes "16F877A Termómetro LM35 II.rar " me surgió una duda de si puedo usar el ds18b20 en vez del lm35 para este programa, desde ya muchas gracias.
 
Última edición:
Que tal foro, buenas tardes, bueno pues los 2 comentarios anteriores a este me sirvieron mucho, ya que estoy en un proyecto, al ver el programa proporcionado por D@rkbytes "16F877A Termómetro LM35 II.rar " me surgió una duda de si puedo usar el ds18b20 en vez del lm35 para este programa, desde ya muchas gracias.
Nop.
No son iguales, el LM35 es un sensor análogo, y el DS18B20 es un sensor digital.
Así que el programa, es totalmente diferente al que se usa para el DS18B20

Aquí esta un proyecto para el DS18B20

Saludos.
 
muchas gracias D@rkbytes, abusando un poco, hice los siguiente, busque acerca de como hacer la converción en caso de querer medir voltaje, y di con la siguiente formula:

ADC_Value = ADIn 5
voltaje=ADC_Value * 5 / 65535

para medir de 0 a 5 volts, pero en caso de que yo quiera medir un voltaje de 0 a 20 volts, no entiendo muy bien como se usa la fórmula para dicha converción, desde ya muchas gracias por la ayuda.
 
muchas gracias D@rkbytes
De nada. (y)
busque acerca de como hacer la conversión en caso de querer medir voltaje, y di con la siguiente formula:

ADC_Value = ADIn 5
voltaje=ADC_Value * 5 / 65535

para medir de 0 a 5 volts, pero en caso de que yo quiera medir un voltaje de 0 a 20 volts,
no entiendo muy bien como se usa la fórmula para dicha conversión, desde ya muchas gracias por la ayuda.
Pues si, así sería, para medir de 0 a 5V, pero los valores como ese de 65535, cambian.
Para que entiendas como determinar el factor de división, adjunto un ejemplo con la explicación.

Saludos.
 

Adjuntos

Osea que según entiendo, el procedimiento para determinar el 65535 o el 63168 (este último como en el ejemplo que me acabas de pasar) es ver el valor tope (por así decirlo) de ADIn que se tiene al medir los 20v efectivos, obviamente siempre que se pase a un voltaje adecuado para el PIC, es correcto esto?
 
Osea que según entiendo, el procedimiento para determinar el 65535 o el 63168 (este último como en el ejemplo que me acabas de pasar) es ver el valor tope (por así decirlo) de ADIn que se tiene al medir los 20v efectivos, obviamente siempre que se pase a un voltaje adecuado para el PIC, es correcto esto?
Pues si, sin embargo el valor que tome, es el valor a través de los componentes del divisor de tensión.
Y por eso dije que ese valor cambia, debido a las tolerancias de los mismos.
Si aplicamos +5V directamente, la lectura directa debe ser de 65472, así como está el código.
Y he aquí un error mio en la programación, ya que deberíamos obtener como lectura 1023
que son los 10 Bits b'1111111111' = 1023, para esto debí haber configurado el registro ADCON1
con el bit 7 a 1 :oops: y entonces si obtendremos como lectura 1023 al tope del ADC.
Esto haría tener una justificación a la derecha de la lectura,
y los 6 bits más significantes de ADRESH serían leidos como ceros.

Ahora entonces, tendrás que hacer la correspondiente modificación al programa. ;)

Suerte.
 
Nop.
No son iguales, el LM35 es un sensor análogo, y el DS18B20 es un sensor digital.
Así que el programa, es totalmente diferente al que se usa para el DS18B20

Aquí esta un proyecto para el DS18B20

Saludos.
buenas noches foro, tengo una duda, ¿como hago para guardar el estado de un puerto para usarlo despues y mandar a hacer una instruccion dependiendo del estado de este?, y otra preguntita y disculpen el abuso, ¿mientras se este ejecutando una linea del programa, no puedo hacer otra cosa? por ejemplo ver si un boton fue presionado y hacer tal cosa. de ante mano gracias. :)