Site hosted by Angelfire.com: Build your free website today!

 

 

 

 

Escuela de Ingeniería en Electrónica y Telecomunicaciones

 

 

TESIS

 

 

PROGRAMADOR PARA EL MICROCONTROLADOR  PIC 16F84 CON MANUAL DE IMPLEMENTACIÓN Y DE USO PRACTICO

 

 

Que para obtener el titulo de Licenciatura de Ingeniería en Electrónica y Telecomunicaciones

 

 

Presenta:

 

Carlos Alberto López González

 

Asesor:

 

M.I.E  Juan Hugo García López

 

Acuerdo No. 2002189

 

León Guanajuato                                                              Al 19 de Agosto de 2002                        


INDICE

 

 

 

 

 

 

 

INDICE.. 2

CAPÍTULO 1. 2

1     MICROCONTROLADORES PROGRAMABLES.. 2

1.1       żQUÉ ES UN MICROCONTROLADOR?. 2

1.2       ARQUITECTURA INTERNA.. 2

1.2.1        EL PROCESADOR.. 3

1.2.2        MEMORIA DE PROGRAMA.. 3

1.2.3        ASIGNACION DE PINES. 4

1.2.4        RECURSOS AUXILIARES. 4

1.3       PRIMER PROGRAMA.. 4

2     MICROCONTROLADORES DE 8 BITS (PIC) 8

2.1       LA FAMILIA DE LOS PIC.. 8

2.1.1 Gama enana: PIC12C(F)XXX.. 8

2.1.2 Gama baja: PIC16C5X.. 8

2.1.3 Gama media PIC16C(F)XXX.. 8

2.1.4 Gama alta: PIC 17CXXX.. 8

2.2       SEGUNDO PROGRAMA.. 10

CAPITULO 3. 14

3     EL MICROCONTROLADOR PIC16F84. 14

3.1       Características principales. 14

3.2       Descripción de pines. 15

3.3       Frecuencia de funcionamiento. 17

3.3.1. Tipos de osciladores. 17

3.4       Reset 19

3.5       Tercer programa. 21

CAPÍTULO 4. 25

4     PROCESADOR INTERNO.. 25

4.1       Arquitectura Interna. 25

4.2       Memoria de programa. 26

4.3       Memoria de Datos RAM... 26

4.3.1. Direccionamiento de la memoria de datos. 29

4.4       El Registro de Estado. 32

4.5       Cuarto Programa. 44

5     RECURSOS FUNDAMENTALES.. 48

5.1       Temporizador/Contador TMR0. 48

5.1.1        El registro OPTION.. 49

5.2       Interrupción del Timer0. 53

5.3       WatchDog (WDT) 54

5.4       Puertos de I/O.. 55

5.4.1        PORTA y Registros TRISA.. 55

5.4.2        PUERTO B Y REGISTROS TRISB.. 55

5.5       Palabra de configuración. 56

5.6       Memoria EEPROM de datos. 60

5.7       Quinto programa. 65

6     INTERRUPCIONES, RESET Y RECURSOS AUXILIARES.. 69

6.1       Causas de interrupción. 69

6.1.1        El registro de control de interrupciones INTCON.. 69

6.1.2        Interrupción externa INT. 70

6.1.3        Interrupción del TMR0. 70

6.1.4        Interrupción del Puerto B.. 71

6.1.5        Interrupción en la EEPROM de datos. 71

6.2       Reset 71

6.3       Modo de bajo consumo. 77

6.4       Sexto programa. 80

7     SET DE INSTRUCCIONES.. 84

7.1       RISC.. 84

7.2       Tipos de formato. 84

7.2.1        Manejo de registro de tamańo byte. 85

7.2.2        Manejo de bits. 86

7.2.3        Manejo de valor inmediato. 86

7.2.5        Salto condicional 87

7.3       Instrucciones especiales y de control 88

7.4       Séptimo programa. 90

7.5       PROGRAMADOR.. 96


CAPÍTULO 1

 

 

1                  MICROCONTROLADORES PROGRAMABLES

 

 

 

 

 

1.1          żQUÉ ES UN MICROCONTROLADOR?

 

El microcontrolador es un circuito integrado programable que contiene periféricos de entrada/salida, memoria. Se utiliza para controlar diferentes tipos de procesos mediante sensores y actuadores del dispositivo a controlar.

 

1.2          ARQUITECTURA INTERNA

 

Las partes principales de un microcontrolador son:

 

1.                Procesador

2.                Memoria no volátil para contener el programa

3.                Memoria de lectura y escritura para guardar los datos

4.                Líneas de I/O para los controladores de los periféricos

a)    Comunicación paralelo

b)    Comunicación serie

5.                Recursos auxiliares

a)    Circuito de reloj

b)    Temporizadores

c)    Watchdog

d)    Convertidores A/D y D/A

e)    Comparadores analógicos

f)      Protección para fallos de alimentación

g)    Estado de bajo consumo


 

1.2.1                      EL PROCESADOR

 

El procesador del PIC cuenta con tres técnicas:

-         Arquitectura Harvard

-         Arquitectura RISC

-         Segmentación

 

En la arquitectura Harvard son independientes la memoria de instrucciones y la memoria de datos y cada una dispone de su propio sistema de buses para el acceso. El RISC tiene un repertorio de instrucciones, máquina pequeńa y simple, de forma que la mayor parte de las instrucciones se ejecutan en un ciclo de instrucción.

 

1.2.2                      MEMORIA DE PROGRAMA

 

Existen diferentes tipos de memoria que utilizan los microcontroladores:

-         ROM

-         EPROM

-         OTP
EEPROM
FLASH

 

El PIC 16C84 y el PIC16F84 utilizan memorias de tipo EEPROM y FLASH respectivamente.


 

1.2.3                      ASIGNACION DE PINES

 

En la figura 1.1 se muestra el diagrama del PIC16F84A

 

 

 

Figura 1.1

 

 

1.2.4                      RECURSOS AUXILIARES

 

Los recursos más comunes con los que cuenta un microcontrolador son los siguientes:

 

a)    Circuito de reloj

b)    Temporizadores

c)    Watch Dog

d)    Convertidores A/D y D/A

e)    Comparadores analógicos

f)      Sistema de protección ante fallas de alimentación

g)    Sistemas de bajo consumo de energía

 

 

 

 

1.3          PRIMER PROGRAMA

 

Objetivo

 

Conocer los modos de configuración de los puertos del microcontrolador así como las instrucciones necesarias para mandar y datos por el puerto A y B.

 

Desarrollo

 

Generar por medio de un programa una secuencia de datos y reflejarlos en la salida de los puertos del PIC16F84A por medio de led´s. Ver Figura A

 

 

 

        

 

 

 

FIGURA A


PROGRAMA 1

 

***************************************************************************

;*Programa: luces.asm              

;*Descripcion: Manda datos al puerto a y b como un contador binario, ;           ;*después inicia otra secuencia de luces*

;***************************************************************************

 

;********************************IGUALDADES*********************************

                       

STATUS                   EQU   3                                 ;Dirección del registro de estado

PORTB                     EQU   6                                 ;Dirección del puerto B

TRISB                       EQU   6                                 ;Registro de configuración E/S

CONTADOR1          EQU   0Ch                            ;Dirección del conta1 p/retardo

CONTADOR2          EQU   0Dh                            ;Dirección del conta2 p/retardo

DATO                        EQU   0Eh                            ;Datos a mandar por PORTB

CICLO1                     EQU   0Fh                            ;Indica el fin de luces1

CICLO2                     EQU   10h                            ;Indica el fin de luces2

w                                EQU   0                                 ;Destino w

f                                  EQU   1                                 ;Destino el propio registro

 

;*************************PROGRAMA PRINCIPAL********************************

                        ORG   00h                                        ;Inicio del ensamblado desde  00

                        GOTO            INICIO                                   ;Salto a la primera instrucción

                        ORG   05h                                        ;Ensamblar de la localidad 05h

INICIO            BSF    STATUS,5                            ;Selecciona la pagina 1 de datos

                        CLRF TRISB                                   ;Programa PORTB como salida

                        CLRF TRISA                                   ;Programa porta como salida

                        BCF   STATUS,5                            ;Selecciona la pagina 0 de datos

 

;**************************INICIO LUCES 1 ******************************************

INICIO2         MOVLW        01                               ;Veces que se repite luces1

                        MOVWF        CICLO1                     ;Carga las veces a ciclo1

                        CLRF             DATO                        ;El registro dato se pone en ceros

OTRO                        MOVF                        DATO,w                    ;Carga dato en w

                        MOVWF        PORTB                     ;Manda de w a PORTB

                        MOVWF        PORTA                     ;Manda de w a PORTA

                        MOVLW        0B0h                         ;Carga w con B0 para el retardo

                        CALL             RETARDO               ;Llama a un retardo

                        INCFSZ         DATO,f                      ;Incrementa en uno a dato

                        GOTO                        OTRO                                    ;Incrementa al puerto en uno

                        DECFSZ       CICLO1,f                  ;Termino todo el sentido?

                        GOTO                        OTRO                                    ;No, continua

 

 

 

;**************************SI, INICIO DE LUCES 2 ***********************************

                        MOVLW        05h                            ;Veces que se repite luces2

                        MOVWF        CICLO2                     ;Carga las veces a ciclo2

INI                   MOVLW        80h                            ;Pone en uno el bit7 de w

                        MOVWF        PORTB                     ;Manda el dato al puerto

                        BCF               STATUS,0                ;Borra posible carry

                        MOVLW        0E0h                          ;Carga w con E0

 

;**************************INICIO DE LUCES 2 EN SENTIDO DERECHA **********

MAS               CALL             RETARDO               ;Llama al retardo

                        RRF               PORTB,f                   ;Recorre el bit a la derecha

                        BTFSS          STATUS,0                ;Verifica el acarreo

                        GOTO                        MAS                           ;Recorre de nuevo el bit a la der

                        MOVLW        01h                            ;Pone a uno el bit 0 de w

                        MOVWF        PORTB                     ;Lo pasa al puerto b

                        MOVLW        0E0h                          ;Carga w con E0

;**************************INICIO DE LUCES2 EN SENTIDO IZQUIERDA***********

                        BCF               STATUS,0                ;Borra posible carry

MAS1             CALL             RETARDO               ;Llama al retardo

                        RLF                PORTB,f                   ;Recorre el bit a la izquierda

                        BTFSS          STATUS,0                ;Verifica el acarreo

                        GOTO            MAS1                        ;Recorre de nuevo el bit a la izq

                        DECFSZ       CICLO2,f                  ;Termino recorrido?

                        GOTO            INI                              ;No, sigue el recorrido

                        GOTO            INICIO2                                 ;Si, repite todo

 

;*******************************RETARDO*************************************

RETARDO    MOVWF        CONTADOR1          ;Se cargan los contadores con el

LOOP2          MOVWF        CONTADOR2          ;valor inicial de w

LOOP1          DECFSZ       CONTADOR2,f        ;Termino de decrementar?

                        GOTO                        LOOP1                      ;No, sigue decrementando

                        DECFSZ       CONTADOR1,f        ;Termino de decrementar?

                        GOTO                        LOOP2                      ;Regresa a decrementar conta2

                        RETURN                                          ;Regresa al programa principal

 

;***************************************************************************

                        END                           ;Fin del programa

;***************************************************************************


CAPITULO 2

 

 

2                  MICROCONTROLADORES DE 8 BITS (PIC)

 

 

 

 

 

 

2.1          LA FAMILIA DE LOS PIC

 

Microchip cuenta con 4 familias de microcontroladores de 8 bits:

 

 

2.1.1 Gama enana: PIC12C(F)XXX

 

Su principal característica es su reducido tamańo. Se alimenta entre 2.5VDC y 5.5VDC y consumen menos de 2mA. El formato de sus instrucciones puede ser de 12 a 14 bits y cuenta de 33 o 35 instrucciones respectivamente.

 

2.1.2 Gama baja: PIC16C5X

 

Esta serie de PIC cuenta con un repertorio de 33 instrucciones cuyo formato consta de 12 bits. Este tipo de microcontrolador no admite interrupciones.      

 

 

 

 

 

2.1.3 Gama media PIC16C(F)XXX

 

El repertorio de instrucciones es de 35, de 14 bits cada una y compatible con el de la gama baja. Disponen de interrupciones y una pila de 8 niveles que permite el anidamiento de subrutinas.

2.1.4 Gama alta: PIC 17CXXX

 

