Autor Tema: INSOLADORA DE LEDS CON PIC 16F84 Y LCD  (Leído 10134 veces)

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

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« en: 25 de Junio de 2009, 14:21:44 »
hola buenas, mi proyecto es muy simple, he construido una insoladora con leds UV, utilizo un  PIC16f84A y para mostrar algo de info como el tiempo de insolado y cuando termina la insolacion utilizo un display lcd powertip 1602hsl, mi problema con este proyecto es el siguiente, he construido la placa con los leds despues de realizar los calculos de a que distancia los tengo ke colocar, hice un progrma con ccs para el control de pic y utilizando la libreria que lleva y el portb del pic comunicarse con el lcd y utilizar el puerto a como entradas la cuestion es que he probado a programar tanto en c como en asm mi programa pero no logro mostrar informacion en display solo aparece la primera linea en negro, he revisado conexiones y comprobado continuidad, para el codigo en asm utilizo la libreria de retardos que viene en el libro del pic16f84 y la libreria de lcd de 4 bits para el control del lcd pero me sigue apareciendo lo mismo, alguien ha trabajado con ese tipo de display y ha logrado mostrar informacion me da igual si es codigo asm o c,visual basic, ya que controlo la programacion bastante bien pero no se xk no sale infor por la pantalla es un proyecto bonito y sencillo de realizar ya que en un coste muy bajo tenemos una insoladora casera con un tiempo de insolado entre 1 y 3 minutos mas o menos GRACIAS

PD:si alguien esta interesado en mi proyecto le puedo pasar el codigo tanto en c como en asm

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #1 en: 25 de Junio de 2009, 14:53:40 »
No es mala idea lo que comentas pero no has intentado simularlo en Proteus o por que no como dices muestra el Codigo C y veamos si ahi esta el Error ya que por lo que dices las conexciones no son

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #2 en: 25 de Junio de 2009, 16:03:47 »
Postea el codigo (en C y en ASM) y vemos.

Que controlador tiene tu LCD?

S
El papel lo aguanta todo

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #3 en: 28 de Junio de 2009, 06:15:42 »
no si en proteus me funciona, pero creo que el problema reside en la incializacion del display y eso se hace con una libreria solo que para ese display no tengo ni idea  aqui os dejo a continuacion el codigo en c

la libreria LCD_16F84.c es la libreia lcd que viene con ccs

#include "E:\ingenieria\2º año\informatica industrial\programas de pics\c\PROYECTO\main.h"
#fuses XT,NOWDT,NOPUT,NOPROTECT
#use delay(clock=4000000)
#include <LCD_16F84.c>
#define input_pin_a2==0;
#define input_pin_a0==0;
#define input_pin_a1==0;
void main()
{

int contador=1;
//lcd_init(); 
//printf(lcd_putc," %d volts  ",variable_adc);pasar variable a lcd
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   lcd_init();
   set_tris_a(11111);
   set_tris_b(000000);
   input(pin_a0==1);
   input(pin_a1==1);
   lcd_putc("\f   Bienvenido");
   delay_ms(2000);
    lcd_putc("\f a la insoladora\n       de");
   delay_ms(2000);
    lcd_putc("\fJuan");
   delay_ms(2000);
   lcd_putc("\fIntroduce tiempo:");
   do
   {
   
   
   if(input(pin_a0)==1)
   {
   printf(lcd_putc,("\f tiempo: %d min"),contador);
   contador++;
   delay_ms(800);
   }else if(input(pin_a1)==1)
   {
   lcd_putc("\f INSOLANDO... ");
  do
  {
  input(pin_a0==0);
  output_high(pin_a2);
   delay_ms(60000);
   contador--;
  }while(contador>1);
   output_low(pin_a2);
  delay_ms(100);
   lcd_putc("\f...TERMINADO...");
   delay_ms(1000);
   contador=1;
   lcd_putc("\fIntroduce tiempo:");
  }
} while(true);
}   // fin de programa



ahora os dejo el codigo en asm las libreria de lcd4bit.inc y retardos.inc son las que vienen con el libro pic16f84a, hice el codigo en asm porque pense que como en proteus con el codigo en c funcionaba pero me aparecia algun warning pense que podria ser eso y lo hice en ensamblador pero ni aun asi sigue haciendo lo mismo si teneis cualquier duda me lo decis porque no se por donde tirar, ya que lo unico que creo que pueda ser es la libreria de control del display que al ser la generica que vienen con los programas y el libro y no sean compatibles




   __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC 
 LIST P=16F84A
 INCLUDE <P16F84A.INC>
