Guia Para Usar El Pic

Embed Size (px)

Citation preview

Microcontroladores PIC

pag 1

MicrocontroladoresPICBy Frank

Mecaclub 2008

Microcontroladores PIC

pag 2

INTODUCCIONEste tutorial, es una recopilacin de la mejor y mas til informacin relacionada con la programacin de pics en lenguaje ensamblador, enriquecida con ejemplos prcticos, Buscando que esta sea una gua de consulta bsica a los programadores mas experimentados y tambin para los que inician. Se empieza con la teora elemental de los pics, su memoria, registros bsicos, sus pines,.. para luego ver las 35 instrucciones del ensamblador, y llevar paso a paso a que conozca el programador jdm que usted mismo puede construir, y aprenda a configurar ic-prog para xp y realizar el primer proyecto en mplab, as como realizar la simulacin de entradas para el debug del cdigo. Se Anexa circuito electrnico a la mayora de los cdigos en ensamblador, para que vean la aplicacin practica. Se exponen claramente como calcular retardos, como usar las tablas, los tipos de saltos en el programa, acceso indirecto a los registros, uso de directivas muy practicas de mplab como cblock y dt. Y al final se muestra como trabajar con lcss 16x2 (hitachi 44780), en interfaces de 8 bits y 4 bits. Aunque se enfoca en el pic16f84a, todo lo aprendido es aplicable a los pics mas avanzados como los 16f877a.

Mecaclub 2008

Microcontroladores PIC

pag 3

PIC Programmable Integrated Circuits (Circuitos Integrados Programables)Un microprocesador y un microcontrolador no son la misma cosa. Los PICs son microcontroladores, es decir, una unidad que posee en su interior al microprocesador y a los elementos indispensables para que pueda funcionar como una minicomputadora en un solo chip. Un microprocesador es solamente la unidad central de procesos o (CPU), la memoria, los puertos y todos los dems perifricos son exteriores. El 16f84A requiere, en general, una fuente de 5V, un cristal con dos capacitores y como mnimo una resistencia para el reset. Posee dos puertos de salida, el A y el B, cuyos terminales son marcados RA0 al RA4 y RB0 al RB7. Estos puertos pueden ser programados como de entrada o de salida. A fines prcticos podemos decir que cuando tocamos una patita del PIC correspondiente a un puerto, es como si estuviramos tocando un bit del registro PORTA o PORTB, donde 0 significa GND y 1 significa 5 volts. La Memoria de Programa del PIC16F84A es una EEPROM (Electrically-Erasable Programmable Read-Only memory), es decir (ROM programable y borrable elctricamente). Antiguamente, los microprocesadores tenan una ventanita transparente y era necesario exponerlos a la luz ultravioleta para borrar su memoria e introducir un programa nuevo. Actualmente cuentan con memorias (Flash) que no tienen este requisito. Basta con cargarlos con un programa para que se borre el anterior. Los PICS que poseen la letra F (16f84, por ejemplo) pueden ser programados hasta 1 milln de veces porque poseen memoria Flash, mientras que los que poseen la letra C (16C92, por ejemplo) solo pueden ser programados una vez ya que poseen memoria ROM. El PIC 16F84A es un versin mas nueva del 16F84, (la letra A indica que es una versin mejorada de su antecesor). En el nombre del pic 16F84A-04 se indica que se puede operar mximo a 4 mhz, y por su parte el 16F84A-20 a 20 mhz.

Mecaclub 2008

Microcontroladores PIC

pag 4