Maneja 58 instrucciones de 16 bits en el repertorio, contiene variados controladores de periféricos, puertos de comunicación, serie y paralelo. La característica más importante en esta gama es su arquitectura abierta, por su posibilidad de ampliación del microcontrolador con elementos externos.

 


 

2.2          SEGUNDO PROGRAMA

 

 

Objetivo

 

Manejar todo el conjunto de instrucciones, diseńar el hardware y software para controlar un display de 7 segmentos desde un Dip Switch.

 

Desarrollo

 

Se conecta al las entradas menos significativas del Puerto A el Dip Switch por donde se introducirá un numero binario comprendido del 0000 al 1111.

A las entradas del Puerto B se conectan los 7 segmentos de un display de cátodo común. Ver Figura B

 

        

 

FIGURA B


PROGRAMA 2

;***************************************************************************

;*Programa: Decoder.asm

;*Descripcion: Decodificador BCD a 7 segmentos

:***************************************************************************

;*******************************ETIQUETAS***********************************     

STATUS                   EQU   3                    

PORTA                     EQU   5

PORTB                     EQU   6                     

TRISB                       EQU   6                    

TRISA                       EQU   5

CONTADOR1          EQU   0Ch               

CONTADOR2          EQU   0Dh               

DATO                        EQU   0Eh               

CICLO1                     EQU   0Fh               

CICLO2                     EQU   10h                

DELAY                      EQU   0XFF

w                                EQU   0                    

f                                  EQU   1                    

 

;*************************PROGRAMA PRINCIPAL********************************

                                   ORG               00h                

                        ORG               05h    

                                   BSF               STATUS,5

                                   CLRF             TRISB

                        MOVLW        0X0F

                                   MOVWF        TRISA

                                   BCF               STATUS,5

                                   GOTO                        INICIO

INICIO                       MOVF                        PORTA,w

                                   MOVWF        DATO

                                    GOTO                        CODIF

;*************************VERIFICA DIP SWITCH*********************************

CODIF                       MOVLW        0X00              ;Mueve 00 a W

                                   SUBWF         DATO,W        ;Resta el valor de dato a w

                                   BTFSC          STATUS,2    ;Verifica el resultado

                                   GOTO                        CERO                        ;Si son iguales manda a cero

                                   MOVLW        0X01              ;Mueve 01 a W

                                   SUBWF         DATO,W        ;Resta el valor de dato a w

                                   BTFSC          STATUS,2    ;Verifica el resultado

                                   GOTO                        UNO               ;Si son iguales manda a uno

                                   MOVLW        0X02              ;Mueve 02 a W

                        SUBWF         DATO,W

                                   BTFSC          STATUS,2

                                   GOTO            DOS

                        MOVLW        0X03              ;Mueve 03 a W

                                   SUBWF         DATO,W

                                   BTFSC          STATUS,2

                        GOTO                        TRES

                                   MOVLW        0X04              ;Mueve 04 a W

                        SUBWF         DATO,W

                                   BTFSC          STATUS,2

                                   GOTO                        CUATRO

                        MOVLW        0X05              ;Mueve 05 a W

                                   SUBWF         DATO,W

                                   BTFSC          STATUS,2

                                   GOTO                        CINCO

                        MOVLW        0X06              ;Mueve 06 a W

                                   SUBWF         DATO,W

                                   BTFSC          STATUS,2

                                   GOTO                        SEIS

                                   MOVLW        0X07              ;Mueve 07 a W

                                   SUBWF         DATO,W

                        BTFSC          STATUS,2

                                   GOTO                        SIETE

                        MOVLW        0X08              ;Mueve 08 a W

                                   SUBWF         DATO,W

                                   BTFSC          STATUS,2

                        GOTO                        OCHO

                                   MOVLW        0X09              ;Mueve 09 a W

                        SUBWF         DATO,W

                                   BTFSC          STATUS,2

                                   GOTO                        NUEVE

                                   GOTO                        INICIO

;****************  BCD --- 7 SEGMENTOS  **************************

CERO                                   MOVLW        0X3F              ;Mueve valor 0 en 7 segment a W

                                   MOVWF        PORTB         ;Mueve el valor de w al puerto B

                                   MOVLW        DELAY          ;Mueve a w el valor del retardo

                        CALL                         RETARDO    ;Llama la subrutina de retardo

                                   GOTO            INICIO            ;Regresa a inicio

UNO                          MOVLW        0X06              ;Mueve valor  1 en 7 segment a W

                                   MOVWF        PORTB

                        MOVLW        DELAY

                                   CALL                         RETARDO

                                   GOTO            INICIO

DOS                           MOVLW        0X5B             ;Mueve valor 2 en 7 segment a W

                        MOVWF        PORTB

                                   MOVLW        DELAY

                                   CALL             RETARDO

                                   GOTO            INICIO

TRES                        MOVLW        0X4F              ;Mueve valor  3 en 7 segment a W

                        MOVWF        PORTB

                                   MOVLW        DELAY

                                   CALL             RETARDO

                                   GOTO            INICIO

CUATRO                  MOVLW        0X66              ;Mueve valor 4 en 7 segment a W

                        MOVWF        PORTB

                                   MOVLW        DELAY

                                   CALL             RETARDO

                                   GOTO            INICIO

CINCO                      MOVLW        0X6D             ;Mueve valor 5 en 7 segment a W

                        MOVWF        PORTB

                                   MOVLW        DELAY

                                   CALL             RETARDO

                                   GOTO            INICIO

SEIS                          MOVLW        0X7D             ;Mueve valor 6 en 7 segment a W

                                   MOVWF        PORTB

                                   MOVLW        DELAY

                                   CALL             RETARDO

                                   GOTO            INICIO

SIETE                                   MOVLW        0X07              ;Mueve valor 7 en 7 segment a W

                                   MOVWF        PORTB

                                   MOVLW        DELAY

                                   CALL             RETARDO

                                   GOTO            INICIO

OCHO                       MOVLW        0X7F              ;Mueve valor 8 en 7 segment a W

                        MOVWF        PORTB

                                   MOVLW        DELAY

                                   CALL             RETARDO

                        GOTO            INICIO

NUEVE                     MOVLW        0X67              ;Mueve valor 9 en 7 segment a W

                                   MOVWF        PORTB

                                   MOVLW        DELAY

                                   CALL             RETARDO

                                   GOTO            INICIO

;******************************SUBRUTINA DE RETARDO ******************************        

RETARDO               MOVWF        CONTADOR1         

LOOP2                      MOVWF        CONTADOR2         

LOOP1                      DECFSZ       CONTADOR2,f       

                                   GOTO            LOOP1                     

                                   DECFSZ       CONTADOR1,f       

                                   GOTO            LOOP2                     

                                   RETURN                             

 

                                   END


CAPITULO 3 

 

 

3                  EL MICROCONTROLADOR PIC16F84

 

 

 

 

 

 

 

3.1          Características principales

 

Este microcontrolador es de la familia media. Se utilizara este microcontrolador debido a que cumple con los requisitos para aprender a diseńar proyectos. Al aprender a manejar este sencillo PIC lograremos programar los de gamas más altas que cuentan con mayores recursos.

 

 

 

Características de alto desempeńo:

 

·        Solo 35 instrucciones por aprender

·        Todas las instrucciones se ejecutan en un ciclo de máquina excepto las de salto que utilizan 2 ciclos.

·        Velocidad de operación: DC – 20 MHz clock input

                                                 DC – 200 ns ciclo de instrucción

·        Memoria de programa de 1024 words

·        RAM de datos de 68 Bytes

·        EEPROM de datos de 64 Bytes

·        Stack de 8 niveles

·        4 Tipos de  interrupciones diferentes

- Pin externo RB0/INT

- TMRO sobreflujo del temporizador

- PORTB<7:4> interrupción en cambio

- Escritura de datos completa en EEPROM

 

 

Periféricos:

 

·        13 pines de I/O con control de dirección individual

·        TMR0 temporizador/contador de 8 bits con 8 bits del prescalador programable.

·        Corriente de manejo

- Máxima absorbida por línea 25 mA

- Máxima suministrada por línea 25 mA

 

 

Características Especiales del Microcontrolador

 

·        10,000 ciclos de borrado/escritura en memoria de programa FLASH

·        10,000,000 ciclos de borrado/escritura en memoria de datos EEPROM

·        Retención EEPROM más de 40 ańos

·        ICSP In-Circuit Serial Programming

·        (POR) Power-On-Reset, (PWRT) Power-up-Timer, (OST) Oscillator Start-Up Timer

·        Whatchdog Timer (WDT)

·        Protección de código

·        Modo de bajo consumo SLEEP

·        Oscilador con opción de selección

 

Tecnología CMOS FLASH/EEPROM

 

·        Bajo consumo, tecnología de alta velocidad

·        Rango de operación de voltaje: 2.0V a 5.5V

 

 

3.2          Descripción de pines

 

·        VDD: Alimentación positiva

 

·        VSS: Referencia a tierra

 

·        OSC1/CLKIN: Oscilador externo que proporciona la frecuencia

                            de trabajo del microcontrolador.                                       

 

·        OSC2/CLKOUT: Auxiliar del circuito oscilador

 

·        MCLR: Reset del PIC, se activa con un nivel lógico bajo y reinicia el PIC. También se utiliza durante la grabación de la memoria de programa para introducir VPP, que está comprendida entre 12 y 14 VDC.

 

·        RA0 – RA4: Puerto A, 5 líneas de I/O. La línea RA4 multiplexa otra función expresada por TOCKI. Esta función sirve para recibir una frecuencia externa para alimentar el temporizador interno TMR0.

 

·        RB0-RB7: Puerto B, 8 líneas de I/O. La línea RB0 multiplexa otra función que sirve como entrada a una petición externa de una interrupción.

 

 

3.3          Frecuencia de funcionamiento

 

La frecuencia de trabajo del microcontrolador es un parámetro fundamental a la hora de establecer la velocidad en la ejecución de instrucciones y el consumo de energía.

        

Cuando un PIC 16X8X funciona a 10Mhz, que es su máxima frecuencia, le corresponde un ciclo de instrucción de 400ns, puesto que cada instrucción tarda en ejecutarse 4 periodos de reloj, o sea 4 x 100ns. Todas las instrucciones del PIC se realizan en un ciclo de instrucción, menos las de salto, que tardan el doble.

 

Los pulso de reloj de OSC1/CLKIN se dividen entre 4 internamente, dando lugar a las seńales Q1, Q2, Q3 y Q4, Durante un ciclo de instrucción, que comprende las 4 seńales mencionadas, se desarrollan las siguientes operaciones:

 

Q1:   Durante este pulso se incrementa el contador del programa

Q4:   Durante este pulso se busca el código de la instrucción en la memoria del programa y se carga en el registro de instrucciones.

Q2-Q3: Durante la activación de estas dos seńales, se produce la decodificación de la instrucción.

 

Para conseguir ejecutar cada instrucción en un ciclo de instrucción (excepto las de salto), se aplica la técnica de la segmentación <<pipe-line>>, que consiste en realizar en paralelo las dos fases que comprende cada instrucción.

 

En realidad cada instrucción se ejecuta en dos ciclos: En el primero se lleva a cabo la búsqueda del código de la instrucción en la memoria del programa (fase de búsqueda), y en el segundo se decodifica y se ejecuta (fase de ejecución).

 

La estructura segmentada del procesador, permite realizar al mismo tiempo la fase de ejecución de una instrucción y la de búsqueda de la siguiente. Cuando la instrucción ejecutada corresponde a un salto no se conoce cuál será la siguiente hasta que se complete, por eso en esta situación se sustituye la fase de búsqueda de la siguiente instrucción por un ciclo <<vacío>>, originando que las instrucciones de salto tarden en realizarse dos ciclos de instrucción.

 

 

3.3.1. Tipos de osciladores

 

El PIC admite cuatro tipos de osciladores externos para aplicarles la frecuencia de funcionamiento. El tipo empleado debe especificarse en dos bits (FOSC1 y FOSC0) en la palabra de configuración.


Oscilador tipo RC

 

Éste es un oscilador de bajo costo, formado por una resistencia y un capacitor. Éste no tiene una frecuencia muy estable y su valor depende de  los valores de los elementos de la red RC      (Figura 3.4)

 

Figura 3.4 Esquema del oscilador tipo RC

 

Oscilador tipo HS

 

Es un oscilador que alcanza una alta velocidad comprendida entre 4 y 10 MHz y está basado en un cristal de cuarzo o un resonador cerámico.

 

