TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: falflores en 01 de Noviembre de 2011, 18:46:56
-
Hola amigos del foro.
Estoy empapándome todo lo que puedo con la programación en ensamblador, ya que llevo cerca de 2 años programando en CCS y ha habido ocasiones en que su presición no me ha sido suficiente.
Por ahora estoy con las interrupciones, y me surge una duda que expongo a continuación:
He notado en infinidad de códigos que los programadores ponen los siguientes vectores: ORG 0, ORG 4 y ORG 5, por lo que me he documentado, comprendo que cuando el programa necesita transladarse a una zona del programa como después de un reset (ORG 0), o durante una interrupción (ORG 4), busca su vector correspondiente, estoy en lo correcto?, por lo tanto me surgen 2 dudas, en qué momento o parte de un programa es necesario un ORG 5?, suponiendo que se coloca para dejar intacto el vector de interrupciones, por que he notado que los programadores hacen esto:
org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion.-
goto ISR
; **** Programa Principal ****
;**** Configuracion de puertos ***
org 0x05 ; Origen del codigo de programa.-
Inicio
Con mi razonamiento llego a la conclusión de que linealmente, el programa nunca pasará por org 0x05, debido a que en el reset salta Inicio y en la interrupcion salta a ISR, por lo que la única forma de llegar allí es por medio de una condicion equivalente al reset y la interrupción, esto es correcto?, alguien sabe cuál es dicha condición?
La otra duda que tengo es que durante un reset, el PC (program counter) se pone en 0, y se dirige a ORG 0x00, para comenzar a ejecutar normalmente las instrucciones e incrementar el CP en cada una, bien, mi duda es, cuando pasa por la dirección 0x04, que pasa aquí entonces?, no hay confusión con el vector de interrupción? o simplemente se salta este vector?, he tratado de ver la secuencia de inicio en el MPlab Sim, pero cuando inicia el programa, lo hace directamente en inicio, y el CP ya vale 10, asi que no tengo idea de lo que sucede en ese instante.
Y por último, hay otros vectores a parte de estos que deba conocer?
Disculpenme por debrayarme tanto, pero estas dudas no me dejan avanzar, y agradezco por adelantado la atención y el tiempo que me pudiesen dedicar.
-
Hola fal, el org lo que hace es asignar una direccion a la etiqueta, es decir, en caso de inicio lop que haces es decirle que tu rutina "inicio" esta en la direccion 5, pero la puedes poner en 20,30,7 el numero que quieras, excepto el 0 y el 4 que estan reservados para el reset y para la interrupcion
-
Mira, la instrucción ORG viene de la palabra origen, y lo que indica es que a partir de ahi es el origen de las instrucciones que pongas.
Resolviendo dudas:
---------------------
org 0x0000
goto INICIO
org 0x0004
...................
..................
org 0x0005
INICIO
...........
...........
end
Esto tipo de firmware que ves aqui, que es muy comun para quienen se inician, lo único que hace es indicar donde comienza el vector reset (0x0000) donde comienza el vector interrup (0x0004) y donde comienza tu firmware principal (0x0005).
Cuando se produce un reset, sin importar lo que se haya implementado, el pc del uc apunta a la posicion 0x0000. Luego ejecuta las instrucciones una por una empezando por la 0x0000, luego la 0x0001; y si te das cuenta, la primera instrucción es " goto inicio"; por la tanto se dirije a la etiqueta INICIO, que se ubica en la posicion 0x0005. Cuando se produzca una interrup, el pc del uc automaticamente apuntara a la posicion 0x0004, y ejecutara las instrucciones una por una, primero la 0x0004, luego la 0x0005 y asi sucesivamente. Lo que pasa es que cuando se empieza con el asm, se indica poner el "org 0x0005" para poder colocar en la posicion 0x0004 (posicion del interrup) una instruccion como goto SERVICIO_INTERRUP. nada mas por eso (cosa que no es recomendable, a menos que solo uses una pagina del uc).
Saludos.
-
Muchas gracias por sus respuestas muchachos.
Hola rivale, lo que me dices es que la instrucción ORG en realidad hace esto?:
ORG 0x00 goto INICIO ;La instrucción goto INICIO se guarda en 0x00
ORG 0x04 goto INTERRUPT ;La instrucción goto INTERRUPT se guarda en 0x04
De esta forma ya me queda claro la utilidad del ORG, gracias!!!
Amigo JBQ, muchas gracias, ya comprendí que realmente no ejecuta las instrucciones linealmente despues del ORG 0x00, si no que esta dirección, cuando hay un ORG 0x05 Inicio, es simplemente un puente para llegar a dicha dirección, lo que no comprendo es por qué dices que no es recomendable hacerlo de esta forma?
-
no exactamente al decirle
org 0x00
goto inicio
lo que haces es que en cuanto este en la direccion 0x00 lo siguiente que hace es brincar a inicio. y en cuanto este en 0x04 la siguiente instruccion sera brincar a "interrupt"
-
Las instrucciones "org" no son puentes, son indicadores de que ahi es el inicio del codigo a implementar.
por ejemplo: si tu dices que tal bloque de programa inicie en la posicion 0x1125 entonces lo haces asi:
addres instruccion
org 0x1125
0x1125 nop
0x1126 bsf
0x1127 nop
0x1128 bcf
al decir que inicie en 0x0005 indicas que a partir de ahi empieeza lo que comunmente llaman el inicio, o el programa principal.
cuando hay un reset, el pc apunta a la posicion 0x0000, si no hay nada que le indique que salte, ejecutara la 0x0001 y luego la 0x0002, y asi sucesivamente, incluso la 0x0003 y la 0x0004 sin importar que alli haya un "org 0x0004".
Respecto a lo de que no es recomendable poner un goto en la posicion 0x0004, va por que si en tu firmware estas manejando paginas, y suponte que estas en la página 3 y se produce una interrup, el pc apunta a la posicion 0x0004 y lo que ejecutara sera un goto , y si tu codigo implementado esta en la pagina 0, pues no ira ahi, ira a la página 3. Recuerda que el goto solo contiene 11 de los 13 bits de las instrucciones.
saludos.
-
Ok, ahora si lo comprendí perfectamente, excelentes explicaciones, gracias!!!