x
salidas equ b'00001111'
entradas equ b'00101'
    CBLOCK 0x0C
    ENDC
    
 ORG 0
    call LCD_Inicializa   
inicio
    call Retardo_20ms
    call Retardo_20ms
    movlw d'0'
    movwf x
    call LCD_Borra
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw 'B'
    call LCD_Caracter
    movlw 'i'
    call LCD_Caracter
    movlw 'e'
    call LCD_Caracter
    movlw 'n'
    call LCD_Caracter
    movlw 'v'
    call LCD_Caracter
    movlw 'e'
    call LCD_Caracter
    movlw 'n'
    call LCD_Caracter
    movlw 'i'
    call LCD_Caracter
    movlw 'd'
    call LCD_Caracter
    movlw 'o'
    call LCD_Caracter
    call LCD_Linea2
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw 'a'   
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw 'l'
    call LCD_Caracter
    movlw 'a'
    call LCD_Caracter
    call Retardo_2s
    ;mensage de "Bienvenido a la" se muestra tb 2seg
    call LCD_Borra
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw 'I'
    call LCD_Caracter
    movlw 'n'
    call LCD_Caracter
    movlw 's'
    call LCD_Caracter
    movlw 'o'
    call LCD_Caracter
    movlw 'l'
    call LCD_Caracter
    movlw 'a'
    call LCD_Caracter
    movlw 'd'
    call LCD_Caracter
    movlw 'o'   
    call LCD_Caracter
    movlw 'r'
    call LCD_Caracter
    movlw 'a'
    call LCD_Caracter
    call LCD_Linea2
    movlw ' '
    call LCD_Caracter
    movlw 'd'
    call LCD_Caracter
    movlw 'e'
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw 'J'
    call LCD_Caracter
    movlw 'u'
    call LCD_Caracter
    movlw 'a'
    call LCD_Caracter
    movlw 'n'
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw 'y'
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw 'J'
    call LCD_Caracter
    movlw 'o'
    call LCD_Caracter
    movlw 's'
    call LCD_Caracter
    movlw 'e'
    call LCD_Caracter
    call Retardo_2s
INSOLACION    
    call LCD_Borra
    movlw 'I'
    call LCD_Caracter
    movlw 'n'
    call LCD_Caracter
    movlw 't'
    call LCD_Caracter
    movlw 'r'
    call LCD_Caracter
    movlw 'o'
    call LCD_Caracter
    movlw 'd'
    call LCD_Caracter
    movlw 'u'
    call LCD_Caracter
    movlw 'c'
    call LCD_Caracter
    movlw 'e'
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw 'T'
    call LCD_Caracter
    movlw 'i'
    call LCD_Caracter
    movlw 'e'
    call LCD_Caracter
    movlw 'm'
    call LCD_Caracter
    movlw 'p'
    call LCD_Caracter
    movlw 'o'
    call LCD_Caracter
    call LCD_Linea2
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movlw ' '
    call LCD_Caracter
    movfw x
   call LCD_ByteCompleto
   call Retardo_500ms
   btfss PORTB,1
   goto sumar
   goto insolar
       
sumar
   btfss PORTB,0
   goto INSOLACION
   movfw x
   addlw d'1'
   movwf x
   call LCD_Borra
   movlw 'e'
    call LCD_Caracter
    movfw x
   call LCD_ByteCompleto
    call Retardo_500ms
   goto INSOLACION
insolar

   call LCD_Borra
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw 'I'
    call LCD_Caracter
    movlw 'N'
    call LCD_Caracter
    movlw 'S'
    call LCD_Caracter
    movlw 'O'
    call LCD_Caracter
    movlw 'L'
    call LCD_Caracter
    movlw 'L'
    call LCD_Caracter
    movlw 'A'
    call LCD_Caracter
    movlw 'N'
    call LCD_Caracter
    movlw 'D'
    call LCD_Caracter
    movlw 'O'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    call Retardo_500micros