Oscilador tipo XT

 

Es un oscilador de cristal para frecuencias estándar comprendidas entre 100KHz y 4MHz

 

Oscilador tipo LP

 

Oscilador de bajo consumo con cristal, diseńado para trabajar en un rango de frecuencias de 35 a 200KHz. (Figura 3.5)

 

 

Figura 3.5 Para frecuencias comprendidas entre 4MHz y  10 MHz C1

y C2 deben de ser de 15pF a 33pF.

 

                                    

3.4          Reset

 


Cuando se aplica un nivel bajo en el pin MCLR, el microcontrolador reinicia su estado provocando los acciones importantes:

 

1.    El contador del programa se carga con la dirección 0,  apuntando hacia la primera dirección del programa en donde deberá estar la primera instrucción del programa de aplicación.

2.    La mayoría de los registros de estado y control del procesador toman un estado determinado.


 

3.5          Tercer programa

 

Objetivo

 

Conocer el comportamiento del TMR0, manejarlo y controlar 8 frecuencias diferentes. Visualizando la frecuencia por medio de un diodo led.

 

Desarrollo

 

Realizar por medio de subrutinas diferentes tiempos, guardando el contador del programa en la pila. Ver Figura C

 

La formula que indica el tiempo es:

 

 

 

 

 

FIGURA C
PROGRAMA 3

;********************************************************************************

;*Programa: tiempo.asm

;*Descripcion: Generador de 8 frecuencias

;********************************************************************************

;*******************************ETIQUETAS***********************************     

STATUS                   EQU   3

TMR_OPT                EQU   1

INTCON                    EQU   0Bh

PORTA                     EQU   5

PORTB                     EQU   6                    

TRISB                       EQU   6                    

TRISA                       EQU   5

SEG                           EQU   0Ch               

VAR                           EQU   0Dh               

DATO                        EQU   0Eh               

CICLO1                     EQU   0Fh               

CICLO2                     EQU   10h                

w                                EQU   0                    

f                                  EQU   1                    

;*************************PROGRAMA PRINCIPAL***********************

ORG               00h                

ORG               05h    

BSF               STATUS,5

MOVLW        0X1F

MOVWF        TRISA

CLRF             TRISB

MOVLW        0XD7

MOVWF        TMR_OPT

BCF               STATUS,5

CLRF             PORTB

GOTO                        INICIO

:************************** INICIO DEL PROGRAMA ****************************

INICIO            MOVF                        PORTA,w     ;Mueve el valor del puerto A en w                                MOVWF        DATO            ;Guarda el valor de w en dato                                       MOVLW        0X00           

SUBWF         DATO,W        ;Compara si el dip switch es igual a 0            BTFSC            STATUS,2    ;Si no es igual salta la instrucción                   CALL             SEG1             ;Si es igual llama a subrutina seg1                  MOVLW        0X01

SUBWF         DATO,W        ;Compara si el dip switch es igual a 1

                        BTFSC          STATUS,2   

                        CALL             SEG2            

MOVLW        0X02 

SUBWF         DATO,W        ;Compara si el dip switch es igual a 2

                        BTFSC          STATUS,2

                        CALL             SEG3

                        MOVLW        0X03 

                        SUBWF         DATO,W        ;Compara si el dip switch es igual a 3

                        BTFSC          STATUS,2

                        CALL             SEG4

                        MOVLW        0X04             

                        SUBWF         DATO,W                  

                        BTFSC          STATUS,2    ;Compara si el dip switch es igual a 4

                        CALL             SEG5            

                        MOVLW        0X05             

                        SUBWF         DATO,W                  

                        BTFSC          STATUS,2    ;Compara si el dip switch es igual a 5

                        CALL             SEG6            

                        MOVLW        0X06             

                        SUBWF         DATO,W                  

                        BTFSC          STATUS,2    ;Compara si el dip switch es igual a 6

                        CALL             SEG7

                        MOVLW        0X07 

                        SUBWF         DATO,W                  

                        BTFSC          STATUS,2    ;Compara si el dip switch es igual a 7

                        CALL             SEG8

;************************PARPADEO*********************************************                         BSF                PORTB,0      ;Fija a 1 el bit 0 del puerto B

                        CLRF             SEG               ;Limpia la variable SEG

                        CALL                         RETARDO    ;Llama a subrutina de retardo

                        CLRF             SEG              

                        BCF               PORTB,0      ;Fija a 0 el bit 0 del puerto B

                        CALL                         RETARDO

                        GOTO            INICIO            ;Manda llamar a inicio

;***********************FRECUENCIAS*******************************************

SEG1             MOVLW        0X01 

                        MOVWF        VAR               ;Fija en var el retardo para la frec 1

                        RETURN

SEG2             MOVLW        0X02

                        MOVWF        VAR               ;Fija en var el retardo para la frec 2

                        RETURN

SEG3             MOVLW        0X04

                        MOVWF        VAR               ;Fija en var el retardo para la frec 3

                        RETURN

SEG4             MOVLW        0X08

                        MOVWF        VAR               ;Fija en var el retardo para la frec 4

                        RETURN

SEG5             MOVLW        0X0F

                        MOVWF        VAR               ;Fija en var el retardo para la frec 5

                        RETURN

SEG6             MOVLW        0X10

                        MOVWF        VAR               ;Fija en var el retardo para la frec 6

                        RETURN

 

SEG7             MOVLW        0X20

                        MOVWF        VAR               ;Fija en var el retardo para la frec 7

                        RETURN

SEG8             MOVLW        0X40

                        MOVWF        VAR               ;Fija en var el retardo para la frec 8

                        RETURN

;*****************************RUTINA DE RETARDO***********************

RETARDO    CLRF             TMR_OPT

INC                 BTFSS          INTCON,2

                        GOTO                        INC

                        BCF               INTCON,2

                        INCF              SEG

                        MOVF                        VAR,w

                        SUBWF         SEG,w

                        BTFSS          STATUS,2

                        GOTO                        RETARDO

                        RETURN

                       

                        END              

 


CAPÍTULO 4

 

 

4                  PROCESADOR INTERNO

 

 

 

4.1          Arquitectura Interna

 

Para lograr una compactación del código óptima y una velocidad superior, el PIC incorpora en su procesador 3 de las características

 

·        Procesador tipo RISC

·        Procesador segmentado

·        Arquitectura HARVARD

 

La arquitectura HARVARD es con la cual se puede acceder de forma simultanea e independiente a la memoria de datos y a la memoria de instrucciones. La arquitectura interna del PIC 16F84 se muestra en el diagrama a bloques de la Figura 4.1

Figura 4.1 Diagrama a bloques del PIC16F84

La arquitectura interna consta de 7 bloques fundamentales:

 

 

1.    Memoria de programa EEPROM de 1K x 14 bits.

 

2.    Memoria de datos formada por dos áreas. Una RAM donde se alojan 22 registros de propósito especÍfico Especial Function Registers (SFR) y 36 de propósito general General Purpose Registers (GPR) y otra del tipo EEPROM de 64 bytes.

 

3.    Bus de datos con una ALU de 8 bits y un registro de trabajo W

 

4.    Recursos conectados al bus de datos tales como puertos de I/O, temporizador, etc.

 

5.    Base de tiempos y circuitos auxiliares.

 

6.    Direccionamiento de la memoria de programa en base al contador de programa ligado al stack de 8 niveles.

 

7.    Direccionamiento directo e indirecto de la memoria RAM.

 

 

 

 

4.2          Memoria de programa

 

El PIC16F84 tiene un contador de programa de 13 bits, capaz de direccionar un espacio de memoria de 8K x 14. El primer 1K x 14 (0000h-03FFh) ya está implementado Figura 4.2.El vector de reset se encuentra en la dirección 0000h y el vector de interrupción en la 0004h.

 

 

 

Figura 4.2  Mapa de memoria de programa y stack.

 

 

 

 

4.3          Memoria de Datos RAM

 

La memoria de datos se dispone de dos áreas diferentes:

 

1.    Área de RAM estática o SRAM, donde reside el banco de registros específicos (SFR) y el banco de registros de propósito general (GPR). El primer banco tiene 24 posiciones de tamańo byte, aunque dos de ellas no son operativas, y el segundo 36.

2.    Área EEPROM de 64 bytes donde, opcionalmente, se pueden almacenar datos que no se pierden al desconectar la alimentación.

 

La zona de memoria RAM está dividida en dos banco (banco 0 y banco 1)de 128 bytes cada uno. Solo se hallan implementadas las 48 primeras posiciones de cada banco, de las cuales las 12 primeras están reservadas al SFR, que son los encargados del procesador y sus recursos. Algunos de los registros se encuentran repetidos en la dirección de los dos bancos, para simplificar su acceso (INDF, ESTADO, FSR, PCLATH e INTCON). La posición apuntada por la dirección 7H y la apuntada por la 87H no son operativas. Los 36 registros restantes de cada banco se destinan a GPR y en realidad solo son operativos los 36 del banco 0 por que los del banco 1 se mapean sobre el banco 0. Es decir que cuando se apunta a un registro general del banco 1, se accede al mismo del banco 0. (Figura 4.3)

 

Para seleccionar el banco para acceder se manipula el bite (RP0) del registro de estado.  Cuando RP0 = 1 acceso a banco 1, RP0 = 0 acceso a banco 0. Después de un Reset   se accede automáticamente al banco 0.  Para seleccionar un registro GPR no hay que tener en cuenta el estado del bit RP0, porque al estar mapeado el banco 1 sobre el banco 0 cualquier registro del banco 1 corresponde al mismo del banco 0. En el direccionamiento directo a los registros GPR se ignora el bit MSB, que identifica el banco y sus direcciones están comprendidas entre el valor 0x0c y Ox2f.

 

Los registros SFR se clasifican en 2 grupos. En uno se incluye el núcleo del microcontrolador (ESTADO, OPTION, INTCON, etc.) y en el otro la operación de los recursos auxiliares y periféricos.  La figura 4.4  muestra la estructura de estos registros y los valores que toman después de un Reset.


 

Figura 4.3 La memoria RAM de datos se divide en 2 bancos de 128 bytes cada uno, solo los primeros 48 de cada banco están implementados. Las 12 primeras posiciones de cada banco se reservan a los registros SFR y las 36 restantes a los registros GPR.


4.3.1. Direccionamiento de la memoria de datos

 

Direccionamiento Directo

 

El operando que utiliza la instrucción en curso se referencia mediante su dirección, que viene incluida en el código de operación de la misma en los 7 bits menos significativos. El banco a acceder lo determinan los bits RP0 y RP1 del registro de estado.  (Figura 4.5)

 

Direccionamiento Indirecto

 

Este modo de direccionamiento se usa cuando en una instrucción se utiliza como operando el registro INDF, que ocupa la dirección 0 de ambos bancos. El registro INDF no está implementado físicamente y cuando se le hace referencia, se accede la dirección de un banco especificada, con los 7 bits menos significativos del registro FSR. El bit MSB de FSR junto al bit IRP del registro de estado se encarga de seleccionar el banco a acceder, mientras que los 7 bits menos significativos apuntan a la posición.  En este modo de direccionamiento el bit IRP = 0 siempre.

 


 

 

 


Figura 4.5  Direccionamiento directo del PIC16F84

 

 

4.4          El Registro de Estado

 

El registro de estado contiene el estado aritmético de la ALU            (C, DC y Z). Indica el estado de RESET (TO y PD). Selecciona el dato a acceder en la memoria de datos (IRP, RP0 y RP1).

 

Para modificar el registro de estado, se deben de utilizar únicamente las instrucciones BCF, BSF, SWAPF y MOVWF ya que estas instrucciones no afectan ningún bit del registro de estado.

 

REGISTRO DE ESTADO

 

 

bit 7-6        No implementado: Se programa como 0

bit 5            RP0: Selección de banco en direccionamiento directo

                   01 = Banco 1 (80h – FFh)

                   00 = Banco 0 (00h – 7Fh)

bit 4            TO: Bit Time-out

1 = Después de energizarlo  o al ejecutarse las  instrucciones CLRWDT y SEP

0 = Cuando termina el tiempo del WDT (Watchdog)

bit 3            PD: Bit Power-Down

1 = Después de energizarlo o al ejecutar la instrucción CLRWDT

0 = Al ejecutar la instrucción SEP

bit 2            Z: Bit Cero

                   1 = El resultado de la operación aritmética-lógica ha sido 0

                   0 = El resultado de la operación aritmética-lógica no es 0

