TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: jmiguel en 18 de Enero de 2010, 06:30:57
-
Hola, no estoy acostumbrado a trabajar con pics, estoy trabajando con las siguientes herramientas:
- Pic18f6527
- MPLAB 8.10
- ICD2
- Compilador MCC18 (versión gratuita)
La cuestión es la siguiente: Tras realizar del parte del desarrollo de una aplicación para comunicacionas con una UART, al depurarla no ocurren cosas raras, que parecen estar relacionadas con accesos a zonas de memoria de datos incotroladas y esto produce alteraciones de variables.
Mas concretamente tenemos una variable global tipo char y con un codigo equivalente a el siguiente en el main y con un while(1):
main()
{
while(1)
{
if(z<10)
z++;
}
}
pues bien cuando paramos en depuración el código y visualizamos la variable z resulta que vale un valor mayor de 10 :shock:, lo cual por código es imposible ya que no se toca en ningun otro sitio.
Por si fuese de ayuda se esta trabajando con dos irq una de alta prioridad(la de RX) y otra de baja prioridad(un timer de 1ms), y se estan ubicando variables en dos bancos de memoria.
Creemos que puede ser algun problema con el tema de la gestión de bancos de memoria, stack o algo asi, ya que con otros micros que he trabajado que no gestionan la memoria en bancos no he tenido estos problemas .
Gracias por la atención prestada.
-
He utilizado el compilador C18 y nunca me ha paso lo que comentas :shock: Asegurate de que el compilador entienda correctamente que involucra al if por las dudas :?
Despues habría que ver el resto del código, pues si trabajas con punteros y de forma incorrecta puede ser que estes modificando la variable.
Saludos!
-
Cuando declares la variable z globalmente, declárala igual a cero.
char z=0;
Algunos compiladores las declaran pero no las inicializan.
-
Ya la he inicializado y ocurre lo mismo, no se sin tendra que ver algo lo de la gestión de bancos y las instrucciones extendidas
-
Danos más información, código, para ver si en algún lado se pueda estar modificando la variable. La versión gratuita no soporta instrucciones extendidas.
Saludos!
-
Pregunta ¿ Tengo que tener alguna precaución si tengo declaradas variables en dos bancos distintos que no son el por defecto ? , o el compilador se encarga de esto??, y otra cosa que compilador me recomendais entre el del HITECH, CCS y MCC18. No necesito mucha potencia, necesito uno intuitivo y de facil uso y sobre todo transparencia.
Gracias
-
Hitech no conozco, C18 es transparente con respecto a que ves claramente los registros utilizados y como se hace, en cambio CCS es muuuuy simple de usar pero no es transparente, es mi opinión. :mrgreen:
Saludos!
-
se que en la ayuda del C dice que no es necesario, pero yo acostumbro a colocar el statment del if entre llaves, así sea una instrucción la que valide.
-
hola,
comentas que tienes una interrupción de alta prioridad y otra de baja, yo de ti revisaria que no haya ninguna errata para ese micro relacionada con la interrupción de alta prioridad, ya que varios micros de la seria 18F tienen un problemilla con la gestion de la interrupción de alta prioridad que puede hacer que ocurra cualquier cosa. Te lo digo por experiencia, yo con el 18F8722, 18F6722 he tenido problemas tal que una simple comparación como esta if (1 == 1) y el micro decia que era falso, y despues de darle muchas vueltas, creyendo que era cosa del compilador resulta que era por culpa de una interrupcion de alta prioridad que tenia, en mi caso era la INT0.
La solución pasa por no usar interrupciones de alta prioridad o aplicar los parches mediante software que propone microchip en el documento de errata.
Saludos.
-
Me puedes mandar el link al documento de errata de microchip??, pues si no se pueden utilizar las prioridades de alta prioridad menuda caga... :5]
-
He cambiado a la version Pro de HiTech y sin problemas :-/