duda sobre lenguaje ensamblador

Hola Forer@s.

Me interesé hace varios meses por saber programar el PIC en lenguaje ensamblador, y me he metido en un problema que lleva interrupciones y timmers y aun no las controlo bien.
LO que vengo a decir con esto es que si alguien aquí en el foro me podría echar una mano y echarle un vistazo al programa que he escrito en lenguaje ensamblador y me "corrigiera" algo que esta mal se lo agradecería.

Si alguien me puede ayudar que me lo diga y subo el .txt y le explico lo que quiero conseguir muchas gracias y un saludo. ;)
 
O sea, si, por favor sube el .txt.

Mm, no te estarás ambicionando mucho al tratar de aprender a usar timers e interrupciones? O ya sabes bien todo lo que va antes?

Recuerda subir el .txt!
Un saludo!

:)
 
Muchas gracias de antes de nada por querer ayudarme con esto del PIC. :)

El problema que quiero proponerle al microcontrolador es que por el puerto a, que los habilito como salida se enciendan 5 leds haciendo cuatro secuencias diferentes:

-La primera se mueve un solo led hacia la derecha y termina y empieza de nuevo.

-La segunda se mueve lo mismo que el primero pero al llegar al final vuelve haciendo lo mismo pero en sentido contrario (tipo pendulo).

-La tercera mueve exactamente como la primera secuencia pero en vez de un solo led que se muevan dos a la vez.

-La cuarta se enciendes todos los leds del puerto a y se apagan, es decir, parpadeando.

el timer me da igual el caso es que sea lo suficiente para poder verlo al ojo humano en el proteus.

Estas secuencias cambian segun la combinación que ponga en rb0 y rb1 00=cuarta secuencia,
01=segunda secuencia, 10=tercera secuencia, 11= primera secuencia.

Eso es todo si hay algo que no entiendes escribemelo y te lo vuelvo a explicar un Saludo amigo ;)
 

Adjuntos

  • hardware PIC.jpg
    hardware PIC.jpg
    95.1 KB · Visitas: 19
  • selector.txt
    2.1 KB · Visitas: 15
Hola Ferrare.

Veo que tu programa corre en el compilador, pero no funciona en el simulador Proteus.
¿Realizaste antes programas sencillos como un "rotador de 5 LEDs" (tu primera secuencia) sin el uso de temporizadores?
Si no, entonces tal ves podrías empezar por ahí. Es decir:

1. Hacer sólo tu primera secuencia "rotador" sin el uso de temporizadores, ya que sólo quieres que sea observable a la vista.

2. Las entradas en los pines RB0 y RB1 las puedes realizar por testeo, es decir que el programa constantemente estará testeando estos bits y, según el nivel que éstos tengan, saltar a una de las 4 secuencias (pero como te digo, primero que te funcione una secuencia).

3. El retardo lo puedes hacer por un bucle en cascada con ayuda de 2 bytes auxiliares, por ejemplo: CONTADOR1, CONTADOR2. Que estos contadores se vayan decrementando hasta llegar a cero. En ese tiempo en que el programa esté decrementando te permite que el efecto sea observable.

4. En tu gráfico los condensadores que van al cristal tienen que ser de 22pF. Para las entradas a RB0 y RB1 puedes usar switchs tipo SPDT que hay en Proteus. El pin RA4 es de tipo "colector abierto" por lo que necesita una resistencia "pull up" para que funcione.

A ver si te animas, te puedo dar una mano.
Chau.
 
Hola Rodo, antes de nada gracias por contestar e intentar ayudarme.

En lo primero que dices te refieres a hacer cada secuencia sin temporización, es decir, para simularlo paso a paso en mplab y ver que hace lo que quiero, sin usar el proteus porque sino no se vería. Y si lo probe en mplab paso a paso lo que son las secuencias y si me iban.

Lo que has dicho en el caso 3, es que entre movimiento y movimiento llame a retardo para que pueda apreciarse el movimiento en proteus???.

lo que has chico en el segundo caso no entiendo como hacer que el programa testee las entradas en cada pasada.

Lo del caso 4 lo del grafico ya esta solucionado muchas gracias. haber si pudiese sacar este programa.

Un saludo.
 
Hola.

En lo primero que dices te refieres a hacer cada secuencia sin temporización, es decir, para simularlo paso a paso en mplab y ver que hace lo que quiero, sin usar el proteus porque sino no se vería. Y si lo probe en mplab paso a paso lo que son las secuencias y si me iban.

Tiene que funcionar en Proteus ya que es un simulador confiable, y si no funciona en él, entonces será demasiado dificil que funcione en la realidad (en programas mucho más complejos tal ves sería mejor prescindir del simulador, pero no en este caso).

Lo que has dicho en el caso 3, es que entre movimiento y movimiento llame a retardo para que pueda apreciarse el movimiento en proteus???.

Sí, un algoritmo más o menos así:
... enciendes un LED.
... llamas a una subrutina de retardo (todo este tiempo verás el LED encendido).
... apagas el LED.
... llamas a la subrutina de retardo (todo este tiempo verás el LED apagado).

lo que has chico en el segundo caso no entiendo como hacer que el programa testee las entradas en cada pasada.

