Autor Tema: programacion basic para conexion serie con hyperterminal  (Leído 22079 veces)

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

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #15 en: 07 de Julio de 2008, 13:02:02 »
Buenas,

Estoy programando con el BASIC compiler del PIC Simulator IDE, ya que no me entiendo con ensamblador ni otros lenguajes. Lo que quiero es hacer pruevas de transmision de datos entre el PC i el PIC. Lo tengo todo bien conectado y con salidas a led's para ir experimentando.

Este código seria para que depende del número que introduzca, si es más grande de 5 o más pequeño, se encienda un led u otro. Es correcto?

AllDigital 

TRISA = %00011111
TRISB = %01000000

Dim i As Byte
i = 1
Hseropen 9600
loop:
   Hserin i
      If i > 5 Then
      PORTA.1 = 1
      PORTA.2 = 0
      Endif
      If i < 5 Then
      PORTA.2 = 1
      PORTA.1 = 0
      Endif
Goto loop

Pero no sé por qué el Hyperterminal no me deja poner números ni letras, no escribe nada, o sólo carácteres estraños, por qué?

Gracias por todo

PD: las estructuras del BASIc estan aquí http://www.oshonsoft.com/picbasiccompiler.html#11


Que tal amigos!
barrabaixa, dejame ver si te puedo ayudar aunque en pic simulator no he trabajado aun  :mrgreen:  segun veo en el codigo de arriba, si el numero recibido es mayor de 5 enciendo un led y si es menor de 5 enciendo otro. Ahora bien si las velocidades (baud rate, y si el formato de recepcion y transmision es el mismo 8,N,1) puedes hacer lo siguiente; primero como sabes debes utilizar un max232 preferiblemente para comunicarte con la PC eso lo doy por hecho sino en el foro hay informacion al respecto  :mrgreen: 
Luego si estas utilizando el hserin debes tener mucho cuidado al trabajar con este, ya que, como esa instruccion se trabajar con el usart del micro y este tiene un buffer que te permite recibir solo dos caracteres  :shock:  y si le envias por ejemplo tres o mas se bloquea el usart y tienes que resetearlo para poder trabajar con el  :? eso es muy importante, lo otro es que al utilizar el hserin debes utilizar los pines tx y rx que estan diseñados para ese fin de lo contrario no te servira.  Lee con mucho cuidado el data sheet del micro que estes utilizando, para que puedas entender bien como funciona el usart del pic, muy importante.
Lo otro al utilizar el usart del pic este no puede invertir los niveles logicos (0 y 1) por lo que hace falta el max232 o equivalente.
Si todo esto esta bien entendido y aplicado vamos por buen camino  :mrgreen: sino a leer el data sheet y el manual del compilador sobre el hserin  :D

Tu haces una comparacion:

If i > 5 Then
      PORTA.1 = 1
      PORTA.2 = 0
      Endif
      If i < 5 Then
      PORTA.2 = 1
      PORTA.1 = 0
      Endif

recuerda que cuando pulsas la tecla 5 en el teclado (keyboard  :D) lo que vas es a recibir es el caracter ascci correpondiente a esa tecla (5)  el cual es el 53 en decimal, por lo que deberias colocar en el codigo asi:
If i > "5" Then
      PORTA.1 = 1
      PORTA.2 = 0
      Endif
      If i < "5" Then
      PORTA.2 = 1
      PORTA.1 = 0
      Endif