bit 1                     DC: Bit Digito de carry/borrow (instrucciones ADDWF, ADDLW, SUBLW, SUBWF) (para borrow la polaridad es al revés)

                   1 = En el resultado de la instrucción se produjo un carry en el cuarto bit de menos peso.

                            0 = No se produjo carry

 

 

 

 

bit 0                     C: Bɩt carry/borrow (instrucciones ADDWF, ADDLW, SUBLW, SUBWF) (para borrow la polaridad es al revés)

                   1 = En el resultado de la instrucción se produjo un carry en el bit de más significativo.

                            0 = No se produjo carry.


 

4.5          Cuarto Programa

 

 

Objetivo

 

Realizar una pantalla de matriz de 8x16 y desplegar diferentes mensajes

 

Desarrollo

 

Realizar un programa que mediante la ayuda de multiplexores, genere un barrido en las 16 columnas de la pantalla y en sincronía con el puerto B mandar los datos a desplegar. El barrido se hará a una velocidad en la que el ojo humano perciba que están iluminadas todas las columnas. Ver figura D

 

 

 

FIGURA D
PROGRAMA 4

;*****************************************************************************

;*Programa: Display 16 x 8

;:Autor: Carlos Alberto López González

;*Descripcion: Controlar por medio del puerto a y b una pantalla de 16 x 8

;*****************************************************************************

;*******************************ETIQUETAS*************************************

STATUS                   EQU               3                    

PORTA                     EQU               5

PORTB                     EQU               6                    

TRISB                       EQU               6                    

TRISA                       EQU               5

COLUMNA               EQU               0Ch                                      

TABLA                      EQU               0Dh               

CONTADOR1          EQU               0Eh

CONTADOR2          EQU               0Fh

CICLO                       EQU               10h                

DELAY                      EQU               0XFF

ENABLE                   EQU               0X08

PCL                           EQU               02h

w                                EQU               0                    

f                                  EQU               1                    

 

;*************************PROGRAMA PRINCIPAL********************************

                                   ORG               00h                

                                   ORG               05h    

                                   BSF               STATUS,5

                                   CLRF             TRISB

                                   MOVLW        0X10

                                   MOVWF        TRISA

                                   BCF               STATUS,5

                        MOVLW        0X00

                                   MOVWF        COLUMNA

                                   GOTO                        INICIO

INICIO                       GOTO                        BARRIDO

;******************************CONTROLA PANTALLA 1****************************

BARRIDO                 BTFSC          PORTA,4                  ;Verifica push

                                   GOTO                        BARRIDO1              ;Va a pantalla  2

                                   MOVF                        COLUMNA,w           ;Mueve valor de colum a W

                                   MOVWF        PORTA                     ;Mueve valor de W al Port A

                        INCF              COLUMNA,w           ;Incrementa columna

                                   MOVWF        COLUMNA

                                   CALL             DATO                        ;Rutina de dato a desplegar

                                   MOVWF        TABLA                      ;Guarda dato en la variable

                        MOVLW        0X0F                          ;Carga w con el retardo

                                   CALL             RETARDO               ;Llama retardo

                                   MOVF                        TABLA,w                  ;Mueve valor de tabla a W

                                   MOVWF        PORTB                     ;Despliega  dato al puerto B

                                   MOVLW        0X10                          ;Carga w con 10

                                   SUBWF         COLUMNA,w           ;Posición de columna

                        BTFSC          STATUS,2

                                   CALL            RESET                      ;Ultima regresa al origen

                        GOTO            BARRIDO                 ;Regresa a barrido

;*******************************CONTROLA PANTALLA 2****************************

BARRIDO1              BTFSC          PORTA,4

                                   GOTO                        BARRIDO2

                        MOVF                        COLUMNA,w

                                   MOVWF        PORTA

                        INCF              COLUMNA,w

                        MOVWF        COLUMNA

                                   CALL             DATO1

                        MOVWF        TABLA

                                   MOVLW        0X0F

                                   CALL             RETARDO

                        MOVF                        TABLA,w

                        MOVWF        PORTB

                                   MOVLW        0X10

                                   SUBWF         COLUMNA,w

                        BTFSC          STATUS,2

                                   CALL            RESET

                                   GOTO            BARRIDO1

;*******************************CONTROLA PANTALLA 3 ***************************** BARRIDO2              BTFSC          PORTA,4

                                   GOTO                        BARRIDO3

                        MOVF                        COLUMNA,w

                        MOVWF        PORTA

                                   INCF              COLUMNA,w

                                   MOVWF        COLUMNA

                        CALL             DATO2

                                   MOVWF        TABLA

                                   MOVLW        0X0F

                        CALL             RETARDO

                                   MOVF                        TABLA,w

                                   MOVWF        PORTB

                        MOVLW        0X10

                                   SUBWF         COLUMNA,w

                                   BTFSC          STATUS,2

                        CALL                         RESET

                                   GOTO            BARRIDO2

RESET                      MOVLW        0X00                          ;Carga w con 00

                        MOVWF        COLUMNA               ;Descarga  w en columna

                        RETURN                 

 

;********************************RUTINA DE RETARDO ****************************

RETARDO               MOVWF        CONTADOR1         

LOOP2                      MOVWF        CONTADOR2         

LOOP1                      DECFSZ       CONTADOR2,f       

                                   GOTO                        LOOP1                     

                                   DECFSZ       CONTADOR1,f       

                                   GOTO                        LOOP2                     

                                   RETURN                             

;********************************DATO PANTALLA 1 ******************************

DATO                        ADDWF         PCL

                                   RETLW         0X81  ;regresa de subrutina con w=81

                                   RETLW         0X81  ;regresa de subrutina con w=81

                        RETLW         0XFF  ;regresa de subrutina con w=FF

                                   RETLW         0X81  ;regresa de subrutina con w=81

                                   RETLW         0X81  ;regresa de subrutina con w=81

                        RETLW         0X00  ;regresa de subrutina con w=00

                                   RETLW         0XFF  ;regresa de subrutina con w=81

                                   RETLW         0X89  ;regresa de subrutina con w=89

                        RETLW         0X89  ;regresa de subrutina con w=89         

                                   RETLW         0X89  ;regresa de subrutina con w=89

                                   RETLW         0X00  ;regresa de subrutina con w=81

                                   RETLW         0X01  ;regresa de subrutina con w=01

                                   RETLW         0X01  ;regresa de subrutina con w=01

                                   RETLW         0XFF  ;regresa de subrutina con w=81

                                   RETLW         0X01  ;regresa de subrutina con w=01

                                   RETLW         0x01   ;regresa de subrutina con w=01

                                   RETLW         0X00  ;regresa de subrutina con w=81

;*********************************DATO PANTALLA 2 *******************************

DATO1                      ADDWF         PCL

                                   RETLW         0X00

                        RETLW         0X82

                                   RETLW         0X81

                                   RETLW         0XFF

                        RETLW         0X80

                                   RETLW         0X80

                                   RETLW         0X00

                        RETLW         0XFF

                                   RETLW         0X91

                                   RETLW         0X91

                        RETLW         0XF1

                                   RETLW         0X00

                                   RETLW         0XFF

                                   RETLW         0X11

                        RETLW         0X11

                                   RETLW         0x11

                                   RETLW         0X00

 

;*********************************DATO PANTALLA 3 **********************************

DATO2                     

                        ADDWF         PCL

                        RETLW         0X00

                        RETLW         0X00

                        RETLW         0XFF

                        RETLW         0X91

                        RETLW         0X91

                        RETLW         0X91

                        RETLW         0XFF

                        RETLW         0X00

                        RETLW         0X00

                        RETLW         0X10

                        RETLW         0X18

                        RETLW         0X14

                        RETLW         0X12

                        RETLW         0XFF

                        RETLW         0X00

                        RETLW         0x00

                        RETLW         0X00

 

                        END
CAPÍTULO 5

 

 

5                  RECURSOS FUNDAMENTALES

 

 

 

 

 

 

5.1          Temporizador/Contador TMR0

 

Una de las labores más comunes en los programas de control de dispositivos, es determinar intervalos concretos de tiempo. El elemento encargado de realizar esta función es el temporizador TMR0. También es frecuente contar los pulsos que se producen en el exterior del sistema y este elemento se denomina contador.

 

El PIC 16F84 tiene un temporizador/contador de 8 bits llamado TMR0, que actúa de dos maneras diferentes:

 

1.-     Como contador de sucesos, que están representados por los pulsos que se aplican al pin RA4/TOCKI. Al llegar al valor FFh se desborda el contador y con el siguiente pulso pasa a 00h, activando una bandera ido provocando una interrupción.

 

2.-     Como temporizador, cuando se carga en el registro que implementa al recurso un valor inicial, se incrementa con cada ciclo de instrucción ( Fosc/4) hasta que se desborda, o sea, pasa de FFh a 00h y avisa fijando a 1 la bandera seńalizadora ido provocando una interrupción. Ver figura 5.1

 

 

 

 

Figura 5.1 Diagrama a bloques del TIMER0

 

Nota: 1: TOCS, TOSE, PSA, PS2 (Registro OPTION)

          2: El prescalador se comparte con el temporizador del Watchdog

 

Para que el TMR0 funcione como contador se tiene que fijar a 1 el bit TOCS. En esta situación el registro TMR0 se incrementa con cada flanco activo en el pin TOCK1. El tipo de flanco activo se elige programando el bit TOSE en el registro OPTION. Si TOSE = 1, el flanco activo es negativo y si TOSE = 0 el flanco activo es el positivo.

Para que el TMR0 funcione como temporizador el bit TOCS = 0.

 

En realidad el PIC 16F84 dispone de 2 temporizadores, el TMR0 y el Watchdog. El primero actúa como principal y el segundo vigila el programa que se esté ejecutando normalmente y que no este detenido en un ciclo infinito a espera de algún evento que no se produce, lo que se traduce en un Reset que reinicia todo el sistema.

 

El TMR0 y el Watchdog, precisan controlar largos intervalos de tiempo y necesitan aumentar la duración de los pulsos de reloj que los incrementa. Para hacer esto se tiene un circuito denominado prescalador que divide la frecuencia utilizada por diversos rangos.

En la figura 5.2 podemos ver el diagrama a bloques del prescalador del TIMER/WDT

 

 

 

Figura 5.2 Diagrama a bloques del Prescalador TIMER0/WDT.

 

Para calcular los tiempos a controlar con TMR0 se utilizan las siguientes fórmulas prácticas.

 

 

Temporización = 4 * TOSC * (Valor cargado en TMT0)* (Prescaler)

 

Valor a cargar en TMR0 = Temporización/4 * TOSC * Prescaler

 

 

En cualquier momento se puede leer el valor de TMR0 sin detener su cuenta. La instrucción adecuada es movf tmr0,w.

 

5.1.1           El registro OPTION

 

Este registro controla el TMR0 y el prescalador . El bit T0CS (Timer 0 Clock Edge Select) selecciona el multiplexor MPX1 la procedencia de los pulsos de reloj, que pueden ser los del oscilador interno (Fosc/4) o los que se aplican desde el exterior por el pin TOCKI. El bit T0SE         ( Timer 0 Clock Source Select)  elige el tipo de flanco activo en los pulsos externos. Si T0SE = 1 el flanco activo es el negativo, y si   T0SE = 0 el flanco activo es el positivo.

 

El bit PSA del registro OPTION determina la asignación del prescalador al TMR0 (PSA = 0) o al WDT (PSA = 1).

 

 

REGISTRO OPTION

 

bit 7            RBPU: Bit de habilitación de Pull-up del puerto B

                   1 = PORTB Pull-up deshabilitado

                   0 = PORTB Pull-up habilitado

bit 6            INTEDG: Bit de selección de flanco de interrupción

                   1 = Interrupción en flanco negativo

                   0 = Interrupción en flanco positivo

bit 5           TOCS: Bit de selección de reloj fuente del TMR0

                   1 = Transición en el pin RA4/TOCKI

                   0 = Ciclo de reloj de instrucción interna (CLKOUT)

bit 4            T0SE : Bit de selección de flanco del TMR0

                   1 = Incrementa en transición negativa en el pin RA4/TOCKI

                   0 = Incrementa en transición positiva en el pin RA4/TOCKI

bit 3            PSA: Bit de asignación del prescalador

                   1 = Prescalador asignado a WDT

                   0 = Prescalador asignado al Timer0

