Sei sulla pagina 1di 10

UNIVERSIDADE FEDERAL DO ABC

Relatrio Intermedirio do Projeto


Alarme Ultrassom Contra Enchentes
Lgica Programvel

Prof. Dr. Rodrigo Reina Muoz

Fbio Augusto Barcelos Teixeira

RA11079312

Paulo Csar Menegon de Castro

RA11004911

Pedro Pennachi

RA 21038414
00112233

Santo Andr
2016

1. Introduo
O objetivo do projeto medir continuamente o nvel de gua de determinado
local (rios, lagos, ruas etc), emitir alarmes (sonoros, visuais) e exibir mensagens no
LCD quando o nvel do lquido estiver acima ou abaixo de nveis pr-determinados.
Para isso ser utilizado, dentre outros componentes, o sensor ultrassnico HCSR04, amplamente disponvel no mercado e de baixo custo (Foto 1), que apresenta
as seguintes caractersticas:

Alimentao: 5V DC

Corrente de Operao: 2mA

ngulo de efeito: 15

Alcance: 2cm ~ 4m

Preciso: 3mm

Foto 1 Sensor ultrassnico HC-SR04

Seu funcionamento consiste basicamente em enviar um sinal que, ao atingir


um objeto, volta para o sensor e com base nesse tempo entre o envio e recebimento,
calculada a distncia entre o sensor e o objeto.
O processo de medio ocorre em 3 etapas:

enviado um sinal com durao de 10 us ao pino trigger, indicando que a


medio ter incio;

Automaticamente, o mdulo envia 8 pulsos de 40 KHz e aguarda o retorno do


sinal pelo receptor;

