Teclado matricial 4x4 LCD 2x16 Display 7 segmentos Grabacion EEPROM interna
Comunicaciones rs232     Read / Write Flash de código

 

Las rutinas pregeneradas en ensamblador se utilizan para ahorrarse tiempo de diseño en generar un código que ya han hecho otros o que puedes generar tu mismo y necesitarlo en mas de un proyecto y así no tener que volver a escribirlo o diseñarlo. 

La extensión de archivo por defecto en rutinas es .lib y contienen únicamente las instrucciones necesarias para el trabajo al que se destinan. 

Para incluir una sub-rutina  o librería  en nuestro programa tendremos que usar la directiva include de la manera siguiente;

 include "rutina.lib" 

Una vez hecho esto, será como si tuviésemos las líneas de código contenidas en la librería, incluidas en el listado principal del programa .asm y accederemos a las partes de la librería utilizando la llamada a subrutinas "CALL" ya que todas las funciones contenidas en las librerías retornan con la instrucción "RETURN" o similar que devuelven el proceso del programa a la posición siguiente a la instrucción "CALL"..

 

 


 

 

Teclado Matricial 4x4

TEORIA

Descripción: Dispositivo de entrada de datos que consta de 16 teclas o pulsadores, dispuestos e interconectados en filas y columnas. Dispone de un conector SIL (Single In Line) macho de 8 pines que se corresponden con las 4 filas y las cuatro columnas de las que dispone.

Funcionamiento: En la siguiente figura vemos el esquema de conexionado interno del teclado matricial y sus correspondientes pines de salida numerados de izquierda a derecha mirando el teclado tal y como se ve en la foto anterior. Cuando se presiona un pulsador se conecta una fila con una columna, teniendo en cuenta este hecho es muy fácil averiguar que tecla fue pulsada. También podemos ver el conexionado típico con el puerto B del µC PIC. 
Las resistencias de 2k2 son necesarias para poder compartir el puerto del pic independientemente del teclado y por ejemplo poder conectar un LCD o una barra de leds al mismo tiempo. Durante la fase de lectura del teclado la mitad de la puerta B es configurada como entrada y la otra mitad como lectura y durante la escritura en el lcd o otro sistema, la puerta B es configurada como salidas. Entonces se podrían cortocircuitar accidentalmente las salidas de los puertos provocando su destrucción, si pulsásemos alguna tecla es ese momento con lo que al poner estas resistencias evitamos este hecho y así si se produjera el cortocircuito tan solo circularía una pequeña corriente y el puerto del µC no correría ningún riesgo.
 

RUTINA

La siguiente librería configura las salidas y entradas para usar el teclado escanea las teclas y si es pulsada alguna retorna el valor de tecla en modo hexadecimal para ser mostrado directamente en un display LCD. Las variables y subrutinas utilizadas son:

KB_Port Configura los puertos B del PIC para ser usados con el teclado.
KB_Scan Escanea todas las teclas y devuelve la tecla pulsada en formato Hexadecimal.
Tecla Variable en donde se devuelve la tecla pulsada

Descripción: Para controlar el teclado, los puertos del µC conectados a las filas se programan como salidas y los conectados a las columnas del teclado se programan como entradas, también se activan las resistencias de polarización internas en los puertos de salida. Esto se hace mediante la llamada a la etiqueta "KB_Port" que inicializa los puertos para ser usados con el teclado matricial.

KB_Port                                                 ;Inicializa la puerta B para las entradas del
                                                              ;teclado. Programa RB0-3 como salidas y RB4-7
                                                              ;entradas con las resistencias de polarización
                                                              ;habilitadas------------------------------------------- 
                 BSF          STATUS,RP0       ;Selecciona Pagina 1 (Banco)
                 MOVLW   0F0h                     ;PB4-7 como entradas 
                 MOVWF   TRISB                   ;y PB0-3 como salidas
                 BSF          OPCION,RBPU     ;Habilita R de polarización en entradas
                 BCF          STATUS,RP0       ;Vuelve a la pagina 0 (Banco)
                 RETURN                               ;Retorna.

