Escrever no LCD checando o busy flag

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Escrever no LCD checando o busy flag

Mensagempor Renato_mcl » 29 Abr 2007 14:46

Olá pessoal,

Este já é o segundo programa que estou tentando escrever no LCD 2 x 16
e não escreve.
O exemplo eu peguei no site abaixo:

http://igortg.cjb.net/

O programa foi escrito para o PIC 16F84 e eu estou usando o 16F84A na simulação com o Proteus.

Segue abaixo o código fonte e agradeço se puderem avaliar.

;***************************************************************************
;
; PROGRAMA PARA ESCRITA EM LCD
;
; DATA: 22/03/2001
;
; DESENVOLVIDO POR ÍGOR TSCHOEPKE GOEDEL - ESTAS ROTINAS PODEM SER
; USADAS LIVREMENTE, DESDE QUE SEMPRE SEJA CITADO O AUTOR.
;
; PROCESSADOR: PIC16F84
;
; COMUNICAÇÃO EM 4 BITS, SEM O USO DE DELAYS VIA SOFTWARE (PORTANTO,
; O CLOCK PODE SER ALTERADO SEM PROBLEMAS), POIS TODAS ROTINAS DE
; ENVIO DE DADOS, ENDEREÇOS OU COMANDOS SÓ RETORNAM QUANDO O BUSY FLAG
; DO LCD INDICAR QUE ESTE ESTÁ LIVRE.
;
; ESQUEMAS DE LIGAÇÃO:
;
; RB0: ESTE PINO É CONFIGURADO COMO ENTRADA (PODENDO TRABALHAR
; NORMALMENTE COM INTERRUPÇÕES), MAS PODE SER USADO COMO SAÍDA
; DESDE QUE SEJAM FEITAS AS DEVIDAS ALTERAÇÕES NO CÓDIGO
; RB1: SAÍDA, LIGADO AO PINO Nº 4 (RS) DO LCD
; RB2: SAÍDA, LIGADO AO PINO Nº 5 (RW) DO LCD
; RB3: SAÍDA, LIGADO AO PINO Nº 6 (E) DO LCD
; RB4: BIDIRECIONAL, LIGADO AO PINO Nº 11 (D4) DO LCD
; RB5: BIDIRECIONAL, LIGADO AO PINO Nº 12 (D5) DO LCD
; RB6: BIDIRECIONAL, LIGADO AO PINO Nº 13 (D6) DO LCD
; RB7: BIDIRECIONAL, LIGADO AO PINO Nº 14 (D7) DO LCD
;
;***************************************************************************



LIST P=16F84A ;INFORMA O PIC UTILIZADO

INCLUDE <P16F84A.INC>

__CONFIG _XT_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON


;DESLIGA A MENSAGEM DE AVISO Nº 302:
;"Register in operand not in bank 0. Ensure that bank bits are correct"

ERRORLEVEL -302

RS EQU 0X01 ;REGISTER SELECT 1 = DADO, 0 = INSTRUÇÃO
RW EQU 0X02 ;READ/WRITE 1 = LEITURA 0 = ESCRITA
E EQU 0X03 ;ENABLE
BF EQU 0X07 ;BUSY FLAG 1 = OCUPADO 0 = LIVRE

CBLOCK 0Ch
AUX1 ;AUX1 E AUX2 SÃO VARIÁVEIS AUXILIARES USADAS NAS
AUX2 ;SEGUINTES ROTINAS: 'EL' (ENVIA LINHA) E 'DELAY'
DADO ;VARIÁVEL QUE ARMAZENA O BYTE A SER TRANSMITIDO
ENDC

ORG 00H ;VETOR DE RESET
INICIO
BSF STATUS,RP0 ;VAI PARA O BANCO 1
MOVLW 0X00
MOVWF TRISA ;CONFIGURA O PORTA TODO COMO SAÍDA
MOVLW 0X01 ;CONFIGURA O PORTB: 0 = ENTRADA
MOVWF TRISB ;1, 2, 3, 4, 5, 6 E 7 COMO SAÍDAS
BCF STATUS,RP0 ;VOLTA PARA O BANCO 0

