TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: telojurito en 20 de Septiembre de 2008, 21:18:33
-
Hola amigos,
Ya llevo un rato (bastante) sin cooperar en el foro, una disculpa.
Por ahora estoy haciendo un LCD de caracteres de 4x20 y estoy un poco confundido. Se supone que el modelo es un JHD-204ASTNLED, según la tienda dnde lo compré (AG Electrónica en México) y en la parte posterior del display dice PCM2004F-FL-YBS. Supongo que son similares o equivalentes, ya que todo depende del controlador que lleven dentro y he aquí otra duda: lleva el S6A0069 o el KS066 o ambos también son equivalentes?
Bueno eso por un lado. He tratado de programarlo, inicializarlo y escribir la letra A pero nada. Estoy usando un PIC16F76 con un cristal de 8MHz y las conexiones de los 16 pines son como sigue:
1 - GND
2 - 5V
3 - Sin conexion
4 - RS - RA0
5 - R/W - RA1
6 - E - RA2
7 - 14 - DB0-DB7 - RB0-RB7
15 - Pot 10K con respecto a 5V
16 - LED(-) - RA3
Creo que con las conexiones no he de tener problema. El código que estoy probando para escribir la letra A es el siguiente:
list p=16f76
include "p16f76.inc"
__CONFIG _PWRTE_OFF & _HS_OSC & _WDT_OFF
#DEFINE LCD_RS PORTA, 0 ;LCD Register Select
#DEFINE LCD_RW PORTA, 1 ;LCD Read/Write
#DEFINE LCD_E PORTA, 2 ;LCD Enable
#DEFINE LCD_LED PORTA, 3 ;LCD Reset
#DEFINE LCD_DAT PORTB
J equ 0x20
;*****************************************************************************************
;INPUT/OUTPUT PORTS CONFIGURATION
;*****************************************************************************************
org 0x00 ;Program start
clrf STATUS
bsf STATUS,RP0 ;Change to Bank 1
movlw 0x00 ;Set w = 00000000
movwf PORTA ;Set PORTA & PORTB as outputs
movwf PORTB
bcf STATUS,RP0 ;Change to Bank 0
;*****************************************************************************************
;Main program
;*****************************************************************************************
clrf PORTA ;PORTA = w = 00000000
clrf PORTB ;PORTB = w = 00000000
call lcd_cmd
movlw 0x38 ;Function Set
call lcd_data
call lcd_cmd
movlw 0x0C ;Display ON/OFF Control
call lcd_data
;Clear Display routine
movlw 0x50 ;80 charachters 20x4
movwf J
loopk1 call lcd_cmd
movlw 0x20 ;ASCII space
call lcd_data
decfsz J, 1 ;J=J-1, jump if J=0
goto loopk1
clrwdt
call lcd_cmd
movlw 0x07 ;Entry Mode Set
call lcd_data
call lcd_cmd
movlw 0x02 ;Return Home
call lcd_data
movlw 0x41 ;Entry Mode Set
call lcd_data
bsf LCD_RS ;RS=1
bsf LCD_RW ;Activate Read operation RW=1
;*****************************************************************************************
;Subroutines
;*****************************************************************************************
;Send Command to LCD Subroutine
;*****************************************************************************************
lcd_cmd:
bcf LCD_RS ;RS=0
bsf LCD_E ;E=1
bcf LCD_RW ;Activate Write operation RW=0
return
;*****************************************************************************************
;Send Data to LCD Subroutine
;*****************************************************************************************
lcd_data:
bsf LCD_RS ;RS=1
bcf LCD_RW ;Activate Write operation RW=0
movwf LCD_DAT ;Place data in PORTB
bsf LCD_RW ;Activate Read operation RW=1
return
end
Claro que no escribe nada, por esto es que estoy pidiendo la ayuda del foro. He buscado temas similares pero no he tenido suerte. Ayuda por favor.
Saludos
-
Bueno, sigo trabajando en esto y aquí algunos cambios:
Pin 3 del Display al cursor de un pot de 10K con un extremo a 5V y el otro a GND
Pin 15 de Display a una resistencia de 10ohms y de ahi a 5V
Nuevo código:
list p=16f76
include "p16f76.inc"
__CONFIG _PWRTE_OFF & _HS_OSC & _WDT_OFF
#DEFINE LCD_RS PORTA, 0 ;LCD Register Select
#DEFINE LCD_RW PORTA, 1 ;LCD Read/Write
#DEFINE LCD_E PORTA, 2 ;LCD Enable
#DEFINE LCD_LED PORTA, 3 ;LCD Reset
#DEFINE LCD_DAT PORTB
J equ 0x20
K equ 0x21
PDel0 equ 0x22
PDel1 equ 0x23
PDel2 equ 0x24
PDel3 equ 0x25
PDel4 equ 0x26
;*****************************************************************************************
;INPUT/OUTPUT PORTS CONFIGURATION
;*****************************************************************************************
org 0x00 ;Program start
clrf STATUS
bsf STATUS,RP0 ;Change to Bank 1
movlw 0x00 ;Set w = 00000000
movwf PORTA ;Set PORTA & PORTB as outputs
movwf PORTB
bcf STATUS,RP0 ;Change to Bank 0
;*****************************************************************************************
;Main program
;*****************************************************************************************
clrf PORTA ;PORTA = w = 00000000
clrf PORTB ;PORTB = w = 00000000
movlw .89 ;32 mseg Delay
movwf J
movlw .143
movwf K
call Delay_ms
movlw 0x38 ;Function Set
movwf LCD_DAT ;Place data in PORTB
call lcd_cmd
call Delay_40us
movlw 0x0C ;Display ON/OFF Control
movwf LCD_DAT ;Place data in PORTB
call lcd_cmd
call Delay_40us
movlw 0x01 ;Clear Display
movwf LCD_DAT ;Place data in PORTB
call lcd_cmd
call Delay_2ms
movlw 0x06 ;Entry Mode Set
movwf LCD_DAT ;Place data in PORTB
call lcd_cmd
movlw .110 ;50 mseg Delay
movwf J
movlw .181
movwf K
call Delay_ms
movlw 0x4F ;Letra "O"
movwf LCD_DAT ;Place data in PORTB
call lcd_cmd
movlw .156 ;100 mseg Delay
movwf J
movlw .213
movwf K
call Delay_ms
movlw 0x4B ;Letra "K"
movwf LCD_DAT ;Place data in PORTB
call lcd_cmd
;*****************************************************************************************
;Subroutines
;*****************************************************************************************
;Send Command to LCD Subroutine
;*****************************************************************************************
lcd_cmd:
bcf LCD_E ;E=1
bcf LCD_RW ;Activate Write operation RW=0
bcf LCD_RS ;RS=0
bsf LCD_E ;E=1
bcf LCD_E ;E=0
return
;*****************************************************************************************
;Send Data to LCD Subroutine
;*****************************************************************************************
lcd_data:
bcf LCD_E ;E=0
bcf LCD_RW ;Activate Write operation RW=0
bsf LCD_RS ;RS=1
bsf LCD_E ;E=1
bcf LCD_E ;E=0
return
;*****************************************************************************************
;Delay 40 useg subroutine
;*****************************************************************************************
Delay_40us:
movlw .18 ; 1 set numero de repeticion
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;*****************************************************************************************
;Delay 2 mseg subroutine
;*****************************************************************************************
Delay_2ms:
movlw .5 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .159 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
return ; 2+2 Fin.
;*****************************************************************************************
;Delay mseg subroutine
;*****************************************************************************************
Delay_ms:
movlw J ; 1 set numero de repeticion (B)
movwf PDel3 ; 1 |
PLoop3 movlw K ; 1 set numero de repeticion (A)
movwf PDel4 ; 1 |
PLoop4 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel4, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel3, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop3 ; 2 no, loop
PDelL5 goto PDelL6 ; 2 ciclos delay
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7
return ; 2+2 Fin.
end
Se supone que quería poner OK en el display pero el único cambio que tuve es que me presenta las 4 lineas del display algo tenues con el pot al max para el contraste pero de letras nada....
Alguna idea???? Alguna ayuda????
Saudos
-
estan ajustadas las rutinas de retardo al cristal que estas utilizando? o lo has aprovechado de algun programa que has visto por ahí?
-
Sí, están ajustadas a 8MHz. Desde hace tiempo uso un programita que genera el código
-
Y bueno, sigo intentando sin lograr escibir nada en el LCD....
... que mala cosa... con tantos proyectos interesantes e ingeniosos y yo trabado con un LCD.....
Una pregunta Para el montaje del PIC16F76 con cristal de 8MHz como debe ser el OSC en el programa? HS_OSC o XT_OSC
-
hola amigo
con respecto al cristal:
xt-->entre 100khz y 4Mhz
hs-->entre 4Mhz y 20Mhz
Un saludo
-
esta parte no esta mal?
movlw .156 ;100 mseg Delay
movwf J
movlw .213
movwf K
call Delay_ms
movlw 0x4B ;Letra "K"
movwf LCD_DAT ;Place data in PORTB
call lcd_cmd
;ACA DEBERIA IR UN GOTO $ SINO EL PROGRAMA SE VA DE LARGO
;*****************************************************************************************
;Subroutines
;*****************************************************************************************
;Send Command to LCD Subroutine
;*****************************************************************************************
lcd_cmd:
bcf LCD_E ;E=1
bcf LCD_RW ;Activate Write operation RW=0
bcf LCD_RS ;RS=0
puede verificar eso, derepente salta mas detalles que a simple vista no los detecta , ni el compilador :?
//-------------------------------------------------------------------------------------------------
otro detalle curioso
1 - GND
2 - 5V
3 - Sin conexion
4 - RS - RA0
5 - R/W - RA1
6 - E - RA2
7 - 14 - DB0-DB7 - RB0-RB7
15 - Pot 10K con respecto a 5V
16 - LED(-) - RA3
seguro de esa configuracion? podrias colgar el datasheet de tu lcdp ara verificarlo. :o
-
encontre la falla :-/
movlw 0x4F ;Letra "O"
movwf LCD_DAT ;Place data in PORTB
call lcd_data
movlw .156 ;100 mseg Delay
movwf J
movlw .213
movwf K
call Delay_ms
movlw 0x4B ;Letra "K"
movwf LCD_DAT ;Place data in PORTB
call lcd_data
goto $
te olvidastes de usar: call lcd_data
-
Hola amigos,
Como decia anteriormente, le he hecho algunos cambios al programa. Adjunto el archivo asm más reciente al cual le añadí unas rutinas de un ejemplo que encontré en otro post pero nada, no muestra nada en el lcd.
En cuanto a la configuración de los pines el 15 lo tengo con una resistencia de 10ohms a +5v y el 16 lo puse directo a GND pero nada que se ilumina el backlight. Incluso lo intente al reves 15 a (-) y 16 a (+) como decia en alguno que encontré que posiblemente estaban invertidos pero nada.
Espero seguir contando con su apoyo para hacer jalar a este bicho que ya se puso muy bronco.....
Gracias nuevamente
-
y como no podía poner todos los archivos juntos en un solo post, aquí esta el de la configuración de mi lcd
-
Hola amigo
lo estas simulando con algun programa como proteus
o por el contrario lo estas haciendo fisicamente.
si lo estas haciendo fisicamente.
primero verifica que el programa funciona bien mediante un simulador proteus por ejemplo.
despues fijate bien si la asignacion de RW,E, y RS y el bus de datos es el que pusiste en el programa.
si le pusiste una resistencia de 10k o 10 homios prueba a ponerle un potenciometro de ese valor para poder modificar el comtraste
a lo mejor te esta mostrando pero tienes muy bajo el contraste y no lo ves.
si no usas el RW ponle a masa o te hara cosas raras.
Un saludo
-
yo lo simule y puse mi observacion para que funcione el codigo. saludos
-
:-/ :-/ :-/
Bueeeeno..... finalmente logramos hacerlo funcionar..... con la ayuda del foro
Adjunto el archivo probado físicamente con un display LCD 4x20 a 8 bits con un controlador S6A0069 o equivalente gobernado por un PIC16F76 con cristal de 8MHz.
Las fallas eran básicamente de tiempos en las subrutinas Delay además de NO haber puesto las direcciones de la DDRAM donde empezaria a escribir.
Por último, podrían decirme como grabo un dato en la memoria interna del PIC y leerla? para hacer una prueba mostrando el dato en el LCD (de ser posible en asm).
Muchas gracias nuevamente