Ahora para saber que tecla esta siendo pulsada necesitamos escanear el teclado, y esto se consigue mediante la siguiente rutina que consiste en ir poniendo una a una las líneas RB0 a RB3 (conectadas a las filas del teclado) a nivel bajo ya que estas salidas tienen conectada la resistencia de polarización a Vcc y por lo tanto están siempre a nivel lógico alto. Cada vez que una fila se pone a nivel bajo se hacen 4 comprobaciones para ver si una de las cuatro columnas se a puesto a nivel bajo y así saber la tecla pulsada.

KB_Scan                                               ;Escanea el teclado
                 CLRF         Tecla                   ;Borra Tecla y
                 INCF          Tecla,f                 ;prepara Tecla para primer código.
                 MOVLW    0Eh                      ;Saca 0 a la primera fila
                 MOVWF    PORTB                 ;de la Puerta B
                 NOP                                      ;Nada para estabilización de señal. 
Cheq_Col  BTFSS     PORTB,4              ;Primera columna = 0 
                 GOTO      antirebotes           ;Sale si se ha pulsado tecla.
                 INCF         Tecla,f                 ;Si no tecla pulsada, incrementa tecla.
                 BTFSS     PORTB,5              ;Segunda columna = 0
                 GOTO      antirebotes          ;Sale si se ha pulsado tecla.
                 INCF         Tecla,f                 ;Si no tecla pulsada, incrementa tecla.
                 BTFSS     PORTB,6              ;Tercera columna = 0
                 GOTO      antirebotes          ;Sale si se ha pulsado tecla.
                 INCF        Tecla,f                  ;Si no tecla pulsada, incrementa tecla.
                 BTFSS     PORTB,7              ;Cuarta columna = 0
                 GOTO      antirebotes          ;Sale si se ha pulsado tecla.
                 INCF        Tecla,f                  ;Si no tecla pulsada, incrementa Tecla.

Ultima_Tecla                                         ;comprueba si se a escaneado todo el teclado

                MOVLW   d'17'                     ;Carga W con el n£mero de Teclas + 1.
                SUBWF    Tecla,w               ;y lo compara con el valor actual de Tecla.
                BTFSC      STATUS,Z          ;Si Tecla + 1 = valor actual.
                GOTO       NTeclas              ;No ha sido pulsada ninguna tecla.
                BSF          STATUS,C          ;Pone a 1 Bit C. 
                RLF          PORTB,f              ;as¡ la Fila 1 pasa a 1 con la rotaci¢n a izqda.
                GOTO      Cheq_Col  

                NTeclas   CLRF Tecla          ;Coloca variable Tecla a 0
                RETURN                               ;y regresa. 

antirebotes      ;ahora se espera a que la tecla sea soltada para evitar rebotes
                        ;y reactivaciones de tecla
                        ;esta parte puede ser eliminada si para nuestro proyecto no es necesaria
                        ;o es un inconveniente.

Espera1   BTFSS   PORTB,4                ;Si no se suelta la tecla FILA 1
                GOTO    Espera1                 ;vuelve a esperar. 
Espera2   BTFSS   PORTB,5                ;Si no se suelta la tecla FILA 2
                GOTO    Espera2                 ;vuelve a esperar.
Espera3   BTFSS   PORTB,6                ;Si no se suelta la tecla FILA 3
                GOTO    Espera3                 ;vuelve a esperar. 
Espera4   BTFSS   PORTB,7                ;Si no se suelta la tecla FILA 4
                GOTO    Espera4                 ;vuelve a esperar. 

                

                MOVF    Tecla,w               ;pone en w el numero contenido en la variable
                CALL     T_Conv                ;llama a la tabla de conversion y retorna
                MOVWF Tecla                   ;con el valor en hexadecimal y lo pone en la variable.
                RETURN                             ;vuelve al programa principal que hizo la llamada.
;----------------------------------------------------------------------------------------------------------