Caso haja um retorno de sinal (em nvel HIGH), determinamos a distncia entre
o sensor e o obstculo utilizando a seguinte equao: Distancia = (pulso em
nvel alto x velocidade do som (340m/s) / 2 (conta-se o tempo de ida e de volta
do sinal).

Outro componente importante a ser utilizado o display LCD presente na placa


DE2-115, cujo uso demanda uma sequncia de inicializao, conforme Figura 1.

Figura 1 Sequncia de Inicializao do LCD

Aps a finalizao dessa sequncia, os caracteres podem ser escritos no


display LCD.

2. Objetivo
Nesse momento do projeto o objetivo escrever o cdigo VHDL para escrever
no display LCD da placa Altera DE2-115, o nome do projeto a ser elaborado, utilizando
as duas linhas disponveis no display (2 linhas x 16 caracteres por linha). Os
caracteres esto armazenados do ROM do display e cada um corresponde a
determinado cdigo hexadecimal conforme a Figura 2.

Figura 2 Tabela de caracteres armazenados no LCD

3. Resultados
O seguinte cdigo VHDL foi implementado:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_1164.all;
ENTITY display_lcd IS
PORT ( rst:
lcd_rw:
lcd_e:
lcd_rs:
lcd_on:
lcd_data:
clk_50_MHz:
END display_lcd;

IN STD_LOGIC;
OUT STD_LOGIC; --LCD Read/Write, 0=Write, 1=Read
OUT STD_LOGIC; --LCD Enable
OUT STD_LOGIC; --LCD Command/Data Select, 0=Command, 1=Data
OUT STD_LOGIC; --LCD Power On/Off
INOUT STD_LOGIC_VECTOR (7 DOWNTO 0); --LCD data
IN STD_LOGIC);

ARCHITECTURE behave OF display_lcd IS


TYPE char_string IS ARRAY (0 TO 31) OF STD_LOGIC_VECTOR (7 DOWNTO 0);
TYPE st IS (rst_1, rst_2, rst_3, lcd_func, lcd_doff, lcd_clear,
lcd_don, lcd_mode, lcd_string, lcd_line_2, lcd_home, lcd_drop, lcd_hold);
SIGNAL state, next_command: st;
SIGNAL lcd_display_string: char_string;
SIGNAL lcd_data_value, next_char: STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL char_count: STD_LOGIC_VECTOR (4 DOWNTO 0);
SIGNAL clk_count_400_Hz: STD_LOGIC_VECTOR (19 DOWNTO 0);
SIGNAL clk_400_Hz_en, lcd_rw_int: STD_LOGIC;
BEGIN
lcd_on <= '1'; --Liga alimentao do LCD
--Nome do Projeto: Alarme Ultrassom Contra Enchentes
--41 6c 61 72 6d 65 20
--55 6c 74 72 61 73 73 6f 6d
--43 6f 6e 74 72 61 20
--45 6e 63 68 65 6e 74 65 73
lcd_display_string <= (
--LCD Linha 1
X"41", X"6C", X"61", X"72", X"6D", X"65", X"20", X"55",
X"6C", X"74", X"72", X"61", X"73", X"73", X"6F", X"6D",
--LCD Linha 2
X"43", X"6F", X"6E", X"74", X"72", X"61", X"20", X"45",
X"6E", X"63", X"68", X"65", X"6E", X"74", X"65", X"73");
next_char <= lcd_display_string (CONV_INTEGER(char_count));
lcd_rw <= lcd_rw_int;
clk_400_Hz: PROCESS (clk_50_Mhz,rst) --Gera um clock de '400 Hz'
BEGIN
IF (rst = '0') THEN
clk_count_400_Hz <= X"00000";
clk_400_Hz_en <= '0';
ELSIF (clk_50_MHz = '1' and clk_50_MHz'EVENT) THEN
IF (clk_count_400_Hz <= X"0F424") THEN
clk_count_400_Hz <= clk_count_400_Hz + 1;
clk_400_Hz_en <= '0';
ELSE

clk_count_400_Hz <= X"00000";


clk_400_Hz_en <= '1';
END IF;
END IF;
END PROCESS clk_400_Hz;
lcd: PROCESS (clk_50_MHz, rst)
BEGIN
IF (rst = '0') THEN
state <= rst_1;
next_command <= rst_2;
lcd_data <= X"38";
lcd_e <= '1';
lcd_rs <= '0';
lcd_rw_int <= '0';
ELSIF (clk_50_MHz = '1' AND clk_50_MHz'EVENT) THEN
IF clk_400_Hz_en = '1' THEN
CASE state IS
--Incio da sequncia de inicializao
WHEN rst_1 => --3 passos com a mesma sequencia de dados -> 0011XXXX
lcd_e <= '1';
lcd_rs <= '0';
lcd_rw_int <= '0';
lcd_data <= X"38";
state <= lcd_drop;
next_command <= rst_2;
WHEN rst_2 =>
lcd_e <= '1';
lcd_rs <= '0';
lcd_rw_int <= '0';
lcd_data <= X"38";
state <= lcd_drop;
next_command <= rst_3;
WHEN rst_3 =>
lcd_e <= '1';
lcd_rs <= '0';
lcd_rw_int <= '0';
lcd_data <= X"38";
state <= lcd_drop;
next_command <= lcd_func;
WHEN lcd_func => --Modo 8 bits de dados, 2 linhas e caracter 5x8 pontos
lcd_e <= '1';
lcd_rs <= '0';
lcd_rw_int <= '0';
lcd_data <= X"38";
state <= lcd_drop;
next_command <= lcd_doff;
WHEN lcd_doff => --Desliga o display
lcd_e <= '1';
lcd_rs <= '0';
lcd_rw_int <= '0';
lcd_data <= X"08";
state <= lcd_drop;
next_command <= lcd_clear;
WHEN lcd_clear => --Limpa o display
lcd_e <= '1';

lcd_rs <= '0';


lcd_rw_int <= '0';
lcd_data <= X"01";
state <= lcd_drop;
next_command <= lcd_mode;
WHEN lcd_mode => --Incrementa o endereo em 1 e desloca cursor para d
direita
lcd_e <= '1';
lcd_rs <= '0';
lcd_rw_int <= '0';
lcd_data <= X"06";
state <= lcd_drop;
next_command <= lcd_don;
--Fim da sequncia de inicializao
WHEN lcd_don => --Liga display e cursor (modo piscante)
lcd_e <= '1';
lcd_rs <= '0';
lcd_rw_int <= '0';
lcd_data <= X"0F";
state <= lcd_drop;
next_command <= lcd_string;
WHEN lcd_string => --Escreve um caracter ASCII na primeira posio do lcd
e desloca para a direita
state <= lcd_drop;
lcd_e <= '1';
lcd_rs <= '1';
lcd_rw_int <= '0';
IF next_char (7 DOWNTO 4) /= X"0" THEN --Converte caracter ASCII para
escrita no display
lcd_data <= next_char;
ELSIF next_char (3 DOWNTO 0) > 9 THEN
lcd_data_value <= X"4" & (next_char (3 DOWNTO 0) - 9);
ELSE
lcd_data_value <= X"3" & next_char (3 DOWNTO 0);
END IF;
IF (char_count < 31) AND (next_char /= X"FE") THEN
char_count <= char_count + 1;
ELSE
char_count <= "00000";
END IF;
IF char_count = 15 THEN --Pula para a linha 2
next_command <= lcd_line_2;
ELSIF (char_count = 31) OR (next_char = X"FE") THEN
next_command <= lcd_home;
ELSE
next_command <= lcd_string;
END IF;
WHEN lcd_line_2 => --Escreve na segunda linha do display
lcd_e <= '1';
lcd_rs <= '0';
lcd_rw_int <= '0';
lcd_data <= X"C0";
state <= lcd_drop;
next_command <= lcd_string;
WHEN lcd_home => --Retorna o cursor para a primeira posio da linha 1
lcd_e <= '1';

lcd_rs <= '0';


lcd_rw_int <= '0';
lcd_data <= X"80";
state <= lcd_drop;
next_command <= lcd_string;
WHEN lcd_drop => --Reseta enable para permitir ciclo de escrita/leitura
(0101...)
lcd_e <= '0';
state <= lcd_hold;
WHEN lcd_hold => --Aguarda prxima instruo
state <= next_command;
END CASE;
END IF;
END IF;
END PROCESS lcd;
END behave;

3.1. Implementao na placa Altera DE2-115


Nome do
Sinal

Nome
PORT

rst

Rst

clk_50_MHz

Tipo de
Sinal

Nmero do
Pino FPGA

KEY[0]

PIN_G26

clk_50_MHz IN STD_LOGIC

CLOCK_50

PIN_N2

lcd_rw

lcd_rw

OUT STD_LOGIC

LCD_RW

PIN_K4

lcd_e

lcd_e

OUT STD_LOGIC

LCD_E

PIN_K3

lcd_rs

lcd_rs

OUT STD_LOGIC

LCD_RS

PIN_K1

lcd_on

lcd_on

OUT STD_LOGIC

LCD_ON

PIN_L4

lcd_data[0]
lcd_data[1]

LCD_DATA[0]

PIN_J1

LCD_DATA[1]

PIN_J2

lcd_data[2]

LCD_DATA[2]

PIN_H1

LCD_DATA[3]
INOUT
STD_LOGIC_VECTOR LCD_DATA[4]

PIN_H2

lcd_data[5]

LCD_DATA[5]

PIN_J3

lcd_data[6]

LCD_DATA[6]

PIN_H4

lcd_data[7]

LCD_DATA[7]

PIN_H3

lcd_data[3]
lcd_data[4]

lcd_data

IN STD_LOGIC

Nome do
Sinal FPGA

Tabela 1 Pinos e Sinais Utilizados na Implementao

PIN_J4

Foto 2 Nome do Projeto no LCD da Placa DE2 115

4. Concluso
Com os conceitos aprendidos em aula (circuitos sncronos, circuitos
sequenciais, mquina de estados), associados a um estudo detalhado do datasheet
do controlador do display (HD44780U) e dos slides da lecture 7 - DE2 LCD Display
Controller (ver bibliografia) foi possvel implementar em VHDL os comandos
necessrios para se exibir no display LCD o nome completo do projeto. Grande parte
dessa implementao ser utilizada no projeto final, onde se pretende utilizar o LCD
para exibio de mensagens.

Referncias Bibliogrficas
DAMORE, Roberto; "Descrio e Sntese de Circuitos Digitais", LTC-Livros
Tcnicos e Cientficos Editora S.A., 2005.
PERRY, Douglas L.; VHDL, Programming by Example, Fourth Edition, McGraw-Hill,
2002.
SALSIC, Zoran; SMAILAGIC, A.; "Digital systems design and prototyping using field
programmable logic and hardware description languages", Kluwer Academic
Publishers, 2000.
TOCCI, Ronald J.; WIDMER, Neal S.; MOSS, Gregory L.; Sistemas digitais princpios e aplicaes; 11 Edio, Pearson, 2015
MUOZ, R. R. Quarta Aula Prtica. In: Lgica Programavel. CECS - Universidade Federal
do ABC, 2016.
Datasheet HD44780U (LCD-II), (Dot Matrix Liquid Crystal Display Controller/Driver), ADE207-272(Z), '99.9, Rev. 0.0

http://jjackson.eng.ua.edu/courses/ece480/lectures/ (lecture 7 - DE2 LCD Display


Controller).

Potrebbero piacerti anche