# En proteus simula correctamente, pero en realidad no funciona



## guaifi (Feb 28, 2009)

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


----------



## Dr. Zoidberg (Feb 28, 2009)

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.


----------



## guaifi (Feb 28, 2009)

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.


----------



## guaifi (Feb 28, 2009)

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


----------



## cristian_elect (Feb 28, 2009)

En tu programa la variacion del pwm lo hace muy rapido y no hay los retardos(us) para la convercion ADC. El pin rw esta a tierra o pin2 del puerto.


----------



## LIAMNEESON (Mar 1, 2009)

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


----------



## guaifi (Mar 1, 2009)

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


----------



## guaifi (Mar 1, 2009)

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


----------



## guaifi (Mar 1, 2009)

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 .


----------



## LIAMNEESON (Mar 1, 2009)

Igual y si jaja, por que no subes tu proyecto ?


----------



## guaifi (Mar 1, 2009)

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


----------



## LIAMNEESON (Mar 1, 2009)

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);


----------



## LIAMNEESON (Mar 1, 2009)

Se me olvidaba resubirlo jeje


----------



## guaifi (Mar 1, 2009)

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


----------



## maianus (Dic 11, 2009)

guaifi dijo:


> 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


----------



## GAWAIN (Mar 15, 2015)

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, ...


----------



## pandacba (Mar 15, 2015)

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


----------



## papirrin (Mar 15, 2015)

> 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.


----------



## VIKKOSKY (Mar 15, 2015)

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 )


----------



## papirrin (Mar 15, 2015)

> 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.


----------



## ricbevi (Mar 15, 2015)

GAWAIN dijo:
			
		

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



Entonces que quedaría para este programa que funciona de maravillas 365 x 24hs y tiene al microcontolador usado a mas de 97%.(es de una central de alarma multi-funcion).  



			
				GAWAIN dijo:
			
		

> 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, ...



Como te dijeron anteriormente si el compilador no te da errores no es problemas de IF...etc; debes averiguar que etas haciendo mal en la vida real o no para que este no funcione allí. 
Saludos.

Ric.


----------



## YOUNGBLOOD (Mar 16, 2015)

Buenas. Tengo el mismo problema.
En el Proteus anda bárbaro y  el código corre bien, pero a la hora de probar en el circuito armado, no funciona.
No sé qué hacer con los terminales del PIC que no utilizo. ¿Dónde los referencío?
El microcontrolador utilizado es un 16F877A y estoy iniciandome en lenguaje ensamblador. 

Estoy haciendo un monitor de tensión y corriente sin pantalla LCD.
Toma las señales desde un amplificador operacional en modo buffer y otro en modo seguidor de tension.

Utilizo 4 canales de conversión A/D con dos potenciometros, uno conectado al terminal Vref+ y el otro conectado al terminal vref- y por software compara lo adquirido en un canal y devuelve el resultado encendiendo un led, rojo, verde y otro Amarillo.

El programa no es de mi autoría. Buscando ejemplos de programación, lectura de bibliografía y programación en Nipple, saqué algo de lo que ahora está funcionando.

Dejo el código y la simulación del proteus con cristal de 20Mhz.