T_Conv   ADDWF   PCL,1
               RETLW    '0'                        ;Tecla nº0 = 0
               RETLW    '1'                        ;Tecla nº1 = 1
               RETLW    '4'                        ;Tecla nº2 = 4
               RETLW    '7'                        ;Tecla nº3 = 7 
               RETLW    'A'                       ;Tecla nº4 = A 
               RETLW    '2'                        ;Tecla nº5 = 2 
               RETLW    '5'                        ;Tecla nº6 = 5 
               RETLW    '8'                        ;Tecla nº7 = 8 
               RETLW    '0'                        ;Tecla nº8 = 0 
               RETLW    '3'                        ;Tecla nº9 = 3 
               RETLW    '6'                        ;Tecla nº10 = 6
               RETLW    '9'                        ;Tecla nº11 = 9
               RETLW    'B'                        ;Tecla nº12 = B
               RETLW    'F'                        ;Tecla nº13 = F
               RETLW    'E'                        ;Tecla nº14 = E
               RETLW    'D'                        ;Tecla nº15 = D
               RETLW    'C'                        ;Tecla nº16 = C

 

La parte de código pintada en amarillo puede ser eliminada sin ningún problema si no queremos que el pic tenga que esperar a que soltemos la tecla para continuar con su ejecución normal.

 

Descargar

Teclado.lib

 


Ideas y mejoras: Para disminuir el número de conexión a usar para detectar la tecla que se esta pulsando, podemos modificar un teclado matricial tal y como se expone en la siguiente figura:

Solo usaremos las salidas correspondientes a las filas del teclado y de RB0 a RB4 serán configurables como salida o entrada mientras que RB4 solo será entrada. Para saber la tecla que se esta pulsando tendremos que configurar una línea como salida y ponerla a nivel alto y las demás como entrada y comprobar el valor de las entradas para saber que columna se a pulsado.

 

Los diodos utilizados son del típico modelo 1N4148. hay que tener especial cuidado en no programar mas de una puerta como salida ya que podría destruirse algún diodo debido a una circulación excesiva de corriente en los mismos. Esto es debido a que el circuito no tiene resistencias de limitación para protegerlos en estos casos, pero es totalmente viable el uso de ellas, así que si queremos usar las puertas para controlar el teclado y también para alguna otra cosa podemos poner unas resistencias de 2k2 en serie con las puertas RB0 a RB4.

 

En breve tendré disponible una rutina para esta configuración de teclado.

 

 

Subir

 

 

LCD 2x16

TEORIA

Descripción: La pantalla de cristal liquido o LCD (Liquid Crystal Display) es un dispositivo µControlado de visualización grafico para la presentación de caracteres, símbolos o incluso dibujos (en algunos modelos), es este caso 

dispone de 2 filas de 16 caracteres cada una y cada carácter dispone de una matriz de 5x7 puntos (pixels), aunque los hay de otro número de filas y caracteres. Este dispositivo esta gobernado internamente por un microcontrolador Hitachi 44780 y regula todos los parámetros de presentación, este modelo es el mas comúnmente usado y esta información se basará en el manejo de este u otro LCD compatible.

Caracteristicas principales:
-Pantalla de caracteres ASCII, además de los caracteres Kanji y Griegos.
-Desplazamiento de los caracteres hacia la izquierda o la derecha.
-Proporciona la dirección de la posición absoluta o relativa del caracter.
-Memoria de 40 caracteres por línea de pantalla.
-Movimiento del cursor y cambio de su aspecto.
-Permite que el usuario pueda programar 8 caracteres.
-Conexión a un procesador usando un interfaz de 4 u 8 bits

Funcionamiento: Para comunicarse con la pantalla LCD podemos hacerlo por medio de sus patitas de entrada de dos maneras posibles, con bus de 4 bits o con bus de 8 bits, este ultimo es el que explicare y la rutina también será para este. En la siguiente figura vemos las dos maneras posibles de conexionar el LCD con un pic16F84.

Conexionado con bus de 4 bits

Conexionado con bus de 8 bits

Como puede apreciarse el control de contraste se realiza al dividir la alimentación de 5V con una resistencia variable de 10K.

Las líneas de datos son triestado, esto indica que cuando el LCD no esta habilitado sus entradas y salidas pasan a alta impedancia.

Descripción de pines:

PIN Nº SIMBOLO DESCRIPCION
1 Vss Tierra de alimentación GND
2 Vdd Alimentacion de +5V CC
3 Vo Contraste del cristal liquido. ( 0 a +5V )
4 RS

