Título: Tutorial: Programación PIC Publicado por: Fabios Arts en 2 Diciembre 2005, 15:25 pm Hola, como primer mensaje a este lindo foro, quiero hacer una contribución al foro :- )
Introducción al procesador PIC16F84A Antes de nada, conozcamos como es la parte electrica del microchip, así se aprenderá mejor a programar... (http://perso.wanadoo.es/chyryes/tutoriales/imagenes/pines.gif) Los puertos son entradas/salidas que permiten intercambiar bytes (pulsos) e información al microchip o del microchip al entorno, entre ellos se encuentran A y B
La memoria RAM no solo es usado para almacenar nuestras variables, también se almacenan una serie de registros que configuran y controlan el PIC. Podemos observar que en la imagen que esta memoria esta dividida en dos bancos, el banco 0 y el 1, antes de acceder a un registro de esta memoria tenemos que preguntarnos en que banco estamos, generalmente se trabaja en el banco 0, ya veremos mas adelante como cambiamos de banco de memoria. Fijándonos en el banco 1, las direcciones desde la 00h hasta la 0Bh están ocupadas por registros del pic, por lo que tendremos que empezar a guardar nuestras variables a partir de la dirección 0Ch. Podremos acceder al resto de registros para cambiar la configuración o el estado del pic. Faltaría añadir a este cuadro el registro mas utilizado de todos, el acumulador (W) o registro de trabajo. No se trata de un registro propiamente dicho ya que no tiene dirección pero se usa constantemente para mover datos y dar valore a las variables (registros). Por ejemplo, si queremos copiar la información del registro 0Ch en el registro 0Dh no podremos hacerlo directamente, deberemos usar una instrucción para cargar el valor del registro 0Ch en el acumulador y después otra instrucción para cargar el valor del acumulador en el registro 0Bh. [/list] ATENCIÓN: No continues a menos hayas entendido lo anterior Ahora repasaremos un par de comandos de nuestro PIC: Código: ESTADO EQU 0x03 ORG: Indica al ensamblador la dirección (de memoria de programa) donde se guardará la instrucción que vaya a continuación. Por ejemplo: Código: ORG 00H Código: bsf PORTB,3 GOTO: Salta a la dirección k de programa. Código: goto ENCENDIDO Código: clrf PORTA END: Se escribe al final del programa para indicar que ya ha acabado. (es obligatorio, si no da error). #DEFINE: Otra instrucción para el ensamblador que usaremos será la instrucción #DEFINE. Es parecido a EQU, solo que aquí no ponemos etiquetas a un registro, podemos ponerla a una instrucción entera, Por ejemplo: Código: #DEFINE BANCO1 BSF STATUS,5 Etiquetas a direcciones de Programa: muy útiles para usar con instrucciones CALL (Llamada a subrutina) o GOTO (Salto). Código: [.........] Un poco de orden: Es importante llevar un poco de orden a la hora de escribir el programa, nos ayudará mucho: * Al principio van los EQU y los #DEFINE, después comenzamos con el programa. * El programa se escribe en cuatro columnas separadas por tabuladores: - En la primera columna se ponen las etiquetas a direcjavascript:void(0);ciones de programa - En la segunda columna se ponen las instrucciones (BSF, CLRF, BTFSC... etc.) - En la tercera columna se ponen Los registros o parámetros a los que afecta la instrucción. - En la cuarta columna se ponen los comentarios que creas pertinentes (cuantos mas mejor) seguidos de un punto y coma. Subrutinas
Cuando se produce una interrupción el pic deja automáticamente lo que esté haciendo, va directo a la dirección 04h de programa y ejecuta lo que encuentre a partir de allí hasta encontrarse con la instrucción RETFIE que le hará abandonar la interrupción y volver al lugar donde se encontraba antes de producirse dicha interrupción. Para que se pueda producir una interrupción hay que habilitar las interrupciones globalmente y la interrupción en concreto que queremos utilizar (con el registro INTCON). Este pic tiene 4 tipos de posibles interrupciones: Por cambio en los bits RB4-RB7 Por el estado de RB0 Por desbordamiento del Timer-contador Por fin de ciclo de escritura de la EEPROM de datos Mientras se está ejecutando una interrupción no se puede producir otra interrupción, el pic no lo permite. Una cosa importante a tener en cuenta al usar interrupciones es que cuando estas se producen podríamos estar trabajando con registros que pueden ser modificados en la propia interrupción, como el acumulador o el STATUS. Para que la interrupción no eche a perder el buen funcionamiento del programa principal conviene guardar los valores de estos registros en otras variables que no vayamos a modificar. Antes de salir de la interrupción volvemos a restaurar los valores guardados y todo solucionado. El siguiente ejemplo muestra un programa que usa la interrupción por cambio en el puerto B (En pines RB4 a RB7) Timer - Contador TMR0 El registro TMR0 puede contar ciclos de instrucción interna o pulsos de entrada por RA4 según el valor del bit 5 del registro OPTION ( TOCS ). Si este bit está a "1" TMR0 cuenta pulsos por RA4 y se le llama Contador; si el bit está a "0" cuenta ciclos de instrucción interna y se le llama Timer. Cada ciclo de instrucción dura 4 veces el ciclo del reloj del pic (para un reloj de 4MHz ==> Ciclo reloj=0,25 µSeg ==> Ciclo instrucción = 4 X 0,25 = 1µSeg) Cuando lo usamos como contador (Por RA4) podemos determinar si el incremento se hará por flanco ascendente o descendente con el bit 4 del registro OPTION ( TOSE ) Podemos leer o escribir el registro TMR0 en cualquier momento. Cuando escribamos en él deja de contar durante dos ciclos, cuando lo leamos no pasa nada. Podemos asignar el prescaler al TMR0 , si hacemos esto podemos elegir el factor en el que se verá dividido el conteo mediante los bits del 0 al 2 del registro OPTION según la tabla del factor de división . Por ejemplo, si elegimos un factor de división de 1/2 tienen que entrar 2 pulsos para que TMR0 se incremente en uno, si está a 1/4 tienen que entrar 4... etc. También podemos utilizar la interrupción que se produce cuando se desborda el TMR0 , es decir, cuando pasa de FFh a 00h. (se configura desde el registro INTCON ) Pulsadores e interruptores -REBOTES- Es muy normal usar pulsadores o interruptores en alguna de las entradas del pic para controlarlo. Estos pulsadores no hacen una conexión perfecta e instantánea como podemos pensar: un pulsador se compone de dos partes de metal que entran en contacto (choca una con la otra) al accionarlo. Este choque genera unos pequeñísimos rebotes que suceden tan rápido que son imperceptibles para nosotros, Sin embargo, no lo son para el PIC que trabaja a esas velocidades. Esto es un problema muy común que puede volvernos locos si no lo conocemos pero que resolverás sin problemas (http://perso.wanadoo.es/chyryes/tutoriales/imagenes/rebotes.gif) La solución es fácil, basta con añadir un retardo en nuestro programa desde que se detecta el primer pulso hasta que se vuelve a leer la entrada del pulsador. Dicho retardo debe ser suficientemente largo para asegurar que cuando finalice ya se hayan extinguido los rebotes, pero también suficientemente corto para que sea imperceptible para nosotros. En este ejemplo se cuentan los pulsos introducidos al PIC por RB0. El esquema es el siguiente: (http://perso.wanadoo.es/chyryes/tutoriales/imagenes/esq_pul.gif) Cuando se acciona el pulsador la entrada RB0 se pone a "0". Para evitar contar los rebotes se llama a una subrutina de retardo llamada REBOTE, esta subrutina funciona bien para osciladores de 4MHz. Código: ;************************************ En fin, espero que haya servido de algo :- D Título: Re: Tutorial: Programación PIC Publicado por: BADBYTE-K en 3 Diciembre 2005, 01:28 am Muchas gracias, seguro le servira a muchos 8)
agregado a la biblioteca http://foro.elhacker.net/index.php/topic,59651.msg274419.html#msg274419 saludos Título: Re: Tutorial: Programación PIC Publicado por: Fabios Arts en 4 Diciembre 2005, 22:23 pm Muchas gracias, seguro le servira a muchos 8) agregado a la biblioteca http://foro.elhacker.net/index.php/topic,59651.msg274419.html#msg274419 saludos Gracias : D |