'*************************************************************************************
'Función HserGetStr() ****************************************************************
'-------------------------------------------------------------------------------------
'Función: Espera la recepción de x bytes durante cierto tiempo por el puerto serie ***
'Puerto serie 38400 Baudios, almacena en un vector los bytes recibidos ***************
'By COS, 03/2020, 11/2013, Pic Simulator IDE v7.85 ***********************************
'Pic EBasic con Pic16F88 *************************************************************
'*************************************************************************************
'Biblioteca de funciones
'Include "_ProcSetUpEBasic16F88.bas"
'Include "_FuncionesPic16F88.bas"
'*************************************************************************************
Define CONFIG = 0x2f50 'Definición de fuses
Define CONFIG2 = 0x0000
Define CLOCK_FREQUENCY = 8 'Clock a 8Mhz
Define SIMULATION_WAITMS_VALUE = 1 'Para simulación
'Call _setupebasic() 'Iniciliza la placa entrenadora Pic EBasic
'****************************************************************************
'Configuración de la placa entrenadora Pic EBasic ***************************
'By COS, 11/2013, Pic Simulator IDE v6.94 ***********************************
'Pic16F88 y LCD con linea de datos a 4 Bit sin Bit R/W **********************
'****************************************************************************
'Include "_ProcSetUpEBasic.bas"
Symbol ledv = RB0 'Etiqueta al led verde
Symbol leda = RA7 'Etiqueta al led amarillo
Symbol blcd = RB3 'Etiqueta al backlight del lcd
'Proc _setupebasic()
'Puerto del LCD ----------------------------------------------------------
Define LCD_BITS = 4 'Bus de datos del lcd, a 4bit
Define LCD_DREG = PORTA 'Bus de datos, puerto A
Define LCD_DBIT = 0 'Bus datos 4, bit menos significativos del puerto
Define LCD_RSREG = PORTB 'Bit de control RS, puerto B
Define LCD_RSBIT = 7 'RB7 como RS
Define LCD_EREG = PORTB 'Bit de control E, puerto B
Define LCD_EBIT = 6 'RB6 como E
Define LCD_COMMANDUS = 2000 'Espera despues de cada comando
Define LCD_DATAUS = 100 'Espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Espera inicialización del Display
'Configuración Placa Pic EBasic -----------
AllDigital
ANSEL = 0x00 'Los pin I/O digitales
CMCON = 0x07 'Comparador a off
OSCCON = 0x7e 'Reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'Puerto B como salidas
TRISA.4 = 1 'Como entrada (RA4, adc)
TRISA.6 = 1 'Como entrada (RA6, tecla S1)
TRISA.5 = 1 'Como entrada (RA5, tecla S2)
TRISB.5 = 0 'Como salida(RB5,Tx RS232)
TRISB.2 = 1 'Como entrada (RB2, Rx RS232)
TRISB.4 = 1 'Como entrada (RHT03 inicio)
PORTB.3 = 1 'Luz lcd a ON (RB3)
PORTA.7 = 1 'Led amarillo a OFF
PORTB.0 = 1 'Led verde a OFF
PORTB.1 = 0 'LED RHT03 a OFF
'-----------------------------------------
'Lcdinit
'End Proc
Lcdinit 'Activa el LCD
Hseropen 38400 'Selecciona la velocidad del puerto serie RS232
Lcdout "Test Buffer" 'Datos al Lcd
Hserout CrLf, CrLf 'Linea en blanco al hyperterminal
WaitMs 100
'Rutina principal
indice = 0
n_chtr = 0
'**************************************************************************************
main:
IF _buffer = True THEN 'Si hay caracteres en el puerto serie (registro de la Usart)
n_chtr = _hsergetstr(5, 100) 'Espero 5 caracteres por el puerto serie durante un tiempo máximo de 0.1Seg.
Lcdcmdout LcdLine1Pos(1)
Lcdout "Numero Bytes:", #n_chtr, " "
Hserout CrLf, "Numero de caracteres leidos:", #n_chtr
indice = 0 'Reset al indice
Hserout CrLf 'Nueva línea al puerto serie
'Envia una cadena completa al purto serie y Lcd
WHILE _string(indice) > 0 'Bucle que recorre la cadena
IF indice = 0 THEN Lcdcmdout LcdLine2Clear
Lcdout _string(indice) 'Envía un elemento de la cadena al lcd
Hserout _string(indice) 'Envia un elemento de la cadena al puerto serie
indice = indice + 1 'Incrementa el indice
WEND
Hserout CrLf 'Nueva línea al puerto serie
Endif
GOTO main
'**************************************************************************************
'Funcion _HSERGETSTR:
'Espera la recepción de x caracteres durante cierto tiempo por el puerto serie.
'_buffer: Bit que indica que están entrando datos en el puerto serie (registros de la Usart)
'Call _hsergetstr(numero de bytes a recibir, tiempo de espera en mSeg): Llama a la función
'_hsergetstr: Variable que tendra el número de caracteres que se almacenaron
'_string(x): Longitud del buffer serie, termina en fin de cadena (0)
'_lenbuffer 'Longitud del buffer -1
'--------------------------------------------------------------------------------------
'Parametros de configuración y control
Symbol _buffer = PIR1.RCIF 'Si es True indica que hay datos en los registros Rx de la Usart
DIM _string
(51) AS Byte
'Cadena que contendrá los datos recibidos por el puerto serie 'Función metodo
FUNCTION _hsergetstr
(_byte
AS Byte
, _waitms
AS Word
) AS Byte
DIM _lenbuffer
AS Byte
'Numero de caracteres, bytes o elementos DIM _indice
AS Byte
'Indica el elemento del vector seleccionado IF _waitms = 0 THEN _waitms = 1 'Valor mínimo de espera
_delay = _waitms
_lenbuffer = 50 'Longitud del buffer -1
_string(0) = 0 'Inicializa cadena
_indice = 0 'Primer elemento del vector
WHILE _delay
> 0 AND _indice
< _byte
AND _indice
< _lenbuffer
'Termina por tiempo o por bytes recibidos IF _buffer = True THEN 'Si hay datos se almacenan
Hserget _string(_indice) 'Almacena byte
IF _indice < _lenbuffer THEN _indice = _indice + 1 'Contador de caractes recibidos (indice del vector)
_delay = _waitms 'Reinicia la espera
ELSE
'Inicia la espera por falta de caracteres
_delay = _delay - 1
WaitMs 1
Endif
WEND
_string(_indice) = 0 'Añade el caracter de fin de cadena al vector
_hsergetstr = _indice 'Devuelve el número de caracteres recibidos
'Desbloquea la Usart en modo Rx, si se bloqueo.
IF RCSTA.OERR = True THEN 'Si hay error en la Usart en modo rx
RCSTA.CREN = 0 'Disable, continua recepción
Hserget _indice 'Borra registros usart
Hserget _indice
RCSTA.CREN = 1 'Enable, Continuous Receive Enable bit*/
Endif