Selección del registro de control/registro de datos: 

         RS=0 Seleccion registro de control

         RS=1 Seleccion registro de datos

5 R/W

Señal de lectura/escritura:

         R/W=0 Escritura (Read)

         R/W=1 Lentura (Write)

6 E

Habilitacion del modulo:

         E=0 Modulo desconectado

         E=1 Modulo conectado

7-14 D0-D7 Bus de datos bidireccional.

 

 


JUEGOS DE INSTRUCCIONES:

Estas son las instrucciones para el control del modulo LCD 

Hitachi 44780 o compatible.

 

 CLEAR DISPLAY                                                                               

Borra el módulo LCD y coloca el cursor en la primera posición 

(dirección 0). Pone el bit I/D a 1 por defecto.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 0 0 1

Tiempo de ejecución: 1.64mS

 

 HOME                                                                                               

Coloca el cursor en la posición de inicio (dirección 0) y hace que el display comience a desplazarse desde la posición original. El contenido de la memoria RAM de datos de visualización (DD RAM) permanece invariable. La dirección de la memoria RAM de datos para la visualización (DD RAM) es puesta a 0.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 0 1 X

Tiempo de ejecución: 1.64mS

 

 ENTRY MODE SET                                                                            

Establece la dirección de movimiento del cursor y especifica si la visualización se va desplazando a la siguiente posición de la pantalla o no. Estas operaciones se ejecutan durante la lectura o escritura de la DD RAM o CG RAM. Para visualizar normalmente poner el bit S=0.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 1 I/D S

Tiempo de ejecución: 40µS

 

 DISPLAY ON/OFF CONTROL                                                             

Activa o desactiva poniendo en ON/OFF tanto al display (D) como al cursor (C) y se establece si este último debe o no parpadear (B).

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 1 D C B

Tiempo de ejecución: 40µS

 

 CURSOR OR DISPLAY SHIFT                                                            

Mueve el cursor y desplaza el display sin cambiar el contenido de la memoria de datos de visualización DD RAM.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 1 S/C R/L X X

Tiempo de ejecución: 40µS

 

 FUNCTION SET                                                                                 

Establece el tamaño de interfase con el bus de datos (DL), número de líneas del display (N) y tipo de carácter (F)

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 1 DL N F X X

Tiempo de ejecución: 40µS

 

 SET THE CG RAM ADDRESS                                                             

El módulo LCD además de tener definidos todo el conjunto de caracteres ASCII, permite al usuario definir 4 u 8 caracteres gráficos. La composición de estos caracteres se va guardando en una memoria llamada CG RAM con capacidad para 64 bytes. Cada carácter gráfico definido por el usuario se compone de 16 u 8 bytes que se almacenan en sucesivas posiciones de la CG RAM.

 

Mediante esta instrucción se establece la dirección de memoria CG RAM a partir de la cual se irán almacenando los bytes que definen un carácter gráfico. Ejecutando este comando todos los datos que se lean o escriban posteriormente, lo hacen desde esta memoria CG RAM.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 1

Dirección de la CG RAM

Tiempo de ejecución: 40µS

 

 SET THE DD RAM ADDRESS                                                             

Los caracteres o datos que se van visualizando, se van almacenando en una memoria llamada DD RAM para de aquí pasar a la pantalla.

 

Mediante esta instrucción se establece la dirección de la memoria 

DD RAM a partir de la cual se irán almacenando los datos a visualizar. Ejecutando este comando, todos los datos que se escriban o lean posteriormente lo harán desde esta memoria DD RAM. Las direcciones de la 80h a la 8Fh corresponden con los 16 caracteres del primer renglón y de la C0h a la CFh con los 16 caracteres del segundo renglón, para este modelo de LCD.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 1 Dirección de la DD RAM

Tiempo de ejecución: 40µS

 

 READ BUSY FLAG & ADDRESS                                                         

Cuando el modulo LCD esta ejecutando cualquiera de estas instrucciones, tarda un cierto tiempo de ejecución en el que no se debe mandar ninguna instrucción. Para ello dispone de un flag llamado BUSY (ocupado) que indica que se está ejecutando una instrucción previa.

 

