TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: RALF2 en 22 de Octubre de 2007, 11:15:55
-
Que tal amigos!
Quisiera su ayuda con respecto al programa que coloco abajo el cual fue sacado del manual de proton.
Dicho programa me muestra 0.00 en la pantalla de la lcd que trae el simulador de proton no entiendo porque? :8}
Device = 16F877
XTAL = 4
LCD_DTPIN = PORTD.4
LCD_RSPIN = PORTE.0
LCD_ENPIN = PORTE.1
LCD_INTERFACE = 4 ' 4-bit Interface
LCD_LINES = 2
LCD_TYPE = 0
LCD_COMMANDUS = 2000
LCD_DATAUS = 50
Declare ADIN_RES 10 ' 10-bit result required
Declare ADIN_TAD FRC ' RC OSC chosen
Declare ADIN_STIME 50
Dim RAW As Word
Dim VOLTS As Float
Symbol QUANTA = 5.0 / 1024
Cls
TRISA = %00000001 ' Configure AN0 (PORTA.0) as an input
ADCON1 = %10000100 ' Set analogue input on PORTA.0
DelayMS 400
LOOP:
RAW = ADIn 0
VOLTS = RAW * QUANTA
Print At 1,1,DEC2 VOLTS,"V "
GoTo LOOP
End
-
Hola:
Me sucede lo mismo, y da una advertencia diciendo que posiblemente no se lo puede simular para la frecuencia que se está utilizando, lo has intentado probar en la realidad?
-
Que tal amigo lordlafebre!
Me haz aliviado en algo con tu respuesta, pues ya comensaba a pensar que mi proton se habia jodid... :lol:
He probado el circuito en fisico y no furula ( no funciona) tampoco, asi que al pareser es un problema del proton, eso creo.
Ya que de dos que lo hemos probado no funciona :?
El ejemplo que coloque lo simule con el proteus que trae el proton y no me da esa advertencia, no obstante no me funciona ni simulado ni montado en fisico con un pic16f876A.
Sigo esperando instrucciones :mrgreen:
-
Hola Ralf2, Hola Gio ! :)
En la línea
Print At 1,1,DEC2 VOLTS,"V "
Quitále el DEC2; que te quede la variable VOLTS solamente; y dejá que te muestre todos los decimales del float a ver si aparece algo más allá.
No olvidemos que 5/1024, dá 0,0048.... tal vez por eso te muestra 0.00.
Saludos.
Mario
-
Que tal marioguillote!
Mira dividi 5/15 y le quite el dec y no fifa (no funciona)
Le coloque el dec y me muestra 0.000
-
Hola:
Mario en DEC2 en este caso te indica cuantos numeros luego de la coma tomar.
-
Hola:
RALF2, prueba con esto:
'PIC a utilizar
Device 16F870
'Frecuencia
XTAL 4
Declare LCD_TYPE 0
Declare LCD_DTPIN PORTB.0
Declare LCD_ENPIN PORTB.4
Declare LCD_RSPIN PORTB.5
Declare LCD_INTERFACE 4
Declare LCD_LINES 2
'declaración del ADC
Declare ADIN_RES 10 ' 8-bits
Declare ADIN_TAD FRC ' RC OSC
Declare ADIN_STIME 50 ' muestreo 50us
Dim VAR1 As Word
TRISA = %00000001 ' AN0 (PORTA.0) como entrada
ADCON1 = %10000000 ' PORTA.0 entrada analógica
Cls
inicio:
VAR1 = ADIn 0 'VAR1 almacena el valor de la conversión
Print At 1,1,Dec VAR1
DelayMS 50
GoTo inicio
End
No es problema del ADIN, porque eso lo tengo funcionando, en la simulación y en la realidad, de pronto el problema está en las operaciones.
-
Que tal lordlafebre!
El programa que posteaste funciona bien el problema esta con las variables de tipo flotante ese es el problema en si.
El adin trabaja bien pero cuando uno realiza las operaciones en punto flotante alli es donde se complica todo!
Lo que me llama la atencion es que siendo un programa que esta en el libro del proton deberia trabajar bien y no entiendo porque.
El programa que postee es un voltimetro, pero no quiere trabajar. :(
-
Hola:
en realidad la división es la que genera ese "error", si divides manualmete Symbol QUANTA = 5.0 / 1024 nos da algo así como:
0.00488 si multiplicas el valor leido del ADC por eso tendrás la respuesta correspondiente.
'PIC a utilizar
Device 16F870
'Frecuencia
XTAL 4
Declare LCD_TYPE 0
Declare LCD_DTPIN PORTB.0
Declare LCD_ENPIN PORTB.4
Declare LCD_RSPIN PORTB.5
Declare LCD_INTERFACE 4
Declare LCD_LINES 2
'declaración del ADC
Declare ADIN_RES 10 ' 8-bits
Declare ADIN_TAD FRC ' RC OSC
Declare ADIN_STIME 50 ' muestreo 50us
Dim VAR1 As Word
Dim VOLTS As Float
Dim temp As Float
TRISA = %00000001 ' AN0 (PORTA.0) como entrada
ADCON1 = %10000000 ' PORTA.0 entrada analógica
Cls
inicio:
VAR1 = ADIn 0
VOLTS = VAR1 * 0.00488
Print At 1,1, Dec VOLTS,"V "
DelayMS 50
GoTo inicio
End
Está de revisar esto del punto flotante, mas que nada las divisiones, de pronto genera algun problema para pics de la serie 16.
-
Que lío, no es la serie 16, sucede lo mismo con un 18F452 :?, realizando la división manualmente como en el caso anterior funciona bien.
-
Ok ese truco si funciona :mrgreen:
Pero, deberia funcionar de la forma que coloque inicialmente, segun el manual :mrgreen:
Pero no es asi
Conclucion:
El proton tiene algunos problemitas respecto al manejo de variables tipo float.
Otra forma de resolver el problema: crea una variable tipo byte por ejemplo: dim var1 as byte.
haces var1 = 5.
luego creas una variable tipo float, por ejemplo dim flt1 as float.
luego flt1 = var1/1024
y finalmente volts = raw * flt1
Y funciona :-/
Gracias por su ayuda!
-
Hola:
Hay que revisar el tema de la división, a ver si podemos encontrar algo sobre eso.
-
Estoy trabajando en eso!
Te adelanto para que la division con decimales se lleve acabo bien sea el numerador y/o denominador tienen que ser una variable byte, word, dword o float.
Si divimos dos numeros con decimales o sin ellos no funciona :mrgreen:
Saludos
-
prueba quitamdole esto
Declare ADIN_STIME 50 ' muestreo 50us
puede q deba demorar mas y por eso no funcione
y juega cambiando esto :
ADCON1 = %10000000
por ADCON1 = %00000000
a veces sucede por esto :mrgreen:
-
Hola electronando!
Gracias por la ayuda!
Pero despues de varios dias de revizar y consultar con varios amigos, es conveniente que haga la siguiente reflexion :)
Todo lo que coloque referente a que el proton presentaba problemas con la division no es correcto, asi que les agradesco que obvien los comentarios que coloque arriba, para asi evitar confuciones.
Ayer cargue el programa en una PC de un amigo y corri el programa que postee, tal cual, y este me funciono perfecto, sin tener que modificar nada!
Donde estaba el problema entonces, la respuesta es en el WINDOWS, increible pero cierto alli estaba el problema, por lo que hoy me dedicare a reemplazarlo :(
Espero con esto aclarar el paronama a todos los que poseen el proton!
Saludos
-
Ralf2:
Como estas usando una resolucion de 10 bits, puede estar influyendo la justificacion del resultado.
es probable que este justificando a la derecha y no a la izquierda, prueba cambiando el bit 7 de este registro:
ADCON1 = %10000100 ' Set analogue input on PORTA.0
por esto:
ADCON1 = %00000100 ' Set analogue input on PORTA.0
es un posibilidad, no una certeza.