miércoles, 5 de septiembre de 2007

CORRIMIENTO POR EL PUERTO B - PRIMER PROGRAMA

CORRIMIENTO POR EL PUERTO B

Para este momento ya debes tener el Programador JDM u otro ademas de saber aunque sea lo basico del MPLAB y el IC-Prog y haber leido toda la info publicada antes en este Blog, asi que estamos mas que listos para el primer programa...

Bueno este es el Primer Programa que publicare aqui, se trata de un Corrimiento de un Bit por el Puerto B usando la instruccion RLF y tomando como base de tiempo un retardo hecho con registros.

Puedes ver el video para que observes que es lo que harà:



Como puedes ver en el video, el "uno" va rotando su lugar por el Puerto B y la rutina de retardo nos permite verlo.

Aqui esta el Programa en formato ASM, listo para compilarlo usando MPLAB.
Aqui esta el esquematico, servira tambien para el siguiente programa.
Aqui esta el Archivo HEX (el servidor no me permitio cargarlo), solo copia y pega en el notepad y guardalo asi: rrl_portb.hex


:020000040000FA
:1000000002200B2883120313860183160313860133
:100010008312031308000314860D0F200C28FF30F1
:10002000A000A1000130A200A00B1428A10B1428ED
:06003000A20B14280800D9
:00000001FF


EXPLICACION DEL PROGRAMA

(Viendo el Codigo ASM)

Este primer programa lo tratare de explicar linea por linea para evitar confuciones y que nos perdamos en el codigo.

En la primer linea estamos incluyendo el archivo p16f877a.inc, que tiene los nombres de todos los registros de este pic, con sus respectivas direcciones; esto nos evita el estar escribiendo por ej. PORTB EQU 06H para cada registro que evamos a usar.

Errorlevel -302. Cuando compilamos el programa, el error 302 es muy comun, pero indica algo que en realidad ya arreglamos, asi que lo suprimimos.

Vamos a usar tres registros para la rutina de retardo, asi que los tomamos del area GPR, la cual empieza en la direccion 20H de la memoria de datos y les ponemos nombre.

Como ya se vio antes, el micro empieza a trabajar en la doreccion 00 de la memoria de progama, asi que le damos la directiva ORG 00H y ahi empezamos nuestro programa.

Una llamada a la rutina de configuracion de registros que veremos adelante.

Despues de configurar los registros, un brinco a la etiqueta INICIO.

Configuracion de registros, Seleccionamos el banco donde esta el registro PORTB (Bank 0), y limpiamos cualquier informacion que pudiese tener ahi; luego seleccionamos el Banco del registro TRISB (Bank 1) y ponemos en ceros a este registro para hacer que el Puerto B sea de "solo salidas".

Volvemos al Banco 0 y retornamos a donde llamaron a esta subrutina. (despues de ORG 00H)

Luego el programa brinca a inicio, donde ponemos en uno al carry, ¿para que? pues la instruccion RLF y RRF trabajan rotando el carry, asi ese "uno" cambiara de lugar cada vez que le programemos que lo haga.

La instruccion RLF PORTB, 1, rotara el puerto B usando el valor del carry, el 1 de la instruccion escrita, indica que el resultado se guardara en el registro PortB, de otra manera se guardaria en W.

Una vez que hizo la primera rotacion, necesitamos un retardo para poder visualizar el led encendido, asi que se llama a la rutina de retardo que luego veremos.

Cuando regrese del retardo, la instruccion GOTO $-2 brincara a dos instrucciones antes, es decir ira de nuevo a la rotacion del Puerto B para luego llamar al retardo y empezar el ciclo una y otra vez.

La rutina de Retardo RET1, usa los tres registros declarados al inicio. cada registro tiene un valor el cual sera "restado" pero por estar anidados, lo haran una y otra vez.

Asi pues en las primeras cinco instrucciones del programa estamos dando valores a los registros de la sog. manera: al tener un FFh en W, este lo movemos a los registros contadores 1 y 2, luego damos a W un 1 y lo movemos al reg. contador 3.

En la parte de decrementos, se usa la instruccion DECFSZ, que decrementara y brincara cuando el valor sea cero. luego hace lo mismo para el registro contador 2, pero como se puede ver, tambien el registro 1 que estaba en 00 es decrementado iniciando de nuevo en FFh, asi para decrementar una vez al registro 2, el registro 1 debe ir de FF a 00. El registro 3, hace una funcion similar, en la que podemos hacer mas grande el retardo si queremos, pero con un valor de 1 es suficiente para esta aplicacion.

Return hace volver al punto donde fue llamado el retardo.

Espero que todo salga bien, recuerda seguir especificamente todo el esquematico.

Saludos.

2 comentarios:

Maxi dijo...

Hola Ivan, interesante tu post.Lo estoy siguiendo para sacarme un par de dudas en cto al 877.Si bien no es complicado este circuito, veo q ya no estan los programas, ya q estaban cargados en geocities y este cerro.Te agradeceria si es q los puedes subir nuevamente o x lo menos dejarlo aunq sea como propio html de la pagina.Desde ya se agradece y se valora este blog y el esfuerzo por haberlo realizado.

Anónimo dijo...

hello


Just saying hello while I read through the posts


hopefully this is just what im looking for looks like i have a lot to read.

Google