```
list        p=16f877A    ; 
    

#include    "p16f877 

  __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF



resultado1_adc equ 0x20


resultado2_adc equ 0x21


delay          equ 0x22 ; 



    

ORG 0x00
;

inicializacion del micro
    

bcf STATUS, RP0
    

bcf STATUS, RP1  ;seleccion Bank0
    

clrf PORTA
    

movlw 0x1F
    
movwf PORTB
    
bsf STATUS,RP0  ;seleccion Bank1
    
movlw 0x02
    
movwf ADCON1
    
movlw 0x1F
    
movwf  TRISA
    
movlw 0xC0
    
movwf TRISB
    
bcf STATUS,RP0  ;seleccion Bank0
    
   

mainloop:

;senso ADC0
    
movlw 0x81
    
movwf ADCON0    ; 
ADCS1=1 ,ADON=1
    
movlw  0x32
    
movwf  delay
d0:
    
decfsz  delay   ;delay necesario para cumplir
    
goto   d0       ;requisitos de Tadq
    
movlw 0x85
    
movwf ADCON0 ; 
ADCS1=1 ,GO=1 ,ADON=1

espero_adc0:
    
nop
    
btfsc ADCON0 , 2
    goto espero_adc0
;almaceno valor 1
    
movfw  ADRESH
    
movwf  resultado1_adc

;senso ADC1
     
movlw 0x89   ; ADCS1=1 ,CHS0=1 ,ADON=1
     
movwf ADCON0
     
movlw  0x32
     
movwf  delay
d1:
    
decfsz  delay   ;delay necesario para cumplir
    
goto    d1      ;requisitos de Tadq
    
movlw 0x8D   ; ADCS1=1 ,CHS0=1 ,GO=1 ,ADON=1
    
movwf ADCON0
espero_adc1:
    
nop
    
btfsc ADCON0 , 2
    
goto espero_adc1
;almaceno valor 2
    
movfw ADRESH
    
movwf resultado2_adc


;proceso de comparacion
    
movfw resultado1_adc    ;
    
bsf    STATUS , C       ;Set bit C,preparado para comparacion
    
subwf  resultado2_adc
    
btfsc STATUS, Z
    
goto adc0_igual_adc1
    
btfsc  STATUS , C
    
goto adc0_menor_adc1
;muestro resultado
;adc0 mayor a adc1(Vin<Vref)
    
bsf PORTB,0
    
bsf PORTB,1
    
bcf PORTB,2
    
goto sensa_adc2

adc0_menor_adc1:
    
bsf PORTB,2
    
bsf PORTB,1
    
bcf PORTB,0
    
goto sensa_adc2

adc0_igual_adc1:
    
bsf PORTB,0
    
bsf PORTB,2
    
bcf PORTB,1

;senso ADC2
sensa_adc2:
    
movlw 0x91
    
movwf ADCON0 ; ADCS1=1 ,CHS1=1 ,ADON=1
    
movlw  0x32
     
movwf  delay
d2:
    
decfsz  delay   ;delay necesario para cumplir
    
goto    d2      ;requisitos de Tadq
    
movlw 0x95
    
movwf ADCON0 ; ADCS1=1 ,CHS1=1 ,GO=1 ,ADON=1
espero_adc2:
    
nop
    
btfsc ADCON0 , 2
    
goto espero_adc2
;almaceno valor 1
    
movfw  ADRESH
    
movwf  resultado1_adc

;senso ADC3
    
movlw 0x99   ; ADCS1=1 ,CHS1=1 ,CHS0=1 ,ADON=1
    
movwf ADCON0
    
movlw  0x32
    
movwf  delay
d3:
    
decfsz  delay   ;delay necesario para cumplir
    
goto    d3      ;requisitos de Tadq

    
movlw 0x9D   ; ADCS1=1 ,CHS1=1 ,CHS0=1 ,GO=1 ,ADON=1
    
movwf ADCON0
espero_adc3:
    
nop
    
btfsc ADCON0 , 2
    
goto espero_adc3
;almaceno valor 2
    
movfw ADRESH
    
movwf resultado2_adc

;comparo
    
movfw resultado1_adc    ;
    
bsf    STATUS , C       ;Set bit C,preparado para comparacion
    
subwf  resultado2_adc
    
btfsc STATUS, Z
    
goto adc2_igual_adc3
    
btfsc  STATUS , C
    
goto adc2_menor_adc3

;muestro resultado
;adc2 mayor a adc3
    
bsf PORTB,3
    
bsf PORTB,4
    
bcf PORTB,5
    
goto mainloop

adc2_menor_adc3:
    
bsf PORTB,5
    
bsf PORTB,4
    
bcf PORTB,3
    
goto mainloop

adc2_igual_adc3:
    
bsf PORTB,3
    
bsf PORTB,5
    
bcf PORTB,4

    
goto mainloop ;

 END
```


----------



## papirrin (Mar 16, 2015)

Los pines que no utilizo los pongo como de entrada y los conecto a tierra.


----------



## YOUNGBLOOD (Mar 16, 2015)

Buenas. Gracias por la respuesta.
Pregunta: ¿Cómo configurar por software las entradas de los terminales q*ue* no utilizo?
Como es tecnología CMOS he leído bastante y no he encontrado coincidencia en lo que realicé en el circuito montado con sus componentes y demás.
En los terminales no utilizados coloqué un resistor de 4.7KΩ y a VDD.


----------



## papirrin (Mar 16, 2015)

Bueno en gustos se rompen generos y yo tampoco he visto nada  escrito por microchip.
 Pero los dejo como entrada porque el registro TRIS al iniciar el pic estan como entrada  o sea el registro TRIS=255, entonces solo los dejo igual  y cambio los que voy a ocupar como los necesite y los conecto a tierra asi si por accidente lo toco con el positivo o negativo no le pasa nada al pic.


----------



## YOUNGBLOOD (Mar 16, 2015)

gracias por la respueta; voy a probar y luego comento como fue.- gracias


----------