bucleinsolado   
    banksel TRISB
    clrf TRISB
    banksel TRISA
   movlw b'00000100'
   movwf PORTB
   call Retardo_20s
   call Retardo_20s
   call Retardo_20s
   decfsz x
   goto bucleinsolado
   call LCD_Borra
   call LCD_Borra
   movlw ' '
    call LCD_Caracter   
    movlw ' '
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw 'T'
    call LCD_Caracter
    movlw 'E'
    call LCD_Caracter
    movlw 'R'
    call LCD_Caracter
    movlw 'M'
    call LCD_Caracter
    movlw 'I'
    call LCD_Caracter
    movlw 'N'
    call LCD_Caracter
    movlw 'A'
    call LCD_Caracter
    movlw 'D'
    call LCD_Caracter
    movlw 'O'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    call Retardo_20s
    
    call LCD_Borra   
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw 'R'
    call LCD_Caracter
    movlw 'E'
    call LCD_Caracter
    movlw 'I'
    call LCD_Caracter
    movlw 'N'
    call LCD_Caracter
    movlw 'I'
    call LCD_Caracter
    movlw 'C'
    call LCD_Caracter
    movlw 'I'
    call LCD_Caracter
    movlw 'A'
    call LCD_Caracter
    movlw 'N'
    call LCD_Caracter
    movlw 'D'
    call LCD_Caracter
    movlw 'O'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    movlw '.'
    call LCD_Caracter
    call Retardo_2s
   goto inicio           
 INCLUDE <LCD_4BIT.INC>
 INCLUDE <retardos.INC>
 END

gracias

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #4 en: 28 de Junio de 2009, 12:22:13 »
Si el problema esta en la inicialización sería útil ver el código del LCD. Para ver si se definieron correctamente los pines a utilizar, etc. Hay muchos ejemplos en el foro que han tenido el mismo problema, habría que ver como lo han solucionado :wink:
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #5 en: 28 de Junio de 2009, 14:36:21 »
Creo que esto no se puede hacer:

Código: [Seleccionar]
#define input_pin_a2==0;

El compilador debe generarte error con eso.
El papel lo aguanta todo

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #6 en: 29 de Junio de 2009, 17:50:53 »
no, no da error ahora pongo las librerias de inicializacion, he leido en el foro pero utilizan la misma libreria que tengo y me parece que el problema es debido a la marca pero no se ya por donde tirar de todas formas adjunto las librerias tanto en c como en asm


codigo en ASM

;**************************** Librería "LCD_4BIT.INC" ***********************************
;
;   ===================================================================
;     Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;     E. Palacios, F. Remiro y L. López.
;      Editorial Ra-Ma.  www.ra-ma.es
;   ===================================================================
;
; Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2
; líneas por 16 caracteres, compatible con el modelo LM016L.
;
; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits. Las
; conexiones son:
;    -   Las 4 líneas superiores del módulo LCD, pines <DB7B4>  se conectan a las 4
;   líneas superiores del Puerto B del PIC, pines <RD7:RD4>.
;    -   Pin RS del LCD a la línea RA0 del PIC.
;    -   Pin R/W del LCD a la línea RA1 del PIC, o a masa.
;    -   Pin Enable del LCD a la línea RA2 del PIC.
;
; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librería RETARDOS.INC.
;
; ZONA DE DATOS *********************************************************************

   CBLOCK         
   LCD_Dato
   LCD_GuardaDato
   LCD_GuardaTRISB
   LCD_Auxiliar1
   LCD_Auxiliar2
   ENDC

LCD_CaracteresPorLinea   EQU   .16   ; Número de caracteres por línea de la pantalla.

#DEFINE  LCD_PinRS   PORTA,0
#DEFINE  LCD_PinRW   PORTA,1
#DEFINE  LCD_PinEnable   PORTA,2
#DEFINE  LCD_BusDatos   PORTB

; Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa
   
   bsf STATUS,RP0      ; Configura las líneas conectadas al pines RS,
   bcf LCD_PinRS
   bcf LCD_PinEnable
   bcf LCD_PinRW
   bcf STATUS,RP0            
   bcf LCD_PinRW
   bcf   LCD_PinEnable
   bcf   LCD_PinRS                     
   movlw   b'00110000'   
   call   LCD_EscribeLCD
   call   Retardo_4micros      ; Escribe el dato en el LCD.
   movlw   b'00110000'   
   call   LCD_EscribeLCD
   call    Retardo_4micros
   movlw   b'00110000'   
   call   LCD_EscribeLCD
   call    Retardo_4micros
   movlw   b'00100000'      ; Interface de 4 bits.
   call   LCD_EscribeLCD
   call    Retardo_4micros

