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:
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...