Autor Tema: Lo siento, pero no me aclaro con LCD,  (Leído 1887 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado culebrasx

  • PIC10
  • *
  • Mensajes: 39
Lo siento, pero no me aclaro con LCD,
« en: 22 de Abril de 2009, 15:22:23 »
Lo siento, ya se que hay documentacion para parar un tren, pero no me aclaro, asi que me decido a iniciar un nuevo hilo:
Me he comprado unos display LCD de 8x2 con backlight muy bonitos, en el datasheet dice que lleva un:
Controller : SPLC780D1-001A or equivalent ; he mirado por ahi parece ser que si no es igual que el HD44780 poco le falta, los codigos,etc...todo
Intento generar aunque sea un solo caracter, al principio se encienden en cuadrado todos los caracteres de la primeria linea,luego se apagan y se que quedan como "medio activos, listos para funcionar" mientras que los de seguna linea ni se inmutan.
Mi problema puede que sean los tiempos,trabajo a 6MHz, con Pic; 1/6MHZ * 4= 666nS para completar una instruccion, doble para salto.


Este es esquema de inicializacion que me adjunta el fabricante, uso para bus de datos los 4 bits de mayor peso de  PORTB, por lo que yo entiendo,(esta claro que malamente, si no, no estaria escribiendo esto ahora mismo,jeje);READ lo llevo a tierra, es decir,siempre WRITE,
1-> RS=1
666 nS despues....
E=1
pongo en el puerto B, 0010
E=0
...666nS despues...
E=1
vuelvo a poner en el puerto B 0010
E=0
E=1
pongo en el puerto B 1000
E=0
espero 40us
..
..
..
y nada,.... me gustaria saber si es asi como se hace,
He estado mirando HD44780 y es un poco distinto,dicen poner tres veces al principio 0011y luego el 0010 como inidica aqui:

lo he probado tambien de esta forma y tampoco,al final de mi codigo enciendo un led, mas que nada para saber que llega al final, y lo enciende, compruebo el estado de los pines y me coincide con lo ultimo que le digo que ha de sacar, es decir, que el responde bien,por que lo que creo que la comunicacion es lo que falla, adjunto una tabla con los tiempos adecuados,por lo que antes comentaba de los 666nS,el unico tiempo con valor minimo es el tiempo entre E=0 y E=1,y dice que es de 400nS,mi instruccion tarda 666nS,por lo que no deberia haber problema por ahi incluso si los pusieramos uno detras de otro,no?

EL fabricante tambien me aconseja poner las patillas de datos con una R pull-up de 20K, esto es, del pin directamente a VDD,cierto?

Bueno, disculpen la biblia y mil gracias de antemano.....

AH! se me olvidaba el codigo:
Código: [Seleccionar]
List p=16f677
include "p16f677.inc"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC


horas EQU 20
minutos EQU 21
segundos EQU 22
cuartos EQU 33
wakeh EQU 23
wakem EQU 24
modo EQU 25
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RS EQU 1
E EQU 2
DB7 EQU 3
DB6 EQU 4
DB5 EQU 6
DB4 EQU 7
arriba EQU 0
abajo EQU 1
mas EQU 2
menos EQU 3
delay1 EQU 26
delay2 EQU 27
delay3 EQU 28
temp1 EQU 29
temp2 EQU 2A
save_w EQU 2B
PDel0 EQU 2E
PDel1 EQU 2F
PDel03 EQU 2C
PDel04 EQU 2D
#DEFINE RS_0 bcf PORTC,RS
#DEFINE RS_1 bsf PORTC,RS
#DEFINE DB7_0 bcf PORTC,DB7
#DEFINE DB7_1 bsf PORTC,DB7
#DEFINE DB6_0 bcf PORTC,DB6
#DEFINE DB6_1 bsf PORTC,DB6
#DEFINE DB5_0 bcf PORTC,DB5
#DEFINE DB5_1 bsf PORTC,DB5
#DEFINE DB4_0 bcf PORTC,DB4
#DEFINE DB4_1 bsf PORTC,DB4
#DEFINE E_0 bcf PORTC,E
#DEFINE E_1 bsf PORTC,E
#DEFINE READ bsf PORTC,0
#DEFINE WRITE bcf PORTC,0
#DEFINE ZERO? btfss STATUS,Z

org 0x0000
goto 0x0005
;org 0x0004
;goto decide
org 0x0005

inicio
bcf STATUS,RP0
bcf STATUS,RP1; Situarnos en el ----BANCO 0----------
; bcf T1CON,TMR1CS; (CAMBIAR LUEGO!) oscilacion externa=1,interna=0
; bsf INTCON,GIE; Activa interrupciones generales
; bsf INTCON,PEIE ;Activa las interrupciones por perfericos externos
; bsf INTCON,RABIE ;Activa las interrupciones on change A/B
; bsf T1CON,TMR1ON
; bsf T1CON,TMR1CS ;0=FOSC/4, 1=external
; bsf T1CON,T1CKPS0
; bsf T1CON,T1CKPS1 ;*******usar la division 1:8 para el timer1
bsf STATUS,RP0 ; 
bcf STATUS,RP1 ; ------------BANCO 1--------
; bsf OSCCON,OSTS ;*****1=define by FOSC;0=internal******
; bcf OSCCON,SCS ;***1= internal, 0=define by FOSC********
; bsf PIE1,TMR1IE ;para poder utilizar el timer1 interrupcion
bsf TRISA,TRISA0 ;tecla arriba como entrada
bsf TRISA,TRISA1 ;tecla abajo como entrada
bsf TRISA,TRISA2 ;tecla mas como entrada
bsf TRISA,TRISA3 ;tecla menos como entrada
bcf TRISB,TRISB5 ;cruce por cero
bcf TRISB,TRISB4
bcf TRISB,TRISB6
bcf TRISB,TRISB7
bcf TRISC,TRISC1 ;FUNCION RS DISPLAY
bcf TRISC,0
bcf TRISC,TRISC2 ;FUNCION E DISPLAY
bcf TRISC,TRISC3 ;----DATO1 HACIA EL DISPLAY----
bcf TRISC,TRISC4 ;----DATO2 HACIA EL DISPLAY---
bcf TRISC,TRISC5 ;CONTROL TRIAC
bcf TRISC,TRISC6 ;----DATO3 HACIA EL DISPLAY---
bcf TRISC,TRISC7 ;----DATO4 HACIA EL DISPLAY---
bsf STATUS,RP1
bcf STATUS,RP0 ;-------------BANCO 2---------------
clrf ANSEL
clrf ANSELH
bsf IOCB,IOCB5 ;para poder utilizar el cruce po cero como interrupcion
bcf STATUS,RP0
bcf STATUS,RP1 ;-------------BANCO 0---------------
CLRF minutos
CLRF horas
CLRF segundos
CLRF cuartos
CLRF wakeh
CLRF wakem
clrf modo
movlw 0xff
movwf TMR1H
movlw 0xf0
movwf TMR1L
DB4_0
main
call wait_1000
movlw 0x20
RS_1 ;RS=1
nop
nop
nop
E_1 ;SET ENABLE
nop
movwf PORTB
nop
E_0
nop
nop
E_1
nop
movwf PORTB
nop
E_0
nop
nop
nop
movlw 0x80
nop
E_1
nop
movwf PORTB
nop
E_0
nop
call wait_50u
movlw 0x0C ;DISPLAY ON,CURSOR OFF, NO BLINK
call instru
call wait_50u
movlw 0x01 ;CLEAR DISPLAY
call instru
call wait_1ms
call wait_1ms
movlw 0x06 ;INCREMENT AND NO SHIFT
call instru
call wait_1ms
movlw 0x34
call dato

DB4_1
stop
goto stop
;--------------------------------------------
dato
movwf save_w
RS_1
nop
nop
nop
E_1 ;SET ENABLE
nop
movwf PORTB
nop
E_0
nop
E_1
swapf save_w,0
movwf PORTB
nop
E_0
return

;-------------------------------------
instru
movwf save_w
RS_0
nop
nop
E_1
nop
movwf PORTB
nop
E_0
nop
E_1
swapf save_w,0
movwf PORTB
nop
E_0
return

;---------------------------------------------
wait_1ms
  movlw     .249      ; 1 set numero de repeticion
        movwf     delay1     ; 1 |
PLoop01  clrwdt              ; 1 clear watchdog
PDelL11  goto PDelL21        ; 2 ciclos delay
PDelL21 
        decfsz    delay1, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop01    ; 2 no, loop
        clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.


;-----------------------------------------
wait_1000  movlw     .167      ; 1 set numero de repeticion  (C)
        movwf     delay1     ; 1 |
PLoop02  movlw     .67       ; 1 set numero de repeticion  (B)
        movwf     delay2     ; 1 |
PLoop12  movlw     .26       ; 1 set numero de repeticion  (A)
        movwf     delay3     ; 1 |
PLoop22  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    delay3, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop22    ; 2 no, loop
        decfsz    delay2,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop12    ; 2 no, loop
        decfsz    delay1,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop02    ; 2 no, loop
        clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

;-----------------------------
wait_50u  movlw     .86       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop13  movlw     .217      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop23  clrwdt              ; 1 clear watchdog
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop23    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop13    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        retur; 2+2 Fin.

;--------------------------------
wait_5ms movlw     .6        ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop14  movlw     .249      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop24  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop24    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop14    ; 2 no, loop
        clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.             ; 2+2 Fin.

;-------------------------------------
wait_40u
PLoop25 
movlw     .66       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop15  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop25    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop15    ; 2 no, loop
        clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
end


He usado el buscador del foro y en este hilo dan unas intrucciones que dicen que funcionan,las he probado y tampoco, puede ser porque no lleve el mio un HD44780 y si otro "parecido"?he buscado informacion sobre el mio pero no he encontrado nada.

Muchas gracias de antemano y un saludo a todos...

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Lo siento, pero no me aclaro con LCD,
« Respuesta #1 en: 23 de Abril de 2009, 03:09:45 »
hola, aqui tienes algun ejemplo de como conectarla, por si es eso, si lleva resistencias de pull up, puedes activarlas en el puerto b del micro, o ponerselas externas, esto es un lado a +5 y el otro a cada pin de la lcd y micro
                 ---micro
+5 -<10k>-{
                 ---lcd

un saludo


 

anything