; Ahora configura el resto de los parámetros:

   call   LCD_2Lineas4Bits5x7   ; LCD de 2 líneas y caracteres de 5x7 puntos.
   call   LCD_Borra      ; Pantalla encendida y limpia. Cursor al principio
   call   LCD_CursorOFF      ; de la línea 1. Cursor apagado.
   call   LCD_CursorIncr      ; Cursor en modo incrementar.
   return

; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.

LCD_EscribeLCD
   andlw   b'11110000'      ; Se queda con el nibble alto del dato que es el
   movwf   LCD_Dato      ; que hay que enviar y lo guarda.
   movf   LCD_BusDatos,W      ; Lee la información actual de la parte baja
   andlw   b'00001111'      ; del Puerto B, que no se debe alterar.
   iorwf   LCD_Dato,F      ; Enviará la parte alta del dato de entrada
               ; y en la parte baja lo que había antes.
   bsf STATUS,RP0   ; Acceso al Banco 1.
   movf   TRISB,W      ; Guarda la configuración que tenía antes TRISD.
   movwf LCD_GuardaTRISB
   movlw   b'00001111'      ; Las 4 líneas inferiores del Puerto B se dejan
   andwf   PORTB,F         ; como estaban y las 4 superiores como salida.
   bcf STATUS,RP0      ; Acceso al Banco 0.

   movf   LCD_Dato,W      ; Recupera el dato a enviar.
   movwf   LCD_BusDatos      ; Envía el dato al módulo LCD.
   bsf   LCD_PinEnable      ; Permite funcionamiento del LCD mediante un pequeño
   bcf   LCD_PinEnable      ; pulso y termina impidiendo el funcionamiento del LCD.
    bsf STATUS,RP0
   movf   LCD_GuardaTRISB,W   ; la configuración del Puerto B.
   movwf   PORTB         ;
   bcf   STATUS,RP0      ; Acceso al Banco 0.
   return

; Subrutinas variadas para el control del módulo LCD -----------------------------------------
;
;Los comandos que pueden ser ejecutados son:
;
LCD_CursorIncr            ; Cursor en modo incrementar.
   movlw   b'00000110'
   goto   LCD_EnviaComando
LCD_Linea1             ; Cursor al principio de la Línea 1.
   movlw   b'10000000'       ; Dirección 00h de la DDRAM
   goto   LCD_EnviaComando
LCD_Linea2             ; Cursor al principio de la Línea 2.
   movlw   b'11000000'       ; Dirección 40h de la DDRAM
   goto   LCD_EnviaComando
LCD_PosicionLinea1         ; Cursor a posición de la Línea 1, a partir de la
   iorlw   b'10000000'      ; dirección 00h de la DDRAM más el valor del
   goto   LCD_EnviaComando   ; registro W.
LCD_PosicionLinea2         ; Cursor a posición de la Línea 2, a partir de la
   iorlw   b'11000000'      ; dirección 40h de la DDRAM más el valor del
   goto   LCD_EnviaComando   ; registro W.
LCD_OFF            ; Pantalla apagada.
   movlw   b'00001000'
   goto   LCD_EnviaComando
LCD_CursorON            ; Pantalla encendida y cursor encendido.
   movlw   b'00001110'
   goto   LCD_EnviaComando
LCD_CursorOFF            ; Pantalla encendida y cursor apagado.
   movlw   b'00001100'
   goto   LCD_EnviaComando
LCD_Borra            ; Borra toda la pantalla, memoria DDRAM y pone el
   movlw   b'00000001'      ; cursor a principio de la línea 1.
   goto   LCD_EnviaComando
LCD_2Lineas4Bits5x7         ; Define la pantalla de 2 líneas, con caracteres
   movlw   b'00101000'      ; de 5x7 puntos y conexión al PIC mediante bus de
   goto   LCD_EnviaComando   ; 4 bits.

; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
;
; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
; comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
; a través del registro W. Trabaja en Modo Dato.
;
LCD_EnviaComando
   bcf   LCD_PinRS      ; Activa el Modo Comando, poniendo RS=0.
   goto   LCD_Envia
LCD_Caracter
   bsf   LCD_PinRS      ; Activa el "Modo Dato", poniendo RS=1.
   call LCD_CodigoCGROM   ; Obtiene el código para correcta visualización.
