TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: yukardo en 09 de Julio de 2008, 16:01:49
-
Saludos.
Tengo un problema con el siguiente programa, el problema es que no se enciende el puerto B, con lo cual no me enciende un display que tengo conectado.
@ DEVICE pic16F876A
' Registro
cmcon=7
TRISB=0
TRISC=0
ADCON1=%10001110
' Variable
temp var word
result var byte
result2 var byte
digt var byte
digt2 var byte
'Definir los parametros del ADCIN
DEFINE ADC_BITS 10 ' Setear el numero de bits del resultado
Define ADC_SAMPLEUS 50
' Inicialización de variables
main:
ADCIN 0,temp
temp=temp-2
temp=temp*100
temp=temp*5
temp=temp/1024
if temp>273 then
temp=temp-273
low portA.5
else
temp=273-temp
high portA.5
endif
digt2=temp/10
lookup digt2,[%00111111,%00000110,%01011011,%01001111,%01100110,%01101101,%01111100,%00000111,%01111111,%01100111],result2
portb=result2
digt=temp-digt2*10
lookup digt,[%00111111,%00000110,%01011011,%01001111,%01100110,%01101101,%01111100,%00000111,%01111111,%01100111],result
portc=result
goto main
Espero que me ayuden a conseguir el error, sin mas me despido no sin antes agradecerles por su ayuda.
-
Los calculos estan mal, siempre salen los mismos valores.
digt2=102 y tiene que estar entre 0 y 9
digt = 127 y tiene que estar entre 0 y 9
temp = 223, no varia siempre da el mismo valor
-
Mira aqui, ya esta hecho:
http://www.todopic.com.ar/foros/index.php?topic=22366.0
-
No entiendo porque dice que salen los mismos valores. El valor de temp depende del resultado de la conversion ADC
-
Eso es lo raro, realiza los cálculos a mano para distintos valores de la entrada analógica a ver que es lo que te sale.
A mi me sale siempre lo mismo... :shock:
-
Bueno tenemos que revisar eso bien.
Pero el problema que tengo ahorita es que no me enciende el primer display, y nose cual es el error.
-
Que tal amigos!
Yukardo, en este codigo:
DEFINE ADC_BITS 10 ' Setear el numero de bits del resultado
Define ADC_SAMPLEUS 50
Le falto este:
DEFINE ADC_CLOCK 3
Aqui hay un problema:
main:
ADCIN 0,temp
temp=temp-2
temp=temp*100
temp=temp*5
temp=temp/1024
Como el adc lo tienes configurado para operar a 10 bits eso quiere dec
ir que puedes tener valores que van de 0 a 1023 :mrgreen:
a la variable temp le restas 2, luego la multiplicas por 100 y luego por 5 :shock: si temp vale por ejemplo inicialmente 1000 le restas 2 te queda 998 la multiplicas por 100 y te da 99800, ya aqui, te fregaste :D porque la variable declarada es word cuyo valor maximo puede ser 2 ^16 = 65536 y no 99800 y de alli pa bajo todo falla :(
Vas a tener un valor final en temp que no vas a conocer del todo.
lo que esta mas abajo en tu programa deberia sacar un valor por el portb no obstante.
Saludos
-
Que funcion cumple DEFINE ADC_CLOCK 3
-
Que funcion cumple DEFINE ADC_CLOCK 3
Ese define la fuente del reloj del adc mira el manual (http://www.melabs.com/resources/pbpmanual/) alli te explica.
Saludos
-
Gracias por el manual.
Ya he solventado un poco el problema.
-
Señores ya el programa funciona. Ahora tengo un detalle, el cual es el siguiente:
Cuando lo pruebo en fisico, marca el valor que deberia marcar pero al variar la entrada el display no cambia de valor. Luego que reseteo el pic si agarra el valor nuevo. Pareciera un problema de que el lazo no se esta realizando.
Espero su opinion.
-
Saludos.
Estoy realizando un termometro con Pic usando el 16F876a y en proteus me funciona perfecto pero en fisico no me funciona.
El error es que al variar el voltaje no se produce cambio en los displays, es decir siempre se mantiene el mismo numero. Si lo apago y lo enciendo nuevamente el numero cambia indicando un nuevo valor.
Aqui les dejo el programa y el archivo de proteus.
@ DEVICE pic16F876A
' Registro
cmcon=7
TRISB=0
TRISC=0
ADCON1=%10001110
' Variable
temp var word
result var byte
result2 var byte
digt var byte
digt2 var byte
aux var word
vmv var word
tempk var word
tempc var word
'Definir los parametros del ADCIN
DEFINE ADC_BITS 10 ' Setear el numero de bits del resultado
DEFINE ADC_CLOCK 3
Define ADC_SAMPLEUS 50
' Inicialización de variables
main:
ADCIN 0,temp
temp=temp*10
temp=temp*5
temp=temp/1024
temp=temp*10
aux=temp
if aux<298 then
temp=298-temp
vmv=temp/10
tempk=298-vmv
else
temp=temp-298
vmv=temp/10
tempk=298+vmv
endif
tempc=tempk-273
if tempk>273 then
high portA.5
else
low portA.5
endif
digt2=tempc/10
lookup digt2,[%00111111,%00000110,%01011011,%01001111,%01100110,%01101101,%01111100,%00000111,%01111111,%01100111],result2
portb=result2
digt=tempc-(digt2*10)
lookup digt,[%00111111,%00000110,%01011011,%01001111,%01100110,%01101101,%01111100,%00000111,%01111111,%01100111],result
portc=result
goto main
sin mas me despido esperando su ayuda.