bit 2-0        PS2:PS0: Bits de selección de la taza del prescalador

BIT

Taza TMR0

Taza WDT

000

001

010

011

100

101

110

111

1 : 2

1 : 4

1 : 8

1 : 16

1 : 32

1 : 64

1 : 128

1 :256

1 :1

1 : 2

1 : 4

1 : 8

1 : 16

1 : 32

1 : 64

1 : 128

5.2           Interrupción del Timer0.

 

La interrupción del TMR0 es generada cuando se desborda el registro de FFh a 00h. Este desbordamiento fija el bit T0IF (INTCON<2>). La interrupción puede ser enmasacarada limpiando el T0IE (INTCON<5>). El bit T0IF debe ser limpiado en el programa por la rutina del servicio de interrupción, rehabilitando esta interrupción.

 

REGISTRO INTCON

 

 

 

bit 7            GIE: Bit de habilitación de interrupción global

                   1 = Habilita todas las interrupciones no enmascaradas

                   0 = Deshabilita todas las interrupciones

bit 6            EEIE: Habilitación de interrupción de escritura completa

                   1 = Interrupción habilitada

                   0 = Interrupción deshabilitada

bit 5            T0IE: Habilita la interrupción de desbordamiento del TMR0

                   1 = Interrupción habilitada

                   0 = Interrupción deshabilitada

bit 4            INTE: Habilitación de interrupción externa RB0/INT

                   1 = Interrupción habilitada

                   0 = Interrupción deshabilitada

bit 3            RBIE: Habilitación de interrupción de cambio de puerto RB

                   1= Interrupción habilitada

                   0 = Interrupción deshabilitada

bit 2            T0IF: Bit bandera de interrupción de desbordamiento

                   1 = El registro TMR0 se desbordó

                   0 = El registro TMR0 no se ha desbordado

bit1             INTF: Bit bandera  de interrupción externa RB0/INT

                   1 = Ocurrió una interrupción externa

                   0 = Ningún pin del RB7:RB4 ha cambiado de estado

 

 

 

 

5.3           WatchDog (WDT)

 

El watchdog es un contador interno de 8 bits que origina un Reset cuando se desborda. Su control de tiempos es independiente del TMR0 y esta basado en un simple red R-C. El WDT puede ser permanentemente deshabilitado, programando el bit WDTE como 0 en la palabra de configuración.

 

El WDT tiene un tiempo nominal de desbordamiento de 18ms (sin prescalador). Utilizando el prescalador se puede aumentar hasta alcanzar los 2.3 segundos.

 

Para evitar el desbordamiento del WDT se tiene que refrescar previamente. Esto consiste en  ponerlo a cero mediante las instrucciones clrwdt y sep. Se deben analizar las instrucciones para poder situar estas instrucciones antes de que ocurra el desbordamiento y se reinicie el sistema. Ver Figura 5.3

 

La instrucción clrwdt borra el WDT y reinicia su cuenta. A diferencia de la instrucción sep, además de borrar el WDT detiene el sistema y lo mete en un modo de bajo consumo, al completar su cuenta provocará un reset y sacará al microcontrolador del modo de bajo consumo.

 

Figura 5.3 Diagrama a bloques del temporizador WDT


 

5.4           Puertos de I/O

 

Algunos pines de los puertos de I/O están multiplexados con una función alterna.

 

5.4.1                PORTA y Registros TRISA

 

PORTA es un puerto bi-direccional de 5 bits. Su registro de dirección de datos es TRISA. Fijando un bit de TRISA (= 1) configurara el pin correspondiente como entrada. Limpiando un bit TRISA (= 0) configurará el pin correspondiente del puerto A como salida.

 

Nota: Cuando ocurre un Reset, estos pines son configurados como entrada.

 

Las líneas RA3 – RA0 admiten niveles de entrada TTL y de salida CMOS. RA4/TOCKI dispone de un circuito Schmitt Trigger que proporciona una buena inmunidad al ruido. RA4 multiplexa su función de I/O con la entrada de reloj para el TMR0.

 

TABLA 5-1: Funciones Puerto A

 

Nombre

Bit

Tipo de Buffer

Función

RA0

bit0

TTL

Entrada/Salida

RA1

bit1

TTL

Entrada/Salida

RA2

bit2

TTL

Entrada/Salida

RA3

bit3

TTL

Entrada/Salida

RA4/TOCKI

bit4

ST

Entrada/Salida o entrada de reloj externo para TMR0

 

 

TABLA 5-2 Registros asociados con el Puerto A

 

Direccion

Nombre

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit2

Bit 1

Bit 0

05h

PORTA

---

---

---

RA4/TOCKI

RA3

RA2

RA1

RA0

85h

TRISA

---

---

---

TRISA4

TRISA3

TRISA2

TRISA1

TRISA0

 

 

5.4.2                PUERTO B Y REGISTROS TRISB

 

PORTB es un puerto bi-direccional de 8 bits. Su registro de dirección de datos es TRISB. Fijando un bit de TRISB (= 1) configurará el pin correspondiente como entrada. Limpiando un bit TRISB (= 0) configurará el pin correspondiente del puerto B como salida.

 

Cada pin del puerto B tiene internamente una resistencia de Pull-up. Con un solo bit de control se pueden activar todas las resitencias de Pull-up. Esto se hace mediante el bit RBPU del registro OPTION. El pull-up se desactiva automáticamente cuando el puerto es configurado como salida y al activar el Reset.

 

Cuatro pines del puerto B RB7:RB4 tienen la característica de interrupción. Solo los pines configurados como entrada pueden causar esta interrupción. La interrupción la podemos ver con la badera BIRF que se encuentra en el registro INTCON.

 

 

TABLA 5-3:        Funciones Puerto B

 

Nombre

Bit

Tipo de Buffer

Función

RB0/INT

bit 0

TTL/ST

Pin Entrada/salida o entrada de interrupción externa

RB1

bit 1

TTL

Pin Entrada/salida

RB2

bit 2

TTL

Pin Entrada/salida

RB3

bit 3

TTL

Pin Entrada/salida

RB4

bit 4

TTL

Pin Entrada/salida con interrupción en cambio

RB5

bit 5

TTL

Pin Entrada/salida con interrupción en cambio

RB6

bit 6

TTL/ST

Pin Entrada/salida con interrupción en cambio

RB7

bit 7

TTL/ST

Pin Entrada/salida con interrupción en cambio

RB8

bit 8

TTL/ST

Pin Entrada/salida con interrupción en cambio

 

 

 

 

TABLA 5- 4   Registros asociados con el puerto B

 

Dirección

Nombre

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

06h

PORTB

RB7

RB6

RB5

RB4

RB3

RB2

RB1

RB0/INT

86h

TRISB

TRISB7

TRISB6

TRISB5

TRISB4

TRISB3

TRISB2

TRISB1

TRISB0

81h

OPTION

RBPU

 

 

 

 

 

 

 

0Bh,8Bh

INTCON

GIE

 

TOIE

 

 

TOIF

 

 

 

 

5.5           Palabra de configuración

 

Es una posición reservada de  la memoria de programa situada en la dirección 2007h y accesible únicamente durante el proceso de grabación. Al escribirse el programa de la aplicación es necesario grabar el contenido de esta posición de acuerdo con las características del sistema. Ver Figura 5.4

 

 

Figura 5.4: Palabra de configuración

 

Bit 13-4      CP: Bit de protección de código

                   1 = Protección de código desactivado

                   0 = Toda la memoria de programa está protegida

bit 3            PWRTE: Bit de habilitación del temporizador “POWER-UP”

                   1 = Deshabilitado

                   0 = Habilitado

bit 2            WDTE: Bit de habilitacion del temporizador Watch Dog

                   1= Habilitado

                   0 = Deshabilitado

bit 1-0        F0SC1:F0SC0: Bits de selección del oscilador

                   11 = Oscilador RC

                   10 = Oscilador HS

01 = Oscilador XT

00 = Oscilador LP

 


5.6           Memoria EEPROM de datos

 

El Pic 16F84 tiene 64 bytes de memoria EEPROM de datos, donde se pueden almacenar datos y variables que interesa que no se pierdan cuando se desconecta la alimentación del sistema. Soporta 1,000,000 de ciclos de escritura/borrado y es capaz de guardar la información sin alterarla más de 40 ańos.

 

         La memoria EEPROM no está mapeada en la zona de la memoria de datos donde se ubican los registros SFR y GPR. Para poder leerla y escribirla durante el funcionamiento normal del microcontrolador se tienen que utilizar 4 registros del SFR:

 

·        EEDATA

·        EEADR

·        EECON1

·        EECON2

 

En el registro EEADR, se carga la dirección a acceder de la EEPROM de datos. El PIC16F84 tiene 64 bytes de memoria EEPROM de datos con un rango de 0h hasta 3Fh. En el registro EEDATA se depositan los datos que se leen  o se escriben .

 

         El registro EECON1, funciona para controlar las operaciones de la EEPROM y la distribución de  sus bits se presenta en la figura  5.5

 

 

Figura 5.5  Registro EECON1

 

bit 7-5        No implementados

bit 4                     EEIF: Bandera de interrupción de operación de escritura 

                            1 = Operación de escritura completa

                   0 = Operación de escritura no se ha completado

bit 3            WRERR: Bandera de error en escritura

                   1= Operación de escritura terminó antes de tiempo

                   0= Operación de escritura completa

bit 2            WREN: Bit de habilitación de escritura

                   1= Permite la escritura de la EEPROM

                   0= Inhabilita la escritura de la EEPROM

bit 1            WR: Bit de control de escritura

                   1= Inicia el ciclo de escritura

                   0= Ciclo de escritura completo

bit 0            RD: Bit de control de lectura

                   1= Inicializa la lectura de la EEPROM

                   0= No inicializa la lectura de la EEPROM

 

Ejemplo para realizar la lectura de una posición de la EEPROM de datos.

BCF          STATUS,RP0    ; Banco 0

MOVLW    CONFIG_ADDR

MOVWF    EEADR               ; Dirección a leer

BSF           STATUS, RP0   ; Banco 1

BSF           EECON1, RD     ; Lectura

BCF           STATUS, RP0   ; Banco 0

MOVF        EEDATA, W       ; W = EEDATA

 

 

Ejemplo para realizar la escritura de una posición de la EEPROM de datos un valor.

 

BCF          STATUS,RP0              ; Banco 1

BCF           INTCON, GIE              ;Deshabilita INTs

BSF           EECON1, WREN        ; Habilita escritura

MOVLW    55h

MOVWF    EECON2                      ; Escribe 55h

MOVLW    Aah

MOVWF    EECON2                      ; Escribe Aah

BSF           EECON1, WR             ; Comienza escritura

BSF           INTCON, GIE              ; Habilita INTs.

 

 

 

 

 

5.7           Quinto programa

 

Objetivo

 

Elaborar un  contador de 4 dígitos, diseńando un circuito que requiera la menor cantidad posible de componentes.

 

Desarrollo

 

Conectar los cuatro dígitos del display  en paralelo. Para que no se encienda sobre los cuatro dígitos el mismo número se multiplexa el encendido por medio de cuatro transistores. Para que el display se ilumine no solo tiene que haber un uno lógico en el segmento a encender, sino que también se requiere que el transistor este en conducción para lograr la activación del display. Conmutando los transistores secuencialmente y a velocidad suficiente se logra hacer parecer al ojo humano que los cuatro displays están iluminados simultáneamente, cuando en realidad sólo uno se ilumina. Ver figura E

 

 

 

 

 

 

 

FIGURA E

PROGRAMA 5

;**************************************************************************

;*Programa: Contador.asm

;Descripcion: Contador de 4 digitos.

;***************************************************************************

;********************************ETIQUETAS***********************************

indo                           equ                00h             ;registro de indireccion

pc                   equ                02h             ;contador de programa

status                        equ                03h             ;registro de estado

fsr                   equ                04h             ;registro de seleccion

ptoa               equ                05h             ;puerto a

ptob               equ                06h             ;puerto b

rota                equ                0fh             ;variable para desplazamiento de display

trisa               equ                85h             ;configuracion puerto a

trisb               equ                86h             ;configuracion puerto b

dig1               equ                10h             ;acumulador miles

dig2               equ                11h             ;acumulador centenas

dig3               equ                12h             ;acumulador decenas

dig4               equ                13h             ;acumulador unidades

loops             equ                1dh             ;variables usadas en retardos

loops2           equ                1eh

z                     equ                02h             ;Bandera de cero

