En proteus simula correctamente, pero en realidad no funciona

Hola estoy haciendo el siguiente programa que modifica el valor PWM de una salida en funcion de dos entradas analógicas. Una va a ser un potenciómetro para seleccionar un voltaje en una fuente y el otro la salida de la fuente con el fin de regularla. El proyecto que hice es el siguiente, y tras varios problemas di con la solución y por lo menos di con la forma de que me simule en proteus el lcd y el pwm mas o menos.

Pero en la realidad el LCD muestra la primera linea en negro (y no es problema del ajuste de brillo) y el pwm no se mueve al mover el pot)

En Proteus el lcd funciona correctamente y el PWM si aumenta cuando tiene que aumentar, pero en vez de parar el punto mas alto (D=99% o 100%) empieza a variar la frecuencia y hace otro PWM con otra frecuencia.

Subo abajo el proyecto.


#include <16F876A.h>
#device adc=10
#use delay(clock=4000000)
#fuses NOWDT,XT, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, LVP, NOCPD, NOWRT
#include <LCD.C>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

long volt, salida;
int d=1; //de 0 a 132

void main()
{

setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,32,1);
setup_ccp1(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);


lcd_init();


do

{

set_adc_channel( 0 );
volt =read_adc();
set_adc_channel(1);
salida = read_adc();

if (volt>salida)
{
if (d<180)
d++;
}

if (volt<salida)
{
if (d>0)
d--;
}

set_pwm1_duty(d);

// ahora empezamos con las tareas del LCD

delay_ms(10);
printf(lcd_putc," \f v= %Ld,s= %Ld", volt, salida);
}while (1);



}


Les agradeceria que me ayuden para ver que estoy haciendo mal. Muchas gracias
 

Adjuntos

  • fuente_177.rar
    30.8 KB · Visitas: 136
Antes que nada, usá la directiva #use fast_io(puerto), por que ya tuve problemas con el PWM y el CCS tiene la maldita idea de no usar los puertos en forma directa, sino por medio de un registro intermedio.
Buscá el help del #use fast_io (ya ni me acuerdo si era así o fastio) y aplicáselo al puerto donde está el PWM.
 
Muchas gracias, no se me habia ocurrido pero en la realidad sigue sin funcionar, en el proteus ahora funciona mejor (no parpadea el LCD) pero ahora no me hace el PWM. Creo que no debe ser compatible el fastio con el PWM por lo que veo. Otra cosa, cuando poneis el osciloscopio en una de las patillas del cristal que veis? los 4Mhz verdad? es que yo veo continua. Todas las patilals del PIC se me ponen a 5V, excepto el cristal que esta a 1V y la salida del PWM en alta impedancia. No se que puede pasar, esto es muy raro.

Ah os pongo las advertencias que me da el proteus:
- ADC conversion empieza antes del "tiempo de espera" de la conversion previa. (Y eso que le meti 100ms de delay entre una y otra y nada)
-Puerto A(0) no configurado como entrada analogica (cuando si q lo esta)
-Referencia de voltaje para conversor ADC "yield" un rango de 0V (V+=0, V-=0) (no se que es yield)