MOVLW 0X28 ;INÍCIO DA CONFIGURAÇÃO DO LCD
CALL EC ;CONFIGURA PARA:
MOVLW 0X28 ;DUAS LINHAS
CALL EC ;5 X 7 PONTOS
MOVLW 0X06 ;16 X 2 CARACTERES
CALL EC ;4 BITS
MOVLW 0X0C
CALL EC
MOVLW 0X01
CALL EC ;FIM DA CONFIGURAÇÃO DO LCD

MOVLW 0X40 ;COLOCA 'Í' NA CGRAM
CALL EC
MOVLW 0X02
CALL ED
MOVLW 0X04
CALL ED
MOVLW 0X1F
CALL ED
MOVLW 0X04
CALL ED
MOVLW 0X04
CALL ED
MOVLW 0X04
CALL ED
MOVLW 0X1F
CALL ED
MOVLW 0X00
CALL ED
ESCREVE
MOVLW 0X80 ;ENDEREÇA A DDRAM DO LCD PARA O
CALL EE ;1º CARACTER DA 1ª LINHA
MOVLW ' ' ;ENVIA UMA LINHA INTEIRA ATRAVÉS DA
CALL ED ;ROTINA 'ED' QUE ENVIA SÓ UM CARACTER
MOVLW ' '
CALL ED
MOVLW 'T'
CALL ED
MOVLW 'e'
CALL ED
MOVLW 's'
CALL ED
MOVLW 't'
CALL ED
MOVLW 'e'
CALL ED
MOVLW ' '
CALL ED
MOVLW 'd'
CALL ED
MOVLW 'e'
CALL ED
MOVLW ' '
CALL ED
MOVLW 'L'
CALL ED
MOVLW 'C'
CALL ED
MOVLW 'D'
CALL ED
MOVLW ' '
CALL ED
MOVLW ' '
CALL ED
MOVLW 0XC0 ;ENDEREÇA A DDRAM DO LCD PARA O
CALL EE ;1º CARACTER DA 2ª LINHA
MOVLW LINHA1 ;PÕE EM 'W' A POSIÇÃO DA TABELA 'LINHA1'
;QUE DEVE ESTAR NA 1ª PÁGINA DE MEMÓRIA
;E CONTÉM 16 CARACTERES (UMA LINHA)
CALL EL ;ESCREVE UMA LINHA INTEIRA ATRAVÉS DA
;ROTINA 'EL', QUE ENVIA TODA UMA LINHA

CALL DELAY ;DELAY DE 1,75 SEGUNDOS

MOVLW 0X80 ;ENDEREÇA A DDRAM
CALL EE
MOVLW LINHA2
CALL EL
MOVLW 0XC0
CALL EE
MOVLW LINHA3
CALL EL

CALL DELAY

GOTO ESCREVE

;******************************
;*** ROTINAS DO LCD ***
;******************************

ED ;ESCREVE DADO QUE ESTÁ EM 'W' NA DDRAM DO LCD
BSF PORTB,RS
BCF PORTB,RW
ENVIABYTE ;ROTINA PARA O ENVIO DE UM BYTE QUALQUER
BSF PORTB,E
MOVWF DADO
MOVLW 0X0F
ANDWF PORTB,F
MOVLW 0XF0
ANDWF DADO,W
IORWF PORTB,F
BCF PORTB,E
BSF PORTB,E
SWAPF DADO,F
MOVLW 0X0F
ANDWF PORTB,F
MOVLW 0XF0
ANDWF DADO,W
IORWF PORTB,F
BCF PORTB,E
CALL CHECABF
RETURN

EC ;ENVIA O COMANDO QUE ESTÁ EM 'W' PARA O LCD
BCF PORTB,RS
BCF PORTB,RW
CALL ENVIABYTE
RETURN

EE ;ESCREVE O ENDEREÇO QUE ESTÁ EM 'W' NO LCD
BCF PORTB,RS
BCF PORTB,RW
CALL ENVIABYTE
RETURN