Para que el compilador sepa que es el caracter ascii "5" y no 5 ya que ese caracter pertenece al ENQ (enquire) :-)
Lo otro es que debes colocar una resistencia digamos de 10k del positivo de la fuente a la entrada rx del pic, el porque de ello es muy sencillo, despues que haz estado programando un pic como un loco 20000000000 veces probando la comunicacion serial  :D :g)   :shock: :? :(
Bueno la idea es que cuando el micro no este conectado al puerto serial o este se encuentre desconectado el pin no reciba ruido y empiese el hserin a volverse loco y comience a captar cualquier ruido subespacial  :D

Bueno sigue estos consejos y veras que funciona, sino pues utiliza el serin que no se lia tanto como el hserin, yo lo uso mucho por eso  :mrgreen:

Saludos
« Última modificación: 07 de Julio de 2008, 13:06:50 por RALF2 »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #16 en: 08 de Julio de 2008, 09:03:40 »
Aqui te dejo el programa corregido para que te funcione en el simulador:

Código: FreeBasic
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. '************VERSION SOLO SIMULADOR*************
  5. 'PIC16F88
  6. 'CONEXION POR RS232 AL HYPERTERMINAL
  7. 'USO DEL MODULO USART INTERNO DEL PIC
  8. '***********************************************
  9. AllDigital
  10. TRISA = %00000000  'SALIDAS
  11. TRISB = %00000000  'SALIDAS
  12. TRISB.2 = 1  'ENTRADA RX, POR HARD, MODULO USART
  13. 'TRISB.5 = 0  'SALIDA TX, POR HARD, MODULO USART
  14. 'TRISA.2 = 0  'SALIDA
  15. 'TRISA.1 = 0  'SALIDA
  16. '-----------------------------------------------
  17. Dim i As Byte
  18. i = 1
  19. '-----------------------------------------------
  20. Hseropen 9600  'CONFIGURA EL MODULO USART, HARD
  21. '-----------------------------------------------
  22. main:
  23.         Hserin i  'SE QUEDA PARAD0 HASTA RECIBIR UN CARACTER
  24.         If i > "5" Then  '_"5" REPRESENTACION GRAFICA, ES CAMBIADO
  25. '_____________________POR EL COMPILADOR A SU CODIGO NUMERICO ASCII
  26.                 PORTA.1 = 1
  27.                 PORTA.2 = 0
  28.         Endif
  29.         If i < "5" Then
  30.                 PORTA.2 = 1
  31.                 PORTA.1 = 0
  32.         Endif
  33. Goto main
  34. End
« Última modificación: 08 de Julio de 2008, 09:10:45 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #17 en: 08 de Julio de 2008, 09:08:08 »
Lo mismo que te ha dicho antes Ralf... :mrgreen:
Te dejo un enlace para que puedas ver los codigos ASCII
que corresponden a los caracteres graficos, cuando pulsas
una tecla en el pc este envia el dodigo correspondiente a ese
caracter grafico que puedes ver en la tabla.

http://www.asifunciona.com/tablas/ascii/codigo_ascii.htm

El programa anterior solo funciona en el simulador.
Mas tarde te dejare una version que funcione tambien
en la realidad.

Aqui te dejo el video de la simulacion:

http://rapidshare.com/files/128104400/Ejemplo_UART_por_HARD.avi.html
« Última modificación: 08 de Julio de 2008, 09:31:09 por dogflu66 »
Saludos desde Granada, España.

Desconectado barrabaixa

  • PIC12
  • **
  • Mensajes: 50
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #18 en: 08 de Julio de 2008, 10:15:11 »
Muchas gracias!

Sobre el código, aclarar que estoy trabajando con un PIC 16F628A, por si cambia algo. No entiendo las dos primeras definiciones de CONF_WORD i CONF_WORD_2, para qué sirven?

Sobre la simulación, muy bueno el vídeo, gracias, pero no entiendo esto de que sólo funcione para la simulación y en la realidad no funciona, cómo es esto, por los carácteres que no estan pasados en ASCII?

Saludos!

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #19 en: 08 de Julio de 2008, 10:27:56 »
Excelentes observaciones las que han hecho Ralf y el maestro dogflu.
Barrabaixa, no has logrado hacer el esquemático aún? Sería bueno ver cómo estás conectando el MAX232, tal vez ahí esté el error.
De no ser eso entonces el problema tiene que estar en la configuración del oscilador interno, eso entonces espero te lo aclare mejor el maestro dogflu, que es un experto con el PSI.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #20 en: 08 de Julio de 2008, 12:02:09 »
Muchas gracias!

Sobre el código, aclarar que estoy trabajando con un PIC 16F628A, por si cambia algo. No entiendo las dos primeras definiciones de CONF_WORD i CONF_WORD_2, para qué sirven?

Sobre la simulación, muy bueno el vídeo, gracias, pero no entiendo esto de que sólo funcione para la simulación y en la realidad no funciona, cómo es esto, por los carácteres que no estan pasados en ASCII?

Saludos!

Si utilizas un 16F628A puede que no tengas problema con el oscilador interno ya que este es bastante estable en este micro.

Es la configuración del registro general del micro (fuses), es una configuración básica que funciona en la realidad, al pulsar "Generate Basic Code" previamente habiendo configurado la ventana el PSI los añade al programa, de esta forma quedan en nuestro código fuente y así no hay que volver a programarlos a mano, ni corremos el riesgo de olvidarlos. Esta configuración es imprescindible hacerla a la hora de compilar el programa para posteriormente descargar al PIC, sin embargo no es tan critica en los simuladores:

Options/Configuracion de Bit/Generate Basic Code y añade de forma automática estas dos líneas al programa:

Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc

La forma de utilizar el modulo USART no es la adecuada, en la realidad dará problemas de continuo, mientras que en el simulador siempre lo dará correcto.

Ya se ha dicho muchas veces, que funcione la simulación no quiere decir que funcione en la realidad.
El simulador solo es una guía y tiene que estar dirigido por un profesional. Los ejercicios creados por un profesional para simulación son magníficos, pero te en cuenta que si realmente es un profesional los habrá montado físicamente antes de darles el visto bueno.
« Última modificación: 08 de Julio de 2008, 12:04:51 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #21 en: 08 de Julio de 2008, 13:53:59 »
Esta version si funciona tanto en el Simulador como en la realidad:

Código: FreeBasic
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. '***********VERSION SIMULADOR Y HARD*************
  5. 'PIC16F88
  6. 'CONEXION POR RS232 AL HYPERTERMINAL
  7. 'USO DEL MODULO USART INTERNO DEL PIC
  8. 'programar el hyperterminal del Windows:
  9. 'Bits por segundo: 9600
  10. 'Bits de datos: 8
  11. 'Paridad: Ninguno
  12. 'Bit de parada: 1
  13. 'Control de flujo: Ninguno
  14. '***********************************************
  15. '-----------------------------------------------
  16. Dim i As Byte
  17. i = 53  'i = 53 = "5"
  18. '-----------------------------------------------
  19. AllDigital  'Los pin seran I/O digitales
  20. CMCON = 0x07  'comparador a off
  21. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  22. TRISA = %00000000  'SALIDAS
  23. TRISB = %00000000  'SALIDAS
  24. TRISB.2 = 1  'ENTRADA RX, POR HARD, MODULO USART
  25. 'TRISB.5 = 0  'SALIDA TX, POR HARD, MODULO USART
  26. 'TRISA.2 = 0  'SALIDA
  27. 'TRISA.1 = 0  'SALIDA
  28. '-----------------------------------------------
  29. Hseropen 9600  '_CONFIGURA EL MODULO USART (HARD)
  30. '________________Exact baud rate: 9615, Baud rate error: 15 (.156%)
  31. '________________Baud rate error <= 2% = ok.
  32. PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
  33. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
  34. Enable  '_INTCON.GIE habilita todas las interrupciones globales y
  35. '_________redirecciona el vector de interrupcion a "On Interrupt".
  36. '-----------------------------------------------
  37. main:
  38.         If RCSTA.OERR = 1 Then  '_Desbloquea el modulo USART en Rx en el caso
  39. '____________________________de superarse su bufer de entrada.
  40.                 RCSTA.OERR = 0
  41.                 RCSTA.CREN = 0
  42.                 RCSTA.CREN = 1
  43.         Endif
  44.  
  45.         If i > "5" Then  '_"5" REPRESENTACION GRAFICA, ES CAMBIADO
  46. '_____________________POR EL COMPILADOR A SU CODIGO NUMERICO ASII.
  47.                 PORTA.1 = 1
  48.                 PORTA.2 = 0
  49.                 i = "5"  'Impide que se reinicie la rutina
  50.         Endif
  51.  
  52.         If i < "5" Then
  53.                 PORTA.2 = 1
  54.                 PORTA.1 = 0
  55.                 i = "5"  'Impide que se reinicie la rutina
  56.         Endif
  57.  
  58. Goto main
  59. End                                              
  60. On Interrupt  'Comienza las rutinas de las interrupciones (detiene las interrupcones)
  61. Save System  'Guarda los valores del sistema
  62.         If PIR1.RCIF = 1 Then  '_comprueba que está la interrupcion activa, si solo
  63. '___________________________se esta usando una interrupcion es redundante, lo
  64. '___________________________pongo por costumbre.
  65.                 Hserin i  'lee el caracter del bufer (fifo) del modulo usart y lo almacena en i
  66.                 Hserout i  'devuelve el caracter recibido
  67.         Endif
  68.         PIR1.RCIF = 0  '__ Borra el flag de interrupcion de la usart, en realidad
  69. '____________________ Hserin ya borra este flag, por lo que es redundante el
  70. '____________________ ponerlo, lo pongo por costumbre.
  71. Resume  'habilita las interrupciones              
  72. End

PD: Cuando pueda vere de hacer una version operativa para el 16F628A
Saludos desde Granada, España.

Desconectado barrabaixa

  • PIC12
  • **
  • Mensajes: 50
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #22 en: 08 de Julio de 2008, 18:52:49 »
Muchas gracias dogflu66, un gran trabajo :-) :-)

