TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: joelectronica en 28 de Enero de 2013, 12:30:25

Título: Problemas con PIC16F628A y LCD
Publicado por: joelectronica en 28 de Enero de 2013, 12:30:25
Hola a Todos, soy nuevo en el foro, y recurro a los que saben para que me ayuden en lo que puedan a solucionar mi problema. El tema es el siguiente, hice un programa en Micro Code Studio que me muesta info en un display, el tema es que hay veces que la info que me muestra me come la primer letra del display, osea como ejemplo aveces muestra, "Hola" y otras "ola" me saco la "H", en una parte del programa, muestra un mensaje intermitente en el LCD, en ese momento cuando hace el muestreo del mensaje, por momentos lo hace bien y en otros me saca una letra. Este problema por un lado.
El otro problema que tengo es que si el final del mensaje que visualizo en el LCD termina en 8 o 9, el display se borra. Osea si hago una cuenta regresiva de 20 a 0, cuando tendria que apareecr el 19 y el 18 el display no muestra nada, luego empieza a mostrar otra vez 17,16 ... y cuando llega al 9 y 8 otra vez lo mismo no muestra nada y luego  continua en 7,6... Lo raro es que si el numero que muestra es el 9993 lo muestra bien ahora si el numero termina en 9 u 8 no muestra nada. Espero no haberlos mareado. Y por otra parte tengo un problema con la configuracion del fusible MCLR, ya que yo lo deshabilito para utilizar el PA5 como entrada, el tema es que cuando programo con el IC-Prog obviamente con el MCLR apagado, al correr el programa, cuando le mando señal al PA5 se me reinicia el micro. Espero puedan ayudarme, la verdad no se para donde salir, seguro debe ser una simpleza para resolver pero estoy "ahogado en un vaso de agua" y verdaderamente no quiero retomar el proyecto desde cero qunque es lo que deberia hacer. Gracias
Título: Re: Problemas con PIC16F628A y LCD
Publicado por: Bregy en 28 de Enero de 2013, 15:36:28
Mi recomendación seria que pongas el código para ver si hay algún error...
Título: Re: Problemas con PIC16F628A y LCD
Publicado por: joelectronica en 28 de Enero de 2013, 15:48:09
Este es el codigo del programa


CMCON = 7 'Hace digital todas las entradas y salida

define LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2


DATA @5,20     'inicio con 1 peso por primera vez (20 pulsos)
data @10,0
DAtA @11,20   'inicio con 20 segundos por primera vez
data @15,0
data @16,0
data @17,0
data @18,0

'DECLARACION DE VARIABLES
dinero var word 'variable convertida a centavos
pulsos var word 'pulsos contados desde el monedero 1 pulso = 5 centavos
pulsos1 var word 'utilizada como auxiliar en "configuracionprecio:" para comparar estados
p0 var byte 'unidad de pesos ingresado. EJ: 6.30 pesos ingresado p0=6
c1 var byte 'decena de centavos ingresado. Ej: 6.30 pesos ingresado c1=3
c0 var byte 'unidad de centavos ingresado. Ej: 6.30 pesos ingresado c0=0
pg0 var byte 'unidad de pesos guardado. EJ: 6.30 pesos guardado p0=6
cg1 var byte 'decena de centavos guardado. Ej: 6.30 pesos guardado c1=3
cg0 var byte 'unidad de centavos guardado. Ej: 6.30 pesos guardado c0=0
pulsosguardados var word 'dato leido de la EEPROM en la configuracion de precio
B0 var bit 'utilizado para el conteo de flancos en bucle "contador:"
B1 var word 'control de tiempo en bucle "contador:"
a0 var bit 'control de flancos en "configuracionprecio:"
a1 var bit 'control de flancos en "configuracionprecio:"
total var word 'almacena el total del servicio
multitotal var word      'almacena los multiplos de 255 del total
totalrestante var word      'almacena los bits menos significativos del total
time var word 'almacena el tiempo configurado
timeA1 var word 'se utiliza para comaparar los datos con "time"
multitiempo var word 'guarda el multiplo del tiempo/255
restotiempo var word ' guarda el resto de la division tiempo//255
tempo var byte 'auxiliar para calcular digitos enviados al LCD
seg var byte 'auxiliar para calcular digitos enviados al LCD
m var byte 'decenas de minutos
m1 var byte 'unidades de minutos
s var byte 'decenas de segundos
s1 var byte 'unidades de minutos

