# Proteus no entra en las funciones al simular con CCS  (PIC16F877A)



## Nawy (May 16, 2012)

Hola a todos!

Antes de nada saludar a todos ya que soy nueva en el foro y daros las gracias ya que llevo un par de meses comiendome la cabeza con algunos temas electrónicos y he ido encontrado las diversas solución en este foro ^^

Estoy tratando de simular un programilla muy sencillo en mplab con el compilador CCS sobre una placa de Proteus, y al principio funcionaba todo bien, sin embargo, he empezado a poner funciones (procedimientos) en mi código y cual es mi sorpresa cuando puedo comprobar que en la simulación el programa no me entra en la función que he llamado.

El código en cuestión funciona en la placa física, por lo que no se si tendré el error en el Proteus o en el mplab, pero me estoy volviendo loca...

Agradezco cualquier opinión ya que he agotado todas las que se me han ocurrido a mi...

Un saludo!


----------



## Moyano Jonathan (May 16, 2012)

> he empezado a poner funciones (procedimientos) en mi código y cual es mi sorpresa cuando puedo comprobar que en la simulación el programa no me entra en la función que he llamado.



Es por que justamente es un simulador, no tiene en cuenta absolutamente todas las cosas que se pueden presentar en un programa. 



> El código en cuestión funciona en la placa física, por lo que no se si tendré el error en el Proteus o en el mplab, pero me estoy volviendo loca...



Si te funciona en la realidad, por que te haces problema por el proteus ? El solo hecho que en la realidad funcione te está dando un indicio de que el proteus tiene el problema y no tu programa.

Saludos !


----------



## Nawy (May 16, 2012)

Muchísimas gracias por tu rápida respuesta Moyano 

Ya veo que mi problema era el pensar que el Proteus me simularía de la misma forma que la placa física... ¡Qué desilusión!



> Si te funciona en la realidad, por que te haces problema por el proteus ?



El lío es porque quería simular programas mayores (metiendo LCDs, teclados matriciales, etc) y simularlo con el proteus, sin necesidad de hacer la placa y como en los programas "grandes" es difícil encontrar el problema, cuando notaba que algo no me iba (como es el caso de no entrar en las funciones) probaba con un programa pequeño que pudiese cargar en una placa que tengo... supongo que me tocará hacer toda la placa (que pereza...)

Gracias de nuevo! al menos ya puedo parar de darle vueltas al Proteus


----------



## Nawy (May 18, 2012)

Antes de nada, perdón por hacer doble post, pero no se muy bien como editar ^^'

He encontrado la solución; Proteus te entra en las funciones, el problema era el compilador, al probar con otra versión del CCS ha funcionado como si nada ^^

Espero que sirva de ayuda por si alguien tiene el mismo problema.

Gracias de nuevo


----------



## Berto75 (Jul 26, 2015)

Holas. Yo el HEX lo genero en CCS. Pero cuando se lo cargo al pic de Proteus. Este no responde. Nunca atiende a lo que escribo de nuevo en el codigo y si borro algo del codigo, proteus sige ejecutandolo aunque ya no exista , me ocurre tambien con los proyectos de los demas. Es la segunda vec que me pasa (no se lo que ocurrio para que volviese a funcionar). Siempre que abro Proteus aparece el siguiente mensaje en Ingles:

Schematic Capture
No se puede localizar el predeterminado de archivo de plantilla predeterminado DTF por favor,  Compruebe la configuración de ruta.

Aunque no estoy seguro que tenga algo que ver siempre a salido y a pesar de ello todo funcionaba bien estos ultimos 15 dias, por todo lo que e visto creo que se puede descartar que sea un problema del CCS a la hora de crear el .hex


----------



## TRILO-BYTE (Jul 26, 2015)

desinstala y vuelve a instalar si funciona bien 

si ya no existe el .hex y lo sigue ejecutando es por que no le diste stop a la simulacion


----------



## Berto75 (Jul 26, 2015)

La ultima vec anterior que ocurrio esto no tuve que desinstalar-instalar de nuevo pero si gigue asi es lo unico que se me ocurrea mi tambien.
De todas maneras esto no es mui valido que haga cada vec que ocurre. Me a echo perder toda la mañana.

Hay otra cosa que e visto ahora. Cuando e vuelto a abrir el proyecto Proteus no recuerda nunca donde estan ubicados los .hex de cada micro. Tengo que volver a cargarlos solo entonces los ejecuta pero da igual que los modifique el codigo y compile. Solo hace lo viejo.

¿A ti esto te dice algo?


----------



## TRILO-BYTE (Jul 26, 2015)