ram                equ                05h             ;bit de seleccion de pagina de memoria

c                     equ                00h             ;bandera de acarreo

w                    equ                00h             ;bit de destino a variable de trabajo

reset              org                 00

                        goto               inicio

                        org                 05h

;*******************************PROGRAMA PRINCIPAL****************************

inicio            bsf                   status, ram  ;selecciona el banco de memoria alto

            movlw           10h                 ;configura el puerto a

movwf           trisa               ;bit 4 entrada, demas bits salidas.

                        movlw           00h                 ;configura el puerto b

                        movwf           trisb               ;como salidas

                        bcf                  status, ram  ;selecciona el banco de memoria bajo

                        clrf                  dig1               ;inicializa acumuladores

                        clrf                  dig2

                        clrf                  dig3

                        clrf                  dig4

                        movlw           00                  

            movwf           ptoa            ;todos los displays a 0

empe             btfss              ptoa, 4        ;checa el push y salta si es 0

                        call                 subir          ;llama la rutina de incremento

                        movlw           08h             ;iniciar un 1 en el registro de rotacion

                        movwf           rota           

                        movlw           dig1            ;con el registro selector (fsr) se apunta

                        movwf           fsr                   ;al primer dato que se va a mostrar

disp               movlw           00h                 ;colocar en cero el dato del display

                        movwf           ptob               ;para apagarlos

                        movf              rota, w           ;pasa rotacion del 1 a la variable work

                        movwf           ptoa               ;enciende el transistor (display)

                        movf              indo, w         ;lee dato del registro apuntado por fsr

                        call                 tabla              ;genera el digito de 7 segmentos

                        movwf           ptob               ;envia el digito al puerto b

                        movlw           03h            

            call                 retardo

            btfsc              rota, 0            ;Checa si termino barrido

                        goto               empe             ;si termino, vuelve desde el comienzo

                        bcf                  status, c       ;carry en cero

rrf                   rota                ;desplaza barrido

                        incf                 fsr                   ;incrementa el puntero.

                        goto               disp               ;digito a mostrar

 

;*******************************RETARDO**************************************

retardo          movwf           loops          

top2               movlw           d'110'         

                        movwf           loops2

top                 nop

                        decfsz           loops2         

                        goto               top

decfsz           loops          

                        goto               top2

            retlw   0

;******************************RUTINA DE INCREMENTO X 1000 *******************

s1000           clrf                   dig2            ;pone a cero las centenas

                        incf                 dig1            ;incrementa el contador de miles  

                        movf              dig1, w       ;carga en w el conteo de los miles  

                        xorlw             0ah             ;si numero a, entonces quedara en cero

                        btfsc              status, z     ;si es cero, z queda en alto

clrf                  dig1            ;inicializa los miles  

                        return

;*************************RUTINA DE INCREMENTO X 100 *************************

s100              clrf                  dig3            ;pone a cero las decenas

                        incf                 dig2            ;incrementa el contador de centenas

            movf              dig2, w       ;carga en w el conteo de las centenas

                        xorlw             0ah             ;si w era 10, entonces quedara en cero

            btfsc              status, z     ;si es cero, z queda alto

                        call                 s1000          ;incrementa los miles  

                        return

 

 

 

 

;**************************RUTINA DE INCREMENTO X 10**************************

s10                 clrf                  dig4            ;pone a cero las unidades

incf                 dig3            ;incrementa el contador de decenas

                        movf              dig3, w       ;carga en w el conteo de las decenas

                        xorlw             0ah             ;si w era 10, entonces quedara en cero

                        btfsc              status, z     ;si es cero, el flag z queda alto

                        call                 s100            ;incrementa las centenas

                        return

;***************************RUTINA DE INCREMENTO X 1 *****************************

subir              incf                 dig4            ;incrementa el contador de unidades

                        movf              dig4, w       ;carga en w el conteo de las unidades

                        xorlw             0ah             ;si w era 10, entonces quedara en cero

                        btfsc              status, z     ;si es cero, el flag z queda alto

                        call                 s10             ;incrementa las decenas

                        movlw           d'250'         

                        call                 retardo

                        return

;***************************GENERA LOS NUMEROS SOBRE EL DISPLAY**********

tabla             addwf             pc                   ;agrega al cont. programa el valor de w

                        retlw              3Fh                 ;genera el 0

                        retlw              18h                 ;genera el 1

                        retlw              76h                 ;genera el 2

                        retlw              7Ch                ;genera el 3

                        retlw              59h                 ;genera el 4

                        retlw              6Dh                ;genera el 5

                        retlw              6Fh                ;genera el 6

                        retlw              38h                 ;genera el 7

                        retlw              7Fh                ;genera el 8

                        retlw              7Dh                ;genera el 9

 

 

 

                        end


CAPÍTULO 6

 

 

6             INTERRUPCIONES, RESET Y RECURSOS AUXILIARES

 

 

 

 

 

 

 

6.1           Causas de interrupción

 

El PIC16F84 tiene 4 fuentes de interrupción:

·        Interrupción externa por el pin RB0/INT

·        Interrupción de sobreflujo del TMR0

·        Interrupciones de cambio del puerto B (Pines RB7:RB4)

·        Interrupción de fin de escritura de la EEPROM de datos

 

El registro de control de interrupciones (INTCON) graba las interrupciones  en bits banderas. Cada interrupción tiene su propia bandera.

 

El bit de habilitación global de interrupciones, GIE habilita o deshabilita individualmente cada una de las interrupciones a través del registro INTCON. (Ver figura 6.1)

 

 

6.1.1           El registro de control de interrupciones INTCON

 

GIE

EEIE

TOIE

INTE

RBIE

TOIF

INTF

RBIF

bit 7                                                                                                       bit 0

 

Figura 6.1 Registro INTCON

 

bit 7            GIE: Habilitación de interrupciones global              

                   1= Acepta las interrupciones habilitadas

                   0= No acepta ninguna interrupción

bit 6            EEIE: Habilita interrupción de fin de escritura de la EEPROM

                   1= Habilita interrupción

                   0= Deshabilita interrupción

bit 5            TOIE: Habilita interrupción de sobreflujo del TMR0

                    1= Habilita interrupción

                   0= Deshabilita interrupción

 

bit 4            INTE: Habilitación de interrupción externa pin RB0/INT

                   1= Habilita interrupción

                   0= Deshabilita interrupción

bit 3                     RBIE: Habilitación de interrupción por cambio de estado en                        

                               RB7:RB4

                            1= Habilita interrupción

                            0= Deshabilita interrupción

 bit 2           TOIF: Bandera de sobreflujo del TMR0

                   1= Sobreflujo en el TMR0

                   0= TMR0 no se ha tenido sobreflujo

bit 1            INTF: Bandera de activación del pin RB0/INT

                   1= Se activó RB0/INT

                   0= No se ha activado RB0/INT

bit 0                     RBIF: Bandera de cambio de estado en  los pines RB7:RB4

                   1= Cuando cambia de estado alguno de los 4 pines

                   0= No ha cambiado el estado

 

Siempre que se produce una interrupción, GIE = 0 y el contador del programa CP se carga con el valor 0004h que es el vector de interrupción. Para saber que tipo de interrupción fue, se localiza la bandera que se haya activado en el registro INTCON.

 

Antes de regresar de una interrupción al programa, todas las banderas tienen que fijarse a cero, aunque la interrupción esté deshabilitada.

 

 

6.1.2           Interrupción externa INT

 

Esta interrupción puede programarse tanto de flanco de disparo positivo como negativo en el bit INTDEG en el registro OPTION_REG.         Es importante para atender acontecimientos externos en tiempo real. Cuando ocurre alguno y se activa el pin RB0/INT, se hace una petición de interrupción. De forma automática el bit INTF1 = 1 y, si el bit de habilitación INTE =1, se autoriza el desarrollo de una interrupción.

 

6.1.3           Interrupción del TMR0

 

Cuando existe sobreflujo (FFh – 00h) la bandera T0IF se fija a 1. La interrupción puede ser habilitada o deshabilitada en el bit T0IE en el registro INTCON.

 

Si no se recarga el TMR0 cuando ocurre un sobreflujo, sigue contando desde 00h hasta FFh. Este registro se puede leer y escribir en cualquier momento, cada vez que se escribe en este registro se pierden dos ciclos de reloj para la sincronización. Cuando se carga el TMR0 con un valor N, cuenta 256 – N y el tiempo que tardará en llegar a esta cuenta está dado por la siguiente formula.

 

 

 

 

6.1.4                Interrupción del Puerto B

 

Un cambio en la entrada del puerto B 7:4 fijan el bit bandera RBIF en el registro INTCON. La interrupción puede ser habilitada o deshabilitada en el bit RBIE. Esta interrupción esta diseńada específicamente para detectar cuando se pulsa una tecla correspondiente a un teclado matricial que se explora mediante 4 líneas de I/O.

6.1.5           Interrupción en la EEPROM de datos

 

El tiempo típico que tarda en desarrollarse una operación de escritura en la EEPROM de datos del PIC16F84 es de 10ms, que es considerable comparado con la velocidad a la que el procesador ejecuta las instrucciones. Para asegurarse que se ha completado la escritura y puede continuarse con el flujo de control del programa es aconsejable manejar la interrupción que se origina al finalizar la escritura, que fija automáticamente la bandera  EEIEF a 1 y se habilita en el bit EEIE.

 

Durante la escritura de este registro debe prohibirse la aceptación de interrupciones para asegurar la operación de escritura, para esto se fija el bit GIE = 0.

 

6.2           Reset

 

El PIC16F84 tiene diferentes formas para la reinicialización del sistema:

 

·        Conexión de la alimentación. POR (Power-On Reset)

·        MCLR durante operación normal

·        MCLR durante el modo SEP

·        Reset WDT (Watch Dog) durante operación normal

·        Wake-Up durante modo SLEEP

 

La Figura 6.2 muestra un diagrama a bloques de los diferentes tipos de RESET. En el pin MCLR, se tiene un filtro interno para eliminar el ruido e ignorar los pulsos pequeńos.

 

El  PWRT activa una salida después de cierto tiempo de haber conectado la alimentación. Este tiempo garantiza la estabilización del voltaje de alimentación.

 

 

 

Figura 6.2  Diagrama a bloques de los diferentes tipos de Reset

 

 

6.3           Modo de bajo consumo

 

Este modo de funcionamiento del PIC, está caracterizado por el reducido consumo de energía que requiere y se recomienda  en aquellas aplicaciones en las que hay largos periodos en espera de algún suceso.

 

         Para entrar en el modo de reposo se tiene que ejecutar la instrucción SLEEP. En este modo el pin TOCK1 se conecta a VDD o VSS, para eliminar la entrada de pulsos externos al TMR0. El TMR0 también se detiene. Los pines de I/O mantienen el estado anterior al modo de reposo y las que no estén conectadas, se aconseja conectarlas a VDD o VSS para evitar posibles fugas de corriente.

 

Para salir del modo SLEEP existen tres alternativas:

 

·         Provocando un reset     MCLR

·        WDT sí está en modo SLEEP

·        Por medio de alguna de las interrupciones excepto la del TMR0 que se detiene en modo SLEEP

 

6.4           Sexto programa

 

 

Objetivo

 

Elaborar un  control de velocidad y giro de un motor a pasos. Utilizar el TMR0 para controlar la frecuencia de giro del motor.

 

Desarrollo

 

Conectar el motor a pasos en el puerto b y utilizar las instrucciones RLF(Rotar a izquierda) y RRF(Rotar a derecha) para controlar el giro. Conectar al Puerto A  las entradas de dirección de giro e incremento y decremento de velocidad. Mediante subrutinas de incremento variable controlaremos la frecuencia de barrido en las bobinas del motor a pasos. Ver Figura F

 

 

 

 

FIGURA F
PROGRAMA 6

;**************************************************************************

;*Programa: pasos.asm

;*Descripción: Control de Motor a pasos

;***************************************************************************

;*******************************ETIQUETAS***********************************     

STATUS                   EQU               3                    

TMR_OPT                EQU               1

INTCON                    EQU               0Bh

PORTA                     EQU               5

PORTB                     EQU               6                    

TRISB                       EQU               6                    

TRISA                       EQU               5

SEG                           EQU               0Ch               

VAR                           EQU               0Dh                            ;Variable de frecuencia  

REG                           EQU               0Eh                            ;Registro derecha

REG_IZQ                  EQU               0Fh                            ;Registro Izquierda

