Haz una pregunta
  Foros de Electrónica » Temas de Interés » Software de Simulación y Diseño Electrónico
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

16/05/2012 #1


Proteus no entra en las funciones al simular con CCS (PIC16F877A)
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!
16/05/2012 #2

Avatar de Moyano Jonathan

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 !
16/05/2012 #3


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
18/05/2012 #4


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
26/07/2015 #5


Proteus no entra en las funciones al simular con CCS (PIC16F877A)
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
26/07/2015 #6

Avatar de TRILO-BYTE

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
26/07/2015 #7


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?
26/07/2015 #8

Avatar de TRILO-BYTE

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
24/08/2015 #9


Proteus no entra en las funciones al simular con CCS (PIC16F877A)
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 /////////

Código PHP:
void ACCIONGATILLO(int see,int mira,float mteria,float eur){ // see = ser = TIPO COMBUSTIBLE 0 a 2
float topMfloat topEfloat monyfloat 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+surtdelay_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+surtdelay_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+surtdelay_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.
Archivos Adjuntos
Tipo de Archivo: rar codigoSURTIDOR.rar (2,6 KB (Kilobytes), 7 visitas)
Tipo de Archivo: rar SURTIDOR.rar (33,4 KB (Kilobytes), 9 visitas)
24/08/2015 #10
Moderador

Avatar de D@rkbytes

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é.
25/08/2015 #11


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

---------- Actualizado después de 48 minutos ----------

Un momento R12 este demas o no esta bien colocada. O al menos tan mal colocada como todas las demas.
25/08/2015 #12
Moderador

Avatar de D@rkbytes

AlberertO dijo: Ver Mensaje
No encuentro a #DEFINE use_portd_lcd TRUE declarado 2 veces.
¿Dónde está?
En ésta parte del código: Doble definición.jpg
AlberertO dijo: Ver Mensaje
¿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: Ver Mensaje
---------- Actualizado después de 48 minutos ----------

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.
25/08/2015 #13


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?
25/08/2015 #14
Moderador

Avatar de D@rkbytes

AlberertO dijo: Ver Mensaje
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.
26/08/2015 #15


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.
26/08/2015 #16
Moderador

Avatar de D@rkbytes

AlberertO dijo: Ver Mensaje
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: Ver Mensaje
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: Ver Mensaje
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.
26/08/2015 #17


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?
26/08/2015 #18
Moderador

Avatar de D@rkbytes

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.
Imágenes Adjuntas
Tipo de Archivo: jpg Weak Pull-Up.jpg (19,3 KB (Kilobytes), 31 visitas)
28/08/2015 #19


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.
Imágenes Adjuntas
Tipo de Archivo: jpg attachment.php.jpg (19,3 KB (Kilobytes), 5 visitas)
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Software de Simulación y Diseño Electrónico

Todo lo relacionado con estos programas.

Cerrar
Foros de Electrónica » Temas de Interés » Software de Simulación y Diseño Electrónico

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.