no nada de eso el proteus que tenia era el 7.no me acuerdo ese estaba bueno

descargue el 8 y ese da problemas distintos no hace debug steep steep
entre otras cosas como no reconocer los viejos schematic de proteus 7

pero si cuando empieza a fallar no se si sea problema de las keys o de un archivo corrupto ami me paso que abria e inmeiatamente cerraba pues las keys que instale no eran aunque lo que hise fue meter una actualizacion que trono mi proteus


----------



## Berto75 (Ago 24, 2015)

Este proyecto simula el surtidor de una gasolinera.
Algo falla al elegir el importe en Euros y no consigo ver qué es, siempre echa algo de más con esta opción.
La función afectada es; ACCIONGATILLO(). La he dejado señalada con /////////


```
void ACCIONGATILLO(int see,int mira,float mteria,float eur){ // see = ser = TIPO COMBUSTIBLE 0 a 2
float topM; float topE; float mony; float surt;                // mira = INPORTE L o $
topM=mteria;  topE=eur*mteria;
mony=0.001; 
mteria=0.001;
surt=0.4;
lcd_gotoxy(1,4);
switch (mira){ ///  1 combustible  2 euros  default indefinido
case 1:  //// combustible ----> euros
while(topM>mteria){//wil1
 if (Input(PIN_c1)){
lcd_putc("\f"); lcd_gotoxy(1,1);
  LITRON(see,topM,topE); lcd_gotoxy(1,4);
 mony=mteria*eur;
 printf(lcd_putc,"%f LITROS      %f EUROS",mteria,mony);
mteria=mteria+surt; delay_ms(30);
if (topM<=(mteria+2)){ surt=0.1; }//Cuando kedan solo 2 litros se decelera el surtido
 }
}//wil1
lcd_putc("\f"); lcd_gotoxy(1,1);
  LITRON(see,topM,topE); lcd_gotoxy(1,4);
 mony=mteria*eur;
 printf(lcd_putc,"TOTAL %f LITROS SON %f EUROS",mteria,mony); 
 while(Input(PIN_c5) || Input(PIN_c6) || Input(PIN_c7)){
cerobombeo(); delay_ms(30); 
}


break;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
case 2:  // euros  ----> combustible                                                               ////////////
while(topM>mteria){//wil1    //ERROR SIEMPRE HECHA ALGO DE MAS                                     ////////////
 if (Input(PIN_c1) ){                                                                              ////////////
lcd_putc("\f"); lcd_gotoxy(1,1);                                                                   ////////////
  EURO(see,topE,topM); lcd_gotoxy(1,4);
 mony=mteria*eur;
 printf(lcd_putc,"%f EUROS     %f LITROS",mony,mteria);
mteria=mteria+surt; delay_ms(100);
if (topM<=(mteria+2)){ surt=0.1; }//Cuando kedan solo 2 litros se decelera el surtido
 }
}//wil1
lcd_putc("\f"); lcd_gotoxy(1,1);
  EURO(see,topE,topM); lcd_gotoxy(1,4);
 mony=mteria*eur;
printf(lcd_putc,"TOTAL %f EUROS SON %f LITROS",mony,mteria);                                       ////////////
while(Input(PIN_c5) || Input(PIN_c6) || Input(PIN_c7)){                                            ////////////
cerobombeo(); delay_ms(30);                                                                        ////////////
}                                                                                                     ////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
break;

default: surt=0.2;
while(Input(PIN_c5) || Input(PIN_c6) || Input(PIN_c7)){///...Se espera q cliente....
if (Input(PIN_c1) ){
lcd_putc("\f"); lcd_gotoxy(1,1);
if (see == 0){printf(lcd_putc,"\f A ELEGIDO GASOLINA 95"); }  
if (see == 1){printf(lcd_putc,"\f A ELEGIDO GASOLINA 98");  } 
if (see == 2){printf(lcd_putc,"\f A ELEGIDO DIESEL");   } 
//lcd_putc("   sin definir cantidad "); delay_ms(1000);
mony=mteria*eur;   lcd_gotoxy(1,4);
printf(lcd_putc,"%f LITROS      %f EUROS",mteria,mony);
mteria=mteria+surt; delay_ms(100);
}
}//.....colgar surtidor
}
```
Sé que esta sección no es adecuada, pero el problema es vinculado.
Hay un fallo eléctrico en proteus y agradezco la explicación de cualquier curioso.


----------



## D@rkbytes (Ago 24, 2015)

Tienes que ser más cuidadoso cuando realices el diseño y tenerlo en cuenta en el programa.