MIN                            EQU               10h

MAX                           EQU               11h

w                                EQU               0                    

f                                  EQU               1                    

 

           

                                   ORG               00h                

                                   ORG               05h    

                                   BSF               STATUS,5

                                   MOVLW        0X07

                                   MOVWF        TRISA

                                   MOVLW        0XF0

                                   MOVWF        TRISB

                                   MOVLW        0XD7                         ;Fija prescalador

                                   MOVWF        TMR_OPT   

                                   BCF               STATUS,5

                                   CLRF             PORTB

                                   MOVLW        0X08

                                   MOVWF        REG

                                   MOVLW        0X10

                                   MOVWF        VAR                           ;Determina velocidad

                                   MOVLW        0X01

                                   MOVWF        MIN                            ;Velocidad máxima

                                   MOVLW        0XFF

                                   MOVWF        MAX                           ;Velocidad mínima

                                   CLRF             SEG

                                   GOTO            INICIO

 

 

;*************************PROGRAMA PRINCIPAL********************************

INICIO                       BTFSC          PORTA,2                  ;Verifica entrada pta2

                                   GOTO                        IZQ                             ;Gira izquierda

                                   GOTO                        DER                           ;Gira derecha

;*************************GIRO LADO DERECHO *********************************

DER                           BTFSC          PORTA,2                  ;Verifica entrada pta2

                                   GOTO                        IZQ                             ;Si es 0 gira izquierda

                                   MOVF                        REG,W                      ;Inicia barrido a la derecha

                                   MOVWF        PORTB        

                                   BTFSC          PORTA,0                  ;Verifica entrada  de + Vel

                                   CALL             INCRE                       ;Incrementa Velocidad

                                   BTFSC          PORTA,1                  ;Verifica entrada de - Vel

                                   CALL             DECRE                     ;Decrementa velocidad

                                   CALL             RETARDO               ;Llama subrutina de retardo                              CLRF             SEG

                                   RRF               PORTB,W                ;Incrementa barrido

                                   MOVWF        REG

                                   BTFSS          PORTB,0                  ;Verifica fin de barrido

                                   GOTO                        DER

                                   CALL             CAMBIO_DER

                                   GOTO            INICIO

;************************** RESET BARRIDO A LA DERECHA*******************

CAMBIO_DER        MOVLW        0X08                          ;Prepara barrido derecha

                                   MOVWF        REG

                                   RETURN

;****************************GIRO LADO IZQUIERDO******************************

IZQ                             BTFSS          PORTA,2                  ;Verifica entrada pta2

                                   GOTO                        DER                           ;Si es 1 gira a la derecha

                                   MOVF                        REG,W                      ;Barrido a la izquierda

                                   MOVWF        PORTB        

                                   BTFSC          PORTA,0                  ;Verifica entrada  de + Vel

                                   CALL             INCRE                       ;Incrementa velocidad

                                   BTFSC          PORTA,1                  ;Verifica entrada de - Vel

                                   CALL             DECRE                     ;Decrementa velocidad

                                   CALL             RETARDO               ;Llama subrutina de retardo                              CLRF             SEG

                                   BCF               STATUS,0

                                   RLF                PORTB,W

                                   BCF               STATUS,0

                                   MOVWF        REG

                                   BTFSS          PORTB,3                  ;Verifica fin de barrido

                                   GOTO                        IZQ

                                   CALL             CAMBIO_IZQ          

                                   GOTO            INICIO           

 

 

 

;*****************************RESET BARRIDO A LA IZQUIERDA*******************

CAMBIO_IZQ           MOVLW        0X01

                                   MOVWF        REG

                                   RETURN

;**************************** INCREMENTA VELOCIDAD***************************

INCRE                       MOVF                        VAR,W                      ;Mueve velocidad  a w

                                   MOVWF        VAR

                                   MOVF                        VAR,w          

                                   SUBWF         MIN,w                                    ;Compara si es vel max  

                                   BTFSS          STATUS,2

                                   DECF            VAR                           ;Si no es max decrementa

                                   RETURN

;***************************** DECREMENTA VELOCIDAD*****************************

DECRE                     MOVF                        VAR,W                      ;Mueve velocidad a w

                                   MOVWF        VAR

                                   MOVF                        VAR,w

                                   SUBWF         MAX,w                      ;Compara si es vel min

                                   BTFSS          STATUS,2   

                                   INCF              VAR                           ;Si no es min incrementa

                                   RETURN                 

;*****************************RUTINA DE RETARDO***********************

RETARDO               CLRF             TMR_OPT                ;Limpia el TMR0

INC                            BTFSS          INTCON,2                 ;Verifica desbordamiento

                                   GOTO                        INC

                                   BCF               INTCON,2                 ;Limpia bandera TOIF

                                   INCF              SEG                           ;Incrementa variable seg

                                   MOVF                        VAR,w                       ;Mueve el valor de var a w

                                   SUBWF         SEG,w                       ;Compara si es la velocidad

                                   BTFSS          STATUS,2                ;Si es regresa a rutina

                                   GOTO                        RETARDO

                                   RETURN

                       

                                   END          
CAPÍTULO 7

 

 

7             SET DE INSTRUCCIONES

 

 

 

 

 

 

7.1           RISC

 

Los microcontroladores PIC tienen una arquitectura de tipo RISC (Reduced Instruction Set Computer). Ésta no implica únicamente que el número de instrucciones máquina que es capaz de interpretar y ejecutar es pequeńo, sino que tiene las siguientes características:

 

·        Instrucciones simples y rápidas

·        Instrucciones ortogonales

·        Longitud de instrucciones y datos constante

 

 

7.2           Tipos de formato

 

Las instrucciones del PIC16F84, tienen 14 bits de longitud, divididos en un código operativo (OPCODE) que especifica el tipo de instrucción y uno o más operandos que especifican la operación de la instrucción. Ver tabla 7-1

 

a)    Campo del código OP

Los bits de este campo sirven para definir la operación que realiza la instrucción.

 

b)    Operandos fuente (f) y destino (d)

Estos definen los registros que actúan como operandos en la instrucción. Estos dan una referencia de la dirección que ocupan en la memoria de datos.

 

c)    Campo de operando inmediato o literal (k)

Contiene el valor de un operando inmediato.

 

d)    Campo de referencia a un bit (b)

Es un campo de 3 bits que indica la posición de un bit dentro de un registro de 8 bits.

 

e)    Campo de dirección de salto

En las instrucciones de salto CALL y GOTO hay un campo de bits que contiene la dirección de la siguiente instrucción que hay que ejecutar. Dicho campo de bits se carga en el PC en las instrucciones de salto condicional.

Estos formatos se clasifican en 5 grandes grupos según el tipo de operación que desarrollan

 

1)    Operaciones que manejan registros de tamańo byte

2)    Operaciones que manejan bits

3)    Operaciones que manejan valores inmediatos

4)    Operaciones incondicionales de control de flujo de programa

5)    Operaciones de salto condicional

 

7.2.1                Manejo de registro de tamańo byte

 

El formato de las instrucciones orientado a manejar registros de tamańo  byte, se divide en tres campos. Ver figura 7.1

 

 

1.    Campo del código OP de 6 bits

2.    Campo de la dirección del operando fuente (f) de 7 bits

3.    Campo que define él operando destino (d) de 1 bit

 

Figura 7.1  Manejo de registro de tamańo byte

 

 

Todas las instrucciones que tienen este tipo de formato las podemos encontrar en la tabla 7-1.

 

TABLA 7-1

 

 

Mnemónicos,

Operandos

 

 

Descripción

 

Ciclos

14-Bit Opcode

 

Seńalizadores

 

MSb                   LSb

ADDWF  f,d

ANDWF  f,d

CLRF        f   

CLRW      -

COMF     f,d

DECF      f,d

DECFSZ f,d

INCF       f,d

INCFSZ  f,d

IORWF   f,d 

MOVF    f,d

MOVWF f,d

NOP

RLF         f,d

RRF         f,d

SUBWF   f,d

SWAPF   f,d

XORWF  f,d

Suma W y f

Multiplica W con F

Borra f

Borra W

Complementa f (inv)

Decrementa f

Decrementa f salta si 0

Incrementa f

Incrementa f salta si 0

OR entre W y F

Mueve f

Mueve w a f

No opera

Rota f a la izquierda

Rota f a la derecha

Resta W a f

Intercambia nibbles

XOR de W con f

1

1

1

1

1

1

1(2)

1

1(2)

1

1

1

1

1

1

1

1

00   0111  dfff    ffff

00   0101  dfff    ffff

00   0001  1fff    ffff

00   0001  0xxx  xxxx

00   1001  dfff    ffff

00   0011  dfff    ffff

00   1011  dfff    ffff

00   1010  dfff    ffff

00   1111  dfff    ffff

00   0100  dfff    ffff

00   1000  dfff    ffff

00   0000  dfff    ffff

00   0000  0xx0  ffff

00   1101  dfff    ffff

00   1100  dfff    ffff

00   0010  dfff    ffff

00   1111  dfff    ffff

00   0110  dfff    ffff

 

C,DC,Z

Z

Z

Z

Z

Z

 

Z

 

Z

Z

 

 

C

C

C,DC,Z

 

Z

        

7.2.2               Manejo de bits

El formato al que responden las instrucciones de este grupo tiene tres campos.

 

1.    Campo del código OP de 4 bits

2.    Campo de la dirección del registro fuente

3.    Campo de la posición del bit en el registro de 3 bits

En la tabla 7-2 se muestran las instrucciones orientadas a manejar bits

 

Tabla 7-2

 

 

Mnemónicos,

Operandos

 

 

Descripción

 

Ciclos

14-Bit Opcode

 

MSb                   LSb

BCF       b,f

BSF       b,f

BTFSC  b,f

BTFSS  b,f

Limpia el bit f

Fija a 1 el bit f

Checa bit de f y brinca si es 0

Checa bit de f y brinca si es 1

1

1

1(2)

1

 

01   00bb  bfff    ffff

01   01bb  bfff    ffff

01   10bb  bfff    ffff

01   11bb  bfff    ffff

 

 

 

7.2.3           Manejo de valor inmediato

 

El formato correspondiente a este grupo de formato solo tiene 2 campos

 

1.    Campo del código operativo con 6 bits

2.    Campo del valor inmediato (k) con 8 bits

 

k = Valor inmediato de 8 bits

 

7.2.4               Operaciones incondicionales de control de flujo de programa

 

Este tipo de instrucciones afectan al contenido del Contador de Programa (PC) y sirven para romper la secuencia ordenada de las instrucciones del programa. Las instrucciones de este grupo tienen un formato con sólo 2 campos:

 

1.    Campo del código OP de 3 bits

2.    Campo de la dirección del salto que se carga en el PC de 11 bits

 

k = Valor inmediato de 11 bits

 

7.2.5           Salto condicional

 

El PIC dispone de algunas instrucciones que comparan, y cuando se cumple alguna condición, efectúan un salto de instrucción.

 

El formato de las instrucciones de salto(skip) es el mismo que el de las operaciones que manipulan registros de un byte.

 

En la tabla 7-2 se encuentran las instrucciones de salto  BTFSC y BTFSS

 

7.1          Nomenclatura y símbolos

 

SIMBOLO

SIGNIFICADO

0xhh

Se usa para referenciar 2 números en hexadecimal hh

F

Representa la dirección de la memoria RAM de datos

D

Bit que indica el registro destino. Si d = 0 es W si d = 1 es f

K

Campo que contiene un valor inmediato. Operando (8 bits)  o dirección para el PC (11 bits)

X

Valor indeterminado de un bit puede ser 1 o 0

()

Contenido

<>

Campo de un bit de un registro

Î

En el conjunto de Ejemplo: d Î [0,1].

[]

Opciones

 

 


 

7.3           Instrucciones especiales y de control

 

En este grupo se incluyen las instrucciones que rompen la secuencia normal del programa porque alteran el contenido del PC y también las instrucciones especiales.

 

La instrucción de salto condicional goto carga en el PC la dirección de la nueva instrucción.  La instrucción call de llamada a subrutina, antes de cargar el PC con la dirección de la instrucción a saltar, guarda la dirección de partida guardando en la parte más alta del SP el valor actual de la PC. De esta manera al regresar de la subrutina, se carga la dirección de regreso al programa principal.

 

Para regresar de una subrutina existen 2 formas. La más común es return que se limita a regresar cargando el valor del PC y la otra es retlw k, que además de hacer la función de return, carga en W el valor inmediato k que contiene. Es decir que devuelve un parámetro desde la subrutina.

 

