Este programa recibe una cadena de 16 caracteres ASCII de la calculadora HP 50g y la muestra en un LCD con controlador Hitachi 44780.
Se utiliza Direccionamiento Indirecto para guardar la cadena de caracteres en registros sucesivos a partir de la dirección 20h.
Los datos en serie se reciben a 9600 baudios por el pin RA4.
Funcionamiento:
Según el siguiente diagrama de tiempos de envio de datos en serie:
El programa espera a que se presente un "0" (bit START). Cuando esto ocurre se ejecuta una rutina que guarda los bits que llegan en serie, a partir del menos significativo, en la dirección de memoria al que apunta el registro FSR (Direccionamiento indirecto).
Una vez recibidos los 8 bits, debidamente sincronizados a 9600 baudios mediante retardos, se ejecuta un retardo más a la espera del primer bit STOP (para evitar falsas lecturas de "0" que podría ser el 8 bit de datos).
Se incrementa FSR para apuntar a la dirección sucesiva y se incrementa un contador de caracteres recibidos.
Si ya se recibieron 16 caracteres se salta a la rutina que muestra la cadena en un LCD, una vez finalizada se repite el proceso nuevamente . Caso contrario se espera un nuevo "0" (bit START) para recibir el siguiente caracter.
Diagrama de Conexión:
La cantidad de caracteres a recibir se puede modificar en el archivo .ASM (donde se indica).
Opcional: para enviar caracteres desde la calculadora crear el siguiente programa que permite enviar 10 cadenas cada vez que se ejecuta. Escribir la cadena entre comillas (".....") cuando se solicite.
<< 'a' PURGE 1 10 FOR j "CADENA A ENVIAR" {":a:" {0 0} V} INPUT
Programa que recibe datos del puerto serie de la HP 50g a 9600 baudios.
La HP 50g envia caracteres ASCII por el puerto serie (Compatible con interfaz RS232, necesario adaptador de niveles de tensión) según el siguiente gráfico de tiempos:
Se utiliza el bit START para generar una interrupción por el pin RB0/INT por flanco de bajada.
La rutina de interrupción guarda los bits de datos recibidos en serie en el registro DATO.
Se incluye rutinas de retardo para sincronizar a 9600 baudios.
Una vez finalizada la recepción de datos se muestran los bits (en ASCII) mediante leds en los pines: RB7-RB4 y RA3 - RA0, nibles superior e inferior respectivamente.
Para enviar un caracter ASCII de la calculadora HP 50g crear el siguiente programa:
<<9600 BAUD XMIT>>
Guardar en una variable.
En modo RPN poner el caracter que se desea enviar en el nivel 1 de la pila entre " " y ejecutar el programa.
Esquema de conexión:
El transistor 2N3904 es necesario como adaptador de nivel de tensión ya que la calculadora transmite en niveles CMOS (3.3 V).
1. Ruta de datos simple.
- 1 registro de 8 bit.
- ALU de 8 operaciones. A: Registro y B: Inmediato
Component: alu.vhd
Component: registro_r0.vhd
Programa principal: ruta_datos.vhd
2. Ruta de datos sin acceso a memoria.
- Banco de 4 registros de 1 byte.
- Memoria de programa de 16 x 15 bits.
- ALU de 8 operaciones
- Ejecución de instrucción por cada pulso de botón.
- Visualización de contenido de registros en display.
- Sin acceso a memoria.
Palabra de comando:
2
2
3
1
1
SELA
SELB
6
OP
WR
SELI
SELD
INMEDIATO
Component para procesador.vhd : alu.vhd y registro.vhd
Component para ruta_datos.vhd: procesador.vhd, mem16x15.vhd
y visor.vhd
3. Ruta de datos con acceso a memoria.
- Banco de 4 registros.
- Memoria de programa de 16 x 17 bits.
- ALU de 8 operaciones.
- Acceso a memoria RAM de lectura/escritura de 16 bytes.
- Ejecución de instrucción por cada pulso de botón.
- Visualización de registros en display.
Palabra de comando:
2
2
2
SELB
3
1
1
1
1
SELA
DIR
4
OP
WR
W
SELM
SELI
SELD
INMEDIATO
Component para procesador.vhd: alu.vhd y registro.vhd
Component para ruta_datos.vhd: procesador.vhd, mem16x17.vhd, ram16x8.vhd, visor.vhd
1. Semaforo peatonal 1: Luz normalmente en Verde para tráfico vehicular.
Cuando se presiona BOTON cambia a luz Roja por 20 segundos.
Los últimos 5 segundos se muestran en un Display.
Diagrama de estados tipo Moore:
Archivo: semaforo_peatonal.vhd
2.Luz normalmente en Verde para tráfico vehicular.
Cuando se presiona botón STOP cambia a luz Ámbar y parpadea
por 3 segundos.Cambia a luz Roja por 17 segundos.
Los últimos 5 segundos se muestran en un Display.
Para un oscilador de 50 MHz.
Diagrama de estados tipo Moore:
Archivo: semaforo_peatonal_2.vhd
3. Semáforo simple de cruce de 2 calles. Para un oscilador de 50 MHz.
Diagrama de estados tipo Moore:
Archivo: semaforo_simple.vhd
4. Semáforo en la intersección de una calle de tráfico muy denso con una calle de tráfico
moderado.La calle principal tiene luz Verde durante un mínimo de 25 segundos o
mientras no haya ningún vehículo en la calle perpendicular.
La calle lateral tiene luz Verde hasta que no circule ningún coche por ella o durante un máximo de 25 segundos. La luz ámbar de precaución dura 4 s en los cambios de luz Verde a Roja en ambas calles, principal y lateral.
1. Generador de paridad impar. Envío de bits en serie al presionar START.
Archivo: paridad_serial.vhd
2.Detector de fraude y monedas falsas.
Moneda falsa (SENSOR=01) => Z: Oscilador por 10 s.
Fraude (SENSOR=10)=> X<=1 y Z<=0. STOP para apagar
Moneda falsa y fraude (SENSOR=11)=>Ambas alertas activas. Z por 10 s
y STOP para apagar X.
Archivo: casino.vhd
3. Contador en doble sentido de la secuencia 0,4,7,1,5,9.
UP=1 => Sentido 1
UP=0 => Sentido 2
Archivo: contador_u_d.vhd
4. Circuito generador de la secuencia 11010 cuando se presiona START.
La duración de bit es 100 veces el periodo del Oscilador.
Archivo: secuencia.vhd
5. Detector de secuencia 1011 con traslape.
Archivo: detector1.vhd
6. Detector de secuencia 11X011
Archivo: detector2.vhd
7. Permite detectar el primer botón presionado de un grupo de 3.
El número de participante se muestra en un Display.
Se reinicia sólo cuando se presiona RESET.
Archivo: concurso.vhd
8. Un tanque de agua abierto por la parte superior dispone de tres sensores de detección de llenado (A, B, C) que determinan 4 posibles niveles de llenado (VACIO, NORMAL, LLENO, ALARMA). El nivel del tanque se controla mediante dos válvulas (E, entrada y S, salida).
En condiciones de llenado normal, las válvulas E y S se encuentran abiertas.
Si el líquido llega al nivel de vacío, se cierra la válvula de salida y se mantiene abierta la de entrada.
Si el líquido llega al nivel de lleno, se cierra la válvula de entrada y se mantiene abierta la de salida.
Si por cualquier circunstancia, por ejemplo lluvia, se llegara al nivel de alarma, se deberá cerrar la válvula de entrada y abrir la de salida. Esta situación se mantendrá hasta que el tanque llegue al estado de vacío.
Datos adicionales:
El funcionamiento de los sensores digitales y las válvulas E y S se encuentra resumido en las tablas adjuntas:
1. Codificador BCD con prioridad. El circuito tiene las entradas desde E1,E2,…..E9 y las salidas Z3, Z2, Z1 y Z0.
E9 E8 E7 E6 E5 E4 E3 E2 E1 Z3 Z2 Z1 Z0
1 X X X X X X X X 1 0 0 1
0 1 X X X X X X X 1 0 0 0
0 0 1 X X X X X X 0 1 1 1
………….
0 0 0 0 0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0
Archivo: codificador_bcd.vhd
2. Circuito generador de paridad par de un conjunto de datos de 8 bits. El circuito tiene 8 entradas y 9 salidas (las mismas 8 entradas más el bit de paridad par).
Archivo: paridad.vhd
3. Contador BCD con CLR activo en nivel bajo.
Archivo: contador_bcd.vhd
4.Divisor de frecuencia. 4 frecuencias seleccionables.
Archivo: divisor4.vhd
5. Divisor de frecuencia con selector. 16 frecuencia seleccionables.
Archivo: divisor16.vhd
6. LED parpadeante. La frecuencia de parpadeo se duplica cada vez que se presiona BOTON (hasta
8 veces).
Archivo: led8.vhd
7. Contador decimal de pulsaciones de BOTON. Visualización en Display.
Un LCD (Liquid Crystal Display) es un dispositivo de visualización gráfica para presentación de caracteres, símbolos o incluso dibujos.
Un LCD 16x2 dispone de 2 filas de 16 caracteres cada una. cada caracter se muestra en un a Matríz de 5x7 puntos (pixeles). Está gobernado por un microcontrolador Hitachi 44780 que facilita la comunicación con otros dispositivos.
Características:
Pantalla de caracteres ASCII, caracteres Kanji y Griegos.
Desplazamiento de caracteres hacia la izquierda o hacia la derecha.
Memoria de 40 caracteres por linea.
Movimiento del cursor.
Programación de 8 caracteres por el usuario.
Conexión mediante interfaz de 4 u 8 bit.
Funcionamiento
La comunicación puede hacerse de 2 maneras: Con bus de 4 bits o con bus de 8 bits. Se utilizará bus de 8 bits por la mayor simplicidad de implementarlo en Assembler.
Las líneas de datos son Tri-state, es decir, cuando el LCD no está habilitado sus pines de datos tienen alta impedancia.
Nº PIN
DESCRIPCION
1
VSS
GND
2
VDD
VDD (5 V)
3
V0
Contraste ( 0 a +5V )
4
RS
Registro de control/Registro de datos:
RS=0 Selección registro de control
RS=1 Selección registro de datos
5
R/W
Lectura/Escritura:
R/W=0 Escritura (Write)
R/W=1 Lectura (Read)
6
E
Habilitación:
E=0 Deshabilitado
E=1 Habilitado
7-14
D0-D7
Bus de datos bidireccional.
Juego de Instrucciones del LCD con controlador Hitachi 44780
Clear Display
Borrar y colocar 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
Home
Colocar el cursor en la posición de inicio (dirección 0) y hacer 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) se pone a 0.
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
1
X
Entry Mode Set
Establecer la dirección de movimiento del cursor y especificar si la visualización se desplaza 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
Display ON/OFF Control
Activar o desactivar poniendo en ON/OFF tanto el LCD (D) como el cursor (C) y establecer 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
Cursor or Display Shift
Mover el cursor y desplazar el LCD 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
Function Set
Establecer el tamaño de interface con el bus de datos (DL), número de líneas del LCD (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
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. La composición de estos caracteres se va guardando en una memoria llamada CG RAM con capacidad para 64 bytes. Cada carácter 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. Ejecutando este comando todos los datos que se lean o escriban posteriormente lo harán 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
Set the DD RAM Address
Los caracteres o datos a visualizar se almacenan en una memoria llamada DD RAM para luego pasar a la pantalla.
Mediante esta instrucción se establece la dirección de la memoria DD RAM a partir de la cual se almacenarán 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 80h a 8Fh corresponden a los 16 caracteres del primer renglón y las direcciones C0h a CFh a 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
Read Busy Flag and Address
El módulo LCD tarda un cierto tiempo para ejecutar las instrucciones, tiempo en que no se debe enviar otra instrucción. Para ello dispone de un flag BUSY (ocupado) que indica que se está ejecutando una instrucción.
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
Write data to CG or DD RAM
Comando para escribir en la memoria DD RAM los datos que se quieren presentar en pantalla, en código ASCII.
Igualmente se escribe en la memoria CG RAM los bytes para generar caracteres definidos por el usuario.
Previamente se direcciona la memoria DD RAM o la memoria CG RAM en la que se quiere escribir datos.
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
0
Código ASCII o byte del carácter gráfico
Read Data from CG RAM or DD RAM
Comando para leer los datos almacenados en la memoria DD RAM, en código ASCII.
Igualmente se lee de la memoria CG RAM los bytes de los caracteres definidos por el usuario.
Previamente se direcciona la memoria DD RAM o la memoria CG RAM de la que se quiere leer los datos.
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
1
Código ASCII o byte del carácter gráfico
Programa para PIC16F84A
Programa que incluye subrutinas para mostrar dos lineas de caracteres en el LCD 16x2.
Diagrama de Conexión:
Prueba:
Programa en Assembler:
;----------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa para control de LCD con controlador Hitachi 44780
;2x16 lineas
;Configuracion de pines:
;RA0: RS (Pin 4)
;RA1: R/W (Pin 5)
;RA2: E (Pin 6)
;RB0-RB7: D0-D7 (Pines 7-14)
;----------------------------------------------------------
include "p16f84a.inc"
LIST P=16f84a
__CONFIG _WDT_OFF & _XT_OSC
COUNT1 equ 0x0C
COUNT2 equ 0x0D
CURSOR equ 0x0E
org 0x00 ; Inicio de Programa
BEGIN: bsf STATUS,5; Inicio configuracion E/S
clrf PORTB ; Puerto B como salida
clrf PORTA ; Puerto A como salida
bcf STATUS,5; Fin configuracion E/S
clrf PORTA
call DELAY
START: call INI ; Inicializacion de LCD
movlw 0x01 ; b'00000001' Clear display
call REG
movlw 0x06 ; b'00000110' Incrementa cursor I/D=1
call REG ; y visualizacion modo normal S=0
movlw 0x0C ; b'00001100' Display ON D=1
call REG ; Cursor OFF C=0 y Parpadeo OFF B=0
movlw 0x80 ; Direccion inicio de almacenamiento
call REG ; de datos (Linea 1 comienza en 80h)
clrf CURSOR ; CURSOR almacena #caracter a enviar
ROW1: movf CURSOR,0
call CONV
call DAT ; Enviar a memoria de datos
incf CURSOR,1
movlw 0x09
subwf CURSOR,0; Enviar datos hasta que CURSOR=9
btfss STATUS,2
goto ROW1
movlw 0xC0 ; Direccion inicio de almacenamiento
call REG ; de datos (Linea 2 comienza en C0h)
ROW2: movf CURSOR,0
call CONV
call DAT ; Enviar a memoria de datos
incf CURSOR,1
movlw 0x15
subwf CURSOR,0; Enviar datos hasta que CURSOR=15
btfss STATUS,2
goto ROW2
ILOOP: nop ; Bucle infinito cuando se termine de
goto ILOOP ; enviar todos los datos
;Subrutinas
;BUSY: Subrutina para no enviar datos al LCD cuando
; esta ocupado
BUSY bsf PORTA,1 ; R/W=1 (Lectura de LCD)
bsf STATUS,5
movlw 0xFF
movwf PORTB ; RB7 como entrada (BF:Busy Flag)
bcf STATUS,5
bsf PORTA,2 ; E=1 (Habilitar LCD)
nop
LCD_BU: btfsc PORTB,7 ; Verificar si LCD esta ocupado
goto LCD_BU ; Bucle mientras BF=1
bcf PORTA,2 ; E=0 (Deshabilitar LCD)
bsf STATUS,5
clrf PORTB ; Puerto B como salida
bcf STATUS,5
bcf PORTA,1 ; R/W=0 (Escritura de LCD)
return
;Subrutina para enviar datos a Registro de control
REG bcf PORTA,0 ; Seleccion de reg. de control
movwf PORTB ; Preparar envio de datos
call BUSY ; Verificar si LCD esta ocupado
bsf PORTA,2 ; E=1 (Habilitar LCD)
nop ; Almacena dato en reg. control
bcf PORTA,2 ; E=0 (Deshabilitar LCD)
return
;Subrutina para enviar datos a memoria de datos
DAT bcf PORTA,0 ; Seleccion de reg. de control
movwf PORTB ; Preparar envio de datos
call BUSY ; Verificar si LCD esta ocupado
bsf PORTA,0 ; Seleccion de reg. de datos
bsf PORTA,2 ; E=1 (Habilitar LCD)
nop ; Almacena dato en memoria
bcf PORTA,2 ; E=0 (Deshabilitar LCD)
return
;Subrutina de inicializacion de LCD
INI movlw 0x38 ; b'00111000'
call REG ; DL=1, N=1, F=0
call DELAY ; linea de 8 bits, 2 lineas
return ; caracter 5x7 puntos
;Subrutina de retardo para que LCD complete operaciones
DELAY movlw 0xFF
movwf COUNT2
clrf COUNT1
LOOP: decfsz COUNT1,1
goto LOOP
decfsz COUNT2,1
goto LOOP
return
;Subrutina que devuelve en W el codigo ascii de caracter
;a enviar a LCD
CONV addwf PCL,1
retlw 'l'
retlw 'o'
retlw 'n'
retlw 'e'
retlw 'l'
retlw 'y'
retlw '1'
retlw '1'
retlw '3'
retlw 'b'
retlw 'l'
retlw 'o'
retlw 'g'
retlw 's'
retlw 'p'
retlw 'o'
retlw 't'
retlw '.'
retlw 'c'
retlw 'o'
retlw 'm'
return
end ;Fin de programa
****Programa en Pic Basic (Microcode)****
'****************************************************************'* Name : UNTITLED.BAS *'* Author : LONELY113 *'* Notice : Copyright (c) 2011 LONELY113 *'* : All Rights Reserved *'* Date : 12/05/2011 *'* Version : 1.0 *'* Notes : PIC16f84a *'* : Pines de LCD: RB7-RB4=D7-D4 (Modo de 4 bits) *'* : RA0=RS, RA1=RW, RA2=E *'****************************************************************@ __CONFIG _HS_OSC & _WDT_OFF
define OSC 10 '10 MHz'Definiciones para módulo LCDDEFINE LCD_BITS 4 'Bus de 4 bits
DEFINE LCD_LINES 2 'LCD de 2 filas
DEFINE LCD_DREG PORTB 'Puerto de datos a LCD
DEFINE LCD_DBIT 4 'Bits 4 a 7 de PORTB
DEFINE LCD_RSREG PORTA 'Puerto A seleccion de registro
DEFINE LCD_RSBIT 0 'RA0=RS de LCD
DEFINE LCD_RWREG PORTA 'Puerto A Lectura/Escritura
DEFINE LCD_RWBIT 1 'RA1=RW de LCD
DEFINE LCD_EREG PORTA 'Puerto A Habilitacionde LCD
DEFINE LCD_EBIT 2 'RA2=E de LCD
DEFINE LCD_COMMANDUS 2000 'Retardo ente comandos en us
DEFINE LCD_DATAUS 50 'Retardo entre datos en us
LCDOUT $FE, 1 'Borrar la pantalla
LCDOUT $FE, $0C 'Primera fila, cursor off
LCDOUT "lonely113"'Enviar cadena
LCDOUT $FE, $C0'Cursor a segunda fila
LCDOUT "blogspot.com"'Enviar cadena
END