Por ejemplo.
Tienes declarado dos veces lo siguiente:
*#DEFINE use_portd_lcd TRUE
#DEFINE use_portb_kbd TRUE*
Pero si estás usando el PIC16F877, el compilador usará el puerto D por defecto para la pantalla.
Así que puedes dejar esa parte sin definir porque eso ya está establecido en la librería "lcd.c"

Otro problema.
Si declaras que vas a usar resistencias pull-up por software usando *port_b_pullups(true);*
¿Para qué colocas resistencias externas en el puerto B?

Y otra cosa más.
Como ya tienes resistencias pull-up internas en el puerto B, la resistencia R12 hará un divisor resistivo.
Y la comparación de niveles de entrada en el pin RB7 no será válida porque el pulsador está colocado hacia VCC.
Esto también ocurrirá con el "DIPSW_5" y el pulsador "LITROS"

Seguramente existan más problemas, pero empieza por corregir lo que te mencioné.


----------



## Berto75 (Ago 25, 2015)

No encuentro a #DEFINE use_portd_lcd TRUE declarado 2 veces ¿donde esta?
Tienes razon con R12 ni me abia fijado. Esta mal situada.
El resto son una prudencia. Un desacoplo capacitivo. Me fije hace mucho tiempo que cuando costruia circuitos electricos al tratar con terminales de baja impedancia estos seguian actuando aunque les cortases la corriente. Esto se arreglaba llevandolos a masa con una resistencia considerable. ¿son fiables las resistencias internas del micro (por la intensidad)? Si bien estas solo son un adorno en un simulador.
No se que ocurrira en la realidad pero en el simulador pin RB7 y DIPSW_5 But.LITROS No dan problemas.
¿por que esto no afecta al Buton.EUROS? en principio tiene el mismo problema



Un momento R12 este demas o no esta bien colocada. O al menos tan mal colocada como todas las demas.


----------



## D@rkbytes (Ago 25, 2015)

AlberertO dijo:


> No encuentro a #DEFINE use_portd_lcd TRUE declarado 2 veces.
> ¿Dónde está?


 En ésta parte del código: 


AlberertO dijo:


> ¿Son fiables las resistencias internas del micro (por la intensidad)?
> Si bien éstas sólo son un adorno en un simulador.


Si son fiables y están diseñadas conforme a la intensidad de corriente que cada pin puede soportar.
Cualquier cosa que coloques en el simulador afectará el comportamiento.
Y no es bueno ni normal que coloques cosas en el diseño sólo por adorno.



AlberertO dijo:


> Un momento. R12 está demás o no está bien colocada.
> O al menos está mal colocada como todas las demás.


OK. Finalmente comprendiste.


----------



## Berto75 (Ago 25, 2015)

RE: No encuentro a #DEFINE use_portd_lcd TRUE declarado 2 veces.
     ¿Dónde está?

El sitio que me muestras es el unico que veo, esa es unica declaracion que me referia. ¿Cual es la otra?


----------



## D@rkbytes (Ago 25, 2015)

AlberertO dijo:


> RE: No encuentro a #DEFINE use_portd_lcd TRUE declarado 2 veces.
> ¿Dónde está?
> 
> El sitio que me muestras es el único que veo, esa es única declaración que me refería. ¿Cual es la otra?


Cierto, confundí kbd por lcd. 

Unas recomendaciones:
Si usas las resistencias pull-up internas, tendrías que cambiar la lógica de comparación:
En lugar de.. if(input(pin_xx)), puedes usar: if(!input(pin_xx)) o if(input(pin_xx)==0)
Y debes quitar las resistencias pull-down externas para evitar que se forme un divisor de tensión.
Entonces el dip-switch, y los pulsadores de RB5 a RB7 los debes colocar hacia VCC. (+5V)

Eso es para el puerto B y usando las resistencias pull-up internas.

Para evitar que la pantalla se encuentre parpadeando, evita limpiarla constantemente.
Esto lo puedes mejorar dando un formato a las variables para que muestren la cantidad con ceros a la izquierda.
Por ejemplo:
Si la cifra a mostrar es de 4 dígitos,  le das un formato para que sólo se muestren 4: (%04u)
En las variables del tipo "FLOAT", lo que controlas son los ceros a la derecha.
%0.2f Mostrará dos ceros a la derecha después del punto decimal.
Y para que no queden letras de escrituras anteriores, puedes rellenar con espacios.
De esa forma evitas los molestos parpadeos cada vez que limpias la pantalla.


----------



## Berto75 (Ago 26, 2015)