Esta instrucción de lectura informa del estado de dicho flag además de proporcionar el valor del contador de direcciones de la CG RAM o de la DD RAM según la última que se haya empleado.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 1 BF Dirección de la CG RAM o  DD RAM

Tiempo de ejecución: 40µS

 

 WRITE DATA TO GG OR DD RAM                                                      

Mediante este comando se escribe en la memoria DD RAM los datos que se quieren presentar en pantalla y que serán los diferentes códigos ASCII de los caracteres a visualizar.

 

Igualmente se escribe en la memoria CG RAM los diferentes bytes que permiten confeccionar caracteres gráficos a gusto del usuario.

 

El escribir en uno u otro tipo de memoria depende de si se ha empleado previamente la instrucción de direccionamiento DD RAM o la de direccionamiento CG RAM.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 0 Código ASCII o byte del carácter gráfico

Tiempo de ejecución: 40µS

 

 READ DATA FROM CG RAM OR DD RAM                                           

Mediante este comando se lee de la memoria DD RAM los datos que haya almacenados y que serán los códigos ASCII de los caracteres almacenados.

 

Igualmente se lee de la memoria CG RAM los diferentes bytes con los que se ha confeccionado un determinado carácter gráfico.

 

El leer de uno u otro tipo de memoria depende de si se ha empleado previamente la instrucción de direccionamiento de la DD RAM o la de direccionamiento CG RAM.

 

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 1 Código ASCII o byte del carácter gráfico

Tiempo de ejecución: 40µS

 


 

ABREVIATURAS

Abreviaturas empleadas en los códigos anteriores:

 

S

1 - Desplaza la visualización cada vez que se escribe un dato

0 - Modo normal

I/D

1 - Incremento del cursor

0 - Decremento del cursor

S/C

1 - Desplaza el display

0 - Mueve el cursor

R/L

1 - Desplazamiento a la derecha

0 - Desplazamiento a la izquierda

BF

1 - Módulo ocupado

0 - Módulo disponible

DL

1 - Bus de datos de 8 bits

0 - Bus de datos de 4 bits

N

1 - LCD de dos líneas

0 - LCD de una línea

F

1 - Carácter de 5 x 10 puntos

0 - Carácter de 5 x 7 puntos

B

1 - Parpadeo del cursor ON

0 - Parpadeo del cursor OFF

C

1 - Cursor ON

0 - Cursor OFF

D

1 - Display ON

0 - Display OFF

X

Indeterminado

 

 

Juego de caracteres:

 

 

RUTINA

Descripción: La siguiente librería básica de rutinas es para controlar un LCD Hitachi 44780 o compatible.

Los datos o comandos a enviar al LCD los meteremos en el acumulador W antes de hacer la llamada a cualquiera de las rutinas siguientes. 

 

LCD_E Genera un pulso de 1µS por PORTB,2 patita 6 (Enable) del LCD. Si se usa una velocidad de micro diferente de 4MHz habrá que ajustar este tiempo.
LCD_BUSY Chequea si el LCD esta ocupado (BUSY) y retorna de la rutina cuando ya no lo este.
LCD_REG Pone al LCD en modo de recibir comandos , espera a que no este ocupado y va a LCD_E.
LCD_DATOS Pone el LCD en modo datos y manda el byte presente en W que será mostrado en pantalla.
LCD_INI Inicializacion del modulo LCD segun los tiempo marcados por el fabricante. Bus de 8 bits, 2 lineas de visualizacion y caracteres de 5 x 7 puntos.
LCD_PORT Configura los puertos del PIC para ser usados con el LCD.

 

Rutina

LCD 2x16

LCD.lib

Descargar

 


Ejemplo: El siguiente ejemplo muestra lo fácil que es manejar un LCD. Lo que hace básicamente es configurar el LCD, los puertos del PIC y luego mandar los datos según los va cogiendo de la tabla de datos, para mostrar en el LCD la típica frase "HOLA MUNDO".

;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>