CHECABF ;ROTINA QUE SÓ RETORNA QUANDO BF = 0
BSF STATUS,RP0 ;VAI PARA O BANCO 1
MOVLW 0XF1
MOVWF TRISB ;CONFIGURA O TRISB
BCF STATUS,RP0 ;VOLTA PARA O BANCO 0
BCF PORTB,RS
BSF PORTB,RW
BSF PORTB,E
BTFSS PORTB,BF ;TESTA BUSY FLAG
GOTO RETORNO ;SE BF = 0 VAI PARA A ROTINA DE RETORNO
BCF PORTB,E
BSF PORTB,E
BCF PORTB,E
GOTO $ - 6 ;LOOP PARA NOVO TESTE DO BUSY FLAG
RETORNO ;ROTINA PARA RETORNAR DE CHECABF
BCF PORTB,E
BSF PORTB,E
BCF PORTB,E
BSF STATUS,RP0 ;VAI PARA O BANCO 1
MOVLW 0X01
MOVWF TRISB ;CONFIGURA O TRISB
BCF STATUS,RP0 ;VOLTA PARA O BANCO 0
RETURN

EL ;ROTINA QUE ENVIA UMA LINHA INTEIRA PARA O LCD
;(SÓ FUNCIONA ADEQUADAMENTE PARA LCD's 16 X 2)
MOVWF AUX2 ;ESTA OTINA PODE SER EXCLUÍDA SEM ALTERAR AS
CLRF AUX1 ;OUTRAS ROTINAS DO LCD
DECF AUX1,F
EL1
INCF AUX1,F
BTFSC AUX1,4
RETURN
MOVF AUX2,W
ADDWF AUX1,W
CALL MSGS
CALL ED
GOTO EL1

MSGS MOVWF PCL ;'CABEÇALHO' DAS TABELAS DE CARACTERES

LINHA1 RETLW 'd' ;PRIMEIRA TABELA DE CARACTERES
RETLW 'e' ;PODEM SER FEITAS NOVAS TABELAS E
RETLW 's' ;ESTAS PODEM TER O SEU 'LABEL'
RETLW 'e' ;COM O NOME QUE SE QUISER
RETLW 'n'
RETLW 'v'
RETLW 'o'
RETLW 'l'
RETLW 'v'
RETLW 'i'
RETLW 'd'
RETLW 'o'
RETLW ' '
RETLW 'p'
RETLW 'o'
RETLW 'r'

;******************************
;*** FIM DAS ROTINAS DO LCD ***
;******************************

;ESTAS TABELAS SÃO SOMENTE EXEMPLOS, PODENDO SER
;EXCLUÍDAS SEM AFETARAS ROTINAS DE COMUNICAÇÃO

LINHA2 RETLW ' '
RETLW 0X00 ;CÓDIGO DO 'Í' PREVIAMENTE GRAVADO NA CGRAM
RETLW 'g'
RETLW 'o'
RETLW 'r'
RETLW ' '
RETLW 'T'
RETLW 's'
RETLW 'c'
RETLW 'h'
RETLW 'o'
RETLW 'e'
RETLW 'p'
RETLW 'k'
RETLW 'e'
RETLW ' '

LINHA3 RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '
RETLW 'G'
RETLW 'o'
RETLW 'e'
RETLW 'd'
RETLW 'e'
RETLW 'l'
RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '

DELAY ;DELAY DE APROXIMADAMENTE 1,75 SEGUNDOS
CLRF DADO ;ESTA ROTINA É USADA PARA PERDER TEMPO
DELAY1 ;ENTRE O ENVIO DAS TELAS, PODENDO SER
INCF DADO,F ;EXCLUÍDA SEM PREJUDICAR AS ROTINAS DE
BTFSC DADO,3 ;COMUNICAÇÃO COM O MÓDULO LCD
RETURN
MOVLW 0XFA
MOVWF AUX1
REPETE1
MOVLW 0XF9
MOVWF AUX2
REPETE2
NOP
DECFSZ AUX2,F
GOTO REPETE2
DECFSZ AUX1,F
GOTO REPETE1
GOTO DELAY1

END ;FIM DO PROGRAMA



Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor Renato_mcl » 29 Abr 2007 15:03

Espero que não tenha ficado complicado para ler o código fonte, ficou meio embolado.
Como eu disse acima, este já é o segundo programa que verifica o bit 7 e que não escreve no display 2 x 16.
Não sei se teria que incluir alguma alteração porque foi escrito para o 16F84??
O exemplo do curso Bauru que usa delays via software funciona sem problema.


Obrigado


Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor wil » 30 Abr 2007 13:46

Já faz tempo que eu testei esta rotina, mas também foi no PIC16F628, e funcionou. Nem me pergunte se alterei algo na época por causa do MCU, mas que eu me lembre não...

O LCD usava o chip da Hitachi. HDxxx.

Wil
wil
Nibble
 
Mensagens: 55
Registrado em: 14 Out 2006 18:31

Mensagempor MOR_AL » 30 Abr 2007 19:45

Caro Renato_mcl.

Talvez o que esteja acontecendo seja causado pela influência das capacitâncias expúrias presentes nas fiações que vão do PIC ao Display LCD.
Se este programa já funcionou antes, o problema pode estar na montagem.

Nas minhas rotinas que escrevem em um bit de uma porta, e em seguida escreve em outro bit da mesma porta, interponho um pequeno atraso para que a escrita anterior tenha tempo de atingir o nível lógico desejado.
Atualmente coloco cerca de 50us. Este atraso é suficiente para quase todas as montagens em Protoboard. Você pode tentar colocar algo em torno de 5 ou 10us.
Este atraso eu efetivo via "call T50us" (em asm). Se fosse via "inline", poderia aumentar desnecessariamente o meu arquivo.HEX.

MOR_AL
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor Renato_mcl » 30 Abr 2007 21:18

Olá Mor_AL,

São dois casos diferentes, o primeiro não funcionou na placa de circuito impresso e nem na protoboard.

O primeiro e o segundo programa não funcionaram no simulador Proteus 6.9 SP4.
A verdade é a seguinte, eu não entendo do asunto e tenho procurado algum tutorial na web que me esclareça step by step como montar um programa para rodar com LCD testando o busy flag, mas até agora não encontrei.
Ou melhor, encontrei em C, mas esta linguagem eu não conheço.
Quando encontro algo em assembly, tem somente a rotina para escrever no LCD, não tem a configuração do PIC e aí fico perdido.

Obrigado


Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor zielpunkt » 01 Mai 2007 20:03

Renato,

O site do Renie tem um bom tutorial sobre LCD (http://www.reniemarquet.cjb.net), mas não trás muitos exemplos de código. Nesse outro site tem um tutorial um pouco mais dirigido ao PIC, esplicando (em ingles) cada etapa do programa, em ASM (http://home.iae.nl/users/pouweha/lcd/lcd2.shtml). Agora, para dominar o assunto, seria interessante que vc reescrevesse o código com a sua técnica, passo a passo, compreendendo cada um deles. Tenta por ai, ok.


É isso.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor wil » 01 Mai 2007 20:14

Renato_mcl escreveu:
A verdade é a seguinte, eu não entendo do asunto e tenho procurado algum tutorial na web que me esclareça step by step como montar um programa para rodar com LCD testando o busy flag, mas até agora não encontrei.

Ou melhor, encontrei em C, mas esta linguagem eu não conheço.
Quando encontro algo em assembly, tem somente a rotina para escrever no LCD, não tem a configuração do PIC e aí fico perdido.

Obrigado

Renato


A única fonte confiável que você vai encontrar de como funciona isso, é na DS do LCD. Normalmente baseados no c.i. da Hitachi, o HDxxxx. (não lembro o código no momento)...

Na rotina que você passou já tá a configuração do PIC, pelo menos o essencial, que são os PortX. É só tomar cuidado de ver como estão sendo utlizados.

Em relação a configuração geral, você pode deixar a sua escolha. Não influi na rotina.

A única coisa que é feito para verificar o Busy Flag (BF na rotina), é fazer o strobe no Enable, alterar a porta de saída para entrada e ler se o bit tá em Zero ou Um.

Até!
wil
Nibble
 
Mensagens: 55
Registrado em: 14 Out 2006 18:31

Mensagempor Renato_mcl » 01 Mai 2007 23:04

Obrigado Zielpunkt e Will,

Já estava lendo o tutorial do Renie, o outro site parece interessante.
Baixei também o data sheet do HD44780, falta ler.

Interessante que no Pic Simulator IDE o programa funciona apesar da mensagem de erro qto a tempo de delays.
No Proteus não funciona.


Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor Renato_mcl » 10 Mai 2007 10:16

Bom dia a todos,

Procurei muito na internet e não encontrei programa similar a este que postei no inicio do tópico.
O que pude checar simulando no Proteus step by step foi:
Após enviar a instrução 0x00 (é a última instrução do "COLOCA Í NA CGRAM"), vai para o envia byte depois para o checabf e aí o bit7 não fica livre nem a pau.
Fiz várias alterações na inicialização do LCD, inseri delays e nada resolveu.
Por favor, alguma sugestão?


Obrigado


Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor andre_luis » 10 Mai 2007 11:18

Experimenta colocar uns delays entre as instrucoes :

BCF PORTB,E
BSF PORTB,E

tipo :

BCF PORTB,E
NOP
NOP
BSF PORTB,E

Ou diminui a frequencia do cristal
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Renie » 10 Mai 2007 11:38

Olá Renato,

Experimente a rotina abaixo:


CHECABF ;ROTINA QUE SÓ RETORNA QUANDO BF = 0
BSF STATUS,RP0 ;VAI PARA O BANCO 1
MOVLW 0XF1
MOVWF TRISB ;CONFIGURA O TRISB
BCF STATUS,RP0 ;VOLTA PARA O BANCO 0
BCF PORTB,RS
BSF PORTB,RW
BSF PORTB,E
NOP
NOP
BCF PORTB,E
NOP
BSF PORTB,E
NOP
NOP
BTFSC PORTB,BF ;TESTA BUSY FLAG
GOTO $ -1
BCF PORTB,E
BSF STATUS,RP0 ;VAI PARA O BANCO 1
MOVLW 0X01
MOVWF TRISB ;CONFIGURA O TRISB
BCF STATUS,RP0 ;VOLTA PARA O BANCO 0
RETURN
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor Renato_mcl » 10 Mai 2007 22:17

Infelizmente não funcionou com os NOPs ou a rotina, acho que este código fonte tem tica de galinha.

Este exemplo do link abaixo funciona:

http://patna.sancharnet.in/guria741/pic2lcd/pic2lcd.htm



Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor Adauto sampaio » 11 Mai 2007 08:15

Bom dia a todos. Renato, vá no link abaixo e baixe o arquivo da revista eletronica total da edição 101. Lá tem três exemplos, use o pic_disp_f628. Essa rotina funcionou comigo legal, uso até hj.
Abraços!!!

http://www.eletronicatotal.com.br/downloads.htm
É tudo uma questão de sorte; pergunte a qualquer perdedor
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor Renato_mcl » 11 Mai 2007 20:35

Obrigado Adauto,

Esta vai para o arquivo, assim que possível vou testar.
Vou continuar tentando resolver o código fonte que postei, já li vários artigos sobre o assunto e ainda não consegui encontrar o problema.


Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor Renato_mcl » 12 Mai 2007 13:13

Bom dia a todos,

Depois de tanta luta já consegui algo utilizando a rotina de inicialização do link abaixo:

http://patna.sancharnet.in/guria741/pic2lcd/pic2lcd.htm

No LCD escreve "Teste de LCD" na primeira linha.
Na segunda linha escreve "de" e para por ai, deve ser mais galho no fonte.
Esta rotina de inicialização não utiliza o ENVIABYTE, acho que o problema deve estar nesta rotina que envia o byte em dois nibles que está dando pau e não inicializa corretamente o LCD.

Uma pergunta: quando se coloca um caracter definido pelo usuário na CGRAM o cursor vai mudando para a direita e não aparece nada no LCD?
Isto está acontencendo, o cursor muda umas quatro posições.
Este caracter será chamado qdo escrever o nome do autor no LCD, é a letra "Í" com acento.


Obrigado


Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x