Y una del LCD:
El controlador recibe un comado mientras esta "busy"(ocupado). (Pero si estoy usando la libreria de LCD.C se supone que ccs sabe cuanto tiempo le lleva al LCD hacer las cosas.



**Por cierto el LCD y el PIC funcionan, lo probe con un programa de otro foro (un probador de servos) y me muestra correctamente los caracteres (eso si no lo compile yo, solo le meti el HEX y el tio q lo hizo lo hizo en basic y no puso el codigo completo y me dice q "si se C tengo q saber Basic"). Ya no se que mas probar.
 
acabo de mirar salida por salida los pines del puerto b del LCD, y no hay pulsos por ninguno excepto por uno... cuando otro PIC que SI hace funcionar el LCD esta mandandole continuamente los datos (lo normal) dudo de la libreria del lcd.c del ccs... aunque ya dudo del ccs entero, ya que proyectos compilados por otros me van, y los mios ninguno
 
La variable 'd' del PWM declarala como long, a mi me pasaba algo similar. Cada que cambias de canal del ADC tienes que esperar un tiempo (no recuerdo si de 1 ms.) para iniciar la lectura. Intenté compilar tu código pero el CCS me marcá errores en la librería LCD.C :x
 
No se que pasa que no me deja publicar respuestas... me dice que escriba bien. Que cosa mas rara.

Resumen: revise todo el codigo habia algun error de tantas veces que lo cambie, puse los retardos de lectura ADC y ahora en proteus va sin errores, y voy a grabar el PIC a ver que pasa
 
Ahora si me dejó... pero no me dejó poner el codigo C, debe pensar que escribo mal :S al ver el codigo C.

Entonces el interesado en el codigo, o en el proyecto de la fuente que avise.

muchas gracias a todos por colaborar
 
Vah, esto es imposible ya entrado en desesperacion comente todo el codigo y puse el mitico pinON-delay-pinOFF-delay y no funciona!

Debe de ser mi programador mi protoboard o no tengo la mas minima idea de electronica o la suma de esto ultimo y mas lo anterior. Lo mas coñero es que pongo el HEX de otro proyecto que no hice yo y va todo como la seda! Algo estoy haciendo mal, y no se que es. Ya me era mejor comprarme la maldita fuente switching y punto .
 
aqui os subo mi proyecto:


ACORDAROS DE: al principio de todo hay un #include "b.h" que es el tipico include "C:\\archivos de programa\documentos... etcetera." pues ai poneis la dirección donde lo guardeis vosotros para luego compilarlo, bueno bien os dais cuenta, es simplemente para recordaros que lo cambie ai luego de guardarlo y le deje solo el nombre. ok?


muchas gracias
 

Adjuntos

  • proj_181.rar
    36.7 KB · Visitas: 125
Le modifiqué algunas cosas al circuito y a la programación, parece que corre bien es cosa de que le des una revisada, no sé que hace esto en el código :S

output_high(PIN_B0);
delay_ms(100);
output_low(PIN_B0);
delay_ms(100);
 
buff perdoon, es que como lo daba por imposible hice la prueba basica(encender y apagar)... que no resulto y lo deje asi guardado y me olvide de quitarlo. lo siento


ahora me pongo a mirar tus modificaciones
 
buff perdoon, es que como lo daba por imposible hice la prueba basica(encender y apagar)... que no resulto y lo deje asi guardado y me olvide de quitarlo. lo siento


ahora me pongo a mirar tus modificaciones

Hola, soy de Argentina y tengo el mismo problema que vos en el LCD, primera linea de color negro y no pasa nada. Ya probe de todo hasta grabar el codigo del ccs desde mplab pero no tuve suerte. Vos pudiste solucionar el problema? Ya probe con librerias diferentes del lcd.c y nada. Ni el programa mas basico hecho en ccs me anda realmente. En proteus una maravilla pero al grabarlo en el pic no funciona. Gracias desde ya
 
Hola a todos:

Actualmente estoy desarrollando un sistema de transferencia automatico para plantas electricas de baja capacidad. Esto lo estoy haciendo con el PIC 16F84A utilizando el lenguaje MIKROBASIC con su compilador, y simulando en PROTEUS. El caso es que en la simulacion el sistema funciona perfectamente, sin embargo al quemar el PIC y llevarlo a la placa y probar su funcionamiento, el mismo opera como lo espero pero las ultimas instrucciones no las lleva a cabo. Estas instrucciones son:

RED:
delay_ms(1000)
if porta.0 = 0 then portb.5 = 0 \'SI MG BLOQUEADO Y HAY FALLA DE RED ENTONCES DESENCLAVA CONTACTOR DE RED
portb.2 = 1
delay_ms(1000)
end if
if porta.0 = 1 then portb.5 = 1 \'SI MG BLOQUEADO Y RED NORMAL ENTONCES ENCLAVA CONTACTOR DE RED
end if
GOTO RED

Ya he cambiado varias veces el PIC pero sigue igual, tambien he cambiado la forma de estas instrucciones y nada.

De acuerdo a esto, mi duda es si este problema se podria deber a algunas de las siguientes causas:

a.- Demasiadas lineas de programacion: El software tiene un total de 157 lineas. Si fuese esto mi pregunta es ¿cuantas son la maxima cantidad de lineas permitidas por este pic?. En m caso cada linea es una instruccion incluyendo el encabezado del programa.

b.- Estoy utilizando demasiados IF -- END IF: Cabria la mima pregunta en el sentido si hay un limite de veces de uso de esta instruccion.

Mucho les sabria agradecer su ayuda.

Saludos, ...
 
Nunca dejes de lado que un simulador es eso, una simulacion, es decir algo que se parece a... sin ser igual a a..
Sirve bien para quien conoce la herramienta bien, si no de lo conrario es una trampa.
Hace una cosa bajate el picsimultoride de Oshon y pone el hex alli tenes varias herramientas para hacer debug muy interesantes
 
a.- Demasiadas lineas de programacion: El software tiene un total de 157 lineas. Si fuese esto mi pregunta es ¿cuantas son la maxima cantidad de lineas permitidas por este pic?. En m caso cada linea es una instruccion incluyendo el encabezado del programa.

Cuando el programa no cabe en el pic, normalmente el grabador da una advertencia que no cabe, el numero de lineas en basic no cuentan, mas bien es el numero de instrucciones en ensamblador.

b.- Estoy utilizando demasiados IF -- END IF: Cabria la mima pregunta en el sentido si hay un limite de veces de uso de esta instruccion.
no hay limite, con excepcion del tamaño del codigo generado en ensamblador.

tu problema normalmente es asociado con la falta de configuracion de los fuses (oscilador, etc), pero es dificil saber si no esta el codigo completo y el diagrama.
 
Es algo obvio pero si realmente quieres descartar que el problema es por el tamaño del programa... puedes probar con otro pic con mas capacidad?? o no??... Pude hacer programas bastante grandes en pic sin muchos problemas pero si los tuve que estructurar/indentar y comentar muy bien... sino es muy difícil revisar...

Ya no uso nada que tenga en su nombre "basic", (me traumé al nunca poder hacer multihilo en vb6 :oops:)
 
Ya no uso nada que tenga en su nombre "basic", (me traumé al nunca poder hacer multihilo en vb6 )

no hay porque traumarse, sino cambiar de basic, hasta donde recuerdo si nadie me corrije, visual basic .net ya implementa el multitask, recordemos que cuando aparacio el multitask el VB6 ya era un anciano, seguramente el C de borland tampoco lo soprtaba... en fin hay que irse actualizando XD y seguramente se puede hacer pero casi a pie, utilizando dll's y cosas asi.
 
Atrás
Arriba