TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: PicKetero en 08 de Septiembre de 2004, 20:31:00
-
Hola a todos !!!
Les paso a comentar lo que me ha ocurrido en moderada experiencia en la programación.
Simulando un programita en assembler con el mplab hay una rutina , la cual es consultada cada 18 mili seg y al cabo de la tercera a la sexta repetición ( todas las otras pasadas OK !! ) de este código se produce un "reset" de mi código, advierto que no utilizo el WDT ni el comando SLEEP, ni PWRTE, por lo que desconozco cual es el origen de este reset.
Otro comentario es que a modo de hallar el problema agregué unas lineas con "nop" para ver si mi linea de código era la que ocacionaba este reset o no, y cuando agregué nop"s se produjo el reset en otro punto de mi código. Aparentemente el reset se debe a otra cosa y no a las lineas que estoy muestrando de momento.
También miré los bit"s TO y PD del registro STATUS, los cuales en distintas pruebas daban valores difierentes en el instantes que ocurría el "reset".
Ultima acotación es que todo esto funciona dentro de la interrupción del TMR0 del 16f84a etc etc.
Espero que se me entienda cual es el problema !!
Nunca antes me había pasado algo así
Muchisimas gracias por su ayuda !!!!
-
HOlas
esto tiene toda la pinta de desbordamiento, repasate todas las temporizaciones de las rutinas y recuerda que es muy importante que las rutinas de atención a las interrupciones sean lo mas cortas posibles.
Suerte!
-
Mirá, por lo visto el problema está en el PCL ya que cuando me encuentro en la instrucción " call Tabla_Led " indica la hubicación de la linea de código 0110 una vez ejecutada esta linea se hubicaba en la linea correspondiente ( 0110 addwf PCL,f ) pero luego con W = 0 el PCL debería indicar "0111" pero esto no sucede, el PCL indica la linea 12 por lo que esto ocaciona un salto a cualquier lugar y no al que debería por lo que corrompe el flujo del codigo correspondiente.
Tabla_Led
0110 addwf PCL,f
0111 retlw b"00000000" ;0
0112 retlw b"00000010" ;1
0113 retlw b"00000110" ;2
0114 retlw b"00001110" ;3
0115 retlw b"00011110" ;4
0116 retlw b"00111110" ;5
0117 retlw b"01111110" ;6
0118 retlw b"11111110" ;7
Alguien me puede ayudar con esto, eso no se arregla con " org 0xXXX" ? no entiendo como funciona
Desde ya muchísimas gracias !!!!
-
Escrito originalmente por PicKetero
Mirá, por lo visto el problema está en el PCL ya que cuando me encuentro en la instrucción " call Tabla_Led " indica la hubicación de la linea de código 0110 una vez ejecutada esta linea se hubicaba en la linea correspondiente ( 0110 addwf PCL,f ) pero luego con W = 0 el PCL debería indicar "0111" pero esto no sucede, el PCL indica la linea 12 por lo que esto ocaciona un salto a cualquier lugar y no al que debería por lo que corrompe el flujo del codigo correspondiente.
Tabla_Led
0110 addwf PCL,f
0111 retlw b"00000000" ;0
0112 retlw b"00000010" ;1
0113 retlw b"00000110" ;2
0114 retlw b"00001110" ;3
0115 retlw b"00011110" ;4
0116 retlw b"00111110" ;5
0117 retlw b"01111110" ;6
0118 retlw b"11111110" ;7
Alguien me puede ayudar con esto, eso no se arregla con " org 0xXXX" ? no entiendo como funciona
Desde ya muchísimas gracias !!!!

Perdoname pero que no antes de llamar a la tabla_led deve de estar cargado en W el numero que se va a sumar al PCL para que salte al retlw deseado?
-
Ojo, las tablas de saltos no deben tener mas de 250 posibles saltos, ademas deben ponerse al inicio del programa, para que entren en la misma pagina, porque si no automaticamente provocan un desbordamiento y consecuencias inesperadas...


-
Hola Micom y MGLSOFT !!!
Micom, si tenes razón, me olvidé de agregarlo al ejemplo que dí !!
MGLSOFT ........ las subrutinas deben estar al principio de cada banco de memoria, pero resulta que en org .4 tengo las rutinas de interrupsión que tiene sus buenas cantidad de lineas y luego de este he colocado las subrrutinas a las que llamo con " CALL ".
1ª
- Pregunta: como puedo ver saber en que posición de memoria de programa se encuentra cada linea de código ?
2ª
- Puedo alojar estas subrrutinas en otros bancos que no sean el bancho "0" ?...... Cómo llamo a estas subrrutinas ?
Espero que se me entienda. !!! 
MUCHAS GRACIAS MUCHACHOS !!!!!
-
Mira en el archivo List que se genera al compilarse un programa en el Mplab.
Ademas te sugiero que las subrutinas que llamas con CALL mejor las pongas al ultimo. Suerte
-
Muchas gracias !!!!
Creo que te entendi bien, si no corregime por favor !!!
Cuando decis que cuando trabaje con subrrutinas a las cuales la "llamo" con "CALL" las coloque una vez hecho las rutinas principales al principio del banco, no que la coloque al final del banco, no ?
Es para cerrar el tema y que no queden dudas .......... muchas gracias Muchachos !!!!!
Les estoy muy agradecido !!!
-
Colocalas al final del programa antes del "END" y ya.