LCD_Envia
   movwf   LCD_GuardaDato      ; Guarda el dato a enviar.
   call   LCD_EscribeLCD      ; Primero envía el nibble alto.
   swapf   LCD_GuardaDato,W   ; Ahora envía el nibble bajo. Para ello pasa el
               ; nibble bajo del dato a enviar a parte alta del byte.
   call   LCD_EscribeLCD      ; Se envía al visualizador LCD.
   btfss   LCD_PinRS      ; Debe garantizar una correcta escritura manteniendo
   call   Retardo_2ms      ; 2 ms en modo comando y 50 µs en modo cáracter.
   call   Retardo_50micros
   return   

; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
;
; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
;
; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
; que puedan ser visualizado en el módulo LM016L.
;
; Entrada:   En (W) el código ASCII del carácter que se desea visualizar.
; Salida:   En (W) el código definido en la tabla CGROM.

LCD_CodigoCGROM
   movwf   LCD_Dato      ; Guarda el valor del carácter y comprueba si es
LCD_EnheMinuscula         ; un carácter especial.
   sublw   'ñ'          ; ¿Es la "ñ"?
   btfss   STATUS,Z
   goto   LCD_EnheMayuscula   ; No es "ñ".
   movlw   b'11101110'      ; Código CGROM de la "ñ".
   movwf   LCD_Dato
   goto   LCD_FinCGROM
LCD_EnheMayuscula
   movf   LCD_Dato,W      ; Recupera el código ASCII de entrada.
   sublw   'Ñ'          ; ¿Es la "Ñ"?
   btfss   STATUS,Z
   goto   LCD_Grado      ; No es "Ñ".
   movlw   b'11101110'      ; Código CGROM de la "ñ". (No hay símbolo para
   movwf   LCD_Dato      ; la "Ñ" mayúscula en la CGROM).
   goto   LCD_FinCGROM   
LCD_Grado
   movf   LCD_Dato,W      ; Recupera el código ASCII de entrada.
   sublw   'º'          ; ¿Es el símbolo "º"?
   btfss   STATUS,Z
   goto   LCD_FinCGROM      ; No es "º".
   movlw   b'11011111'      ; Código CGROM del símbolo "º".
   movwf   LCD_Dato
   
LCD_FinCGROM
   movf   LCD_Dato,W      ; En (W) el código buscado.
   return

; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
;
; Visualiza espacios en blanco.

LCD_LineaEnBlanco
   movlw   LCD_CaracteresPorLinea
   goto   LCD_EnviaBlancos
LCD_UnEspacioBlanco
   movlw   .1
   goto   LCD_EnviaBlancos
LCD_DosEspaciosBlancos
   movlw   .2
   goto   LCD_EnviaBlancos
LCD_TresEspaciosBlancos
   movlw   .3
LCD_EnviaBlancos
   movwf   LCD_Auxiliar1      ; (LCD_Auxiliar1) se utiliza como contador.
LCD_EnviaOtroBlanco   
   movlw   ' '         ; Esto es un espacio en blanco.
   call   LCD_Caracter      ; Visualiza tanto espacios en blanco como se
   decfsz   LCD_Auxiliar1,F      ; haya cargado en (LCD_Auxiliar1).
   goto   LCD_EnviaOtroBlanco
   return

; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
;
; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
;
; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero
; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
;
; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
;
LCD_Byte
   movwf   LCD_Auxiliar2      ; Guarda el valor de entrada.
   andlw   b'11110000'      ; Analiza si el nibble alto es cero.
   btfss   STATUS,Z      ; Si es cero lo apaga.
   goto   LCD_VisualizaAlto      ; No es cero y lo visualiza.
   movlw   ' '         ; Visualiza un espacio en blanco.
   call   LCD_Caracter
   goto   LCD_VisualizaBajo

LCD_ByteCompleto
   movwf   LCD_Auxiliar2      ; Guarda el valor de entrada.
LCD_VisualizaAlto
   swapf   LCD_Auxiliar2,W      ; Pone el nibble alto en la parte baja.
   call   LCD_Nibble      ; Lo visualiza.
LCD_VisualizaBajo
   movf   LCD_Auxiliar2,W      ; Repite el proceso con el nibble bajo.
   call   LCD_Nibble      ; Lo visualiza.
   return

