Tutorial 1 – LED’s (segunda parte)

February 2, 2007 at 8:58 am | In Tutorial | 11 Comments

Tutorial 1.2 – Encendiendo y apagando LED’s… ahora con retardo!

Como ya dijimos hay algo que no funciona bien en el programa anterior. Cada instrucción ocupa 1 ciclo de reloj para ejecutarse. Como utilizamos el reloj interno del 16F628A cada instrucción se ejecuta en (1/4MHZ)*4 o lo que es lo mismo 1uS. El programa ejecuta 5 instrucciones mientras los leds estan encendidos y otras 5 mientras están apagados, asi que encienden 5uS y apagan otros 5uS. Al ver el ejemplo en funcionamiento veremos que los leds nunca se apagan, ¿cómo hacemos para que esto se alcance a ver? La respuesta: utilizando un retardo al encender los leds y otro al apagarlos.

El principio del retardo es contar descendentemente desde un número dado y al momento de que la cuenta llega a cero dejar de contar. El cero indica el fin del retardo y una vez concluido puede continuar la ejecución del programa.

Lo primero es definir una constante que usaremos como contador, llamemosla CUENTA. Es importante aclarar que al momento de definir la constante con la directiva equ lo que hacemos es declarar la dirección del registro que usaremos como CUENTA. Esto es que si declaramos CUENTA equ 0×20 no significa que cuenta vaya a valer 0×20, sino que en esa dirección estará ese registro. Después podremos cargarle a CUENTA cualquier valor que querramos, por ejemplo MOVLW 0xFF y después MOVWF CUENTA, así nuestro registro CUENTA, en la dirección 0×20, tendrá un valor de 255 decimal.

El PIC 16F628A cuenta con algunos registros de propósito general que podemos utilizar directamente en nuestros programas para guardar los datos que estamso usando. Estos registros empiezan desde la dirección 0×20 del banco 0, es por eso que CUENTA la definimos en esa dirección. Cada vez que definamos una constante o una variable debemos definirla después de la dirección 0×20 ya que de otro modo el programa no va a funcionar.

Habiendo declarado la constante CUENTA y después de cargar ese registro con un valor podemos realizar la rutina de retardo. Para eso decrementamos CUENTA por 1 hasta que el valor llegue a 0. De esto se encarga la instrucción decfsz. Su sintaxis es decfsz f,d donde f es el registro que queremos decrementar y d es el destino en el que guardamos el resultado, si d=0 el resultado se guarda en el registro W, si d=1 el resultado se guarda en el mismo registro f. decfsz CUENTA,1 decrementa el valor de CUENTA en 1  y guarda el resultado en el mismo registro CUENTA. Para asegurarnos de que decfsz se ejecute hasta que el registro llegue a 0 utilizamos la instrucción goto para estar volviendo hasta que la cuenta termine.

Entonces el nuevo código queda de la siguiente manera (descargar código):

led12.png

Ahora las únicas instrucciones nuevas son call y return. call se utiliza para mandar llamar una rutina, en este caso la rutina de retardo. Utilizar rutinas hacen que el código sea más pequeño y entendible. call Retardo genera que la ejecución del programa salte hacia la subrutina con la etiqueta Retardo, se ejecuta el código de la subrutina y después la instrucción return se encarga de regresar la ejecución del programa a la línea que seguía de la instrucción call. Así funcionan las subrutinas.

Este tutorial sirve para explicar un poco la lógica de los retardos, sin embargo calcular retardos de esta manera puede ser un poco complicado, lo bueno es que existen algunos generadores de retardo a los que solo se les especifica el reloj que se utiliza y el tiempo que se desea de retardo y con esa información se genera el código necesario para el retardo. Un gerador muy bueno es este: Delay Code Generator.

11 Comments »

RSS feed for comments on this post. TrackBack URI

  1. [...] por software February 9, 2007 at 4:53 pm | In Tutorial | La semana pasada, en la segunda parte de tutorial 1, se habló un poco sobre los retardos por software. Ahora vamos a ver esto de la lógica de los [...]

  2. si este programa lo ejecutas en el puerto A se ke el bit cuatro no encendera pero sabes por ke no enciende?????

  3. El bit que no enciende es RA5, que esta en el pin 4 del pic. Ese bit no enciende ya que RA5 solamente funciona de entrada puesto que ese pin es el que se utiliza para resetear el micro en caso de tener configurado el MCLR, por eso solamente es entrada y no salida, tambien por eso para el ejemplo utilice el puerto B y no el A :D

  4. hola es lo mismo que es pic 16f628

  5. Para los que trabajen en Ubuntu o Linux en general, pueden usar un generador de retardos llamado: pikLoops.

  6. [...] 2008 at 5:23 pm | In Uncategorized | El uso de subrutinas lo vimos por primera vez en el tutorial Encendiendo y apagando LED’s… ahora con retardo! Ahí se vio la manera en la que se llama y se regresa de las subrutinas. También se dijo que el [...]

  7. hola, necesito una aclaración sobre el significado de la linea :
    __config 0×3d18 ; palabra de configuración el pic
    ¿cual es el significado de “palabra de configuración”, y donde se obtine el valor asignado a “__config”?.
    Desde ya muchas gracias.

  8. nesesito saver una aclarcion si el pic 16f628a tiene tres puertos o no

  9. requiero 2 programas:
    1.- de un contador (led con subrutinas)
    2.- de un contador (led sin subrutinas)-

    por fa vor se le agradecere.
    grasias.

  10. no podes usar el pic 16f877 que carajo usas un pic tan viejo, encima tus programas no sirven para nada, dejate de usar el puto pic628 la reputa que te pario, usa el que te digo mierda

  11. men me puse a la tarea de seguir este tutorial pero esta parte de los retardos no la he podido realizar bn ya que el led sigue encendido continuamente. no se que pueda pasar me podrias ayudar mi correo electronico es ralexts@hotmail.com.
    gracias de antemano y excelente tutorial


Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Blog at WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.