A ver si mañana voy a Barcelona y compro PIC's, que no tengo. Compraré ya el el 16f88 y así lo pruevo también

Ya te contaré

PD: Prometo el circuito!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #23 en: 08 de Julio de 2008, 22:48:20 »
Después de darle muchas vueltas al datasheet del PIC16F628 no encuentro el registro de calibración del oscilador interno. Por lo que parece que este micro no se puede utilizar para comunicaciones usando el oscilador interno, hay que usarlo a la fuerza con cristal externo. Después he mirado por el foro hilos antiguos y también llegaron a la misma conclusión que yo. De todas formas he grabado un Pic16F628A con el programa anterior adaptado para este y no funciona la comunicación entre el circuito y el PC. Lo he probado en la Pic EBasic que es compatible con el Pic16F628. Asi que te recomiendo que te hagas de algun 16F88 que es un micro compatible con el 16F628 (exeptuando los pin de la uar), pero mucho mas completo.

De todas formas dejo el programa para el 16F628A:

Código: FreeBasic
  1. Define CONF_WORD = 0x3f10
  2. Define CLOCK_FREQUENCY = 4
  3. '***********VERSION SIMULADOR Y HARD*************
  4. 'PIC16F628A
  5. 'CONEXION POR RS232 AL HYPERTERMINAL
  6. 'USO DEL MODULO USART INTERNO DEL PIC
  7. 'programar el hyperterminal del Windows:
  8. 'Bits por segundo: 9600
  9. 'Bits de datos: 8
  10. 'Paridad: Ninguno
  11. 'Bit de parada: 1
  12. 'Control de flujo: Ninguno
  13. '***********************************************
  14. '-----------------------------------------------
  15. Dim i As Byte
  16. i = 53  'i = 53 = "5"
  17. '-----------------------------------------------
  18. AllDigital  'Los pin seran I/O digitales
  19. CMCON = 0x07  'comparador a off
  20. PCON.OSCF = 1  'oscilador interno 4Mhz
  21. TRISA = %00000000  'SALIDAS
  22. TRISB = %00000000  'SALIDAS
  23. TRISB.1 = 1  'ENTRADA RX, POR HARD, MODULO USART
  24. 'TRISB.2 = 0  'SALIDA TX, POR HARD, MODULO USART
  25. 'TRISA.2 = 0  'SALIDA
  26. 'TRISA.1 = 0  'SALIDA
  27. '-----------------------------------------------
  28. Hseropen 9600  '_CONFIGURA EL MODULO USART (HARD)
  29. '________________Exact baud rate: 9615, Baud rate error: 15 (.156%)
  30. '________________Baud rate error <= 2% = ok.
  31. PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
  32. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
  33. Enable  '_INTCON.GIE habilita todas las interrupciones globales y
  34. '_________redirecciona el vector de interrupcion a "On Interrupt".
  35. '-----------------------------------------------
  36. main:
  37.         If RCSTA.OERR = 1 Then  '_Desbloquea el modulo USART en Rx en el caso
  38. '____________________________de superarse su bufer de entrada.
  39.                 RCSTA.OERR = 0
  40.                 RCSTA.CREN = 0
  41.                 RCSTA.CREN = 1
  42.         Endif
  43.  
  44.         If i > "5" Then  '_"5" REPRESENTACION GRAFICA, ES CAMBIADO
  45. '_____________________POR EL COMPILADOR A SU CODIGO NUMERICO ASII.
  46.                 PORTA.1 = 1
  47.                 PORTA.2 = 0
  48.                 i = "5"  'Impide que se reinicie la rutina
  49.         Endif
  50.         If i < "5" Then
  51.                 PORTA.2 = 1
  52.                 PORTA.1 = 0
  53.                 i = "5"  'Impide que se reinicie la rutina
  54.         Endif
  55.  
  56. Goto main
  57. End                                              
  58. On Interrupt  'Comienza las rutinas de las interrupciones (detiene las interrupcones)
  59. Save System  'Guarda los valores del sistema
  60.         If PIR1.RCIF = 1 Then  '_comprueba que está la interrupcion activa, si solo
  61. '___________________________se esta usando una interrupcion es redundante, lo
  62. '___________________________pongo por costumbre.
  63.                 Hserin i  'lee el caracter del bufer (fifo) del modulo usart y lo almacena en i
  64.                 Hserout i  'devuelve el caracter recibido
  65.         Endif
  66.         PIR1.RCIF = 0  '__ Borra el flag de interrupcion de la usart, en realidad
  67. '____________________ Hserin ya borra este flag, por lo que es redundante el
  68. '____________________ ponerlo, lo pongo por costumbre.
  69. Resume  'habilita las interrupciones              
  70. End