TRISA= %11111100

Pause 1000 ' espera al inicio del LCD
PULSOS=0
B0=0

inicio:
    LCDout $FE,1, " INICIANDO SISTEMA  "    ' Mensaje de Bienvenida
    PAUSE 1000                              ' Pausa del mensaje
    LCDOUT $FE,1, "   JOelectronica    "    ' Publicidad
    pause 2000                              ' Pausa Publicidad
    if PORTA.6 =1 and PORTA.7=0 then
        read 10,multitiempo     'lee los datos del primer banco de memmoria
        read 11,restotiempo     'lee los datos del segundo banco de memoria
        time=multitiempo*255+restotiempo  'suma los datos
        goto configuraciontiempo
    endif   
    if PORTA.7=1 and PORTA.6 = 0 then
        goto configuracionprecio
    endif
    if PORTA.7=1 and PORTA.6=1 then
        goto totalizado
    endif
   
 'COMIENZA A CARGAR LOS DATOS ALMACENADOS
read 5,pulsosguardados 'lee los datos guardados en memoria en la ubicacion 5 que fueron guardados en la configuracion de precio
    pg0=pulsosguardados/20 'obtiene la cantidad de pesos guardados
    cg1=(pulsosguardados//20)/2 ' obtiene la decena de los centavos guardados
    lookup2 ((pulsosguardados//20)//2),[0,5],cg0  'obtiene la unidad de los centavos guardados

ingresodinero: 'Bucle principal que muestra el dinero a ingresar e ingresado
    p0=pulsos/20  'obtiene la cantidad de pesos ingresados
    c1=(pulsos//20)/2  ' obtiene la decena de los centavos ingresados
    lookup2 ((pulsos//20)//2),[0,5],c0  'obtiene la unidad de los centavos ingresados 
    lcdout $FE,1,   "Credito:     ","$",dec p0,".",dec c1,dec c0
    lcdout $FE,$c0, "Precio:      ","$",dec pg0,".",dec cg1,dec cg0   
    if pulsos>=pulsosguardados then ' compara el valor ingresado con el valor guardado, si es mayor ejecuta el temporizado
        goto totalizador   'va a la subrutina totalizador para modificar los valores
    endif
   
esperapulsos:
    if PORTA.2=0 then
        goto contador  'espera en el puerto A2 una señal de pulso
    endif
goto esperapulsos

contador:'bucle conteo de pulsos
    LCDout $FE,1
    lcdout $fe,1, "Ingresando Espere"   'mensaje de espera
buclecontador:
    if PORTA.2 =0 and B0=0 then
        pulsos = pulsos +1
        B0=1                 'B0 impide el conteo del mismo pulso varias veces
        else
        if PORTA.2=1 then    'Al cambiar el estado de la señal de pulsos, habilita nuevamente por medio de B0 al conteo
            B0=0
        endif
    EndIF
    pause 1
    B1=B1+1
    if B1>500 then           'Espera de 0.5 segundos (tiempo que demora el monedero en enviar los datos
        B1=0
        goto ingresodinero:
    endif
goto buclecontador:

tiempo:
    LCDOUT $FE,1
    pause 300
    lcdout $FE, 1,  " PRESIONE EL BOTON  "
    lcdout $fe, $c0,"      INICIO        "
    pulsos=0
    if PORTA.5=0 then       'espera a que el boton en PA5 sea presionado
        read 10,multitiempo     'lee los datos del primer banco de memmoria
        read 11,restotiempo     'lee los datos del segundo banco de memoria
        time=multitiempo*255+restotiempo  'suma los datos
        goto temporizador
    endif
    Pause 500
    if PORTA.5=0 then       'espera a que el boton en PA5 sea presionado
        read 10,multitiempo     'lee los datos del primer banco de memmoria
        read 11,restotiempo     'lee los datos del segundo banco de memoria
        time=multitiempo*255+restotiempo  'suma los datos
        goto temporizador
    endif
GOTO TIEMPO
   
temporizador:
        output PORTB.3
        PORTB.3=1           'enciende el rele
        tempo=time/60
        m=tempo/10
        m1=tempo//10
        seg=time//60
        s=seg/10
        s1=seg//10
    LCDout $fe,1
    lcdout $fe, 1,  "  AIRE DISPONIBLE   "
    lcdout $fe, $c0,"Restante:   ", dec m,dec m1, ":", dec s, dec s1,"  S"
    pause 1000
    time=time-1
    if time<=0 then       'apaga el rele y vuelve a ingreso dinero
        PORTB.3=0
        goto ingresodinero
    endif
goto temporizador   

configuracionprecio:    'Bucle para configurar el precio de habilitacion
if PORTA.4 =0 and a1=0 THEN  'incrementa el precio
        pulsos = pulsos +1
        a1=1                 'a1 impide la autorepeticion
        else
        if PORTA.4=1 then     'habilita nuevamente al conteo por un cambio de flanco
        a1=0
        endif
    endif
    if PORTA.3=0 and a0=0 then  'decrementa el precio
        pulsos = pulsos -1
        a0=1                    'a1 impide la autorrepeticion
        else
        if PORTA.3 =1 then      'habilita nuevamente al conteo por un cambio de flanco
            a0=0
        endif
    endif
    Write 5,pulsos              'Guarda en la direccion 5 la cantidad de pulsos
    if pulsos1<>pulsos then      'compara si el estado actual es distinto al anterior, en caso de serlo lo encia al LCD
        p0=pulsos/20  'obtiene la cantidad de pesos ingresados
        c0=(pulsos//20)/2  ' obtiene la decena de los centavos ingresados
        lookup ((pulsos//20)//2),[0,5],c1  'obtiene la unidad de los centavos ingresados
        lcdout $fe,1
        lcdout $fe,1, "Configuracion Dinero"
        lcdout $fe, $c0,"$ ", dec p0,".",dec c0,dec c1
        pulsos1=pulsos         'Iguala los valores para poder realizar una comparacion nuevamente
    endif
    if PORTA.7=1 and PORTA.6=1 then  'Si se presiona el pulsador en PA7 y PA6 simultaneamente el sistema se reinicia
            goto inicio:
    endif
    if PORTA.6=1 then
        lcdout $fe,1
        lcdout $fe,1, "Configuracion Tiempo"
        lcdout $fe, $c0,"Segundos:"
        goto configuraciontiempo:       
    endif                                       
goto configuracionprecio:   

configuraciontiempo:
    if PORTA.7=1 and PORTA.6=1 then  'Si se presiona el pulsador en PA7 y PA6 simultaneamente el sistema se reinicia
            goto inicio:
    endif
    if PORTA.4 =0 THEN      'aumenta un segundo
        time = time +1
    endif
    if PORTA.3=0 then       'disminuye un segundo
        time = time -1
    endif
    if timeA1<>time then  'si se detecta un cambio de valor se lo muestra en el LCD
        multitiempo=time/255
        restotiempo=time//255
        Write 10,multitiempo             'guarda los datos en memoria
        write 11,restotiempo
        lcdout $fe,1
        lcdout $fe,1, "Configuracion Tiempo"
        lcdout $fe, $c0,"Segundos: ",dec time,"  S"
        timeA1=time                        'iguala los datos para que no vuelva a ingresar si no hay cambio
    endif
    if PORTA.7=1 and PORTA.6=1 then
            lcdout $fe,1
            lcdout $fe,1, "REINICIANDO"
            goto inicio:
    endif
    if PORTA.7=1 then
        lcdout $fe,1
        lcdout $fe,1, "Configuracion Dinero"
        lcdout $fe, $c0,"$ ", dec p0,".",dec c0,dec c1
        goto configuracionprecio:
    endif
    PAUSE 70
goto configuraciontiempo

totalizador:                 'incrementa el valor del totalizador y del parcial
    read 15,multitotal           'lee el multiplo del total
    read 16,totalrestante         'lee el resto de la division
    total=multitotal*255+totalrestante+1  'calcula el total e incrementa una unidad
    multitotal=total/255                  'calcula el multiplo del total
    totalrestante=total//255              'calcula el resto del total
    write 15, multitotal                   'escribe el multiplo del total
    write 16, totalrestante                'escribe el resto de la division
goto tiempo

totalizado:
    read 15,multitotal           'lee el multiplo del total
    read 16,totalrestante         'lee el resto de la division
    total=multitotal*255+totalrestante
Lcdout $FE,1,"Total: ",dec total
pause 5000
goto inicio