INICIO      CLRF         Digito             ;Pone a 0 la variable digito 
               CALL         LCD_PORT    ;Puertos en modo LCD 
               BCF           RA,0              ;Desactiva RS del modulo LCD
               BCF           RA,2              ;Desactiva E del modulo LCD 
START    CALL        LCD_INI          ;Inicia LCD (CFG puertos...) 
               MOVLW    b'00000001'   ;Borrar LCD y Home 
               CALL        LCD_REG 
               MOVLW    b'00000110'  
               CALL        LCD_REG 
               MOVLW    b'00001100'   ;LCD On, cursor Off,Parpadeo Off 
               CALL        LCD_REG 
               MOVLW   0x80               ;Direccion caracter
               CALL        LCD_REG 

REPETIR  MOVF      Digito,w          ;W=Digito
               CALL       DATO_1          ;Coge el caracter 
               IORLW     0                      ;Compara 
               BTFSC     STATUS,2       ;Es el ultimo? 
               GOTO      acabar            ;Si 
               CALL       LCD_DATOS   ;Visualiza caracter 
               INCF        Digito,f             ;Incrementa numero de Digito
               GOTO     REPETIR           ;Vuelve a escribir

acabar   nop
              goto        acabar              ;Buclee infinito

;<<<<<<---------------------- TABLA DE DATOS ------------------------->>>>>>> 

DATO_1 ADDWF  PCL,1 
               RETLW  'H' 
               RETLW  'O'
               RETLW  'L' 
               RETLW  'A' 
               RETLW  ' ' 
               RETLW  'M' 
               RETLW  'U' 
               RETLW  'N' 
               RETLW  'D' 
               RETLW  'O' 
               RETLW 0x00 

Ejemplo

HOLA MUNDO

hola.asm

Descargar

Nota: Esta rutina solo funciona correctamente con LCD's rápidos, osea los que son un poco mas caros jejej, esto lo descubrió Taiteki que fue uno de los que la probaron y les falló, la solución consiste en usar un LCD bueno o meter delays entre cada llamada a la rutina del LCD. espero que no tengáis muchos problemas con ella. Suerte.

 

  Subir

 

 

Comunicaciones rs232 (16F87X)

RS232

Descripción: Código fuente para experimentación con puerto serie rs232, usando el puerto hardware de un un PIC 16F87X y un adaptador de señales del puerto serie del PC (rs232) que tiene niveles de +12 a -12 V a niveles comprensibles por el microcontrolador que van de +5 a 0 V (TTL),  el conversor utilizado es un max232, max233 o similar... recomiendo usar  el max233 por no necesitar este de condensadores externos aunque es mas caro que el max232.

 

Transmisión Tx 

PIC-PC

tx-rs232.asm

Descargar

Recepción Rx

PC-PIC

Con interrupción

rx-rs232.asm Descargar

Recepción Rx

PC-PIC

Sin interrupción

232noint.asm Descargar

 

Conexionado para un conversor de TTL a rs232 modelo max232

 

Subir

 

Read / Write Flash de código (16F87X solo)

Flash

Descripción: Las siguientes rutinas nos permitirán leer y grabar la memoria de programa o código del pic de los pic16F87X desde el propio código de programa, esto quiere decir que el propio software se puede reprogramar a si mismo según variables externas o condiciones especificas, también se puede usar para hacer un programa tipo bootloader o simplemente para usarlo como memoria de datos y de esta manera no usar una eeprom externa al pic. 

Funcionamiento: El modo de uso es similar a la lectura/escritura de una la eeprom interna del pic aunque no es necesario en este caso hacer la espera de grabación de la misma con lo que grabar la flash es mas rápido que hacer lo mismo en la eeprom.

La memoria FLASH de un pic16F87X dependiendo del modelo puede alcanzar 8K palabras de 14 bits cada una con lo que el direccionamiento será de 13 bits y el dato de 14 bits. Para direccionar tal cantidad de bits es necesario usar dos registros de 8 bits concatenados con los registros que se usaban en la eeprom (EEADR,EEDATA) para el direccionamiento y otros tantos para el dato, los registros son los siguientes y están ubicados en el banco 2.

dato 14 bits: Parte baja  Parte alta
Direccionamiento: EEADR EEADRH
Dato: EEDATA EEDATAH