PD: Ojo, los pin de la uar cambian de posicion de un micro a otro.
« Última modificación: 09 de Julio de 2008, 12:49:33 por dogflu66 »
Saludos desde Granada, España.

Desconectado barrabaixa

  • PIC12
  • **
  • Mensajes: 50
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #24 en: 09 de Julio de 2008, 10:58:23 »
Dogflu, muchas gracias otra vez por tu trabajo.
Esta mañana he ido a comprar PIC's y no tenian del 16f88, así que los que tengo son 16f628A.
He provado con tu código y no funciona, así que me he decidido a volver a provar con algo simple, y HA FUNCIONADO!

El código es el siguiente

Código: [Seleccionar]
AllDigital

TRISA = %00000000  'SALIDAS
TRISB = %01000000  'SALIDAS. bit 1 = entrada

Dim i As Byte

Hseropen 9600

prova:
Hserin i
Hserout #i
If i > "5" Then  'si es más grande que 5,
Hserout "gran"  'envia el mensaje "gran" (grande)
Else 'sino envia "petit" (pequeño)
Hserout "petit"
Endif

Goto prova
End       

Así que me parece que he conseguido el objetivo, muchas gracias a todos!

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #25 en: 09 de Julio de 2008, 11:15:15 »
Felicitaciones Barrabaixa, enhorabuena!  :-/  :-/  :-/
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #26 en: 09 de Julio de 2008, 12:21:26 »
Hay que controlar obligatoriamente el bloqueo de la usart, ese programa es muy simple por eso funciona. Pero tarde o temprano fallara.

