TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: hackyy en 08 de Noviembre de 2006, 04:06:24
-
tengo un problema y no se si es de programa o simulacion, porfavor echen una miradilla
al esquema y al programa.
A uso proteus 6.9 sp4 y proton+ beta8.
Gracias por adelantao.
device = 16f877
xtal = 20
lcd_dtpin = portd.4
lcd_rspin = porte.0
lcd_enpin = porte.1
lcd_interface = 4
lcd_lines = 4
lcd_type = 0
'all_digital= true
adin_res 10
adin_tad frc
adin_stime 50
dim raw as word
dim value as word
dim rpm as word
delayms 100
cls
trisb.1=1
trisa =%00000001
adcon1=%10000010
again:
if porta.1=0 then DELAYMS 50:gosub alta
raw = adin 0
value= raw/2.1
print at 1,1,"TEMP"
print at 1,8,dec value,"ºC"
print at 2,1,@raw," "
gosub faranhei
goto again
faranhei:
rpm=value*9/5+32
print at 3,1,dec3 rpm,"F"
return
end
-
Hola casi no uso proton, pero en tu codigo por ningun lado veo donde adquieras el valor del ADC, si veo que lo configures pero no veo Var= adcin.....
Y al principio veo que pones all digital=true, eso no te hace digitales todos los puertos?????.
Y en si cual es el problema??
-
Hola:
'all_digital= true
Eso no "lee" el compilador, esta entre comentarios, y si esta leyendo el valor analogico, con: raw = adin 0
comentanos mas cual es tu problema.
-
Perdonad la tardanza en responder, pero ando muy liado estos dias. El problema que tengo es que cuando el valor que mido es negativo (-0,010) no me visuliza en el lcd -1º se queda en cero. mi pregunta es si eso solo pasara en la simulacion o en el circuito montado tambien.
Gracias
-
generalmente el proteus hace lo mismo que el circuito fisico, pero eso es a veces.
Que sensor estas usando???, te pregunot para saber en que formato te da un valor negativo y asi saber si lo estas mostrando correctamente en el lcd.
Saludos
-
Voy a usar el lm35, de -50 a 150 ºC, pero en proteus he usado generador de -1V en la masa del potenciometro para simular el lm35 pero no baja de 0ºC por muy negativo que sea el voltaje. :( :(
-
Hola, pues el lm35 parece que entrega solo un rango de -1volt a 6volts, lo llegue a usar pero nunca con voltajes negativos. habria que ver. deja checo simulando yo tambien
-
Gracias navisimo, aqui te adjunto el datasheet del lm35, por que yo de ingle no se mucho a ver si nos ayuda en algo, creo que pone de -40, -55 a 150ºC.
-
Parte del problema es que tu código funciona solo para voltajes mayores de cero.
Esto se debe a que el convertidor trabaja solo con valores positivos.
A diferencia de los sensores digitales que contienen los valores en complemento 2', los que proporcionan voltaje nos lo dan "crudo" (como tu código).
Para superar este problema se me ocurren tres opciones:
1) Cambia de sensor por uno que te dé valores digitales (positivos y negativos).
2) Realiza un CAS (acondicionador de señal) con valores máximos y mínimos.
3) Implementa un "cambiador o elevador de nivel" para que con tu referencia de 0 a 5 volts puedas leer voltajes negativos (http://www.electronicdesign.com/Articles/ArticleID/12123/12123.html)
Si tu aplicación necesita temperatura negativa, deberás hacer lo que te propongo.
NUNCA podrás hacer que te marque temperaturas negativas con ese código; lo bueno es que es simulación, porque no debes meterle voltaje negativo al convertidor del µicro.
Espero te ayude la información.
-
Concuerdo con Mario y si el data lo tengo, ya lo he usado. La temeratura ala que trabaja es correcta, pero la salida es la que te decia lo que te entregaba de -1 a 6V
Yo estoy tratando de usar un TCN75 que tiene precision de .5 y tambien soporta temperaturas negativas al igual que un TC74 solo que este no tiene tanta precision
-
Gracias por la ayuda, pero podriais poner un ejemplo para poder entenderlo, soy nuevo en este mundillo, he visto algun ejemplo en pbp pero no se como aplicarlo en proton. Gracias de nuevo. :-/ :-/ :-/ :-/
-
perdon de cual sensor?????
-
Del lm35 o tc74, el que me resulte mas facil para programar :-/ :-/ :-/
Da gusto aprender con gente como la hay en este foro. :mrgreen: :mrgreen:
-
La pregunta aquí es:
¿Para qué lo vas a utilizar?
Si es para la escuela o para algún proyecto del trabajo, si medirás temperaturas negativas, todo eso.
Lo más sencillo es la adquicisión de voltaje (LM35) porque con lo otro necesitas tener una noción de I²C y leer la hoja de datos (aunque Navaismo ya lo utilizó).
-
el ejemplo del sensor i2c lo tienes el el post de como usar un sensor Tc74 (http://www.todopic.com.ar/foros/index.php?topic=14413.0) aqui mismo en el foro
-
Lo voy a usar para un cungelador, que no tiene reloj de temperatura y el termostato que tiene es una pequeña rueda que pone 1, 2, 3, 4.
Pero por usarlo en algo, pero lo mas inportante es para ir aprendiendo mas cosas de este mundillo que me roba el sueño.
Pero me gusta.
-
En proton, para leer y escribir el tc74 sabeis si es shin y shout? :-/
-
Bien bien, yo creo que seria mejor un sensor I2C ya que estos te entregan el valor ya leido, con los TC74 y TCN75 estamos aun en pruebas, hay un sensor en el mercado muy bueno segun se, es el DS1620 y no necestitas hacer conversiones AD. El DS1620 seria como el equivalente al TCN75 que aun no se prueba bueno aun no lo pruebo por falta de herramientas pero aqui hay codigo ejemplos de ese sensor ya calado. Checalo es una opcion tiene resolucion de .5°C y se netrega en 9bits el valor el data lo consigues facil.
Y en cuanto a lo de proton le voy mas BUSIN y BUSOUT
-
Ese sensor ya lo van a descontinuar (DS1620).
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2735
De todas maneras, aquí hay un ejemplo de cómo usarlo.
Lo único malo es que está en PBP y no en Proton, y Proton no lo he utilizado.
http://www.rentron.com/PicBasic/SERLED.htm
-
Bueno voy a ver como funciona el ds1620, ya habia empezado con el tc74 y nada, me visualiza 0ºC. Les pongo el codigo que he hecho.
device = 16f877
xtal = 20
lcd_dtpin = portd.4
lcd_rspin = porte.0
lcd_enpin = porte.1
lcd_interface = 4
lcd_lines = 4
lcd_type = 0
all_digital= true
symbol sclk portb.0
symbol sda portb.1
dim temp as byte
inicio:
busout sda,sclk,[$90,$00]
delayms 100
lectura:
temp= busin sda,sclk,$91
delayms 10
print at 1,1,"TEMPERTURA:",dec2 temp,"C"
goto lectura
end
por si iba en buen camino, no creo.
Probare el ds1620 ya que con el ds1307 ya lo esprimi al maximo. :-) :-)
-
Como hacias el codigo del TC74??, que tereminacion era el tuyo los hay TC74A0 hasta TC74A5.
Desconozco la sintaxis bien bien de Proton, pero en PBP era I2Cwrite sda, scl, $90,[00] para configuarcion normal.
No tengo DS1620 asi que no puedo probar tu codigo, sorry
Saludos
-
Hola, amigos, no me olvide del hilo, pero el curro no me deja mucho tiempo, navaismo, el codigo que pegue en el foro es del tc74, pero seguro que le falta codigo para la configuracion de arranque del tc74 y por eso no me funciona.
He seguido vuestra recomendacion de pasar al ds1620, y he tenido mas exito que con el tc74, pero me surgio un problema. El lcd me visualiza el doble de la temperatura que marca el ds1620, pero lo solucione gracias a un ejemplo que vi en proton.
Pero ahora tengo otro problema, cuando mido por bajo de cero me visualiza -255,254,253...etc.
aqui posteo el codigo que tengo:
device = 16f877
xtal = 4
lcd_dtpin = portd.4
lcd_rspin = porte.0
lcd_enpin = porte.1
lcd_interface = 4
lcd_lines = 4
lcd_type = 0
all_digital= true
Symbol RST = PORTc.0 ' Reset pin
Symbol DQ = PORTc.1 ' Data pin
Symbol CLK = PORTc.3 ' Reloj
dim temp as word
dim conv1 as word
dim conv2 as word
dim bcd_a_bin as word
dim index as word
index=9
Delayms 400 ' Wait for PICmicro to stabilise
Low RST ' Reset the device
Cls
conv2=1
MAINLOOP:
RST = 1 ' Enable device
Shout DQ, CLK, LSBFIRST, [$EE] ' Start conversion
RST = 0
Delayms 1000 ' Wait 1 second for conversion to complete
RST = 1
Shout DQ, CLK, LSBFIRST, [$AA] ' Send read command
Shin DQ, CLK, LSBPRE, [TEMP\9] ' Read 9 bit temperature
RST = 0
gosub bin_a_bcd
if conv2=0 then print at 1,1,"-",
if conv2=1 then print at 1,1,"+"
print at 3,1, bin temp
print at 4,1, dec conv1
' Display the decimal temperature
'Cls
Print at 1,3, Dec (TEMP >> 1), ".", Dec (TEMP.0 * 5), " Grados C"
Goto MAINLOOP ' Do it forever
bin_a_bcd:
select temp
case %111111110
temp=1 and conv2=0
endselect
return
End
:-/ :-/ :-/
-
Eso que te dé el doble lo especifica en la hoja de datos, cada incremento es ½ grado, por eso te daba el doble:
para 50 grados te da (100)(0.5) = 50
¿Podrías explicar qué hace la subrutina BIN_A_BCD?
No le entiendo a lo que pusiste.
Lo de que te marque -255, -254... no es raro.
Te recomiendo que preguntes por el último bit, ya que ese determina si es será positivo o negativo. Si es 1 es negativo, si es cero es positivo.
El que te dé 255, 254... no es muy complicado de saber, simplemente lee la hoja de datos:
para ½ grado es 0 0000 0001 porque cada incremento es ½ grado.
Para -½ grado sería el complemento a dos:
complementas 0 0000 0001
1 1111 1110
y le sumas 1
1 1111 1111 que es el 255 que te dá.
Para solucionar esto debes hacerlo a la inversa:
le restas a 1 1111 1111
- 1
1 1111 1110
y complementas
1 1111 1110
0 0000 0001 y tienes tu ½ grado pero negativo.
Espero te sirva.
-
Hola Mario, he intentado interpretar lo que me dices pero no consigo nada, llevo todo el fin de semana probando sin exito, te pongo el codigo para ver si ves el error.
device = 16f877
xtal = 4
lcd_dtpin = portd.4
lcd_rspin = porte.0
lcd_enpin = porte.1
lcd_interface = 4
lcd_lines = 4
lcd_type = 0
all_digital= true
Symbol RST = PORTc.0 ' Reset pin
Symbol DQ = PORTc.1 ' Data pin
Symbol CLK = PORTc.3 ' Reloj
dim temp as word
dim conv1 as word
dim conv2 as word
dim conv3 as word
dim conv4 as word
dim conv5 as word
dim conv6 as word
dim conv7 as word
dim total as word
dim bcd_a_bin as word
dim index as word
index=9
Delayms 400 ' Wait for PICmicro to stabilise
Low RST ' Reset the device
Cls
MAINLOOP:
RST = 1 ' Enable device
Shout DQ, CLK, LSBFIRST, [$EE] ' Start conversion
RST = 0
Delayms 1000 ' Wait 1 second for conversion to complete
RST = 1
Shout DQ, CLK, LSBFIRST, [$AA] ' Send read command
Shin DQ, CLK, LSBPRE, [TEMP\9] ' Read 9 bit temperature
RST = 0
' Display the decimal temperature
Cls
if temp>>8 =1 then print at 1,1,"-"
if temp>>8=1 then gosub bin_a_bcd
if temp>>8=0 then print at 1,1,"+"
Print at 1,3, Dec TEMP>>1 , ".", Dec TEMP.0 * 5, " degrees C"
print at 4,1,bin conv2
Goto MAINLOOP ' Do it forever
bin_a_bcd:
let conv1= temp
conv2=conv1-1 'aqui le resto 1
conv2=conv2 rev 9 'aqui complemento, eso creo pero no me funciona
let temp=conv2
return
End
sigue mostrandome -255 en vez de -1 :( :( :(
El gosub bin_a_bcd del codigo anterior, era para hacer pruebas.
gracias
-
Oye y tienes las resistencias PULLup en las lineas de comunicacion???
-
Manda al LCD CONV2 después de restarle 1. Despliégalo en forma binaria.
Complementa CONV2 y mándalo al LCD en binario.
Con eso te darás cuenta si está complementando o no.
Supongo que rotas la variable 8 espacios al hacer:
if temp>>8 =1 then print at 1,1,"-"
if temp>>8=1 then gosub bin_a_bcd
if temp>>8=0 then print at 1,1,"+"
Creo que deberías rotarla 9 veces ya que el noveno bit es el que te dice si es positivo o negativo; partiendo que no puedes rotar 0 veces, no puedes rotar el bit 0.
Lo que entiendo es que estás rotando del bit 1 al 8, no del bit 1 al 9. Sabemos que es bit 0,1,2,3,4,5,6,7,8,9. Pero (aunque no uso PROTON) no creo que al decirle al compilador 8 entienda que va el cero incluido.
Es mejor preguntar por el bit directamente. En PBP se hace asi:
IF TEMP.8=1 THEN ................ Pregunto si el bit 9 es 1. Aquí si puedes hacerlo así porque el compilador asume el bit cero de TEMP como el primero (0,1,2,3,4,5,6,7,8) y el bit 8 como el bit 9.
Navaismo:
Creo que sí tiene todo en orden ya que puede mostrar temperaturas positivas, solo que a la hora de desplegar la información no lo hace de manera correcta.
-
Bueno por fin, lo consegui.
Navaismo, si que tengo las resistencias pull-up, aunque en la simulacion del proteus, las quito y me funciona igual.
Mario, en proton el bit 9 es el 8 va de 0,1,2,3,4,5,6,7,8.
Y ahora el problema que tenia, resulta que el ds1820 deberia devolverme para -255 el valor 111111111, pero no es asi, me está devolviendo 111111110, o sea que el ds 1820 me devuelve el valor con la resta de 1:
111111111
-1
__________
111111110
Y yo sin darme cuenta, pero bueno os pongo el codigo final, si encontrais mejoras os agradezco que me las sugieran:
Codigo:
device = 16f877
xtal = 4
lcd_dtpin = portd.4
lcd_rspin = porte.0
lcd_enpin = porte.1
lcd_interface = 4
lcd_lines = 4
lcd_type = 0
all_digital= true
Symbol RST = PORTc.0 ' Reset pin
Symbol DQ = PORTc.1 ' Data pin
Symbol CLK = PORTc.3 ' Reloj
dim temp as word
dim conv1 as word
dim conv2 as word
dim conv3 as word
dim c as byte
dim conv5 as word
dim conv6 as word
dim conv7 as word
dim total as word
dim bcd_a_bin as word
dim index as word
index=9
Delayms 400 ' Wait for PICmicro to stabilise
Low RST ' Reset the device
Cls
MAINLOOP:
RST = 1 ' Enable device
Shout DQ, CLK, LSBFIRST, [$EE] ' Start conversion
RST = 0
Delayms 1000 ' Wait 1 second for conversion to complete
RST = 1
Shout DQ, CLK, LSBFIRST, [$AA] ' Send read command
Shin DQ, CLK, LSBPRE, [TEMP\9] ' Read 9 bit temperature
RST = 0
' Display the decimal temperature
Cls
if temp.8 =1 then print at 1,1,"-"
if temp.8 =1 then gosub bin_a_bcd
if temp.8 =0 then print at 1,1,"+"
if temp.8 =0 then conv5= temp
if temp.8=1 then conv5= conv2
Print at 1,3, Dec conv5>>1 , ".", Dec conv5.0 * 5, " GRADOS C"
Goto MAINLOOP ' Do it forever
bin_a_bcd:
let conv2= temp
if temp.0 = 1 then conv2.0= 0
if temp.0 = 0 then conv2.0= 1
if temp.1 = 1 then conv2.1= 0
if temp.1 = 0 then conv2.1= 1
if temp.2 = 0 then conv2.2= 1
if temp.2 = 1 then conv2.2= 0
if temp.3 = 1 then conv2.3= 0
if temp.3 = 0 then conv2.3= 1
if temp.4 = 1 then conv2.4= 0
if temp.4 = 0 then conv2.4= 1
if temp.5 = 1 then conv2.5= 0
if temp.5 = 0 then conv2.5= 1
if temp.6 = 1 then conv2.6= 0
if temp.6 = 0 then conv2.6= 1
if temp.7 = 1 then conv2.7= 0
if temp.7 = 0 then conv2.7= 1
if temp.8 = 1 then conv2.8=0
if temp.8 = 0 then conv2.8=1
conv2=conv2+1
return
End
P.D.: Y ahora a por el presostato.
Gracias a todos por la ayuda que me abies dado, espero subir de nivel y poder ayudar como ustedes.
:-/ :-/ :-/ :-/ :-/ :-/
-
Pues era eso.
No manejo ese integrado (aunque lo tengo) y no sabía que ya te daba la resta, solo necesitabas complementarla.
-
Pues no necesitas subir de nivel para ayudarnos....