No puedo pasar de las resistencias esternas. No me vale port_b_pullups(true); si hago esto en el proyecto actual me pone todos los pin=True ¿No deberia ser al reves?.
Volbiendo a este lo de %0.3f Es muy bueno. Ahora se muestra 3 decimales como en una gasolinera real. No recuerdo que parte del codigo necesito if(!input(pin_xx)) Lo que e visto ahora necesito que sea verdadero pero ya mirare. Gracias
Oye ya no me preocupa el codigo pero si el esquema de proteus. No veo porque funciona solo el surtidor de 95. Los 3 circuitos son equivalentes ¿Podrias trasladar este tema a diseño y simuladores? Yo no lo consigo aunque haga trampa renombrando el adjunto de proteus, siempre me piyais diciendo que ya lo e mandado.


----------



## D@rkbytes (Ago 26, 2015)

AlberertO dijo:


> No puedo pasar de las resistencias externas. No me vale port_b_pullups(true); si hago esto en el proyecto actual me pone todos los pin=True ¿No debería ser al revés?


Es que para eso son las resistencias pull-up. Tendrás todos los pines del puerto B que hayan sido configurados como entradas con resistencias pull-up internas y por eso verás que están en 1.
Es lo mismo que si colocaras las resistencias externas, pero éstas están dentro del chip.


AlberertO dijo:


> No recuerdo que parte del código necesito if(!input(pin_xx))
> Lo que he visto ahora es que necesito que sea verdadero, pero ya mirare. Gracias.


Cuando usas resistencias pull-up, mantendrás un estado lógico 1 como referencia.
Y cuando usas resistencias pull-down mantendrás un estado lógico 0 como referencia.
Entonces, cuando el estado de referencia es un 1, necesitas comparar cuando la transición del nivel pase de 1 a 0.
Pero cuando el estado lógico de referencia es un 0, entonces es al contrario.

Por eso te mencioné que en el caso de usar pull-ups, tendrías que comparar así:
*if(!input(pin_xx))* o *if(input(pin_xx)==0))*
Éstas dos instrucciones hacen lo mismo, pero la primer instrucción tiene el operador *! *que niega el estado.

Ejemplo en pseudo código:
Si RA0 es igual a 0, entonces
{
// Código a ejecutar.
}


AlberertO dijo:


> Oye, ya no me preocupa el código pero si el esquema de proteus.
> No veo porque funciona sólo el surtidor de 95.


Está bien, pero lo anterior es importante que lo tengas en cuenta.


----------



## Berto75 (Ago 26, 2015)

My proyecto actual activa todo mediante verdadero-true parece que pull-up hactua mediante logica negada. Estoy liado con incognitas a resolver y esta demasiado avanzado tendria que volver atras y cambiar muchas cosas. Parece que a my me combienen las pull-down.
Pero la referencia 0  port_b_pullups(false); Me e fijado que no actuan sobre terminales a los pin que les va un diodo desde su catado. Estos siempre a 1 y no son suficientes las pull-down en estos casos.
No se calcularlas tericamente se que deben ser considerables desde masa para que prevalezca el positivo cuando actue. 10k son suficientes ¿cual es la impedancia de las internas?


----------



## D@rkbytes (Ago 26, 2015)

Lo que mencionas tal parece que lo haces en simulación porque físicamente las cosas son muy diferentes.

Las resistencias pull-up internas, son en realidad mosfets que proporcionan un estado alto en los pines.
Y se especifica que proporcionan un máximo de 400 µA y típicamente 200 µA.
Esto es suficiente para que un 0 lógico de mayor corriente logre el cambio de estado.

El mosfet canal P viene siendo la resistencia weak pull-up interna.


Esto no tiene por que causarte confusión.
Simplemente, en donde esperas un 1, ahora lo cambias para esperar un 0.​


----------



## Berto75 (Ago 28, 2015)

Eso busco el 0 logico por defecto. Entiendo que un mosfets siempre devueelve el signo invertido NPN PNP
Pero si me lio escribiendo codigo Te aseguro que mas con la electricidad. El esquema que e recogido No lo entiendo y esta incompleto. La diferencia es que escribir codigo me gusta deducir es entretenido. La electricidad no tanto.
Otra es que este no sea el foro adecuado para lo que me pasa. My Windows 7 esta hecho un asco. Tengo errores en el disco. Esto afecta a programas incluido ccs (no puedo tener 2 programas abiertos) y proteus (no puedo realizar un paso a paso, no funcionan codigos con keypad que antes si funcionaban)
Debo meterme en foros aburridos con cosas que no me entretienen para realizar una instalacion limpia.


----------