Para el final de las interrupciones hay otra instrucción cuyo mnemónico es retfie. Esta instrucción sirve para poner el bit GIE = 1 ya que al atender una interrupción automáticamente se pone en 0 para evitar que cuando se atiende una interrupción se produzca otra.

 

De las instrucciones especiales tenemos clrwdt y sleep. La primera pone a 0 el watchdog , es decir lo reinicia. Esta instrucción se debe de poner en ciertos puntos para evitar el sobre flujo del watchdog y con ello el reset del microcontrolador.

 

La instrucción sleep introduce al procesador en un modo de bajo consumo. Detiene al oscilador y el procesador queda congelado, no ejecutando instrucciones y manteniendo el mismo valor en los puertos de I/O

Ver Tabla 7-3


Tabla 7-3  Operaciones Literales y de Control

 

 

Mnemónicos,

Operandos

 

 

Descripción

 

Ciclos

14-Bit Opcode

 

MSb                   LSb

ADDLW     k

ANDLW     k|

CALL         k

CLRWDT   k

GOTO         k

IORLW       k

MOVLW    k

RETFIE      k

RETLW      k

RETURN

SLEEP

SUBLW      k

XORLW     k

Suma inmediata con w

AND inmediata con W

Llamado a subrutina

Limpia watchdog

Salto incondicional

OR inmediato con W

Mueve a w un valor inmediato

Retorno de interrupción

Retorno subrutina carga w=k

Retorno de subrutina

Modo de bajo consumo

Resta W de un inmediato

XOR con W

1

1

2

1

2

1

1

2

2

2

1

1

1

 

11   111b  kkkk    kkkk

11   1001  kkkk    kkkk

11   0kkk  kkkk    kkkk

11   0000  kkkk    0100

10   1kkk  kkkk    kkkk

11   1000  kkkk    kkkk

11   00xx  kkkk    kkkk

00   0000  0000    1001

11   01xx  kkkk    kkkk

00   0000  0000    1000

00   0000  0110    0011

11   110x  kkkk    kkkk

11   1010  kkkk    kkkk

 

 

 


 

7.4           Séptimo programa

 

Objetivo

 

Controlar un modulo LCD para visualizar las teclas que se vayan pulsando en un teclado de matriz de 4 x 4.

 

Desarrollo

 

Conectar las 8 terminales del teclado, cuatro para las filas y cuatro para las columnas al puerto B (Ver Figura G). Hacer mediante software un barrido en las filas de un nivel bajo lógico. Si existe alguna tecla pulsada en la fila a la que se le introdujo el nivel bajo, dicho nivel saldara por la columna correspondiente a la que haga contacto. Al momento de leer las columnas (RB0-RB3) sabremos que tecla a sido pulsada.

Inicializar la pantalla de LCD y desplegar la tecla que se haya pulsado. (Ver LCD16x2.Pdf)

 

FIGURA G


PROGRAMA 7

;***************************************************************************

;*Programa: LCD.asm

;*Descripcion: Control de Pantalla de LCD

;***************************************************************************

;************************          ETIQUETAS **********************

pcl                  equ                02h                 ;Contador del programa

resul              equ                0ch

tempo1         equ                0dh

temp1                        equ                11h

temp2                        equ                10h

delay1           equ                12h

delay2           equ                13h

barrido          equ                14h

columna       equ                15h

tecla_temp   equ                16h    

fin_reng        equ                17h

enter              equ                18h

resul_1          equ                19h

offset             equ                0eh

opcion          equ                81h

porta              equ                05h                 ;puerto a

portb             equ                06h                 ;puerto b

trisa               equ                85h                 ;configuracion puerto a

trisb               equ                86h                 ;configuracion puerto b

lcd_var          equ                0fh

status            equ                03h                 ;registro de estado

ram                equ                05h                 ;bit de seleccion de pagina de memoria

w                    equ                00h                 ;bit de destino a variable W

f                      equ                01h                 ;bit de destino a variable F

z                     equ                2                     ;zero

;***********************           PROGRAMA PRINCIPAL *********************

            org                 00h

            goto               inicio

            org                 05h

inicio

            call                 up_lcd

            bsf                  status,ram

            movlw           87h

            movwf           opcion

            bcf                  status,ram

            call                 lcd_ini

 

 

 

 

 

;*************************        INICIALIZA  LCD                ***********

inicio_1         call                 borra_home

                        call                 display_on_cur_off

                        bsf                  porta,2                                  ;ENABLE

                        movlw           80h

                        call                 lcd_reg

                        clrf                  offset

                        call                 mens

                        clrf                  enter

                        clrf                  fin_reng

teclado          call                 lectura

                        movlw           0x00

                        xorwf             enter,w

                        btfsc              status,z

                        goto               borra_mensaje

                        call                 convierte     

                        call                 ascii

                        call                 despliega

                        goto               teclado

;************************          L E C T U R A *******************************************

lectura           bsf                  status,ram    ;Entra a modo configuracion

                        movlw           0x0f                ;PB0-PB3 Entradas

                        movwf           trisb               ;PB4-PB7 Salidas

                        bcf                  opcion,7       ;Habilita Pull-Up en puerto B

                        bcf                  status,ram    ;Sale de modo configuracion

                        movlw           4

                        movwf           columna       ;Numero de columnas a explorar

                        movlw           0x7f                ;01111111

                        movwf           barrido          ;Valor de barrido en renglon    

lectura1        movf              barrido,w

                        movwf           portb

                        movf              portb,w

                        movwf           tecla_temp   ;primer valor de lectura de tecla

                        subwf                        barrido,w

                        btfss              status,z         ;verifica si esta presionada una tecla

                        goto               lectura2

                        bsf                  status,0         ;pone carry

                        rrf                   barrido,f        ;Rota el barrido de la columna

                        decfsz           columna,f     ;Fin de barrido??

                        goto               lectura1        ;No ha terminado barrido

                        goto               teclado          ;Regresa a iniciar barrido

 

 

 

 

 

;************************          RETARDO PARA EVITAR REBOTES *******************

lectura2        movlw           100                

                        movwf           delay1

lectura3        clrf                  delay2

                        clrwdt

lectura4        decfsz           delay2,f

                        goto               lectura4

                        decfsz           delay1,f

                        goto               lectura3

                        return

                       

;*************************        CONVIERTE            CODIGO DE TECLADO********************

convierte      clrf                  columna

convierte1    call                 tabla_tecla               ;busca codigo de tecla

                        subwf                        tecla_temp,w          ;compara    

                        btfsc              status,z

                        goto               convierte2               ;si es igual

                        incf                 columna                   ;no es igual, incrementa tabla

                        goto               convierte1

convierte2    movf              columna,w

                        movwf           barrido

                        return

tabla_tecla   movf              columna,w

                        addwf                        pcl,f

                        retlw              0xed   ;0

                        retlw              0x7e   ;1

                        retlw              0x7d   ;2

                        retlw              0x7b   ;3

                        retlw              0xbe   ;4

                        retlw              0xbd  ;5

                        retlw              0xbb  ;6

                        retlw              0xde   ;7

                        retlw              0xdd  ;8

                        retlw              0xdb  ;9

                        retlw              0xee   ;clear

                        retlw              0xeb   ;help

                        retlw              0xe7   ;enter

                        retlw              0xd7   ;2nd

                        retlw              0xb7   ;dwn

                        retlw              0x77   ;up

 

 

 

 

 

 

 

;*********************  CONVIERTE CODIGO ASCII       ****************************

ascii               addwf            pcl,1

                        retlw   '0'

                        retlw   '1'

                        retlw   '2'

                        retlw   '3'

                        retlw   '4'

                        retlw   '5'

                        retlw   '6'

                        retlw   '7'

                        retlw   '8'

                        retlw   '9'

                        retlw   'A'

                        retlw   'B'

                        retlw   'C'

                        retlw   'D'

                        retlw   'E'

                        retlw   'F'

;******************       DESPLIEGA EN PANTALLA      ********************************

despliega     bsf                  status,ram

                        clrf                  trisb

                        clrf                  trisa

                        bcf                  status,ram

                        incf                 fin_reng

                        call                 lcd_dato

                        movlw           0x20

                        subwf                        fin_reng,w

                        btfsc              status,z

                        call                 clear_lcd

                        movlw           0x10

                        subwf                        fin_reng,w

                        btfsc              status,z

                        call                 second_line

                        return                       

;*****************        BORRA MENSAJE PRINCIPAL             ******************

borra             incf                 enter

                        bsf                  status,ram

                        clrf                  trisb

                        clrf                  trisa

                        bcf                  status,ram

                        call                 lcd_delay

                        call                 lcd_delay

                        bcf                  porta,1

                        bsf                  porta,2

                        movlw           0x01

                        call                 lcd_reg        

                        goto               teclado

;******************       BORRA TODA LA PANTALLA               *****************

clear_lcd      bcf                  porta,1

                        bsf                  porta,2

                        movlw           0x01

                        call                 lcd_reg        

                        clrf                  fin_reng

                        return

;******************       MENSAJE PRINCIPAL                 ******************

mens             clrf                  resul

mens_1         movf              offset,w

                        addwf                        resul,w

                        call                 datos

                        iorlw              0

                        btfsc              status,2

                        return

                        call                 lcd_dato

                        incf                 resul,f

                        movlw           0x0A 

                        movwf           tempo1

                        movlw           0x0E

                        subwf                        resul,w

                        btfsc              status,2

                        call                 second

                        goto               mens_1

second         bsf                  porta,2

                        movlw           0xC0

                        call                 lcd_reg

                        bsf                  porta,0

                        return

borra_h         bsf      porta,2                      ;ENABLE

                        movlw           01h

                        call     lcd_reg

                        return

display_on_cur_off          bsf      porta,2          ;ENABLE

                                               movlw           0Eh

                                               call lcd_reg

                                               return

up_lcd           bsf      status,ram

                        clrf      trisb

                        clrf      trisa

                        bcf      status,ram

                        return

 

 

 

 

 

lcd_ini           bcf                  porta,0                      ;OFF_COMANDO

                        call                 lcd_delay

                        bsf                  porta,2                      ;ENABLE

                        call                 lcd_delay

                        movlw           38h

                        call                 lcd_reg

                        call                 lcd_delay

                        bsf                  porta,2                      ;ENABLE

                        movlw           38h

                        call                 lcd_reg

                        call                 lcd_delay

                        bsf                  porta,2                      ;ENABLE

                        movlw           38h

                        call                 lcd_reg

                        call                 lcd_delay

                        return

 

;****************          MANDA DATO A LCD **********************************

lcd_dato       bsf                  porta,0                      ;OFF_COMANDO

                        bsf                  porta,2

                        movwf           portb

                        call                 lcd_delay

                        call                 lcd_e

                        return

 

;*****************        MANDA COMANDO A LCD ***********************

lcd_reg         bsf                  status,ram

                        clrf                  trisb

                        clrf                  trisa

                        bcf                  status,ram

                        bcf                  porta,0                      ;OFF_COMANDO

                        movwf           portb

                        call                 lcd_delay

                        call                 lcd_e

                        return

lcd_e             bcf                  porta,2                      ;DISABLE

                        return

 

 

 

 

 

 

 

 

 

 

;*****************        DATOS A DESPLEGAR EN PANTALLA *************

datos

            addwf            pcl,1

            retlw   'U'

            retlw   'N'

            retlw   'I' 

            retlw   'V'

            retlw   'E'

            retlw   'R'

            retlw   'S'

            retlw   'I' 

            retlw   'D'

            retlw   'A'

            retlw   'D'

            retlw   ' '

            retlw   'D'

            retlw   'E'

            retlw   'L'

            retlw   'A'

            retlw   ' ' 

            retlw   'S'

            retlw   'A'

            retlw   'L'

            retlw   'L'

            retlw   'E' 

            retlw   ' '

            retlw   'B'

            retlw   'A'

            retlw   'J'

            retlw   'I'

            retlw   'O'

            retlw   0x00

 

;*******************     RETARDO DE LCD           ***************************  

lcd_delay    

                        clrwdt

                        movlw           0xA0

                        movwf           temp1

                        clrf      temp2

lcd_delay_1 decfsz           temp2,f

                        goto   lcd_delay_1

                        decfsz           temp1,f

                        goto   lcd_delay_1

                        return

 

 

            end

7.5           PROGRAMADOR