Los registros para configurar y inicializar  los procesos de grabación / lectura son EECON1 y EECON2, ambos ubicados en el banco 3.


LECTURA:  Para usar la rutina de lectura de la FLASH habrá que definir las siguientes 4 variables en la memoria de datos (cuidado con el direccionamiento de banco):

ADDRL Parte baja del direccionamiento.
ADDRH Parte alta del direccionamiento.
DATAL Parte baja del dato leído.
DATAH Parte alta del dato leído.

La rutina es la siguiente:

Read_Flash bsf STATUS,RP1
bcf STATUS,RP0 ;Selecciona el Banco 2
movf ADDRL,W ;Contenido d la variable a EEADR,
movwf EEADR ;parte baja de la direccion.
movf ADDRH,W ;Contenido d la variable a EEADRH,
movwf EEADRH ;parte alta de la direccion.
bsf STATUS,RP0 ;Selecciona Banco 3
bsf EECON1,EEPGD ;habilita acceso a la flash.
bsf EECON1,RD ;Inicio operacion de lectura.
nop ;se esperan dos ciclos
nop tal como especifica el datasheet
bcf STATUS,RP0 ;Selecciona Banco 2
movf EEDATA,W ;DATAL = parte baja del dato leido
movwf DATAL
movf EEDATAH,W ;DATAH = parte alta del dato leido
movwf DATAH
return ;retorna de la subrutina.

y para usarla, una vez definidas las variables, habrá que seguir estos pasos...:

  • Poner dato equivalente a posición de memoria a leer en las variables, ADDRL:ADDRH

  • hacer la llamada a la subrutina con...  call  Read_Flash

  • una vez devuelto el control al programa principal ya tenemos las variables DATAL:DATAH llenas con el contenido de la posición de memoria leída.


ESCRITURA:  Para escribir en la memoria FLASH de programa usaremos exactamente las mismas variables que hemos usado en la lectura

ADDRL Parte baja del direccionamiento.
ADDRH Parte alta del direccionamiento.
DATAL Parte baja del dato leído.
DATAH Parte alta del dato leído.

La rutina es la siguiente:
Write_Flash bsf STATUS,RP1
bcf STATUS,RP0 ;Selecciona el Banco 2
movf ADDRL,W ;Contenido d la variable a EEADR,
movwf EEADR ;parte baja de la direccion.
movf ADDRH,W ;Contenido d la variable a EEADRH,
movwf EEADRH ;parte alta de la direccion.
movf DATAL,W ;Se mueve la parte baja del dato
mowf EEDATA ;a escribir en EEDATA.
movf DATAH,W ;Se mueve la parte alta del dato
mowf EEDATAH ;a escribir en EEDATAH.
bsf STATUS,RP0 ;Selecciona Banco 3
bsf EECON1,EEPGD ;habilita acceso a la flash.
bsf EECON1,WREN ;Habilita escritura en la FLASH
bcf INTCON,GIE ;Deshabilita todas las interrupciones.
movlw 0x55 ;Secuencia especial de 5 pasos
movwf EECON2 ;para escribir en la flash
movlw 0xAA ;
movwf EECON2 ;
bsf EECON1,WR ;Inicia la operacion de escritura.
nop ;se esperan dos ciclos
nop tal como especifica el datasheet
bsf INTCON,GIE ;Habilita todas interrupciones generales
bcf EECON1,WREN ;Deshabilita escritura en la FLASH
return ;retorna de la interupcción

Como puede verse en el código fuente, para la secuencia de escritura se deshabilitan las interrupciones generales ya que esto podría cortar el proceso de escritura si saltase alguna interrupción es ese momento, también puede verse la secuencia especial de escritura compuesta por 5 instrucciones.

Para usar esta subrutina seguir estos pasos:

  • Poner dato equivalente a posición de memoria a escribir en las variables, ADDRL:ADDRH

  • Poner dato a escribir en las variables, DATAL:DATAH

  • hacer la llamada a la subrutina con...  call  Write_Flash

 

Subir

 

 


Robotica & µControladores Pic


ionitron · 2001-2003