'**************************************************************************************** 'Include "_FuncionesUartRingBuffer.bas" ************************************************* 'Funciones para trabajar con un buffer serie en basic PSI ******************************* 'By Cos, 29/09/2016, 06/16, 09/14, 07/14, 10/13, pic simulator ide v7.41 **************** '**************************************************************************************** 'Funciones: '_SetupRBF()_Receive(), _Buffer(), _RingBuffer(0) '**************************************************************************************** '_SetupRBF(mSeg.): inicializa el ring buffer '_Buffer: devuelve el número de caracteres almacenados en el buffer. '_Receive(): devuelve un caracter del buffer. '_RingBuffer(): mantiene el buffer activo, se llama desde las interrupciones '**************************************************************************************** '---------------------------------------------------------------------------------------- 'Asignación de nombres 'Symbol _rs232_error = RCSTA.OERR 'OERR, overrun error Bit Rx 'Symbol _rcsta_cren = RCSTA.CREN 'CREN, continuous receive Enable Bit '---------------------------------------------------------------------------------------- 'Variables compartidas en las funciones del puerto serie Dim _rxhdbf(96) As Byte '_buffer por software Dim _lgbf As Byte 'Numero de bytes del _buffer menos uno. Dim _hdindex As Byte 'Indice del _buffer de entrada de datos Dim _sfindex As Byte 'Indice del _buffer de salida de datos. Dim _Buffer As Byte 'Almacena numero de bytes que hay en el buffer Dim _papelera As Byte 'Variable auxiliar Dim _rs_waitms As Byte 'Tiempo de espera si buffer vacio antes de lectura '---------------------------------------------------------------------------------------- 'Inicializa las funciones del RingBuffer Proc _SetupRBF(_rxwaitms As Byte) RCSTA.CREN = 0 'Disable, continuous Receive Enable bit*/ _lgbf = 96 - 1 'Longitud del _buffer _hdindex = 0 _sfindex = 0 _Buffer = 0 _rs_waitms = _rxwaitms * 10 'Asigna tiempo de espera antes de lectura si no hay datos _papelera = RCREG _papelera = RCREG RCSTA.CREN = 1 'Enable, continuous Receive Enable bit End Proc 'Extrae un elementos del buffer y lo actualiza Function _Receive() As Byte 'Lee caracter del _buffer Dim _rxwaitms As Byte _Receive = 0 'Hace una pausa si el buffer está vacio _rxwaitms = _rs_waitms While _Buffer = 0 And _rxwaitms > 0 _rxwaitms = _rxwaitms - 1 WaitUs 100 Wend 'Extrae un byte del bufer serie y actualiza el buffer If _Buffer > 0 Then 'Si _buffer tiene datos _Receive = _rxhdbf(_sfindex) _Buffer = _Buffer - 1 _sfindex = _sfindex + 1 If _sfindex > _lgbf Then _sfindex = 0 Endif End Function 'Llena el bufer con los datos recibidos a travéz del módulo usart Proc _RingBuffer() If _hdindex = _sfindex And _Buffer > 0 Then _papelera = RCREG Else _rxhdbf(_hdindex) = RCREG _hdindex = _hdindex + 1 _Buffer = _Buffer + 1 If _hdindex > _lgbf Then _hdindex = 0 Endif 'Si se bloquea el buffer Rx, respetando el ring buffer no pasa nunca If RCSTA.OERR = True Then RCSTA.CREN = False 'Disable, continuous Receive Enable bit _papelera = RCREG _papelera = RCREG RCSTA.CREN = True 'Enable, continuous Receive Enable bit Endif End Proc 'Call _enable_interrupts(_int_rda) 'Call _enable_interrupts(_global) 'On Interrupt 'Save System 'If _usartif = 1 Then 'Call _ringbuffer() 'Endif 'Resume