LCD 16x 2 erro

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

LCD 16x 2 erro

Mensagempor Tiago Silva » 15 Set 2007 20:17

Boa noite.


tenho uma rotina de inicialização LCD (4 bits) que uso para 8051 e adaptei a mesma para o PIC porem o display não funcionou.
ja inverti RS com EN,
testei todos pinos do PIC com led fazendo um " pica pisca " e estao funcionadno blz.

O display que estou usando e o mesmo que uso no 8051 e esta blz.

conferi toda PCi e nao tem curto nem trilha em aberto ...etc
alterei o tempo de delay pra + e ora - ...etc

alguma ideia do que pode ser ???
segue programa








#DEFINE BANCO0 BCF STATUS,RP0
#DEFINE BANCO1 BSF STATUS,RP0
#DEFINE RS PORTA,3 ;
#DEFINE EN PORTA,2 ;

#DEFINE DB7 PORTB,3
#DEFINE DB6 PORTB,2
#DEFINE DB5 PORTB,1
#DEFINE DB4 PORTB,0

#DEFINE MENU PORTB,4
#DEFINE SELEC PORTB,5
#DEFINE CONF PORTB,6
#DEFINE MOTOR1 PORTB,7

#DEFINE DISP 20H


ERRORLEVEL -302
__CONFIG _XT_OSC & _CP_OFF & _WDT_OFF & _PWRTE_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF

LIST P=16F627A
RADIX DEC
INCLUDE<P16F627A.INC>

ORG 0000H
NOP
GOTO INI
ORG 0004H
RETFIE

INI:

CLRF PORTA
CLRF PORTB
CLRF STATUS
BANCO1
; 76543210
MOVLW 00100000B
MOVWF TRISA
MOVLW 01110000B
MOVWF TRISB

MOVLW 10000000B ;transfere o literal 080h para o acumulador
MOVWF OPTION_REG ;transfere o dado do acumulador(80h) para o option_reg


CLRF INTCON
CLRF PIE1
CLRF PR2
CLRF PCON
BANCO0
MOVLW 007H
MOVWF CMCON
CLRF PIR1
CLRF PORTB ; deixa portB com 00H
CLRF PORTA ; deixa portA com 00H

INI_DISP:
MOVLW 32H
CALL ENVINS
MOVLW 28H
CALL ENVINS
MOVLW 28H
CALL ENVINS
MOVLW 06H
CALL ENVINS
MOVLW 0CH
CALL ENVINS
MOVLW 01H ; limpa todo display
CALL ENVINS


LOOP:

CALL MENSA1
CALL TE
GOTO $


MENSA1:
CALL ENVMEN2
MOVLW 32H
CALL MANDA2
RETURN

TE: CALL ENVMEN1
MOVLW ' '
CALL MANDA2
MOVLW ' '
CALL MANDA2
MOVLW ' '
CALL MANDA2
MOVLW 'T'
CALL MANDA2
MOVLW 'E'
CALL MANDA2
MOVLW 'S'
CALL MANDA2
MOVLW 'T'
CALL MANDA2
MOVLW 'E'
CALL MANDA2
RETURN

ENVDADO2:

ENVDADO:
RETURN

ENVINS:
BCF RS ; INDICA QUE E INSTRUCAO PARA DISPLAY
CALL MANDA
RETURN
ENVMEN1: ; ESCREVE NA 1º LINHA DO DISPLAY
MOVLW 80H
GOTO ENVINS
ENVMEN2:
MOVLW 0C0H ; ESCREVE NA 2º LINHA DI DISPLAY
GOTO ENVINS
MANDA2:
BSF RS
MANDA:

MOVWF DISP ; MOVE DADO PARA VARIAVEL DISP
BCF DB7 ; zera via de daso do display
BCF DB6
BCF DB5
BCF DB4
; envia 4 bits mais significativos
BTFSC DISP,7
BSF DB7
BTFSC DISP,6
BSF DB6
BTFSC DISP,5
BSF DB5
BTFSC DISP,4
BSF DB4
NOP
BSF EN ; habilita display
CALL DELAY2MS ; espera 5ms e desabilita dosplay
BCF EN
CALL DELAY2MS ; espera 5ms e desabilita dosplay
BCF DB7 ; zera via de daso do display
BCF DB6
BCF DB5
BCF DB4
; envia 4 bits menos significativos
BTFSC DISP,3
BSF DB7
BTFSC DISP,2
BSF DB6
BTFSC DISP,1
BSF DB5
BTFSC DISP,0
BSF DB4
CALL DELAY2MS ; espera 5ms e desabilita dosplay
BCF EN
CALL DELAY2MS ; espera 5ms e desabilita dosplay

RETURN

DELAY2MS:

MOVLW 2
MOVWF 22H
DEL:
MOVLW 255
MOVWF 23H
DEL1:
DECFSZ 23H,1
GOTO DEL1
DECFSZ 22H,1
GOTO DEL
RETURN


END
Tiago Silva
Bit
 
Mensagens: 33
Registrado em: 03 Nov 2006 15:27

Mensagempor Tiago Silva » 15 Set 2007 21:55

