Autor Tema: enviar y recibir una variable single x la uart  (Leído 511 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado WALTER ALEJANDRO

  • PIC12
  • **
  • Mensajes: 58
enviar y recibir una variable single x la uart
« en: 01 de Marzo de 2020, 09:03:21 »
hola señores, trabajando con Pic Simulator Ide estoy tratando de enviar una variable tipo single x la uart, recibirla y mostrarla en un display , alguno tuvo oportunidad de trabajar con esto? acepto ideas y sugerencias.
Desde ya muchas gracias

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3377
    • PICKEY ELECTRÓNICA
Re:enviar y recibir una variable single x la uart
« Respuesta #1 en: 05 de Marzo de 2020, 21:51:23 »
Tienes ejemplos anteriores; aquí te dejo el enlace al índice del hilo:
http://www.todopic.com.ar/foros/index.php?topic=14917.0

Si no te van bien te busco algo más simple.
Saludos desde Granada, España.

Desconectado WALTER ALEJANDRO

  • PIC12
  • **
  • Mensajes: 58
Re:enviar y recibir una variable single x la uart
« Respuesta #2 en: 06 de Marzo de 2020, 16:53:40 »
si estuve leyendo algunos ejemplos previo a escribir ,pero como son publicaciones viejas en lo que respecta a versiones del PSI,no enfatice mucho.En unos dias te volvere a escribir.
Como siempre gracias x tu respuesta

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3377
    • PICKEY ELECTRÓNICA
Re:enviar y recibir una variable single x la uart
« Respuesta #3 en: 07 de Marzo de 2020, 11:16:03 »
En realidad el hilo está actualizado, podrás ver en algunos ejemplos que tienen un comentario añadido de actualización.

Te dejo la versión de la función _HSerGetStr, a la que se le especifica el número de bytes a recibir y el tiempo de espera si no se reciben todos.
Lo que si podrás observar es que no utilizo la declaración de cadena tipo STRING, porque por costumbre uso vectores con mis propias funciones para manejar cadenas y listas.
Si te es más fácil utilizar las funciones para manejo de cadenas del lenguaje, tan solo tienes que cambiar la variable declarada como vector y convertirla a tipo STRING.
Igualmente si te queda alguna duda estaré por aquí.

Código: QBasic/QuickBASIC
  1. '*************************************************************************************
  2. 'Función HserGetStr() ****************************************************************
  3. '-------------------------------------------------------------------------------------
  4. 'Función: Espera la recepción de x bytes durante cierto tiempo por el puerto serie ***
  5. 'Puerto serie 38400 Baudios, almacena en un vector los bytes recibidos ***************
  6. 'By COS, 03/2020, 11/2013, Pic Simulator IDE v7.85 ***********************************
  7. 'Pic EBasic con Pic16F88 *************************************************************
  8. '*************************************************************************************
  9. 'Biblioteca de funciones
  10. 'Include "_ProcSetUpEBasic16F88.bas"
  11. 'Include "_FuncionesPic16F88.bas"
  12. '*************************************************************************************
  13. Define CONFIG = 0x2f50  'Definición de fuses
  14. Define CONFIG2 = 0x0000
  15. Define CLOCK_FREQUENCY = 8  'Clock a 8Mhz
  16. Define SIMULATION_WAITMS_VALUE = 1  'Para simulación
  17.  
  18. 'Call _setupebasic()  'Iniciliza la placa entrenadora Pic EBasic
  19. '****************************************************************************
  20. 'Configuración de la placa entrenadora Pic EBasic ***************************
  21. 'By COS, 11/2013, Pic Simulator IDE v6.94 ***********************************
  22. 'Pic16F88 y LCD con linea de datos a 4 Bit sin Bit R/W **********************
  23. '****************************************************************************
  24. 'Include "_ProcSetUpEBasic.bas"
  25. Symbol ledv = RB0  'Etiqueta al led verde
  26. Symbol leda = RA7  'Etiqueta al led amarillo
  27. Symbol blcd = RB3  'Etiqueta al backlight del lcd
  28. 'Proc _setupebasic()
  29.         'Puerto del LCD ----------------------------------------------------------
  30.         Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
  31.         Define LCD_DREG = PORTA  'Bus de datos, puerto A
  32.         Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto
  33.         Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
  34.         Define LCD_RSBIT = 7  'RB7 como RS
  35.         Define LCD_EREG = PORTB  'Bit de control E, puerto B
  36.         Define LCD_EBIT = 6  'RB6 como E
  37.         Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
  38.         Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
  39.         Define LCD_INITMS = 50  'Espera inicialización del Display
  40.         'Configuración Placa Pic EBasic -----------
  41.         AllDigital
  42.         ANSEL = 0x00  'Los pin I/O digitales
  43.         CMCON = 0x07  'Comparador a off
  44.         OSCCON = 0x7e  'Reloj interno a 8Mhz
  45.         TRISA = 0x00  'Puerto A como salidas
  46.         TRISB = 0x00  'Puerto B como salidas
  47.         TRISA.4 = 1  'Como entrada (RA4, adc)
  48.         TRISA.6 = 1  'Como entrada (RA6, tecla S1)
  49.         TRISA.5 = 1  'Como entrada (RA5, tecla S2)
  50.         TRISB.5 = 0  'Como salida(RB5,Tx RS232)
  51.         TRISB.2 = 1  'Como entrada (RB2, Rx RS232)
  52.         TRISB.4 = 1  'Como entrada (RHT03 inicio)
  53.         PORTB.3 = 1  'Luz lcd a ON (RB3)
  54.         PORTA.7 = 1  'Led amarillo a OFF
  55.         PORTB.0 = 1  'Led verde a OFF
  56.         PORTB.1 = 0  'LED RHT03 a OFF
  57. '-----------------------------------------
  58. 'Lcdinit
  59. 'End Proc
  60.  
  61. Lcdinit  'Activa el LCD
  62. Hseropen 38400  'Selecciona la velocidad del puerto serie RS232
  63. Lcdout "Test Buffer"  'Datos al Lcd
  64. Hserout CrLf, CrLf  'Linea en blanco al hyperterminal
  65. WaitMs 100
  66. 'Rutina principal
  67. DIM indice AS Byte
  68. DIM n_chtr AS Byte
  69. indice = 0
  70. n_chtr = 0
  71. '**************************************************************************************
  72. main:
  73.         IF _buffer = True THEN  'Si hay caracteres en el puerto serie (registro de la Usart)
  74.                 n_chtr = _hsergetstr(5, 100)  'Espero 5 caracteres por el puerto serie durante un tiempo máximo de 0.1Seg.
  75.  
  76.                 Lcdcmdout LcdLine1Pos(1)
  77.                 Lcdout "Numero Bytes:", #n_chtr, " "
  78.                 Hserout CrLf, "Numero de caracteres leidos:", #n_chtr
  79.  
  80.                 indice = 0  'Reset al indice
  81.                 Hserout CrLf  'Nueva línea al puerto serie
  82.                 'Envia una cadena completa al purto serie y Lcd
  83.                 WHILE _string(indice) > 0  'Bucle que recorre la cadena
  84.                         IF indice = 0 THEN Lcdcmdout LcdLine2Clear
  85.                         Lcdout _string(indice)  'Envía un elemento de la cadena al lcd
  86.                         Hserout _string(indice)  'Envia un elemento de la cadena al puerto serie
  87.                         indice = indice + 1  'Incrementa el indice
  88.                 WEND
  89.                 Hserout CrLf  'Nueva línea al puerto serie
  90.         Endif
  91. GOTO main
  92. END                                              
  93. '**************************************************************************************
  94. 'Funcion _HSERGETSTR:
  95. 'Espera la recepción de x caracteres durante cierto tiempo por el puerto serie.
  96. '_buffer: Bit que indica que están entrando datos en el puerto serie (registros de la Usart)
  97. 'Call _hsergetstr(numero de bytes a recibir, tiempo de espera en mSeg): Llama a la función
  98. '_hsergetstr: Variable que tendra el número de caracteres que se almacenaron
  99. '_string(x): Longitud del buffer serie, termina en fin de cadena (0)
  100. '_lenbuffer  'Longitud del buffer -1
  101. '--------------------------------------------------------------------------------------
  102. 'Parametros de configuración y control
  103. Symbol _buffer = PIR1.RCIF  'Si es True indica que hay datos en los registros Rx de la Usart
  104. DIM _string(51) AS Byte  'Cadena que contendrá los datos recibidos por el puerto serie
  105. 'Función metodo
  106. FUNCTION _hsergetstr(_byte AS Byte, _waitms AS Word) AS Byte
  107.         DIM _lenbuffer AS Byte  'Numero de caracteres, bytes o elementos
  108.         DIM _indice AS Byte  'Indica el elemento del vector seleccionado
  109.         DIM _delay AS Word
  110.         IF _waitms = 0 THEN _waitms = 1  'Valor mínimo de espera
  111.         _delay = _waitms
  112.         _lenbuffer = 50  'Longitud del buffer -1
  113.         _string(0) = 0  'Inicializa cadena
  114.         _indice = 0  'Primer elemento del vector
  115.         WHILE _delay > 0 AND _indice < _byte AND _indice < _lenbuffer  'Termina por tiempo o por bytes recibidos
  116.                 IF _buffer = True THEN  'Si hay datos se almacenan
  117.                         Hserget _string(_indice)  'Almacena byte
  118.                         IF _indice < _lenbuffer THEN _indice = _indice + 1  'Contador de caractes recibidos (indice del vector)
  119.                         _delay = _waitms  'Reinicia la espera
  120.                 ELSE
  121.                         'Inicia la espera por falta de caracteres
  122.                         _delay = _delay - 1
  123.                         WaitMs 1
  124.                 Endif
  125.         WEND
  126.         _string(_indice) = 0  'Añade el caracter de fin de cadena al vector
  127.         _hsergetstr = _indice  'Devuelve el número de caracteres recibidos
  128.        
  129.         'Desbloquea la Usart en modo Rx, si se bloqueo.
  130.         IF RCSTA.OERR = True THEN  'Si hay error en la Usart en modo rx
  131.                 RCSTA.CREN = 0  'Disable, continua recepción
  132.                 Hserget _indice  'Borra registros usart
  133.                 Hserget _indice
  134.                 RCSTA.CREN = 1  'Enable, Continuous Receive Enable bit*/
  135.         Endif
  136. END FUNCTION
  137.  

« Última modificación: 15 de Marzo de 2020, 09:30:10 por dogflu66 »
Saludos desde Granada, España.

Desconectado WALTER ALEJANDRO

  • PIC12
  • **
  • Mensajes: 58
Re:enviar y recibir una variable single x la uart
« Respuesta #4 en: 12 de Marzo de 2020, 19:46:08 »
copie el ejemplo LEEME CADENAS  y lo corri en el simulador pero me tira un error en el display, por eso no llegue a entenderlo del todo, aunque con solo poder enviar y recibir una variable tipo single, para mi problema actual lo solucionaria, aunque con mas tiempo pienso leer el ejemplo que me enviaste en unos dias ya que estoy de vacaciones y vuelvo en 7 dias al trabajo
desde ya muchas gracias y en cuanto pueda te tendre al tanto

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3377
    • PICKEY ELECTRÓNICA
Re:enviar y recibir una variable single x la uart
« Respuesta #5 en: 15 de Marzo de 2020, 09:39:06 »
Ok; es normal que no funcione en la simulación porque he subido la versión para descargar en mi tarjeta.
He corregido el código en el hilo anterior para que trabaje directamente sobre el simulador. :mrgreen:

De todas maneras si quieres saber porque no ha funcionado es por dos motivos:
La configuración básica de mi tarjeta la realizo desde un Include o archivo auxiliar, así que este archivo de SetUp es necesario para poder compilar.
Y segundo, la configuración automática del LCD no encuentra la configuración del LCD si esta está incluida en un archivo Include.
Saludos desde Granada, España.

Desconectado WALTER ALEJANDRO

  • PIC12
  • **
  • Mensajes: 58
Re:enviar y recibir una variable single x la uart
« Respuesta #6 en: 16 de Marzo de 2020, 16:31:59 »
lo que necesito ahora es enviar por ejemplo el numero 60,1 y recibirlo del otro lado y guardarlo en una variable ,los ejemplos que mandaste los voy a tener que estudiar con tiempo y en la fabrica me estan pidiendo una solucion.
Desde ya agradezco tu predisposicion y paciencia

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3377
    • PICKEY ELECTRÓNICA
Re:enviar y recibir una variable single x la uart
« Respuesta #7 en: 19 de Marzo de 2020, 12:33:11 »
Si es para una aplicación real deberías de establecer un pequeño código de comprobación de errores.
Te recomiendo implementar una trama de datos con el primer carácter de cabecera seguido de los 4 bytes que componen el tipo de dato Single (en otros lenguajes llamado Float) y uno o dos Bytes más de checksum. El checksum no es mas que el valor de la suma de todos los Bytes anteriores.
Saludos desde Granada, España.

Desconectado WALTER ALEJANDRO

  • PIC12
  • **
  • Mensajes: 58
Re:enviar y recibir una variable single x la uart
« Respuesta #8 en: 25 de Marzo de 2020, 17:44:01 »
gracias, ahora todo el mundo esta parado(soy de argentina)y estamos cuidandonos del coronavirus,no estoy trabajando y estoy en cuarentena obligatoria xq viaje a brasil, asi que ni bien pueda tener la compu a mano voy a intentar lo que me decis.
por el momento gracias y cuidemonos entre todos