Y te dio la casualidad que el % de error de ese PIC del oscilador interno esta dentro de parámetros, pero simplemente no es fiable, ya que con otro PIC igual el % por 100 puede ser ligeramente mas elevado y tampoco funcionara.

Me extraña que no funcione mi programa, ¿probaste a descargarlo después de cambiarle los pin TX y Rx que los tenia equivocados?.

Tu programa no me funciona en ninguno de los tres PIC 16F628A que tengo.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #27 en: 09 de Julio de 2008, 12:51:51 »
PD: despues de buscar mucho he logrado encontrar un micro que funciona.
Funcina tanto tu programa como el mio.
El mio tenia un bit deshabilitado de las pruebas.
Saludos desde Granada, España.

Desconectado kamisama

  • PIC16
  • ***
  • Mensajes: 151
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #28 en: 26 de Julio de 2008, 22:39:21 »
Hola y no probaste con el modulo de PIC simulator? para ver como recibe. Si por lo menos la cantidad de caracteres tiene relacion, quiza este en modo INVERTIDO Polaridad TX/Rx.
Si no hay relacion pero se parece en algo, es la velocidad en baudios.

Desconectado luis_tercero

  • PIC10
  • *
  • Mensajes: 6
Re: programacion basic para conexion serie con hyperterminal
« Respuesta #29 en: 03 de Abril de 2009, 12:39:37 »
Que bueno leer too esto, me motivo cada vez mas para aprender miros. Les comento qe sy nuevisimo en todo esto lo as parecido que he aprendido a programar haredware es en fpga(vhdl), pero me ha parecido mas chevere los micros.

Yo tengo que hacer lo mismo que aqui  pero no en basic sino en C y con un ATmega 16. Pues la verdad solo necesito que se vea una palabra en el hyperterminal de windows como el "hola mundo" yo se que para ustedes debe ser supersencillisimo, pero mara mi pues es un misterio.

Les pido el favor que  me ayuden. lo unico que he realizado es un DAQ pero  ni entiendo el codigo (no del todo eee). Les dejo lo que monte en proteus y la simulacion en proteus.

http://www.megaupload.com/?d=YZ840PZ6


 

anything