INDICEOrganizacin de la memoria ................................................................................5 La memoria EEPROM para el programa..............................................................6 La memoria RAM ..............................................................................................7 Descripcin de pines .......................................................................................8 Ciclo de instruccin........................................................................................9 Capacidad de corriente en los puertos ..........................................................10 El oscilador externo ....................................................................................10 Campos del lenguaje ensamblador ...................................................................11 Directivas........................................................................................................12 contenido de P16F84A.INC ..............................................................................13 set de instrucciones ........................................................................................14 operaciones bsicas add,and,ior,xor ................................................................17 Notacion para numeros ....................................................................................17 Flags del STATUS ............................................................................................18 Configuracin de los puertos del PIC...............................................................19 retardos .........................................................................................................21 calculo de retardos .....................................................................................22 Rlf- encender 4 leds secuencialmente ...........................................................23 pclath y pcl.....................................................................................................24 Tabla de datos ................................................................................................25 Tecnicas de saltos en el programa ...................................................................26 cblock.............................................................................................................27 Bcd (7 segmentos) ...........................................................................................28 Debounce (rebote)............................................................................................29 Debounce con retardo ..................................................................................30 debounce con contador ..............................................................................31 debounce con contador ................................................................................32 MULTIPLEXAR BCDs (7 SEGMENTOS) ...............................................................33 INTERFACES DE POTENCIA CON PIC..................................................................34 Indirect access memory (REGISTROS INDF y FSR ...............................................35 Programador pic ..............................................................................................36 CONFIGURANDO IC-PROG PARA XP ................................................................37 Cargar el programa el programa al PIC .........................................................38 Errores de comunicacin ic-prog....................................................................39 MPLAB 7.52 ....................................................................................................42 Iniciar Simulador del MPLAB 7.52 .................................................................44 Herramientas para hacer el debug .................................................................44 SIMULACION DE ENTRADAS...........................................................................45 SIMULACION DE SALIDAS..............................................................................46 OBSERVACIONES Y RECOMENDACIONES ..........................................................48 Los fuses del PIC ............................................................................................50 (bit 7) Registro OPTION_REG (bit 0) ..........................................................51 watchdog......................................................................................................52 Prescaler .....................................................................................................52 Cmo contar 1 segundo? ..........................................................................54 Interrupciones.................................................................................................55 Registro intcon (BIT 0) ...................................................................57 (BIT 7) Motor a pasos .....................................................................................................58 Aplicando multiplexacion por tabla de datos .................................................................60 LCDs HITACHI HD44780 ..........................................................................62 Interpretacin del significado de los Pines del Modulo LCD ..........................62 Tiempos mnimos requeridos ...........................................................................63 Inicializacin del modulo LCD........................................................................65 INTERFAZ DE 4 BITS SIN R/W (sin busy flag) ....................................................67 INSTRUCCIN DT de MPLAB ............................................................................71 INTERFAZ DE 8 BITS, USANDO R/W (con busy flag)...........................................72

Mecaclub 2008

Microcontroladores PIC

pag 5

Organizacin de la memoriaEn primer lugar tenemos que distinguir claramente las tres memorias que son empleadas por el PIC: La memoria EEPROM donde almacenaremos el programa que haremos, esta

memoria solo podr ser leda por el PIC (el PIC va leyendo las instrucciones del programa almacenado en esta memoria y las va ejecutando). Al apagar el PIC esta memoria no se borra. La memoria RAM en cuyos registros se irn almacenando los valores de las variables que nosotros queramos y cuando nosotros queramos (por programa), al apagar el PIC esta memoria se borra. La memoria EEPROM para datos, es un espacio de memoria EEPROM en la que se pueden guardar variables que queremos conservar aunque se apague el PIC.

Mecaclub 2008

Microcontroladores PIC

pag 6

La memoria EEPROM para el programaEl espacio marcado como "User memory Space" es el espacio de memoria donde ir nuestro programa, comprende las direcciones de memoria desde la 0000h hasta la 3FFh (3FFh en decimal es 1023, mas la direccin 0000h hacen 1024 direcciones, es decir, 1Kbyte) "Reset Vector" es la primera direccin a la que se dirige el PIC al encenderlo o al resetearlo. Peripheral Interrupt Vector es la direccin (0004h) a la que se dirige el PIC cuando se produce una interrupcin, esto es, un evento que permite sacar al PIC de la ejecucin normal del programa. Un programa est compuesto por instrucciones que generalmente se ejecutan de forma secuencial. En el PIC16F84 cada una de esas instrucciones ocupa una posicin de memoria de programa. El contador de programa o PC (Program Counter) es un registro interno de 13 bits que se utiliza para direccionar las instrucciones del programa de control que estn almacenadas en la memoria de programa. Este registro contiene la direccin de la prxima instruccin a ejecutar y se incrementa automticamente de manera que la secuencia natural de ejecucin del programa es lineal, una instruccin despus de otra. "Stack Level" la pila tiene 8 niveles de memoria tipo LIFO (Last Input, First Output; ltimo en entrar, primero en salir). Si se produce la llamada a una subrutina durante la ejecucin de otra subrutina; la direccin de retorno de esta segunda es colocada encima de la pila sobre la direccin anterior. Esta segunda direccin es la primera en salir de la pila mediante la instruccin RETURN. Con una pila de 8 niveles, una subrutina puede llamar a otra y sta, a su vez, llamar a otra hasta un mximo de ocho.

Mecaclub 2008

Microcontroladores PIC

pag 7

La memoria RAM

La memoria RAM no solo se usa para almacenar nuestras variables, tambin se almacenan una serie de registros que configuran y controlan el PIC. Podemos observar en la imagen que esta memoria esta dividida en dos bancos de 128 bytes, el banco 0 y el banco 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. Fijndonos en el banco 1, las direcciones desde la 00h hasta la 0Bh estn ocupadas por registros del PIC, por lo que tendremos que empezar a guardar nuestras variables a partir de la direccin 0Ch hasta 4Fh Faltara aadir 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 direccin pero se usa constantemente para mover datos y dar valores a las variables (registros). Por ejemplo, si queremos copiar la informacin del registro 0Ch en el registro 0Dh no podremos hacerlo directamente, deberemos usar una instruccin para cargar el valor del registro 0Ch en el acumulador y despus otra instruccin para cargar el valor del acumulador en el registro 0Bh.

Direccin 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh

Banco 0 INDF TMR0 PCL STATUS FSR PORTA PORTB No implementado EEDATA EEADR PCLATH INTCON 68 GPR (Registros de proposito general) No implementado

Banco 1 OPTION_REG

Direccin 80h 81h 82h 83h 84h

TRISA TRISB

85h 86h 87h

EECON1 EECON2

88h 89h 8Ah 8Bh

0Ch-4Fh

8Ch-CFh

50h-7Fh

D0h-FFh

Mecaclub 2008

Microcontroladores PIC

pag 8

PIC 16F84A

Descripcin de pinesEl P1C16F84A est fabricado en tecnologa CMOS, consume baja potencia, y es completamente esttico (si el reloj se detiene, los datos de la memoria no se pierden).

Patas 1, 2, 3, 17 y 18 (RA0-RA4/TOCKI): Es el PORT A. Corresponden a 5 lneas bidireccionales de E/S (definidas por programacin). Es capaz de entregar niveles TTL cuando la alimentacin aplicada en VDD es de 5V 5%. El pin RA4/TOCKI como entrada puede programarse en funcionamiento normal o como entrada del contador/temporizador TMR0. Cuando este pin se programa como entrada digital, funciona como un disparador de Schmitt (Schmitt trigger), puede reconocer seales un poco distorsionadas y llevarlas a niveles lgicos (cero y cinco voltios). Cuando se usa como salida digital se comporta como colector abierto; por lo tanto se debe poner una resistencia de pull-Up (resistencia externa conectada a un nivel de cinco voltios). Pata 4 (MCLR / Vpp): Es una pata de mltiples aplicaciones, es la entrada de Reset (master clear) si est a nivel bajo y tambin es la habilitacin de la tensin de programacin cuando se est programando el dispositivo. Es esencial que su tensin sea VDD, de lo contrario el PIC se mantendr en RESET. Patas 5 y 14 (VSS y VDD): Son respectivamente las patas de tierra y alimentacin. La tensin de alimentacin de un PIC est comprendida entre 2V y 6V aunque se recomienda no sobrepasar los 5.5V. Patas 6, 7, 8, 9, 10, 11, 12, 13 (RB0-RB7): Es el PORT B. Corresponden a ocho lneas bidireccionales de E/S (definidas por programacin). Pueden manejar niveles TTL cuando la tensin de alimentacin aplicada en VDD es de 5V 5%. RB0 puede programarse adems como entrada de interrupciones externas INT. Los pines RB4 a RB7 pueden programarse para responder a interrupciones por cambio de estado. Las patas RB6 y RB7 se corresponden con las lneas de entrada de reloj y entrada de datos respectivamente, cuando est en modo programacin del integrado. Patas 15 y 16 (OSC1/CLKIN y OSC2/CLKOUT): Corresponden a los pines de la entrada externa de reloj y salida de oscilador a cristal respectivamente. Como estos dispositivos son de tecnologa CMOS, todos los pines deben estar conectados a alguna parte, pero si no van a ser tomados en cuenta en el programa, no es necesario conectarlos. *E/S Entrada/Salida

Mecaclub 2008

Microcontroladores PIC

pag 9

Ciclo de instruccinEl procesador es segmentado tipo pipe-line: Lo que significa que aplica la tcnica de segmentacin que permite al procesador realizar simultneamente la ejecucin de una instruccin y la bsqueda del cdigo de la siguiente instruccin. Esto permite que se pueda ejecutar una instruccin en un ciclo. (Cada ciclo de instruccin son cuatro ciclos de reloj). Es decir, la mayora de las instrucciones se realizan en un ciclo de contador de programa (ciclo de instruccin) excepto las instrucciones de salto (CALL, RETURN, GOTO) que necesitan dos ciclos para ejecutarla. Se determina el ciclo de instruccin dividiendo por cuatro la frecuencia del oscilador, elegida para el funcionamiento del microcontrolador tal como se ve observa en la figura. Es decir, la seal que proviene del oscilador externo, conectado a los pines OSC1/CLKIN y OSC2/CLKOUT del microcontrolador, se divide en cuatro ciclos, obtenindose as la seal requerida por el procesador interno para realizar las operaciones. De esta manera se puede realizar la bsqueda y ejecucin de la instruccin. El reloj de instruccin es el ciclo interno que posee el microcontrolador para cronometrar el tiempo de ejecucin de las instrucciones. Los pulsos entrantes del reloj son divididos por 4, generando diferentes seales denominadas Q1, Q2, Q3, Q4, El estado Q1 hace incrementar el contador de programa, Q2 y Q3, se encargan de la descodificacin y ejecucin de la instruccin y por ultimo, Q4 es la fase de bsqueda de la instruccin.

Mecaclub 2008

Microcontroladores PIC

pag 10

Capacidad de corriente en los puertosLa mxima capacidad de corriente de cada uno de los pines de los puertos en modo (sink) es de 25 mA y en modo fuente (source) es de 20 mA. La mxima capacidad de corriente total de los puertos es:

PUERTO A Modo Sumidero (absorbida) 80 mA Modo Fuente (suministrada) 50 mA

PUERTO B 150 mA 100 mA

El oscilador externoEs un circuito externo que le indica al micro la velocidad a la que debe trabajar. Este circuito, que se conoce como oscilador o reloj, es muy simple pero de vital importancia para el buen funcionamiento del sistema. El P1C16F84A puede utilizar cuatro tipos de reloj diferentes. Estos tipos son: RC. Oscilador con resistencia y condensador. XT. Cristal (frecuencia de clock mxima de 4 Mhz). HS. Cristal de alta velocidad (entre 4 Mhz y 20 Mhz). LP. Cristal para baja frecuencia y bajo consumo de potencia (entre 30 kHz y 200 kHz). Aqu utilizaremos el cristal de 4 MHz, acompaado de 2 capacitores, porque garantiza mayor precisin y un buen arranque del microcontrolador. Internamente esta frecuencia es dividida por cuatro, lo que hace que la frecuencia efectiva de trabajo sea de 1 MHz, por lo que cada instruccin se ejecuta en un microsegundo

Si no requieres mucha precisin en el oscilador, puedes utilizar una resistencia y un condensador, como se muestra en la figura. Segn las recomendaciones de Microchip, R puede tomar valores entre 5k y 100k, y C superior a 20pf.

Mecaclub 2008

Microcontroladores PIC

pag 11

Campos del lenguaje ensambladorLas instrucciones estn divididas en un nmero de campos, como se muestra debajo. ETIQUETAS caso trio OPERACIN movf retlw sleep OPERANDO 5,w 4 COMENTARIOS ; lee puerto A ; retorna de subrutina ; bajo consumo

El campo del cdigo de operacin es el nico que nunca puede estar vaco; ste siempre contiene una instruccin o una directiva del assembler. El campo del operando o direccin puede contener una direccin o un dato, o puede estar en blanco. El campo del comentario o de etiquetas es opcional.

Etiquetas:La etiqueta es el primer campo en una lnea en lenguaje assembler y puede no existir. Si una etiqueta est presente, el assembler la define como el equivalente a la direccin del 1 byte correspondiente a esa instruccin. Esta etiqueta puede volver a usarse en otro lugar pero como operando de una instruccin.

Ejemplo: START movlw DATO : : goto START DATO EQU 05h

Mecaclub 2008

Microcontroladores PIC

pag 12

DirectivasAlgunas instrucciones del lenguaje assembler no se traducen directamente a instrucciones del lenguaje mquina. stas instrucciones son directivas para el assembler; stas asignan al programa ciertas reas de memoria, definen smbolos, colocan tablas o datos constantes en memoria.

EQU (Equate - Equivalente):La directiva EQU permite al programador igualar nombres a datos o direcciones. Esta pseudo-operacin se nota EQU. Los nombres utilizados se refieren generalmente a direcciones de dispositivos, datos numricos, direcciones de comienzo, direcciones fijas, posiciones de bits, etc. PORT_A START CARRY TIEMPO EQU EQU EQU EQU 5 0 3 5

Tambien se puede definir una equivalencia con el nombre de otra equivalencia ya definida. PORT_B PORT_C FIN FIN2 EQU EQU EQU EQU PORT_A+1 PORT_A+2 START+100 START+200

ORG (Origin - Origen):La directiva origen (se nota ORG) permite al programador especificar la posicin de memoria donde programas, subrutinas o datos residirn. Los programas y los datos pueden estar alojados en diferentes reas de la memoria del programa.

Por Ejemplo: ORG goto org goto ORG inicializa : : 00h inicializa 04h interr 05h movlw 08h

; vector de interrupcion

; aqu comienza el programa

Mecaclub 2008

Microcontroladores PIC

pag 13

contenido de P16F84A.INC(C:\Program Files\Microchip\MPASM Suite\P16F84A.INC)

A las posiciones de la memoria de datos se les pone nombres, con lo cual es ms fcil programar, estos nombres estan definidos dentro del archivo que se incluye dependiendo del modelo del pic, que en nuestro caso es p16f84a.inc. Por ejemplo: Estado equ 0x03 Al registro STATUS, que est en la posicin 0x03 de la memoria de datos le puse la etiqueta "Estado". equ es algo as comoooo...igual . (Es decir, le estoy asignando el nombre estado al registro que est en la posicin 0x03 de la memoria de datos). Asi se incluye: #include P16F84A.INC Dentro del archivo P16F84A.INC ya estan las definiciones de las posiciones de los SFR que se van usar.;----- Register Files---INDF TMR0 PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLATH INTCON OPTION_REG TRISA TRISB EECON1 EECON2 ;----- STATUS Bits -----IRP RP1 RP0 NOT_TO NOT_PD Z DC C EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000' EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'0000' H'0001' H'0002' H'0003' H'0004' H'0005' H'0006' H'0008' H'0009' H'000A' H'000B' H'0081' H'0085' H'0086' H'0088' H'0089'

;----- INTCON Bits -GIE EEIE T0IE INTE RBIE T0IF INTF RBIF EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- OPTION_REG Bits -------NOT_RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

Mecaclub 2008

Microcontroladores PIC

pag 14

set de instruccionesAbreviaturas empleadas:

F= File Register D= Destiny

Representa un registro cualquiera de la RAM 1 indica que el resultado de la operacin se almacene en el mismo registro 0 indica que el resultado de la operacin se almacene en el registro W Ejemplo (D80 , 0x49, b00101101)

B= Bit del registro K= Numero constante.

SINTAXIS ASM ADDLW ADDWF ANDLW ANDWF XORLW XORWF IORLW IORWF SUBLW SUBWF CLRF CLRW COMF DECF DECFSZ INCF INCFSZ MOVLW MOVF MOVFW K F, D K F, D K F, D K F, D K F, D F F, D F, D F, D F, D F, D K F, D F W = W+K F = F+W W = F+W

Descripcin de la instruccin Suma el contenido de W con K y guarda en W D=1 D=0

Flags alterados C, DC, Z C, DC, Z Z

W = [W] and [K] F = [F] and [W] W = [F] and [W] W = [W] xor [K] F = [W] xor [F] W = [W] xor [F] W = [W] ior [K] F = [F] ior [W] W = [F] ior [W] W = K-W F = F-W W = F-W Borra F Borra W Invierte todos los bits de F Decrementa F Decrementa F, Incrementa f Incrementa f, W= K F =F W=F W= F Salta si 0 Salta si 0 D=1 D=0 D=1 D=0 D=1 D=0 D=1 D=0

Z Z Z Z Z C, DC, Z C, DC, Z Z Z Z Z

Z

Carga W con el valor K D=1 D=0 Pasa el contenido de F a W Z Z

Mecaclub 2008

Microcontroladores PIC MOVWF NOP F F = W Pasa el contenido de W a F

pag 15

Solo gasta 1 ciclo de instruccin Rota los 8 bits a la izquierda, pasando por el bit C

RLF

F, D

C

Rota los 8 bits a la derecha, pasando por el bit C

RRF

F, D

C

SWAPF BCF BSF BTFSC BTFSS CALL GOTO RETFIE RETLW RETURN NOTA:

F, D F, B F, B F, B F, B K K K -

Intercambia la posicin de los primeros 4 bits, con los 4 finales del registro F Coloca a 0 el bit B del registro F Coloca a 1 el bit B del registro F Salta la siguiente instruccin, si el bit B del registro F es 0 Salta la siguiente instruccin, si el bit B del registro F es 1 Llama a una subrutina Salta a la posicin de memoria K Activa el bit 7 de INTCON (el cual habilita todas las interrupciones ), luego ejecuta RETURN W = K, luego ejecuta RETURN Retorno de una llamada

MOVWF y SWAPF, son muy tiles en las interrupciones porque no alteran flags del STATUS. MOVFW no es una instruccin RISC del pic, sino una pseudo instruccin de MPLAB, que al momento de compilar cambia a (MOVF F,0); puede resultar mas fcil programar usando MOVFW cuando se desea pasar el contenido de F a W.

Mecaclub 2008

Microcontroladores PIC

pag 16

traduccion de las instruccionesADDLW ADDWF ANDLW ANDWF BCF BSF BTFSC BTFSS CALL CLRF CLRW CLRWDT COMF DECF DECFSZ GOTO INCF INCFSZ Add W and f AND W with f AND literal with W AND W with f Bit Clear f Bit Set f Bit Test f, Skip if Clear Bit Test f, Skip if Set Call subroutine Clear f Clear W Clear Watchdog Timer Complement f Decrement f Decrement f, Skip if 0 Go to address Increment f Increment f, Skip if 0 RRF SUBLW SUBWF SWAPF XORLW XORWF Rotate Right f through Carry Subtract W from literal Subtract W from f Swap nibbles in f Exclusive OR literal with W Exclusive OR W with f IORLW IORWF MOVLW MOVWF NOP RETFIE RETLW RETURN RLF Inclusive OR literal with W Inclusive OR W with f Move literal to W Move W to f No Operation Return from interrupt Return with literal in W Return from Subroutine Rotate Left f through Carry

Mecaclub 2008

Microcontroladores PIC

pag 17

operaciones bsicas add,and,ior,xorADD suma, donde 1+1=1, y genera bit de acarreo 0 1 1 1 0 1 1 1 (119) 0 0 1 0 1 1 1 1 (47) 1 0 1 0 0 1 1 0 (166) IOR a diferencia de ADD, 1 +1 =1 y no genera bit de acarreo 01110111 00101111 01111111 AND simple multiplicacin entre bits 01110111 00101111 00100111 XOR si son iguales los bits diferentes bits 01110111 00101111 01011000 =0 =1

Notacion para numerosMPLAB entiende cualquiera de las siguientes notaciones numricas y se pueden emplear en un mismo programa sin tener que especificar con anterioridad. Decimal : Hexadecimal : Octal : Binario : ASCII : D'100' = .100 H'64' = 0x64 O'144' B'01101100' A'C' = 'C'

= 64

Mecaclub 2008

Microcontroladores PIC

pag 18

Flags del STATUSLos Flags o banderas son marcadores, representados por bits dentro del registro STATUS, y son: Z : Flag de cero, se pone a 1 cuando una operacin lgica o aritmtica da 0 (cero)como resultado. En cualquier otro caso se pone a 0. C : Flag de Carry, se pone a 1 cuando la operacin que le afecta sobrepasa el nivel de representacin del procesador, en nuestro caso es de 8 BIT's , de esta manera si sumamos a b11111111 un b00000011 el resultado sera b00000010 y el BIT de Carry pasara a 1. DC : Flag de carry del nibble inferior, este se comporta igual que el BIT de Carry, solo que el lmite de representacin son los 4 bits inferiores, de esta manera si tenemos b00001111 y sumamos b00000111, el resultado ser b00010110 y el BIT de DC se pone a 1, el BIT de Carry estar a 0 al no superarse los 8 bits y el de Z a 0 al ser el nmero diferente de 0. Nota: (nibble): el byte se divide en 2 nibbles; cada 4 bits es un nibble.

Ejemplo : Z=0 Z=1 C=1 C=0 cuando cuando cuando cuando el el el el resultado resultado resultado resultado no es cero es igual a cero es positivo es negativo

C=1, Z=0 ( Resultado es positivo ) C=1, Z=1 ( Resultado es cero ) C=0, Z=0 ( Resultado es negativo)

(BIT 7)

REGISTRO STATUS

(BIT 0)

IRP RP1 RP0

TO

PD

Z

DC

C

Mecaclub 2008

Microcontroladores PIC

pag 19

Configuracin de los puertos del PICLleg el momento de ver como configurar los puertos del PIC. Para poder hacerlo es necesario conocer la tabla de registros de la memoria de datos, la cual como dijimos, est dividida en el BANCO 0 y BANCO 1. Los registros importantes en la configuracin de los puertos son: STATUS direccin 0x3 PORTA direccin 0x5 PORTB direccin 0x6 TRISA direccin 0x5 TRISB direccin 0x6 Al configurar los puertos debers tener en cuenta que: Si asignas un CERO (0) a un pin, ste quedar como salida y... Si le asignas un UNO (1), quedar como entrada Esta asignacin se hace en: TRISA para los pines del PUERTO A (5 bits) TRISB para los pines del PUERTO B (8 bits) Por Ejemplo: Si TRISA es igual a 11110 todos sus pines sern entradas salvo RA0 que esta como salida Si TRISB es igual a 00000001 todos sus pines sern salidas salvo RB0 que esta como entrada Cuando el PIC arranca se encuentra en el BANCO 0, como TRISA y TRISB estn en el BANCO 1 no queda otra, deberemos cambiar de banco. Esto se logra a travs del Registro STATUS. STATUS es un Registro de 8 bits u 8 casillas, en el cual la N 5 (RP0) define la posicin del banco en donde nos encontramos. Si pones un CERO (0) a RP0 estaremos en el BANCO 0 Si le pones un UNO (1) ya ves, estaremos en el BANCO 1

(BIT 7)

REGISTRO STATUS

(BIT 0)

IRP RP1 RP0RP0 0 1 0 1 RP1 0 0 1 1

TO

PD

Z

DC

C

RP1, RP0, juntos permiten configurar el banco que se quiere acceder.

BANCO BANCO BANCO BANCO

0 1 2 3

Pero como el PIC16F84A solo tiene 2 bancos solo se usa el RP0.

Mecaclub 2008

Microcontroladores PIC

pag 20

Vamos a escribir un cdigo que configure todos los pines del puerto A como entrada y todos los del puerto B como salida, es un ejemplo didctico, que muestra el pedazo de cdigo bsico, que siempre se usa en todos los programas. Ejemplo: estado equ 0x03 ; Aqu le asignamos nombres a los trisa equ 0x05 ; registros indicando la posicin trisb equ 0x06 ; en la que se encuentran ;-------Configuracin de puertos------reset org 0x00 ; origen del programa, aqu comienzar ; siempre que prenda el pic o se resetee goto inicio ; salto a "inicio" inicio bsf estado,5 ; pongo rp0 a 1 y paso al banco1 movlw b'11111' ; cargo W con 11111 movwf trisa ; y paso el valor a trisa movlw b'00000000' ; cargo W con 00000000 movwf trisb ; y paso el valor a trisb bcf estado,5 ; pongo rp0 a 0 y regreso al banco0 ;-----------------------------------------end ; se acab ;------------------------------------------

Mecaclub 2008

Microcontroladores PIC

pag 21

retardosAhora si programaremos en serio. Encenderemos un LED, lo mantendremos encendido por un tiempo, luego lo apagaremos y haremos que se repita todo de nuevo. Recuerda ponerle un nombre, aqu lo llamar LED1.asm (no olvides el .asm)estado TRISB puertoB reg1 reg2 equ equ equ equ equ 0x03 0x06 0x06 0x0C 0x0D ; Haciendo asignaciones

; Estos 2 registros los utilizar ; para hacer el retardo

;-------Configuracin de puertos------org 0x00 ; origen del programa, aqu comenzar ; siempre que ocurra un reset goto inicio ; salta a "inicio" inicio bsf estado,5 ; pone rp0 a 1 y pasa al banco1 movlw b'00000000' ; carga W con 00000000 movwf TRISB ; y pasa el valor a trisb bcf estado,5 ; pone rp0 a 0 y regresa al banco0 ;----Aqu enciende y apaga el LED----ahora bsf puertoB,0 ; pone un 1 en RB0 (enciende el LED) call retardo ; llama al retardo bcf puertoB,0 ; pone a 0 RB0 (apaga el LED) call retardo ; llama al retardo goto ahora ; repite todo de nuevo ;-----------Rutina de Retardo----------retardo movlw d'200' ; Aqu se cargan los registros movwf reg1 ; reg1=200 y reg2=0 clrf reg2 ; respectivamente retorno decfsz goto decfsz goto return

; le quitare 1 a reg2 ; cuando reg2 llegue a 0 brinca el goto retorno ; le quitare 1 a reg1 ; cuando reg1 llegue a 0 brinca el goto retorno ; regresare al lugar ; de donde se hizo la llamada ;-----------------------------------------end ; se acab ;------------------------------------------

reg2,1 retorno reg1,1 retorno

Mecaclub 2008

Microcontroladores PIC

pag 22

calculo de retardosUsando la subrutina de retardo empleada anteriormente Como ejemplo el cristal que usamos es el de 4 Mhz , como cada 4 pulsos se ejecuta 1 instruccin, estamos manejando una frecuencia de 1 Mhz realmente. Todas las instrucciones gastan 1 ciclo de instruccin (1 microsegundo). Excepto las de salto como CALL, GOTO, RETURN que gastan 2. Cuando llega a cero la variable en este caso: decfsz var,1 salta la siguiente instruccin, no usando el goto, sino ejecutando la siguiente instruccin como un nop.

Vamos a sumar cuando duro toda esta subrutina de retardoretardo movlw movwf clrf ;2 al momento de usar CALL retardo d'200' ;1 Aqu se cargan los registros reg1 ;1 reg1=200 y reg2=0 reg2 ;1 respectivamente ;hasta aqu van 5 microsegundos

retorno decfsz reg2,1 ;1 le quitare 1 a reg2 goto retorno ;2 cuando reg2 llegue a 0 brinca el goto retorno ;como reg2 fue inicializado en cero, y tiene que llegar a cero de nuevo, va a ejecutar estas 2 ;instrucciones 256 veces, lo que da (256 x 3)-1 = 767 microsegundos ;el -1 viene de que al finalizar decfsz ejecuta un nop, para saltarse la siguiente instruccin, y como el nop gasta 1 ciclo, la diferencia entre el goto que gastaba 2 ciclos, da que sea -1. decfsz reg1,1 ;1 le quitare 1 a reg1 goto retorno ;2 cuando reg1 llegue a 0 brinca el goto retorno ;como estas 2 instrucciones estan anidadas a las anteriores y gastan 3 ciclos, seran sumadas al ciclo anterior, multiplicadas por el numero que fue cargado el reg1=200, -1 de la correccion debido al nop que ejecuta al final el decfsz. ; la operacin da ((767+3)x200)-1= 153999 microsegundos return ;LA SUMA FINAL >> ;mas 2 microsegundos debidos al RETURN 5 +153999+ 2= 154,006 microsegundos, ~ 154 milisegundos

Mecaclub 2008

Microcontroladores PIC

pag 23

RlfRlf- encender 4 leds secuencialmenteLo que haremos ahora ser un programa que encienda 4 LED's en forma secuencial, y para ello recurriremos a la rutina de retardo del programa anterior, que espero lo hayas comprendido.estado puertoB reg1 reg2 equ equ equ equ 0x03 0x06 0xC 0xD ; Haciendo asignaciones ; para hacer el retardo

;-------Configuracin de puertos------org 0x00 ;al enegizar el PIC, aqui empieza goto inicio ; salta a "inicio" inicio bsf estado,5 ; configurando el puerto B clrf puertoB ;puertoB=TRISB=0x06 bcf estado,5 ;lo importante es que banco te encuentras ;----Realiza la secuencia de LED's----ahora movlw 0x01 ; carga W con 00000001 movwf puertoB ; lo pasa al registro rotar rotando call retardo ; llama a retardo rlf puertoB,1 ; desplaza un bit el contenido ; de rotar y lo guarda. btfss puertoB,4 ; prueba si se activa el 5to. bit ; si es as saltea una lnea goto rotando ; sino, sigue rotando goto ahora ; repite todo de nuevo ;-----------Rutina de Retardo----------retardo movlw d'200' ; Aqu se cargan los registros movwf reg1 ; respectivamente clrf reg2 retorno decfsz goto decfsz goto return

; le quitare 1 a reg2 ; cuando reg2 llegue a 0 brinca ; le quitare 1 a reg1 ; cuando reg1 llegue a 0 brinca ; regresare al lugar ; de donde se hizo la llamada ;-----------------------------------------end ; The End ;------------------------------------------

reg2,1 retorno reg1,1 retorno

Mecaclub 2008

Microcontroladores PIC

pag 24

pclath y pclLa memoria del programa tiene capacidad de 1024 instrucciones, para direccionar la prxima instruccin a ejecutar se usa el contador de 13 bits (PC COUNTER) que se particiona en 2 registros: PCL que esta en la posicin 0x02 de 8 bits PCLATH que esta en la posicion 0x0A de 5 bits Es decir como para direccionar las intrucciones se ocupan 13 bits, estos se comparten entre los registro PCL y PCLATH, los 8 bits del PCL mas los primeros 5 bits del PCLATH. Uno no debe preocuparse por modificar estos registros a menos que ests usando tabla de datos, y por ejemplo si quieres ir a la posicin (500 decimal == 0x200 hexadecimal ) entonces tendras que cargar con 0x2 PCLATH y con 0x00 el PCL.

PCL PCLATH

cuenta de 0 hasta 256 cuenta de 0 hasta 3, indicando en que pagina se encuentra ejecutando instrucciones. = 0x100 hexadecimal = 0x400 hexadecimal ok?

256 256*4=1024

Entonces se divide en 4 partes o paginas, el programa. Porque 256 x 4= 1024 Como manejamos registros de 8-bit, el registro PCL, es que dice que lnea de cdigo se esta ejecutando, y PCLATH, indica en que pagina PCLATH=00 PCLATH=01 PCLATH=10 PCLATH=11 PAGINA PAGINA PAGINA PAGINA 0 1 2 3

Las instrucciones CALL, GOTO, RETURN configuran automticamente solo los 3 primeros bits del PCLATH, cuando hacen saltos entre las paginas, pero lo regresan a su estado original PCLATH despus de ejecutar la instruccin, as que pasa desapercibido. Con 3 bits, no hay problemas hasta llegar a la pagina 9 (000 al 111 son 8 paginas), que seria hasta 0x7FF; a esto le llaman PAGE BOUNDARY, (limite de pagina). Si se quiere trabajar en las paginas 8 a la 16 hay que configurar el PCLATH en el bit 4 con 1, sino cualquier instruccin CALL, GOTO o RETURN ocasiona desastre al pensar que se debe trabajar en las primeras paginas. La pagina de una direccin la puedes manejar mas fcilmente observando el tercer digito de la direccin en hexadecimal por ejemplo: 0x700 es el inicio de la pagina 8.

Solo se ocupa modificar el PCLATH cuando se altera el PCL manualmente o el programa excede las 8 paginas.

Mecaclub 2008

Microcontroladores PIC

pag 25

Tabla de datosLa mejor manera de explicar cmo una tabla de datos trabaja, es comenzar con un ejemplo. PCL, es el que maneja que lnea de cdigo o instruccin es la prxima a ejecutar. Entonces, al agregarle por ejemplo 3, lo que ocasiona es que se salte las siguientes 3 instrucciones, y devuelva el 4 por medio de W. movlw 03 call table : : table addwf retlw 01 retlw 02 retlw 03 retlw 04 retlw 05 retlw 06 retlw 07 return

PCL,1

;le agrega a PCL=PCL+3

Si no se le agrega nada a PCL ejecuta la instruccin que se encuentra en la siguiente lnea de cdigo.

Mecaclub 2008

Microcontroladores PIC

pag 26

Tecnicas de saltos en el programaSALTOS CON ETIQUETAS GOTO clrf clrf adelante .. .. adelante porta portb

; en todos los ejemplos se saltan estas 2 instrucciones clrf

SALTOS RELATIVOSGOTO clrf clrf .. .. $+3 porta portb ; si fuera $+1 aqu va ; si fuera $+2 aqu va ; AQU SE DIRIGE CON $+3

SALTOS MODIFICANDO EL CONTADOR DE PROGRAMA (PCL) MOVLW ADDWF clrf clrf .. .. D3 PCL,1 porta portb

; PCL=PCL+3

; Aqu se dirige

EXTRACION DE LA DIRECCION DE UNA ETIQUETA MOVLW MOVWF clrf clrf adelante adelante PCL,1 porta portb ; extrae la direccion de la etiqueta ; se dirige a la direccion de la etiqueta

EXTRACION DE LA PAGINA EN QUE SE ENCUENTRA UNA ETIQUETA MOVLW MOVWF MOVLW MOVWF clrf clrf adelante HIGH adelante PCLATH adelante PCL,1 porta portb ; ; ; ; extrae la pagina en que se encuentra la etiqueta configura a la pagina a la que, se quiere saltar extrae la direccion de la etiqueta se dirige a la direccion de la etiqueta

Mecaclub 2008

Microcontroladores PIC

pag 27

cblockcblock [direccion inicial] Var1 Var2.. endc Cuando un programa requiere declarar demasiadas variables, no es practico hacerlo manualmente, por eso, esta instruccin de MPLAB, automticamente asigna las posiciones de la memoria a las variables, a partir de la direccin inicial que se le da..

Ejemplo

cblock h'0C'ret_05ms divisor divisor_adj cociente_l cociente_h disp_enc1 disp_enc2 indice_dis disp_u disp_d disp_c indice_7seg seg70 seg71 seg72 seg73 seg74 seg75 seg76 seg77 seg78 seg79 seg7a seg7b

;en notacin hexadecimal en este caso

endc

Mecaclub 2008

Microcontroladores PIC

pag 28

Bcd (7 segmentos)Conectaremos un BCD (7 segmentos) para ver como cambiar del 0 al 9, implementando la tecnica de la tabla de datos.STATUS PCL TRISB PORTB reg1 reg2 contador equ equ equ equ equ equ equ 0x03 0x02 0x06 0x06 0xC 0xD 0xE ; Haciendo asignaciones

; Estos 2 registros los utilizar ; para hacer el retardo ; variable para contar

;-------Configuracin de puertos------org 0x00 ; origen del programa, aqu comenzar goto inicio bsf movlw movwf bcf ;----Aqu enciende y repetir incf movfw xorlw btfsc clrf movfw call movwf call goto ;-----------Rutina de retardo movlw movwf clrf retorno decfsz goto decfsz goto return STATUS,5 b'00000000' TRISB STATUS,5 apaga el LED----contador,1 contador d'10' STATUS,2 contador contador TABLA_BCD PORTB retardo repetir Retardo----------d'200' reg1 reg2 reg2,1 retorno reg1,1 retorno ; ; ; ; pone rp0 a 1 y pasa al banco1 carga W con 00000000 y pasa el valor a trisb pone rp0 a 0 y regresa al banco0 inicio

;contador=contador+1 ;compara 10 con el valor del contador ;si es 1, coincidio ;si coincidio, resetea el contador ;w=contador ; PORTB=W ; llama al retardo ; repite todo de nuevo

; Aqu se cargan los registros ; reg1=200 reg2=0 ; respectivamente ; ; ; ; ; ; le quitare 1 a reg2 cuando reg2 llegue a 0 brinca el goto retorno le quitare 1 a reg1 cuando reg1 llegue a 0 brinca el goto retorno regresare al lugar de donde se hizo la llamada

;-----------------------------------------TABLA_BCD ADDWF PCL,1; retlw b'01000000' ;0 retlw b'01111001' ;1 retlw b'00100100' ;2 retlw b'00110000' ;3 retlw b'00011001' ;4 retlw b'00010010' ;5 retlw b'00000010' ;6 retlw b'01111000' ;7 retlw b'00000000' ;8 retlw b'00010000' ;9 end ; se acab

Mecaclub 2008

Microcontroladores PIC

pag 29

Debounce (rebote)Las entradas cuando vienen de sensores infrarrojos y contactos mecnicos (pushbuttons) principalmente, no hacen el cambio de estado lgico sin rebote, y a la velocidad que esta corriendo el pic (1 MILLON DE INSTRUCCIONES POR SEGUNDO), ocasiona resultados no deseados, por lo que hay 2 maneras de evitar esto. 1. Usar retardos de tiempo, para cuando detecte que cambio de estado por primera vez, haga un retardo de tiempo, y luego lo compare con su ultimo estado lgico (1, 0) para ver si cambio de verdad, esto puede resultar satisfactorio pero no es lo optimo, porque la seal bien se pudo haber estabilizado mucho antes, y el PIC, esta perdiendo el tiempo, y en aplicaciones en donde es crucial la velocidad esto no debe ser implementado. 2. Usar contadores de estado, para evaluar cuando una seal ya esta estable. Mientras este en el estado de transicin, el contador se va estar resetendo, pero en cuando llegue al un estado lgico estable, el contador ya no se va a resetear y va permitir que dado cierto umbral establecido al contador, el PIC, tome la determinacin de que ya esta estable.

A continuacin se muestran 2 codigos que hacen la funcion DEBOUNCE de manera distinta, uno con retardos y otro con contador. Al final del primer codigo se encuentra el circuito electronico que corresponde a los 2 codigos. Hacen lo mismo solo difieren en el codigo DEBOUNCE.

Mecaclub 2008

Microcontroladores PIC

pag 30

Debounce con retardoSTATUS PCL TRISB TRISA PORTB PORTA reg1 reg2 equ equ equ equ equ equ equ equ 0x03 0x02 0x06 0x05 0x06 0x05 0xC 0xD ; Haciendo asignaciones

; Estos 2 registros los utilizar ; para hacer el retardo

;-------Configuracin de puertos------org 0x00 ; origen del programa, aqu comenzar goto inicio bsf movlw movwf movlw movwf bcf STATUS,5 b'00000000' TRISB b'00000111' TRISA STATUS,5 ; ; ; ; ; ; pone rp0 a 1 y pasa al banco1 carga W con 00000000 y pasa el valor a trisb carga W con 00000111 RA0,RA1,RA2, son los pushbuttons pone rp0 a 0 y regresa al banco0 inicio

repetir ;-----------------------CODIGO DEBOUNCE-----RETARDO---------movfw PORTA andlw b'00000111' ; filtra los bits de los pushbuttons BTFSC STATUS,2 ;si es 1, significa que PORTA=0 goto repetir ; no hay nada presionado repite call retardo ; llama al retardo, cuando se presiona un boton o mas ;-------------------------------------movfw PORTA ; w=PORTA andlw b'00000111' ; filtra los bits de los pushbuttons call movwf TABLA_BCD PORTB

; PORTB=W

goto repetir ; repite todo de nuevo ;-----------Rutina de Retardo----------retardo movlw d'200' ; Aqu se cargan los registros movwf reg1 ; reg1=200 reg2=0 clrf reg2 ; respectivamente retorno decfsz goto decfsz goto return

reg2,1 retorno reg1,1 retorno

; ; ; ; ; ;

le quitare 1 a reg2 cuando reg2 llegue a 0 brinca el goto retorno le quitare 1 a reg1 cuando reg1 llegue a 0 brinca el goto retorno regresare al lugar de donde se hizo la llamada

Mecaclub 2008

Microcontroladores PICTABLA_BCD ADDWF PCL,1; retlw b'01000000' ;-gfedcba 0 retlw b'01111001' ;1 retlw b'00100100' ;2 retlw b'00110000' ;3 retlw b'00011001' ;4 retlw b'00010010' ;5 retlw b'00000010' ;6 retlw b'01111000' ;7 retlw b'00000000' ;8 retlw b'00010000' ;9 ;-----------------------------------------end ; se acab

pag 31

El circuito muestra en el BCD (7 segmentos), el numero que corresponde a la configuracin binario de los push buttons presionados. (Ejemplo : 110 muestra 6)

Mecaclub 2008

Microcontroladores PIC

pag 32

debounce con contadorSTATUS PCL TRISB TRISA PORTB PORTA debounce equ equ equ equ equ equ equ 0x03 0x02 0x06 0x05 0x06 0x05 0xE ; Haciendo asignaciones

; variable para debounce

;-------Configuracin de puertos------org 0x00 ; origen del programa, aqu comenzar goto inicio bsf movlw movwf movlw movwf bcf STATUS,5 b'00000000' TRISB b'00000111' TRISA STATUS,5 ; ; ; ; pone rp0 a 1 y pasa al banco1 carga W con 00000000 y pasa el valor a trisb carga W con 00000111 ; RA0,RA1,RA2, son los pushbuttons ; pone rp0 a 0 y regresa al banco0 inicio

repetir ;-------------------CODIGO DEBOUNCE------CONTADOR--------movfw PORTA andlw b'00000111' ; filtra los bits de los pushbuttons BTFSC STATUS,2 ;si es 1, significa que PORTA=0 clrf debounce ;resetea el conteo decfsz debounce,1 ;decrementa hasta llegar a cero goto repetir ;si debounce logra contar 256 veces ;-------------------------------------movfw PORTA ; w=PORTA andlw b'00000111' ; filtra los bits de los pushbuttons call movwf goto TABLA_BCD PORTB repetir

; PORTB=W ; repite todo de nuevo

TABLA_BCD ADDWF PCL,1; retlw b'01000000' ;-gfedcba 0 retlw b'01111001' ;1 retlw b'00100100' ;2 retlw b'00110000' ;3 retlw b'00011001' ;4 retlw b'00010010' ;5 retlw b'00000010' ;6 retlw b'01111000' ;7 retlw b'00000000' ;8 retlw b'00010000' ;9 ;-----------------------------------------end ; se acab

Mecaclub 2008

Microcontroladores PIC

pag 33

MULTIPLEXAR BCDs (7 SEGMENTOS)Para manipular multiples BCDs, se usa multiplexan. Es decir, los 7 segmentos (A,B,C,D,E,F,G), se conectan en paralello, pero la tierra, se controla independientemente en cada BCD, para que por un breve instante, el PIC, cargue el valor que quiere en el BCD 1, y active su tierra, luego de transcurriedos unos milisegundos, se desconecta su tierra y se cargan en los 7 segmentos, el valor que se desea en el BCD 2, y se le conecta la tierra, y asi se repite el ciclo, todo pasa tan rapido, que pasa desapercibido el parpadeo de esta operacin.

Mecaclub 2008

Microcontroladores PIC

pag 34

INTERFACES DE POTENCIA CON PIC

Mecaclub 2008

Microcontroladores PIC

pag 35

Indirect access memory (REGISTROS INDF y FSREl registro INDF no es un registro fsico. Dirigirse a INDF en realidad produce la direccin del registro que est contenido en el registro FSR. FSR es un puntero. Esto se denomina Direccionamiento indirecto. Tenemos disponibles desde 0xc0 hasta 0x4f, de memoria libre, al arrancar el pic, para inicializar en ceros todos los registros, ocupamos hacer borrado manual a cada una. CLRF CLRF CLRF AUX1 AUX2 TEMP ; direccin 0xC0 ; direccin 0xD0 ; direccin 0xE0

(PERO ESTO ES OBSOLETO PARA TODAS LAS VARIABLES QUE QUEREMOS RESETEAR)>.

(POR ESO SE USA EL ACCESO INDIRECTO DE LA MEMORIA RAM)

FSR que esta en la posicin 0x4 de la memoria ram funciona como un apuntador, que almacena la direccin que le mandes y por medio del registro INDF puedes modificar el registro que tiene la direccin el FSR. EJEMPLO PRCTICO, PARA INICIALIZAR TODAS LAS VARIABLES DE LA RAM. ;-------------------------------------------------------------------------------------MOVLW 0xC0 ;INICIO DE RAM REGISTERS MOVWF FSR RAM_CLEANER CLRF INDF ;BORRA INDIRECTAMENTE EL REGISTRO INCF FSR,1 ;INCREMENTA A LA SIGUIENTE DIRECCION MOVFW FSR ;INDIRECT POINTER XORLW H'4F' ;FINAL DE RAM REGISTERS BTFSS 3,2 ;STATUS,Z GOTO RAM_CLEANER CLRF INDF ;--------------------------------------------------------------------------------------

Mecaclub 2008

Microcontroladores PIC

pag 36

Programador pic(EN STEREN LO VENDEN POR 200 PESOS este programador y el software de ICPROG y MPASM en un cd, estos ltimos de distribucin gratuita en internet)

Mecaclub 2008

Microcontroladores PIC

pag 37

IC-PROGENCARGADO DE CARGAR EL ARCHIVO HEXADECIMAL AL PIC. ARCHIVOS NECESARIOS

CONFIGURANDO IC-PROG PARA XP1. Al iniciar sale un error normal

2. Ir a Options>> Misc habilitar las siguientes opciones para ser usado en el XP

3. Por ultimo elige el PIC, que vas a programar

Mecaclub 2008

Microcontroladores PIC

pag 38

Cargar el programa el programa al PICSe abre un programa hexadecimal que se quiere cargar al PIC

Se ordena cargarlo al pic con el comando PROGRAM ALL (F5)

Mecaclub 2008

Microcontroladores PIC As debe mostrarse el mensaje si todo salio correctamente

pag 39

Errores de comunicacin ic-prog icNormalmente la primera vez, sale un error, si el error es de 0000h significa que no hay conexin entre el PIC y el programa, primero se checa si es por la configuracin del programa y los puertos seriales de la computadora, despus si todava no funciona, se revisan los cables que estn bien conectados a la interfaz del programador y el PIC que este bien insertado en el zcalo.

Si el error ocurre en otra direccin que no sea 0000h, por ejemplo (013FH), significa que se interrumpi la programacin, comnmente por estar usando otros programas que le quitan los recursos del sistema XP al ICPROG.

Mecaclub 2008

Microcontroladores PIC Se checa en Hardware, para ver que puertos estn habilitados por la computadora para poder comunicarse con el PIC.

pag 40

Cambia el puerto habilitado (COM1, COM2, COM3, COM4), y checa si se puede programar.

Las opciones en el parte derecha no deben ser alteradas, solamente deberas experimentar con la barra desplazadora que indica la velocidad de la transmisin de la computadora al PIC ( I/O Delay ).

Mecaclub 2008

Microcontroladores PIC

pag 41

Para revisar ms fcil si hay conexin con el PIC, haz la lectura del PIC, presionando F8 o presionando el icono READ ALL. Si te muestra puros ceros, significa que no hay conexin, ya sea porque el puerto que esta leyendo no es que estn conectando realmente, entonces ocupas cambiarlo en HARDWARE, como anteriormente se dijo. Cuando la lectura de nmeros que no sean ceros ya existir la conexin y se podr programar el PIC

Mecaclub 2008

Microcontroladores PIC

pag 42

MPLAB 7.52Es el compilador oficial del fabricante, en donde se escribe el cdigo en ensamblador (ASM), que luego puede ser simulado aqu mismo para corregir errores y, ya compilado este programa genera el archivo .hex que va ser insertado al PIC, por medio de IC-PROG. 1. Se debe iniciar un nuevo proyecto

2. Se escoge el paquete MPASM, que indica el lenguaje que va ser empleado para la programacin.

3. Se elige el nombre del proyecto, y se finaliza la creacin del proyecto.

Mecaclub 2008

Microcontroladores PIC

pag 43

Crea un nuevo archivo y grabalo con un nombre con la extensin (.asm) al final. Luego haz clic derecho en la carpeta de proyecto Source Files y Add Files para agregar el cdigo con la extensin .ASM

Al momento de compilar el programa ensamblador en MPLAB, te aparece un pantalla de mensajes o errores, si son errores se ocupan corregir para poder generar el archivo hexadecimal. Basta con dar 2 click al error mostrado, para que el programa se dirija a esa posicin del programa y veas el error, para corregirlo.

Mecaclub 2008

Microcontroladores PIC

pag 44

Iniciar Simulador del MPLAB 7.52NOTA: Solo puede ser activado el simulador, si hay un proyecto abierto.

Herramientas para hacer el debugStopwatch es una herramienta, que te permite ver los tiempos reales del programa.

Mecaclub 2008

Microcontroladores PIC

pag 45

SIMULACION DE ENTRADASPara simular inputs (entradas del circuito que vayas a usar), se ocupa abrir STIMULUS, e ir a Worbook, en el tab Asynch. Debugger>>Stimulus>>New Workbook

Ah se especifican los pines que se quieren manejar, para accionarlos, y la funcin que puedes usar, como el TOOGLE, es para alternar entre 1 y 0, pero tambin puede configurar para que sea un pulso alto o bajo de cierta duracin, como se te ocurra. Cuando quieras accionar el INPUT hay que presionar con un clic el cuadro a la izquierda (que dice FIRE), del rengln correspondiente.

Mecaclub 2008

Microcontroladores PIC

pag 46

SIMULACION DE SALIDASPara la simulacin de los OUTPUTS (salidas) se pueden manipular los bits directamente, mediante el teclado, escribiendo en los registros por medio de las ventanas de: SPECIAL FUNCTION REGISTERS FILE REGISTERS

configurar fuses del pic para correcta simulacinEs importante apagar el WATCHDOG TIMER porque va estorbar en la simulacin del cdigo.

Mecaclub 2008

Microcontroladores PIC

pag 47

Pseudo-instrucciones de MPLAB

Son una extensin a las instrucciones de ensamblador de Microchip. MPLAB las traduce a su respectivo cdigo en ensamblador en el momento de compilar el cdigo.

Mecaclub 2008

Microcontroladores PIC

pag 48

OBSERVACIONES Y RECOMENDACIONESEl hecho de que son tecnologa CMOS, no significa que se daan al contacto con dedos por una leve carga esttica y es que basta con que toques un metal, y te des cuenta si ocurri un chispazo, si no lo hubo, no tenias suficiente carga esttica para daar al PIC. Se puede tocar con las manos, si antes de descargaste tocando un metal. Existe un diodo inverso entre el vss y vdd, por lo cual, si se colocas el PIC invertido, las polaridades inversas, pondran en corto al regulador de voltaje (7805). El PIC es tecnologa cmos, para un pulso alto o bajo, no ocupa consumir ni recibir ms de 25 mA por pin, solo ocupa voltaje. Cuando uses INPUTS (pushbutton, sensores...), deben tener muy en cuenta, que el pin de tener un nivel de voltaje siempre, que le indique 1 o 0, por lo cual, en un PUSHBUTTON, por ejemplo que le enva pulso positivo (+5v) por medio de una resistencia de 1k ohm, debes tener en una resistencia de 10k ohms a GND, para cuando no este accionado el PUSHBUTTON, el pin tenga un cero lgico. Nunca conectar directamente los pines de los PUERTOS directamente a la fuente, ya sea VDD o VSS, ya que si se llega a suministrar mucha corriente a un puerto se daa el PIC, por eso debes usar resistencias. Los nicos pines que puedes llegar a conectar con seguridad directamente son los que no son bidireccionales, como VDD, VSS y RESET. Las entradas operan a alta impedancia y no hay un consumo de corriente considerable. As es que se pueden disear entradas, pushbuttons que tomen directamente de GND, pero es un riesgo innecesario, mejor por medio hazlo por medio de una resistencia mnimo de 1 kohm. Es indispensable tener 5 volts al pin de reset para que funcione el PIC. En pics mas avanzados como los 16F87X, el fuse LVP (LOW VOLTAGE PROGRAMMING), debe ser desactivado para permitir que funcione correctamente el programa del PIC. Las cadas de voltaje en el regulador 7805 pueden ocasionar que el PIC, se este reseteando, sobre todo cuando el circuito ocupa de muchos integrados que no son tecnologa CMOS, ya sean OPAMS o compuertas lgicas TTL que consumen mas amperaje, por lo que es muy recomendable poner capacitores electrolticos (Por ejemplo de 470 uF 16V) en la entrada y salida del 7805. En todos los PIC 16f84a, 16f873a, 16f877a se maneja el pin RA4 a colector abierto, es decir no puede dar 5 volts por ese pin, solo da GND. Siempre si se va usar debe tener PULL-UP; una resistencia de 1 k ohms por ejemplo a 5 v, para que el pulso alto lo suministre el 7805, ya que no puede hacerlo este pin.

Mecaclub 2008

Microcontroladores PIC

pag 49

Los registros cuando se les incrementa y llegan al numero 0XFF (255 DECIMAL), lo siguiente es que se desborde y empiece de cero de nuevo. Tambin ocurre lo mismo cuando se decrementa y despus del 0 toma el valor de 255. Los cristales de cuarzo no son precisos 100 %, al momento de querer hacer un reloj digital este hecho se hace notar, porque aunque en la simulacin te de correctamente 1 segundo, nunca va estar libre del error real, ya sea que se adelante o atrase. Por ejemplo en 1 hora, se te puede adelantar 10 segundos, que es demasiado, para un reloj confiable. Es muy comn cuando todava no se tiene en la mente todas las instrucciones, que se confundan en el momento de aplicar el IOR, por el ADD. Y cuando se quiere aplicar un AND, se ponga sin querer el ADD, pero es muy parecido como se escribe pasa desapercibido para el ojo. Cuando ejecutas un RETURN, sin que haya nada en el STACK DE 8 niveles, el PIC se resetea, y cuando se desborda el STACK la novena llamada corrompe el STACK, por ejemplo cuando se hacen 9 llamadas consecutivas una dentro de otra sin que se haya ejecutado el RETURN en ninguna funcin, y como el STACK solo puede almacenar 8 direccin del programa para las 8 llamadas de subrutinas, la novena va ocasionar que se corrompa el stack. __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC Al intentar escribir manualmente de memoria la configuracin de los fuses, siempre recuerda que va en maysculas porque as estn en el 16F84A.INC, que se incluye, adems al inicio son 2 guiones bajos. La tolerancia de maysculas se puede deshabilitar haciendo clic derecho en el proyecto >> build options >> MPASM ASSEMBLER >> Disable case sensitivity. Cuando se desea programar pics mas avanzados como los de la serie PIC16F87X, con el mismo programador del 16f84a se puede, basta con conectar los pines correspondientes RB7,RB6, MCLR/RESET, VDD, VSS, estos 5 pines debes ser conectados desde el socket de 18 patitas del programador hacia el pic16f87X que deseas. Al momento de hacer un pin entrada, este se desconecta de sus 2 posible outputs VDD o GND. Es indispensable pasar por un filtro el acumulador W despus de hacer una lectura de puerto en donde estn entradas y salidas mezcladas. Ejemplo: TRISB = 0B00001111 PORTB = 0B11001100 Al hacer MOVFW PORTB, ocurre que se leen tambin los estados de las salidas, por lo que es necesario aplicar un filtro por medio de ANDLW 0B00001111.

Mecaclub 2008

Microcontroladores PIC

pag 50

Los fuses del PICEstos sirven para configurar ciertos aspectos del microcontrolador. Cada FUSE activa o desactiva una opcin de funcionamiento.

WDT (Watchdog Timer): El famoso "perro" del PIC. (perro guardin). Esta es una capacidad del PIC de autoresetearse. Es muy til, por ejemplo si un PIC, por un descuido de programacin, se queda en un bucle infinito, esta "utilidad" lo sacar de l. Su funcionamiento es sumamente sencillo. Simplemente es un registro que debemos borrar cada cierto tiempo (en mltiplos 18 milisegundos). Si transcurrido un cierto tiempo el registro no ha sido borrado el PIC se resetea. La instruccin para borrar el registro es CLRWDT. Con poner un par de ellos a lo largo de nuestro cdigo es suficiente para tener una garanta de que el PIC no se quede "haciendo el bobo". Pero no se recomienda, ya que oculta los fallos en la programacin, con el reseteo. PWRT (Power Up Timer Reset): Si activamos este FUSE, lo que conseguimos es que se genere un retardo en la inicializacin del PIC. Esto se usa para que la tensin se estabilice, por lo que se recomienda su uso.

CP (Code Protect): El "dichoso" Code Protection. Proteccin del cdigo. Lo nico que hace es impedir que algn curioso se apropie de tu creacin no tiene efecto alguno en el correcto funcionamiento del PIC, ni que no se pueda sobrescribir su contenido. Lo nico que hace es eso, tratar de impedir su lectura.

Mecaclub 2008

Microcontroladores PIC

pag 51

(bit 7) NOT_RBPU

RegistroINTEDG T0CS

OPTION_REGPSA PS2

T0SE

(bit 0) PS1 PS0

BIT 7 (NOT_RBPU)Con 0 se activa el PULL-UP interno en los pines RB4,RB5,RB6,RB7, para que si son configuradas como entradas, tengan un estado lgico (1) normalmente, y no haya necesidad de ponerles en el circuito la resistencia de 10 kohms a +5v en cada pin.

PORTB Pull-up Enable bit 1 = PORTB pull-ups desactivadas 0 = PORTB pull-ups activadas BIT 6 (INTEDG) Interrupt Edge Select bit 1 = Interrupcin en flanco ascendente en pin RB0/INT 0 = Interrupcin en flanco descendente en pin RB0/INT TMR0 Clock Source Select bit 1 = Pulsos externos por RA4/T0CKI 0 = Clock interno TMR0 Source Edge Select bit 1 = Incrementar en flanco descendente en pin RA4/T0CKI 0 = Incrementar en flanco ascendente en pin RA4/T0CKI Prescaler Assignment bit 1 = Prescaler asignado a Watchdog Timer 0 = Prescaler asignado a TMR0

BIT 5 (T0CS)

BIT 4 (T0SE)

BIT 3 (PSA)

BIT 2, BIT 1, BIT 0

PS2 PS1 PS0 TMR0 WDT 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1:2 1:4 1:8 1:16 1:32 1:64 1:1 1:2 1:4 1:8 1:16 1:32

1:128 1:64 1:256 1:128

Mecaclub 2008

Microcontroladores PIC

pag 52

watchdogEl tiempo base esta determinado como 18 milisegundos internamente en el PIC y no se puede cambiar, antes de que se consuma este tiempo debe ser reseteado por medio de la instruccin CLRWDT, de lo contrario se resetea el PIC. Si se va activar el watchdog, debes analizar mediante el simulador MPLAB y la herramienta STOPWATCH, para ver donde poner los reseteadores CLRWDT que resetean el watchdog antes de que llegue al tiempo base 18 ms, sino se va a resetear el PIC.

PrescalerEl Prescaler es un divisor de frecuencia que se utiliza comnmente para programar tiempos largos y puedes aplicarlo al TMR0 o al WDT, esto lo configuras en PSA (bit 3) del registro OPTION_REG. Sirve como multiplicador al tiempo base 18ms x 2 = 36 ms 18ms x 4 = 72 ms 18ms x 8 = 144 ms 18ms x 16 = 288 ms 18ms x 32 = 576 ms 18ms x 64 = 1152 ms 18ms x 128 = 2304 ms

En los bits 0,1,2 del registro OPTION_REG, se configura el prescaler segn la escala que se desee. El bit 3 tambin ocupa ser puesto a 0 para que el prescaler sea usado en el WATDOGTIMER.

Mecaclub 2008

Microcontroladores PIC

pag 53

TMR0_TIMEREs un registro que permite ser empleado como contador o como timer. Configurndolo con el bit 5 del OPTION_REG a cero, este registro incrementara con cada instruccin del programa, es decir que incrementa a la misma frecuencia que el programa, por ejemplo si el PIC tiene un cristal de 4 mhz y como internamente se divide entre 4 esta frecuencia da: (4 / 4mhz) = 1 mhz, 1 microsegundo cada instruccin El tiempo mximo en un timer con 8 bits como TMR0, es de 256 microsegundos, que pueden ser ampliados con el prescaler a: 256 256 256 256 256 256 256 256 microseg microseg microseg microseg microseg microseg microseg microseg x x x x x x x x 2 = 4 = 8 = 16 = 32 = 64 = 128 = 256 = 512 microseg 1024 microseg 2048 microseg 4096 microseg 8192 microseg 16384 microseg 32768 microseg 65536 microseg

INICIO clrf call bcf bcf call movlw call movlw call movlw call movlw call movf call iorlw btfsc goto call incf goto nop goto Digito LCD_PORT RA,0 RA,2 LCD_INI b'00000001' LCD_REG b'00000110' LCD_REG b'00001100' LCD_REG 0x80 LCD_REG Digito,w DATO_1 0 STATUS,2 acabar LCD_DATOS Digito,f REPETIR ;Pone a 0 la variable digito ;Puertos en modo LCD ;Desactiva RS del modulo LCD ;Desactiva E del modulo LCD ;Inicia LCD (CFG puertos...) ;Borrar LCD y Home ; ;LCD On, cursor Off,Parpadeo Off ;Direccion caracter

START START_1

REPETIR

;W=Digito ;Coge el caracter ;Compara ;Es el ultimo? ;Si ;Visualiza caracter ;Incrementa numero de Digito ;Vuelve a escribir

acabar

acabar

;Bucle infinito

;> DATO_1 addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw PCL,1 'H' 'O' 'L' 'A' '' 'M' 'U' 'N' 'D' 'O' 0x00

Mecaclub 2008

Microcontroladores PICLCD_E bsf nop bcf return RA,2 RA,2 ;Activa seal E ;Espera 1uS ;Desactiva seal E

pag 74

LCD_BUSY bsf bsf movlw movwf bcf bsf nop clrf L_BUSY btfss goto decfsz goto exit_busy_loop bsf clrf bcf bcf return LCD_REG bcf movwf call goto LCD_DATOS bcf movwf call bsf goto LCD_INI movlw call call movlw call call movlw call call return

RA,1 STATUS,5 0xFF TRISB STATUS,5 RA,2 Exit_counter RB,7 exit_busy_loop Exit_counter L_BUSY bcf RA,2 STATUS,5 TRISB STATUS,5 RA,1

;Pone el LCD en modo lectura ;Selecciona el Banco 1 ;Puerta B acta de entrada ;Selecciona el Banco 0 ;Activa el LCD (Seal E) ; para asegurar la salida ;Chequea el bit BUSY

;Esta a "1" (Ocupado) ;Desactiva el LCD (Seal E) ;Selecciona el Banco 1 ;Puerta B actua como salida ;Selecciona el Banco 0 ;Pone el LCD en modo escritura

RA,0 RB LCD_BUSY LCD_E

;Desactiva RS (Modo instruccion) ;Saca el codigo de instruccion ;Espera a que se libere el LCD ;Genera pulso en seal E

RA,0 RB LCD_BUSY RA,0 LCD_E b'00111000' LCD_REG DELAY_5MS b'00111000' LCD_REG DELAY_5MS b'00111000' LCD_REG DELAY_5MS

;Desactiva RS (Modo instruccin) ;Valor ASCII a sacar por RB ;Espera a que se libere el LCD ;Activa RS (Modo dato) ;Genera pulso en seal E

;Codigo de instruccion ;Temporiza 5 mS. ;Codigo de instruccion ;Temporiza 5 mS. ;Codigo de instruccion ;Temporiza 5 mS.

LCD_PORT bsf clrf movlw movwf bcf bcf bcf DELAY_5MS movlw movwf clrf DELAY_1 goto decfsz goto return

STATUS,5 TRISB b'00011000' TRISA STATUS,5 RA,0 RA,2

;Selecciona el banco 1 de datos ;RB se programa como salida ;RA se programan como entradas ;RA se programan como salidas ;Selecciona el banco 0 de datos ;Desactiva RS del modulo LCD ;Desactiva E del modulo LCD ; temporizacion de 5mS necesario para la secuencia de inicio del LCD

0x1a DATO_B DATO_A decfsz DELAY_1 DATO_B,1 DELAY_1

DATO_A,1

END

Mecaclub 2008

Microcontroladores PIC

pag 75

FUENTES FUENTES RECOMENDADASLibro Microcontroladores PIC Funcionamiento Programacin Diseo AUTOR: Ing. Horacio Daniel Vallejo

Paginas de Internet http://www.hobby-elec.org/e_pic.htm La mejor pagina para aprender informacin a fondo de los pics y tambin una extensa galera de circuitos prcticos muy interesantes y excelentemente documentados. http://perso.wanadoo.es/luis_ju/index.html Tutoriales de electrnica, digitales y PIC http://perso.wanadoo.es/chyryes/ Pagina sobre electrnica y pics de Carlos Daz http://jap.hu/electronic/ http://www.x-robotics.com/rutinas.htmUltima modificacion 27 Enero 2008

Mecaclub 2008