; Subrutina "LCD_Nibble" ----------------------------------------------------------------
;
; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
; - Si (W)=b'01010110', se visualizará "6".
; - Si (W)=b'10101110', se visualizará "E".
;
LCD_Nibble
   andlw   b'00001111'      ; Se queda con la parte baja.
   movwf   LCD_Auxiliar1      ; Lo guarda.
   sublw   0x09         ; Comprueba si hay que representarlo con letra.
   btfss   STATUS,C   
   goto   LCD_EnviaByteLetra
   movf   LCD_Auxiliar1,W
   addlw   '0'         ; El número se pasa a carácter ASCII sumándole
   goto    LCD_FinVisualizaDigito   ; el ASCII del cero y lo visualiza.
LCD_EnviaByteLetra
   movf   LCD_Auxiliar1,W
   addlw   'A'-0x0A         ; Sí, por tanto, se le suma el ASCII de la 'A'.
LCD_FinVisualizaDigito
   goto   LCD_Caracter      ; Y visualiza el carácter. Se hace con un "goto"
               ; para no sobrecargar la pila.


codigo en C


///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2007 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
#define use_portb_lcd TRUE-->para usar el puerto B del pic


struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;


#if defined use_portb_lcd
   //#locate lcd = getenv("sfr:PORTB")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf81
   #else
    #locate lcd = 6
   #endif
   #define set_tris_lcd(x) set_tris_b(x)
#else
   //#locate lcd = getenv("sfr:PORTD")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf83
   #else
    #locate lcd = 8
   #endif
   #define set_tris_lcd(x) set_tris_d(x)
#endif

#ifndef lcd_type
#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#endif

#define lcd_line_two 0x40    // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(15);//originalmente es delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
     delay_us(15);//originalmente es delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(30);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(10);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING);
}


void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}
 aqui estan las dos librerias que he usado las dos simuladas en proteus funcionan

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #7 en: 14 de Septiembre de 2009, 09:39:58 »
hola buena foro, aun sigo con el problema y no soy capaz de solucionarlo, alguien tiene alguna idea

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #8 en: 14 de Septiembre de 2009, 09:49:32 »
Dices que en proteus te funciona, por lo tanto la falla puede estar en el esquemático no? Puede ser que no este bien conectado el potenciometro del contraste?
El papel lo aguanta todo

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #9 en: 20 de Septiembre de 2009, 17:03:20 »
mmmmm es ke el problema creo ke es con la libreria de inicializacion, xk el lcd es una powertip, y el pin de contraste solo me muestra una linea en negro por eso si alguien ha probado con esa pantalla hacer otra coas aunque sea para ver que libreria se usa xk tb he montado en protoboard y me aparecia lo mismo

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #10 en: 22 de Julio de 2010, 17:01:59 »
hola buenas foro, por fin tube un hueco y ya lo tengo todo solucionado listo y funcionando

Desconectado PulKon

  • PIC12
  • **
  • Mensajes: 70
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #11 en: 08 de Febrero de 2012, 23:44:36 »
Hola zerovlc, observé que tuviste problemas con la inicialización del display lcd powertip 1602hsl, yo estoy usando un display similar, el AA16206, te agradecería me comentaras como resolviste el problema.

Tengo la tabla del fabricante para la inicialización y lo quiero usar a 4 bits, le doy los retardos requeridos, pero creo los codigos no los estoy colocando como debe ser puse:  11110000, luego 1111000 después 0001000 y finalmente 01110000. (resuminedo para no extenderme).

Saludos.
La felicidad no consiste en tener lo que quieres, sino en querer lo que tienes.

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #12 en: 09 de Febrero de 2012, 17:48:01 »
Hola Pulkron te he respondido por privado lo que puedes mirar, como posibles problemas, lo que no me acorcaba es que en el mismo post estan las librerias para una lcd en modo de 4 bits tanto en asm como en C

Desconectado PulKon

  • PIC12
  • **
  • Mensajes: 70
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #13 en: 10 de Febrero de 2012, 04:13:40 »
Muchas gracias zerovlc, voy a seguir tus recomendaciones y checar la librería que estoy usando con la de tu post.

Saludos.
La felicidad no consiste en tener lo que quieres, sino en querer lo que tienes.

Desconectado PulKon

  • PIC12
  • **
  • Mensajes: 70
Re: INSOLADORA DE LEDS CON PIC 16F84 Y LCD
« Respuesta #14 en: 12 de Febrero de 2012, 04:48:02 »
zerovlc

Ya está operando el módulo LCD, gracias por tus recomendaciones.

Saludos.
La felicidad no consiste en tener lo que quieres, sino en querer lo que tienes.


 

anything