Interferencia entre LCD y puerto serie (PIC Simulator IDE "BASIC")

Saludos. Mi problema es el siguiente:
Estoy realizando un medidor de energía utilizando los ADC del PIC16F88 y quiero mostrar los valores medidos, tanto por una LCD, como enviarlo a la PC a través del puerto serial, pero cuando uso la instrucción HSEROPEN, la LCD deja de mostrar caracteres, si la elimino del programa, la LCD funciona perfectamente.

Tengo que usar esa instrucción obligatoriamente porque quiero capturar lo que haya en el buffer y para eso uso el HSERGET, porque la comunicación serial por software no tiene una instrucción para eso. (Por lo menos, no la conozco)

Aquí el código que uso:
PHP:
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTA
Define LCD_RSBIT = 0
Define LCD_EREG = PORTA
Define LCD_EBIT = 2

OSCCON = 01110110b

ANSEL = 00001010b

Dim x As Byte  'variable para saludar
Dim corriente As Byte  'Corriente
Dim voltaje As Byte  'voltaje
Dim potencia As Single  'potencia
Dim orden As Byte  'comando desde pc

INTCON.7 = 1
INTCON.4 = 1
Hseropen 9600
Lcdinit LcdCurOff

Enable
x = 1
'MAIN
main:

'Saludos
If x = 1 Then
Gosub saludos
Endif

Hserget orden
Select Case orden
Case "b"
Hserout #potencia

EndSelect
Goto main
End 

'Rutina de saludos inicial
saludos:
x = 2
Lcdcmdout LcdLine1Pos(2)
Lcdout "Red Electrica"
WaitMs 1000
Lcdcmdout LcdLine2Pos(5)
Lcdout "Virtual"
WaitMs 1000
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(3)
Lcdout "Ing. Adames"
WaitMs 1000
Lcdcmdout LcdLine2Pos(2)
Lcdout "Ing. Hernandez"

WaitMs 1000
Lcdcmdout LcdClear

Return       

On Interrupt
Save System

INTCON.7 = 0
INTCON.4 = 0

Adcin 1, corriente
Adcin 3, voltaje
potencia = corriente * voltaje

Lcdcmdout LcdHome
Lcdout "Potencia:"
Lcdcmdout LcdLine2Home
Lcdout #potencia
INTCON.INT0IF = 0
INTCON.7 = 1
INTCON.4 = 1
            
Resume
 
Última edición por un moderador:
HSEROPEN ¿Usa la uart hardware o genera una por software?
Los Waits esos tampoco me gustan un pelo
 
quiero mostrar los valores medidos, tanto por una LCD, como enviarlo a la PC a través del puerto serial, pero cuando uso la instrucción HSEROPEN, la LCD deja de mostrar caracteres, si la elimino del programa, la LCD funciona perfectamente.
Se me hace muy lógico, porque el bus de datos de la pantalla lo tienes en el puerto B ocupando el pin Tx.
Entonces cuando activas el módulo AUSART, la pantalla deja de funcionar correctamente.

Tienes esta definición:
Define LCD_DREG = PORTB
Eso define los bits <RB7:RB4> como el bus de datos para la pantalla.
Y dentro de esos bits está RB5/SS/TX/CK

HSEROPEN ¿Usa la uart hardware o genera una por software?
HSEROPEN usa el módulo AUSART, o sea que es por hardware.
H = Hardware
SER = Serial
 
Última edición:
Gracias por sus respuestas.
D@rkbytes, es lo que he estado pensando, ya que ambos comparten el RB5, pero también se supone que la LCD no detecte cambios en el la linea de datos si la linea de control no da la orden, o sea que debería poder compartir ese pin sin problema alguno.
 
Posiblemente ese compilador no tiene un buen manejo sobre la pantalla.
De hecho eso es lo más probable, ya que en proteus no se puede simular la pantalla a 4 bits.

Tienes dos opciones.
1.- Haz una prueba con otro PIC que tenga más puertos para que cambies de lugar la pantalla.
2.- Usa RS-232 por software y Tx en otro pin. (Más recomendable)
 
Última edición:
Gracias, ya pude resolverlo. Cambié la la linea de datos de la lcd al puerto A, empezando desde el bit 0, porque si empiezo en el 4, como RA5 es entrada no funcionaría. Cambié las lineas de control RB1 y RB3, todo listo. Muchas gracias!
 
Atrás
Arriba