Autor Tema: PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)  (Leído 859593 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #780 en: 19 de Octubre de 2013, 08:29:24 »
No te preocupes, ese es un ejemplo muy antiguo cuando el lenguaje solo permitía trabajar con Sub-rutinas, preparo el que utilizo en la actualidad con funciones que es mucho más entendible y lo pego por aquí.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #781 en: 19 de Octubre de 2013, 15:09:57 »
Versión actualizada del RingBuffer y las Bases de tiempos junto con un ejemplo de uso.
Recordar quitar la extensión .TXT a los archivos.

El programa realiza la siguientes tareas (Ejemplo de RingBuffer + Bases de Tiempos.bas):

Se actualiza el display cada 50mSeg. mediante la base de tiempos _btimer.0

Cambia de estado el Led amarillo cada 500mSeg. mediante la base de tiempos _btimer.1

Ledverde encendido durante 50mSeg. cada vez que se lee un byte del buffer mediante _btimer.2

Modo eco, el byte que se extrae del buffer es enviado de inmediato al puerto serie.

Código: [Seleccionar]
'******************************************************************************
'Ejemplo de RingBuffer + Bases de Tiempos *************************************
'Eco al puerto serie 38400 Baudios, control LCD, parpadeo Led *****************
'By COS, 11/2013, Pic Simulator IDE v6.94 *************************************
'Pic EBasic con 16F88 *********************************************************
'******************************************************************************
Define CONFIG = 0x2f50  'Definición de fuses
Define CONFIG2 = 0x0000
Define CLOCK_FREQUENCY = 8  'Clock a 8Mhz
Call _setupebasic()  'Iniciliza la placa entrenadora Pic EBasic
Lcdinit  'Activa el LCD
Hseropen 38400  'Selecciona la velocidad del puerto serie RS232
Call _setuprbf()  'Inicializa el Ring Buffer
Call _setupbt(0xf830)  'Incializa el TMR1 (1mSeg. a 8Mhz) y bases de tiempos
INTCON.PEIE = 1  'Bit habilita interrupciones perifericos
Enable  'INTCON.GIE habilita las interrupciones globales
Lcdout "Test RingBuffer"  'Datos al Lcd
Hserout CrLf, CrLf  'Linea en blanco al hyperterminal
Call _pause(1000)  'Pausa de 1Seg.
'Rutina principal
main:
If _btimer.0 = True Then  'Se refresca el display cada 50mSeg.
Call _rldbt(0, 50)  'Recarga base de tiempos 0 con 50mSeg.
Lcdcmdout LcdLine2Home  'Se imprimira al principio de la linea dos
Lcdout "Buffer:", #_buffer, " "  'Muestra los carracteres que tiene Buffer
Endif
Call error_buffer()  'Controla el posible bloqueo del módulo Usart en modo Rx

If _btimer.2 = 1 Then ledv = 1  'Led amarillo apagado
If _buffer > 0 Then  'Si hay datos en el buffer se lee
Call _rldbt(2, 50)  'Recarga la base de tiempos 2 con 50mSeg.
ledv = 0  'Led amarillo encendido, actividad en el buffer
Call _receive()  'Lee un caracter del buffer
If _receive = 13 Then Hserout CrLf  'Línea nueva en el hyperterminal
Hserout _receive  'Envia el dato recibido al hyperterminal
Endif

'Parpadea led amarillo
If _btimer.1 Then  'Si la base de tiempos 1 termino de contar
Call _rldbt(1, 500)  'Recarga base de tiempos 0 con 500mSeg.
Toggle leda  'Invierte el estado del led amarillo
Endif
Goto main
End                                              
'Biblioteca de funciones
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesUartRingBuffer.bas"
Include "_FuncionesBasesTimer8_Pic16.bas"
'*******************************************************************************
'Gestión de interrupciones
On Interrupt
Save System
Call _ringbuffer(0)  'Llama a la función ringbuffer, desde las interrupciones
Call _basestiempos()  'Actualiza las bases de tiempos
Resume
« Última modificación: 20 de Octubre de 2013, 06:36:55 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #782 en: 20 de Octubre de 2013, 06:13:35 »
Nueva versión del programa, realiza la siguientes tareas (Ejemplo RingBuffer + Bases de Tiempo_01.bas):

Se actualiza el display cada 50mSeg. mediante la base de tiempos _btimer.0

Cambia de estado el Led amarillo cada 500mSeg. mediante la base de tiempos _btimer.1

Led verde encendido durante 50mSeg. cada vez que se lee un byte del buffer mediante _btimer.2

La siguiente versión captura los datos del buffer en un vector de 25 elementos, el fin de la cadena recibida se marca como 0 (fin de cadena estándar). Cuando deja de haber actividad en el buffer durante 3Seg la cadena se envía al puerto serie. El control se realiza mediante la base de tiempos _btimer.3

Código: [Seleccionar]
'******************************************************************************
'Ejemplo de RingBuffer + Bases de Tiempos_01 **********************************
'Eco al puerto serie 38400 Baudios, control LCD, parpadeo Led *****************
'By COS, 11/2013, Pic Simulator IDE v6.94 *************************************
'Pic EBasic con 16F88 *********************************************************
'******************************************************************************
Define CONFIG = 0x2f50  'Definición de fuses
Define CONFIG2 = 0x0000
Define CLOCK_FREQUENCY = 8  'Clock a 8Mhz
Call _setupebasic()  'Iniciliza la placa entrenadora Pic EBasic
Lcdinit  'Activa el LCD
Hseropen 38400  'Selecciona la velocidad del puerto serie RS232
Call _setuprbf()  'Inicializa el Ring Buffer
Call _setupbt(0xf830)  'Incializa el TMR1 (1mSeg. a 8Mhz) y bases de tiempos
INTCON.PEIE = 1  'Bit habilita interrupciones perifericos
Enable  'INTCON.GIE habilita las interrupciones globales
Lcdout "Test RingBuffer"  'Datos al Lcd
Hserout CrLf, CrLf  'Linea en blanco al hyperterminal
Call _pause(1000)  'Pausa de 1Seg.
'Rutina principal
Dim string(26) As Byte
Dim indice As Byte
Dim vdatos As Word  'Tiempo de validación de los datos recibidos.
indice = 0
vdatos = 3000  'Validación de los datos a los 3Seg. de no haber actividad en el puerto serie.
main:
If _btimer.0 = True Then  'Se refresca el display cada 50mSeg.
Call _rldbt(0, 50)  'Recarga base de tiempos 0 con 50mSeg.
Lcdcmdout LcdLine2Home  'Se imprimira al principio de la linea dos
Lcdout "Buffer:", #_buffer, " "  'Muestra los carracteres que tiene Buffer
Endif
Call error_buffer()  'Controla el posible bloqueo del módulo Usart en modo Rx

If _btimer.2 = True Then ledv = 1  'Led amarillo apagado
If _buffer > 0 Then  'Si hay datos en el buffer se lee
Call _rldbt(2, 50)  'Recarga la base de tiempos 2 con 50mSeg.
ledv = 0  'Led amarillo encendido, actividad en el buffer
Call _receive()  'Lee un caracter del buffer
If _receive = 13 Then Hserout CrLf  'Línea nueva en el hyperterminal
Hserout _receive  'Envia el dato recibido al hyperterminal (modo eco)
string(indice) = _receive  'Añade el byte del buffer al vector
If indice < 25 Then indice = indice + 1  'Incrementa el indice del vector
string(indice) = 0  'Marca fin de cadena
Call _rldbt(3, vdatos)  'Reset al contador de actividad del puerto serie, tiempo validación
Endif

'Envia al puerto serie la cadena almacenada si no se recibieron datos por más de 1Seg.
If _btimer.3 = True Then  'Flag base de tiempos 3
indice = 0  'Reset al indice
Hserout CrLf  'Nueva línea al pureto serie
While string(indice) > 0  'Bucle que recorre la cadena
Hserout string(indice)  'Envia un elemento de la cadena al puerto serie
indice = indice + 1  'Incrementa el indice
Wend
Hserout CrLf  'Nueva al puerto serie
indice = 0  'Reset al indice
_btimer.3 = False  'Impide que se repita esta rutina
Endif

'Parpadea led amarillo
If _btimer.1 Then  'Si la base de tiempos 1 termino de contar
Call _rldbt(1, 500)  'Recarga base de tiempos 0 con 500mSeg.
Toggle leda  'Invierte el estado del led amarillo
Endif
Goto main
End                                              
'Biblioteca de funciones
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesUartRingBuffer.bas"
Include "_FuncionesBasesTimer8_Pic16.bas"
'*******************************************************************************
'Gestión de interrupciones
On Interrupt
Save System
Call _ringbuffer(0)  'Llama a la función ringbuffer, desde las interrupciones
Call _basestiempos()  'Actualiza las bases de tiempos
Resume
« Última modificación: 20 de Octubre de 2013, 06:35:17 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #783 en: 20 de Octubre de 2013, 07:42:11 »
Dejo una versión simplificada del buffer.
Esta versión va almacenado los bytes recibidos por el puerto serie en un vector, el ultimo valor del vector será 0 (fin de cadena estándar).

Monitoria el puerto serie hasta recibir el primer byte, después espera 3Seg para que termine de entrar la trama de datos, al mismo tiempo los almacena en un string y terminados los 3Seg lo envía al puerto serie.

_string(81): Es el vector donde se almacena los datos recibidos (buffer).
_Buffer es una variable que contiene el número de caracteres.
_Error_Buffer(): Supervisa el módulo Usar por si se bloquea.
_SetUpBf(): Inicializa el buffer para poder recibir datos.
_RsBuffer(): Es la función principal que crea el buffer.

Código: [Seleccionar]
'******************************************************************************
'Ejemplo de Buffer Serie ******************************************************
'Puerto serie 38400 Baudios, almacena en una cadena los bytes recibidos *******
'By COS, 11/2013, Pic Simulator IDE v6.94 *************************************
'Pic EBasic con 16F88 *********************************************************
'******************************************************************************
Define CONFIG = 0x2f50  'Definición de fuses
Define CONFIG2 = 0x0000
Define CLOCK_FREQUENCY = 8  'Clock a 8Mhz
Call _setupebasic()  'Iniciliza la placa entrenadora Pic EBasic
Lcdinit  'Activa el LCD
Hseropen 38400  'Selecciona la velocidad del puerto serie RS232
Call _setupbf()  'Inicializa el Buffer
INTCON.PEIE = 1  'Bit habilita interrupciones perifericos
Enable  'INTCON.GIE habilita las interrupciones globales
Lcdout "Test Buffer"  'Datos al Lcd
Hserout CrLf, CrLf  'Linea en blanco al hyperterminal
WaitMs 100
'Rutina principal
Dim indice As Byte
indice = 0
main:
Call _error_buffer()  'Controla el posible bloqueo del módulo Usart en modo Rx

'Envia los datos recibidos dureante 3Seg al puerto serie.
If _buffer > 0 Then  'Hay datos en el buffer, numero de bytes.
WaitMs 3000  'Pausa de 3Seg. más demoras interrupciones
indice = 0  'Reset al indice
Hserout CrLf  'Nueva línea al puerto serie
While _string(indice) > 0  'Bucle que recorre la cadena
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
Call _setupbf()  'Inicializa el buffer, permite recibir una nueva trama de datos
Endif

Goto main
End                                              
'Biblioteca de funciones
Include "_ProcSetUpEBasic.bas"
'*******************************************************************************
'Funciones para la implementación de un buffer serie
Dim _string(81) As Byte  'Vector del buffer
Dim _buffer As Byte  'Numero de bytes recibidos
Function _rsbuffer(_ctrol As Byte) As Byte
Dim _lenbuffer As Byte
Dim _indice As Byte
'Incializa el buffer
If _ctrol = 1 Then  'Inicializa la función ringbuffer
_buffer = 0
_lenbuffer = 80  'Numero de elementos -1
RCSTA.CREN = 0  'Disable, continua recepción
Hserget _indice  'Vacia registros usart
Hserget _indice
Hserget _indice
RCSTA.CREN = 1  'Enable, Continuous Receive Enable bit*/
_indice = 0
Endif
'Buffer y control
If _ctrol = 0 Then
If PIR1.RCIF = 1 Then  'Si la interrupción de la Usart está activa
Hserget _string(_indice)  'Extrae el byte de la Usart y lo almacena
If _indice < _lenbuffer Then _indice = _indice + 1  'Incrementa el indice del buffer
_string(_indice) = 0  'Marca final de la cadena recibida
Endif
Endif
_buffer = _indice  'Numero de caracteres recibidos
End Function                                      
'Incializa el buffer
Proc _setupbf()
PIE1.RCIE = 0  'Disable la interrupcion de la usart en modo rx*/
Call _rsbuffer(1)
PIE1.RCIE = 1  'Activa la interrupcion de la usart en modo rx*/
End Proc                                          
'Comprueba si hay error de recepción en la Usart y la desbloquea.
Proc _error_buffer()
If RCSTA.OERR = True Then
Disable
Call _rsbuffer(1)
PIE1.RCIE = 1  'Activa la interrupcion de la usart en modo rx*/
Enable
Endif
End Proc                                          
'*******************************************************************************
'Gestión de interrupciones
On Interrupt
Save System
Call _rsbuffer(0)  'Llama a la función _rsbuffer, desde las interrupciones
Resume
« Última modificación: 21 de Octubre de 2013, 08:16:17 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #784 en: 21 de Octubre de 2013, 21:54:47 »
Recordé que hay algunos lenguajes que tienen una función que captura x bytes del puerto serie durante un tiempo máximo especificado (no se usa mucho), pero la he construido para el que quiera pasar el rato realizando algunas practicas con ella y así, de este modo, iniciarse en el tema de las tramas de datos con el puerto serie.

Ejemplo de Buffer Serie_01:
Funcion: Espera la recepción de x bytes durante cierto tiempo del puerto serie.

Código: Visual Basic
  1. '********************************************************************************
  2. 'Ejemplo de Buffer Serie_01 *****************************************************
  3. 'Funcion: Espera la recepción de x bytes durante cierto tiempo del puerto serie**
  4. 'Puerto serie 38400 Baudios, almacena en una cadena los bytes recibidos *********
  5. 'By COS, 4/2016, 11/2013, Pic Simulator IDE v6.94 *******************************
  6. 'Pic EBasic con 16F88 ***********************************************************
  7. '********************************************************************************
  8. Define CONFIG = 0x2f50  'Definición de fuses
  9. Define CONFIG2 = 0x0000
  10. Define CLOCK_FREQUENCY = 8  'Clock a 8Mhz
  11. 'Define SIMULATION_WAITMS_VALUE = 1
  12. 'Biblioteca de funciones
  13. Include "_ProcSetUpEBasic16F88.bas"
  14. '---------------------------------------
  15. Call _setup_ebasic()  'Iniciliza la placa entrenadora Pic EBasic
  16. Lcdinit  'Activa el LCD
  17. Hseropen 38400  'Selecciona la velocidad del puerto serie RS232
  18. 'INTCON.PEIE = 1  'Bit habilita interrupciones perifericos
  19. 'Enable  'INTCON.GIE habilita las interrupciones globales
  20. Lcdout "Test Buffer"  'Datos al Lcd
  21. Hserout CrLf, CrLf  'Linea en blanco al hyperterminal
  22. WaitMs 100
  23. 'Rutina principal
  24. Dim indice As Byte
  25. indice = 0
  26. '**************************************************************************************
  27. main:
  28.        
  29.         If _buffer = True Then  'Si hay caracteres en el puerto serie (registro de la Usart)
  30.                 Call _hsergetstr(5, 10)  'Espero 5 caracteres por el puerto serie durante un tiempo máximo de 10mSeg.
  31.  
  32.                 Hserout CrLf, "Numero de caracteres leidos:", #_hsergetstr
  33.  
  34.                 indice = 0  'Reset al indice
  35.                 Hserout CrLf  'Nueva línea al puerto serie
  36.                 'Envia una cadena completa al purto serie
  37.                 While _string(indice) > 0  'Bucle que recorre la cadena
  38.                         Hserout _string(indice)  'Envia un elemento de la cadena al puerto serie
  39.                         indice = indice + 1  'Incrementa el indice
  40.                 Wend
  41.                 Hserout CrLf  'Nueva línea al puerto serie
  42.         Endif
  43. Goto main
  44. End                                              
  45. '*******************************************************************************
  46. 'Funcion que espera la recepción de x caracteres durante cierto tiempo en el puerto serie
  47. '_buffer: Bit que indica que están entrando datos en el puerto serie (registros de la Usart)
  48. 'Call _hsergetstr(numero de bytes a recibir, tiempo de espera máximo en mSeg): Llama a la función
  49. '_hsergetstr: Variable que tendra el número de caracteres que se almacenaron
  50. '_string(51): Almacenan los bytes o caracteres que entraron por el puerto serie, termina en fin de cadena (0)
  51. '_byte <= _lenbuffer (caracteres), _waitms <= 6000mSeg. (6Seg.), valor tipico entre 1 y 10mSeg.
  52. Symbol _buffer = PIR1.RCIF  'Si es True indica que hay datos en los registros Rx de la Usart
  53. Dim _string(51) As Byte  'Cadena que contendrá los datos recibidos por el puerto serie
  54. Function _hsergetstr(_byte As Byte, _waitms As Word) As Byte
  55.         Dim _lenbuffer As Byte  'Numero de caracteres, bytes o elementos
  56.         Dim _indice As Byte  'Indica el elemento del vector seleccionado
  57.         Dim _delay As Word
  58.         _lenbuffer = 50  'Numero de elementos -1
  59.         _indice = 0  'Primer elemento del vector
  60.         If _byte > _lenbuffer Then _byte = _lenbuffer
  61.         _waitms = _waitms * 10  'Se adapta la espera a la base patron Waitus 100.
  62.         _delay = _waitms  'Guarda el tiempo de espera
  63.         While _waitms > 0 And _indice < _byte  'Termina por tiempo o por bytes recibidos
  64.                 If _buffer = True Then  'Si hay datos se almacenan
  65.                         Hserget _string(_indice)  'Almacena byte
  66.                         _indice = _indice + 1  'Contador de caractes recibidos (indice del vector)
  67.                         _waitms = _delay  'Reset al contador de tiempo
  68.                 Else
  69.                         WaitUs 100  'Tiempo de espera patron
  70.                         _waitms = _waitms - 1  'Decrementa el tiempo
  71.                 Endif
  72.         Wend
  73.         _string(_indice) = 0  'Añade el caracter de fin de cadena al vector
  74.         _hsergetstr = _indice  'Devuelve el número de caracters recibidos
  75.         'Desbloquea la Usart en modo Rx si se bloqueo
  76.         If RCSTA.OERR = True Then  'Hay error en la Usart, entraron más datos de los que se extrajero (está bloqueada)
  77.                 RCSTA.CREN = 0  'Disable, continua recepción
  78.                 Hserget _indice  'Vacía registros usart
  79.                 Hserget _indice
  80.                 RCSTA.CREN = 1  'Enable, Continuous Receive Enable bit*/
  81.         Endif
  82. End Function

Nota: Mejorada la velocidad de captura (26/10/2013).
Nota: Actualizada (20/4/2016)
« Última modificación: 21 de Abril de 2016, 09:23:52 por dogflu66 »
Saludos desde Granada, España.

Desconectado zgouki

  • PIC10
  • *
  • Mensajes: 5
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #785 en: 25 de Octubre de 2013, 08:16:13 »
Muchas gracias dogflu66, me ha resultado de mucha ayuda tus códigos bien explicados. Te djo un abrazo desde Rosario, Argentina. Y un gran aplauso tambien!  ((:-))  ((:-))  ((:-))  ((:-))

Desconectado zgouki

  • PIC10
  • *
  • Mensajes: 5
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #786 en: 11 de Noviembre de 2013, 20:20:51 »
Estimado dogflu, recurro a su sabiduría esta vez para saber si es posible usar el o los pines determinados para la comunicación serial (RX y TX) como entrada o salidas digitales una vez habilitadas las interrupciones usart.
Le explico lo que quiero hacer: el pic receptor solo utiliza el pin RX, ya que no es necesario mandar información por el TX, por lo tanto este pin lo tengo sin conexión y no cumple función alguna. Pero mi proyecto requiere una salida mas, y este pin me vendría como anillo al dedo. El problema es que siempre queda a nivel alto si lo pongo como salida, nose como controlarlo. He probado colocando una subrutina que se activa mediante el timer1 y que hace lo siguiente:

   TRISB.2 = 0  'Salida
   PORTB.2 = 0

Pero no parece funcionar  :(  .

Alguna idea? Desde ya muchas gracias!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #787 en: 11 de Noviembre de 2013, 20:33:55 »
Que yo sepa si se puede usar. Tienes que redefinirlo después de abrir el puerto:

Hseropen 38400 'Esto entre otras cosas, configura los pin de Tx y Rx como salida y entrada respectivamente.
Trisb.2 = 0 'Esta es la ultima configuración que perdura.

Pruébalo y me cuentas.

Nota: Cuando se habilita el módulo, este se apropia de los pins de Tx y Rx por lo que no se pueden usar por el usuario. Para poder recuperar el control de estos pins en tiempo de ejecución, hay que deshabilitar el módulo usart para que queden libres y reconfigurar con TRIS para poder usarlos como I/O de nuevo.
« Última modificación: 13 de Agosto de 2024, 15:37:20 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #788 en: 17 de Noviembre de 2013, 20:37:17 »
Para todo aquel que esté interesado trabajar con el modulo de ultrasonidos HC-SR04 o equivalentes les dejo una función para manejarlo.
Mide correctamente desde 2Cm a 300Cm totalmente lineal. Hay que tener en cuenta que a distancias superiores a 1 metros, el haz abre mucho
y le pueden afectar las paredes laterales.

https://www.mouser.com/ds/2/813/HCSR04-1022824.pdf

Código: [Seleccionar]
'**********************************************************************************
'Funsion para HC-SR04.bas
'Funciones para la medición de distancia con el sensor HC-SR04 con TMR1
'Placa PicEBasic, By COS, 11/2018, 11/2013
'Basic Pic Simulator IDE (PSI), v7.48, Pic16F88
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8  'Oscilador a 8Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesPic16F88.bas"
'-----------------------------------------
Call _setupebasic()  'Inicializa la placa entrenadora PicEBasic.
Hseropen 38400  'Inicializa puerto RS232 por hardware a 38400Baudios
Lcdinit  'Inicializa el LCD sin cursor
WaitMs 100  'Pausa de 100 mSeg.
Lcdout "Test P. HC-SR04"  'Imprime el texto en el LCD
WaitMs 2000  'Pausa de 2 Seg.
'-----------------------------------------
void_main:

Symbol _ledsr04 = RA4  'Se asigna pin del LED placa adaptadora
ConfigPin _ledsr04 = Output  'Led, salida
Call _setup_hcsr04(8, 0, 0)  'Oscilador, compensación positiva, compensación negativa

Dim distancia_mm As Word
Dim main As Byte

While main = main
'Muestra lecturas
_ledsr04 = True  'Led a On
distancia_mm = _gethcsr04()  'Lee sensor
WaitMs 50  'Pausa para que se vea el led iluminado
_ledsr04 = False  'Led a Off
Lcdcmdout LcdLine2Home  'Cursor al principio de la linea2
Lcdout "HC-SR04: ", #distancia_mm, "mm    "  'Salida de datos por el LCD
Hserout "HC-SR04: ", #distancia_mm, "mm", CrLf  'Salida de datos por Usart
Wend

End                                               
'-------------------------------------------------
'Funciones para el control del sensor HC-SR04
'********************************************************************
'Funcion para la configuración de la función principal
'_clk = Mhz del reloj del sistema
'_mas = factor de correción positivo, incrementa la lectura final
'_menos = factor de correción negativo, decrementa la lectura final
'Call _setup_hcsr04(Mhz reloj, incremento, decremento)
Proc _setup_hcsr04(_clk As Byte, _mas As Byte, _menos As Byte)
Call _hcsr04(_clk, _mas, _menos, 0)
End Proc                                         
'Función para la lectura del sensor
'Retorna una lectura en mm del sensor HC-SR04
'_GetHCSR04 = retorna la lectura en mm del sensor
'Lectura = _GetHCSR04()
Function _gethcsr04() As Word
_gethcsr04 = _hcsr04(0, 0, 0, 1)
End Function                                     
'Función principal de lectura y control del sensor HC-SR04
'Funcion de lectura y control del sensor HC-SR04, devuelve valor
'_clk = Mhz del reloj del sistema
'_mas = factor de correción positivo, incrementa la lectura final
'_menos = factor de correción negativo, decrementa la lectura final
'_ctrl = configración
'Call _gethcsr04(Mhz reloj, incremento, decremento, control)
'_gethcsr04 > de 0 lectura en mm, = 0 error de lectura
Symbol _echosr04 = RB4  'Se asigna pin del ECHO
Symbol _trigersr04 = RB1  'Se asigna pin del TRIGER
Function _hcsr04(_mhz As Byte, _mas As Byte, _menos As Byte, _ctrl As Byte) As Word
Dim _auxw As Word
Dim _auxl As Long
Dim _aux_mhz As Byte
Dim _aux_mas As Byte
Dim _aux_menos As Byte
_hcsr04 = 0  'Se marca error de lectura por defecto
'Inicializa la función
If _ctrl = 0 Then
ConfigPin _echosr04 = Input  'Echo, entrada
ConfigPin _trigersr04 = Output  'Triger, salida
_trigersr04 = False  'Inicializa el Triger
_aux_mhz = _mhz / 4  'Factor corrección a uSeg.
_aux_mas = _mas  'Calibrado positivo
_aux_menos = _menos  'Calibrado negativo
Call _setup_timer1(_tmr1_internal, _tmr1_div1)  'Configura el timer1
Call _timer1(True)  'Pone en marcha el timer1
'Call _disable_interrupts(_int_timer1)  'Desactiva las interrupciones del Timer1
Exit  'Fuerza la salida de la función
Endif
'Solicitud de una lectura al sensor -------------------------------------
'Se demanda lectura
_trigersr04 = True  'Inicia pulso del Triger
WaitUs 15  'Ancho del pulso del Triger en uSeg., minimo 10uSeg.
_trigersr04 = False  'Fin del pulso del Triger
Call _clear_timer1()  'Se borra el contador del Timer
While _echosr04 = False  'Se espera hasta que el sensor inicie una lectura
If _tmr1if = True Then Exit  'Fin si desbordo el Timer
Wend
Call _clear_timer1()  'Se borra el contador del Timer
While _echosr04 = True  'Se espera hasta que el sensor inicie fin de lectura
If _tmr1if = True Then Exit  'Fin si desbordo el Timer
Wend
_auxw = _get_timer1()  'Asigna la lectura del Timer
_auxw = ((_auxw / _aux_mhz) + _aux_mas) - _aux_menos  'Calibrado
'_auxl = ((_auxw * 340) / 2) / 1000  'Milimetros
_auxl = (_auxw * 34) / 200  'Milimetros
_hcsr04 = _auxl  'Pasa valor
End Function                                     
'**************************************************************************
« Última modificación: 06 de Noviembre de 2018, 21:19:27 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #789 en: 01 de Diciembre de 2013, 20:56:52 »
Para terminar con la lectura de ancho de pulso, dejo una nueva versión de la lectura del sensor HC-SR04 con la novedad, de que he incorporado una función para la lectura del ancho de pulso, esta es _GetPulseWidthIn(Flanco, Tiempo de espera). La función devuelve la lectura del ancho de pulso en una variable tipo Long en uSegundos.

Código: [Seleccionar]
'**********************************************************************************
'Funcion _getpulsewidthin aplicado HC-SR04.bas
'Funciones para la medición del ancho de pulso de una señal externa con TMR1
'Aplicado a la lectura del sensor por ultrasonidos HC-SR04
'Placa PicEBasic, By COS, 11/2018, 12/2013
'Basic Pic Simulator IDE (PSI), v7.48, Pic16F88
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8  'Oscilador a 8Mhz
Define SINGLE_DECIMAL_PLACES = 1
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'Bibliotecas usadas:
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesPic16F88.bas"
Include "_FuncionesCapturaAnchoPulso.bas"
'-----------------------------------------
Call _setupebasic()  'Inicializa la placa entrenadora PicEBasic.
Hseropen 38400  'Inicializa puerto RS232 por hardware a 38400Baudios
Lcdinit  'Inicializa el LCD sin cursor
WaitMs 100  'Pausa de 100 mSeg.
Lcdout "Sensor HC-SR04"  'Imprime el texto en el LCD
WaitMs 2000  'Pausa de 2 Seg.
'-----------------------------------------
voidmain:
Symbol trigger = RB1  'Se asigna pin del TRIGGER para HC-SR04
Symbol _ledsr04 = RA4  'Se asigna pin del LED placa adaptadora HC-SR04
ConfigPin _ledsr04 = Output  'Led, salida
ConfigPin trigger = Output  'Trigger, salida
'Espencificar pin de adquisición en la función
'(Symbol _pinpulsewidthin = RB4  'Se asigna pin por donde se aplica la señal)
Call _setup_pulsewidthin(8)  'Se inicializa la función _pulsewidthin (oscilador y TMR1).
trigger = False  'Inicializa el Trigger
_ledsr04 = False  'Led a Off

Dim useg As Word
Dim main As Byte
Dim mm As Long

While main = main
'Activa una lectura del sensor HC-SR04
trigger = True  'Inicia pulso del Triger
WaitUs 15  'Ancho del pulso del Triger en uSeg., minimo 10uSeg.
trigger = False  'Fin del pulso del Triger

'Devuelve la lectura en uSegundos.
_ledsr04 = True  'Led a On
'Lee el ancho de pulso positivo del sensor durante un tiempo máximo de espera de 10mSeg.
useg = _getpulsewidthin(1, 100)
mm = (useg * 34) / 200  'Pasa a milimetros la lectura dada en uSeg.
WaitMs 300  'Pausa para que de tiempo a ver el led iluminado.
_ledsr04 = False  'Led a Off

'Muestra los datos por LCD y puerto serie RS232
Lcdcmdout LcdLine1Home  'Cursor al principio de la linea1
Lcdout "Tmp: ", #useg, "uSeg.    "  'Salida de datos por el LCD
Lcdcmdout LcdLine2Home  'Cursor al principio de la linea2
Lcdout "Dist: ", #mm, "mm    "  'Salida de datos por el LCD
Hserout "Lectura: ", #useg, "uSeg."  'Salida de datos por Usart (RS232)
Hserout "Distancia: ", #mm, "mm", CrLf  'Salida de datos por Usart (RS232)

Wend
End                                               
'********************************************************************
« Última modificación: 04 de Noviembre de 2018, 10:25:16 por dogflu66 »
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #790 en: 18 de Enero de 2014, 17:48:38 »
Estimado Dogflu66 saludos,


Nuevamente recurro a tu sabiduría, hace un tiempo te consulte por como poder hacer funcionar el sensor de Humedad y temperatura DHT22, al cual pudiste hacerlo funcionar bajo PSI, hasta la fecha satisfactoriamente esta funciona de maravilla, ha sido de apoyo para aplicaciones simples como medir temperatura y observarla dentro de la casa, y en uno que otro trabajo que he efectuado.

Ahora yendo al grano con la consulta estoy trabajando con un datalogger, para almacenar los datos utilizo un logger diseñado por sparkfun el cual permite utilizar una memoria MicroSd para guardar datos y que se cominica mediante RS232 con el pic18f4550, con este actual trabajo utilizo las entradas ADC pudiendo procesar los datos adquiridos desde sensores que trabajen de 0 a 5 VDC sin problemas, utilizo el rtc ds1307para las horas y hasta el sensor 1 wire ds18b20 sin complicaciones y eventualidades.
Sin embargo no todo puede ser color rosa, como antes te mencione te solicite ayuda para el DHT 22, mi problema es que al querer enviar los datos al logger de sparkfun los datos almacenados en la memoria micro SD se muestran como código ASCII y no los datos reales que en este caso seria la temperatura, hora y otros datos.
 
Te adjunto lo que pasa a ser mi programación y humildemente nuevamente te pido apoyo con respecto a solucionar este cacho que me tiene ya mucho tiempo sin poder resolver.

Saludos.


Código: [Seleccionar]
AllDigital
Define CLOCK_FREQUENCY = 20


'configuracion de parametros para dht22
CMCON = 0x07
OSCCON = 0x7e
Dim hr As Word
Dim tmp As Word
Dim chk As Word


TRISA.1 = 1  'entrada RHT03 inicio
WaitMs 100
Call _rht03ini(8)
WaitMs 2000

'configuracion canales analogicos
'ADCON1 = %00001010
'Dim adc As Word
'adc = 0

'configuracion de puerto
Symbol tx = PORTC.6


'configuracion puerto i2c
Symbol sda = PORTB.0
Symbol scl = PORTB.1


'configuracion parametros de reloj
Dim seg As Byte
Dim min As Byte
Dim hora As Byte
Dim daym As Byte
Dim dias As Byte
Dim mes As Byte
Dim anno As Byte

Dim seg1 As Byte
Dim min1 As Byte
Dim hora1 As Byte
Dim dias1 As Byte
Dim mes1 As Byte
Dim anno1 As Byte

Dim y As Word


'sincronizacion de reloj y toma de datos
Gosub lcd3
Gosub reloj_rtc
Gosub calculo1
Gosub calculo
While y > 0
y = y - 1
Gosub lcd
Wend
'termino sincronizacion salto a inicio y comienza trabajo datalogger

inicio:

Call _rht03read()
hr = _ped1(_rht03read.HW)
tmp = _ped1(_rht03read.LW)
chk = _rht03chk()

'Adcin 1, adc
Gosub reloj_rtc
Gosub lcd3
Gosub calculo1
If seg1 = 0 Or seg1 = 10 Or seg1 = 20 Or seg1 = 30 Or seg1 = 40 Or seg1 = 50 Then
Gosub enviar
Endif

Goto inicio
End                                              

Include "humedad.bas"
Include "trabajando con bits.bas"

reloj_rtc:
I2CRead sda, scl, 0xd1, 0x00, seg
WaitMs 20
I2CRead sda, scl, 0xd1, 0x01, min
WaitMs 20
I2CRead sda, scl, 0xd1, 0x02, hora
WaitMs 20
I2CRead sda, scl, 0xd1, 0x03, daym
WaitMs 20
I2CRead sda, scl, 0xd1, 0x04, dias
WaitMs 20
I2CRead sda, scl, 0xd1, 0x05, mes
WaitMs 20
I2CRead sda, scl, 0xd1, 0x06, anno
WaitMs 20
Return                                            

calculo1:
'conversion de hexa a decimal segundos
If seg >= 0 And seg <= 9 Then seg1 = seg
If seg >= 16 And seg <= 25 Then seg1 = seg - 6
If seg >= 32 And seg <= 41 Then seg1 = seg - 12
If seg >= 48 And seg <= 57 Then seg1 = seg - 18
If seg >= 64 And seg <= 73 Then seg1 = seg - 24
If seg >= 80 And seg <= 89 Then seg1 = seg - 30

'conversion de hexa a decimal minutos
If min >= 0 And min <= 9 Then min1 = min
If min >= 16 And min <= 25 Then min1 = min - 6
If min >= 32 And min <= 41 Then min1 = min - 12
If min >= 48 And min <= 57 Then min1 = min - 18
If min >= 64 And min <= 73 Then min1 = min - 24
If min >= 80 And min <= 89 Then min1 = min - 30

'conversion de hexa a decimal hora
If hora >= 0 And hora <= 9 Then hora1 = hora
If hora >= 16 And hora <= 25 Then hora1 = hora - 6
If hora >= 32 And hora <= 41 Then hora1 = hora - 12

'conversion de hexa a decimal dias
If dias >= 0 And dias <= 9 Then dias1 = dias
If dias >= 16 And dias <= 25 Then dias1 = dias - 6
If dias >= 32 And dias <= 41 Then dias1 = dias - 12
If dias >= 48 And dias <= 57 Then dias1 = dias - 18

'conversion de hexa A decimal mes
If mes >= 0 And mes <= 9 Then mes1 = mes
If mes >= 16 And mes <= 25 Then mes1 = mes - 6

'conversion de hexa a decimal año
If anno >= 0 And anno <= 9 Then anno1 = anno
If anno >= 16 And anno <= 25 Then anno1 = anno - 6
Return                                            

calculo:
If min1 >= 0 And min1 <= 4 Then y = 300 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 5 And min1 <= 9 Then y = 600 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 10 And min1 <= 14 Then y = 900 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 15 And min1 <= 19 Then y = 1200 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 20 And min1 <= 24 Then y = 1500 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 25 And min1 <= 29 Then y = 1800 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 30 And min1 <= 34 Then y = 2100 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 35 And min1 <= 39 Then y = 2400 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 40 And min1 <= 44 Then y = 2700 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 45 And min1 <= 49 Then y = 3000 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 50 And min1 <= 54 Then y = 3300 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 55 And min1 <= 59 Then y = 3600 - min1 * 60 - (60 - (63 - seg1))
Return                                            

enviar:

Serout tx, 9600, #hora1
WaitMs 10
Serout tx, 9600, ":"
WaitMs 10
Serout tx, 9600, #min1
WaitMs 10
Serout tx, 9600, ":"
WaitMs 10
Serout tx, 9600, #seg1
WaitMs 10
Serout tx, 9600, ";"
WaitMs 10
Serout tx, 9600, #hr.HB
WaitMs 10
Serout tx, 9600, "."
WaitMs 10
Serout tx, 9600, #hr.LB
WaitMs 10
Serout tx, 9600, ";"
WaitMs 10
Serout tx, 9600, #tmp.HB
WaitMs 10
Serout tx, 9600, "."
WaitMs 10
Serout tx, 9600, #tmp.LB, CrLf
WaitMs 10
Return            



Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #791 en: 20 de Enero de 2014, 15:52:18 »
¿Que datalogger es para echarle un vistazo?.
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #792 en: 21 de Enero de 2014, 22:07:56 »
¿Que datalogger es para echarle un vistazo?.

El logger que utilizo es uno de spark fun, modelo logomatic V2 Serial SD datalogger.

Aquí dejo unos link

https://www.sparkfun.com/products/10216
https://www.sparkfun.com/datasheets/Widgets/SFE-0016-DS-Logomatic-v21.pdf

Como asi tambien en el siguiente recuadro te dejo la configuracion interna de la memoria Micro sd, la cual debe estar formateada en fat 16 y debe ser a lo mas de 2 gb en lo posible, ya casi en mi país no se ven muchas de estas.

Citar
MODE = 0
ASCII = y
Baud = 4
Frequency = 100
Trigger Character = $
Text Frame = 100
AD1.3 = N
AD0.3 = N
AD0.2 = N
AD0.1 = N
AD1.2 = N
AD0.4 = N
AD1.7 = N
AD1.6 = N
Saftey On = Y

Se agradece la ayuda e interés.
« Última modificación: 21 de Enero de 2014, 22:17:37 por Evonkc »

Desconectado arrluis

  • PIC10
  • *
  • Mensajes: 4
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #793 en: 16 de Febrero de 2014, 02:47:14 »
Hola podrían pasarme el diagrama en proteus por favor de "NOMBRE: 16F88_LCD_RTC_12" RESPUESTA No. 93
« Última modificación: 16 de Febrero de 2014, 21:19:35 por dogflu66 »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #794 en: 16 de Febrero de 2014, 21:20:30 »
Este hilo es más bien practico, no sé si alguien habrá pasado el ejemplo a Proteus.
Saludos desde Granada, España.


 

anything