acabei de coocar delay2ms apos zerar baramento de dado do display e nada de funcionar ..

Tiago
Tiago Silva
Bit
 
Mensagens: 33
Registrado em: 03 Nov 2006 15:27

Mensagempor MOR_AL » 16 Set 2007 19:45

Olá Tiago Silva.

Eu fiz umas rotinas para o mostrador LCD em assembler e estão funcionando perfeitamente.

Um detalhe. Quando você for alterar o estado de algum pino de uma porta qualquer (porta X), e logo a seguir alterar outro pino da mesma porta, TEM QUE INCLUIR UM DELAY. Porque antes de escrever em um pino, o PIC lê a porta. Se o valor do pino que você alterou ainda não mudou de estado, devido às capacitâncias dos componentes externos conectados ao pino, vai acontecer que ele não será alterado.
Criei uma rotina de 50 microsegundos (T50us) e chamo ela toda vez que isso ocorre. É simples, porque ela só aparecerá em algumas rotinas do LCD e não fora delas.
Tente fazer isso e dê um retorno.

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

Mensagempor ze » 17 Set 2007 07:41

abaixo, parte de um código que uso para escrever em lcd 16x2 4bits. se entendes um mínimo de c, fica fácil adaptar para asm.

#define LCD_RS RC1
#define LCD_EN RC0
#define LCD_STROBE LCD_EN=1;asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");LCD_EN=0

void lcd_write(unsigned char c)
{
PORTC = (PORTC & 0x0f) | (c & 0xf0);
LCD_STROBE;
c <<= 4;
PORTC = (PORTC & 0x0f) | (c & 0xf0);
LCD_STROBE;
delay(500);
}


void lcd_init(void)
{
LCD_EN=0;
LCD_RS=0; // write control bytes
delay(30); // power on delay
PORTC = 0b00110000; // attention!
LCD_STROBE;
delay(2000); // power on delay
LCD_STROBE;
delay(10000); // power on delay
LCD_STROBE;
delay(2000); // power on delay
PORTC = 0b00100000; // set 4 bit mode
LCD_STROBE;
delay(2000); // power on delay
lcd_write(0x28); // 4 bit mode, 1/16 duty, 5x8 font
lcd_write(0x0e); // display off
lcd_write(0x06); // entry mode
lcd_write(0x0c); // entry mode
lcd_write(1); // limpa display
}

abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: LCD 16x 2 erro

Mensagempor SoMeWhErE » 17 Set 2007 11:18

Tiago Silva escreveu:MANDA2:
BSF RS
MANDA:
MOVWF DISP ; MOVE DADO PARA VARIAVEL DISP
BCF DB7 ; zera via de daso do display
BCF DB6
BCF DB5
BCF DB4
; envia 4 bits mais significativos
BTFSC DISP,7
BSF DB7
BTFSC DISP,6
BSF DB6
BTFSC DISP,5
BSF DB5
BTFSC DISP,4
BSF DB4
NOP
BSF EN ; habilita display
CALL DELAY2MS ; espera 5ms e desabilita dosplay
BCF EN
CALL DELAY2MS ; espera 5ms e desabilita dosplay
BCF DB7 ; zera via de daso do display
BCF DB6
BCF DB5
BCF DB4
; envia 4 bits menos significativos
BTFSC DISP,3
BSF DB7
BTFSC DISP,2
BSF DB6
BTFSC DISP,1
BSF DB5
BTFSC DISP,0
BSF DB4
---> BSF EN <-----
CALL DELAY2MS ; espera 5ms e desabilita dosplay
BCF EN
CALL DELAY2MS ; espera 5ms e desabilita dosplay

RETURN


olá sou iniciante, e fiz um serviço com lcds há um tempinho, estava dando uma olhada no seu programa e pelo que notei, quando vc esta enviando os 4 bits menos significativos vc não setou o pino ENABLE.

Se estiver errado alguem me corrija.
Avatar do usuário
SoMeWhErE
Byte
 
Mensagens: 119
Registrado em: 20 Jun 2007 18:09
Localização: Charqueada

Mensagempor fabim » 17 Set 2007 11:25

dado X
set enable
Movfw 'X'
movwf portaX

swapf w,W
movwf portaX
deset enable.

mais facil, do que ficar testando floags

fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Tiago Silva » 18 Set 2007 08:02

Bom dia pessoal;

Obrigado pelas dicas;

vou testar hoje a noite o display alterando o programa de acordo com as dicas e prosto o resultado.

despois que eu zero o barramento de dado do display eu estou colocando um tempo de +- 2ms e mesmo assim não estvava funcionado, neste programa prostado não está na rotina-delay mas depois fiz teste colocando delay entre um pino e outro, depois que zero barramneto ...etc

Mas acho que o erro maior e de não ter habilitado o display quando mando os 4 bits menos significativos.


vou testar rotina usando swapf w,W.


Obrigado pessol;


Tiago
Tiago Silva
Bit
 
Mensagens: 33
Registrado em: 03 Nov 2006 15:27


Voltar para PIC

Quem está online

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

cron

x