Más o menos así:
Preguntas si RA0 está conectado a "0" lógico: (BTFSC PORTA,0) si RA0 está conectado a "0" saltará a un determinado lugar del programa, y si está conectado a "1" saltará a otro lugar.
De la misma forma con RA1, entonces de esa forma podrás direccionar al programa a las distintas secuencias.

Lo del caso 4 lo del grafico ya esta solucionado muchas gracias. haber si pudiese sacar este programa.

Sería bueno que lo sacases, ánimo. Chau.
 
BIen me gusta el progreso que voy teniendo en el programa ya me va haciendo lo que quiero mas o menos y me selecciona la secuencia que quiero según la combinación que ponga.
Solo me falla una cosa y es que yo antes de nada cargo un literal al puerto a normalmente 0x01 para la secuencia de rotación y luego digo que me vaya rotando el puerto A, hasta ahí perfecto y me lo hace.

Ahora bien el problema es que en unas de las secuencias el literal que debo cargar es FF todos los leds encendidos al puerto A, pero como en el programa puse que cargara 0x01 siempre me carga ese. No se si me entenderás lo que quiero decir.

Si pongo el literal que quiero cargar en cada secuencia no me vale porque cuando vuelve a hacer el segundo ciclo me vuelve a cargar lo mismo empezando por arriba y sin terminar la secuencia quedándose rotando en dos puertos nada mas RA0 y RA1.

Como digo no se si entenderás mi problema Rodo en caso de que si, que solución me das.


Un saludo y gracias ;)
 
Hola.

Ahora bien el problema es que en unas de las secuencias el literal que debo cargar es FF todos los leds encendidos al puerto A, pero como en el programa puse que cargara 0x01 siempre me carga ese. No se si me entenderás lo que quiero decir.

Entiendo el problema, lo que se podría hacer es utilizar variables y no trabajar directamente con el PORTA, por ejemplo:

aaaaAUX_secuencia1 EQU 0x22 ; Defines una variable auxiliar para la secuencia 1.

aaaaMOVLW 0x01aaaaaaaaaaaa; Cargas el literal inicial en W.
aaaaMOVWF AUX_secuencia1aa; Cargas el literal en la variable auxiliar para hacerlo rotar.

SECUENCIA1aaaaaaaaaaaaaaaa; Esta digamos sea tu subrutina de la secuencia 1.
aaaaMOVF AUX_secuencia1,Wa; Mueves lo que tienes en AUX_secuencia1 a W.
aaaaMOVWF PORTAaaaaaaaaaa; En este momento estas mostrando un valor en PORTA.
aaaaCALL RETARDOaaaaaaaaaa; Esperas un tiempo para que este valor sea observable.
aaaaRLF AUX_secuencia1,Faaaa; Rotas la variable auxiliar.
aaaaGOTO SECUENCIA1aaaaaa; Retornas para hacer otro ciclo de rotación.

Así, tendrías para la secuencia 2 otra variable auxiliar (AUX_secuencia2) y así sucesivamente.
De este modo no se te cruzarían los datos en el PORTA.

Si no te queda claro, podrías adjuntar tu código para que podamos analizarlo y solucionarlo.

Saludos, chau.
 
Hola Rodo

ya lo tengo casi casi ahora lo unica pega es que tengo que apagar el simulador para cambiar de secuencia y entonces darle al play.
Como hago para que cada vez que haga un ciclo me revise Rb0 y Rb1 para ver si ha cambiado de secuencia. No se como ponerlo instruccionadamente.


Un saludo y muchas gracias ;)
 
Hola Ferrare, qué bueno que tu proyecto esté avanzando satisfactoriamente.

Una pequeña nota:
Al empezar a aprender a programar creo que es bueno que lo hagas de esta manera como lo estás haciendo, es decir, con un RETARDO digamos “artesanal”, por testeo constante de los pines de entrada, etc. Con un poco más de práctica lo podrás hacer con el uso de temporizadores como querías originalmente; también al investigar más, podrás ver que el micro tiene muuuuuuchos otros recursos más para ofrecer y que sería bueno aprovecharlos, aunque no siempre son sencillos de manejarlos (yo también estoy aprendiendo). Bueno, entonces ahora con respecto a tu pregunta:

El simulador no es necesario que se apague para que puedas cambiar los niveles de los pines de entrada, mientas él esta en funcionamiento tiene que ser posible cambiar los estados de entrada. Para eso son esos switchs tipo SPDT, en Proteus pones spdt y te sale el switch, tiene una forma de Y (ver gráfico).

Para “revisar” constantemente los pines RB0 y RB1 es necesario que hagas una subrutina de testeo, al que saltarás cada vez que hagas un ciclo de cualquiera de tus secuencias. Te pongo un pequeño ejemplo en el archivo adjunto (sólo para 2 secuencias)y tú verás como lo puedes adaptar a tus necesidades.

Ahh! y no te olvides de la resistencia “pull up” que tiene que estar conectado al pin RA4, el valor de ésta puede ser de 470 Ohm, aunque puedes jugar un poco con los valores según veas el funcionamiento.

Un cordial saludo, chau.
 

Adjuntos

  • Gráfico.pdf
    13 KB · Visitas: 13
Rodo ya conseguí sacarloo HURRAAA!!! tio te tengo que dar las gracias por ayudarme, me ha servido de mucho.

Y perdona por darte la lata jejeje

Un saludo compañero ;) aquí estaré por si te puedo ayudar yo en algo.
 
Atrás
Arriba