TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: barrabaixa en 04 de Julio de 2008, 14:07:32

Título: programacion basic para conexion serie con hyperterminal
Publicado por: barrabaixa en 04 de Julio de 2008, 14:07:32
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
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: firepic en 04 de Julio de 2008, 14:29:41
Saludos barrabaixa!
Bueno según ese código, sólo estás recibiendo un valor, o sea que no vas a ver nada en el hyperterminal, aunque él realmente lo está enviando. Si deseas ver el valor recibido, deberías introducir algo así como:

Código: [Seleccionar]
AllDigital

TRISA = %00011111
TRISB = %01000000

Dim i As Byte
i = 1
Hseropen 9600
loop:
   Hserin i
   Hserout #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


Nota el "Hserout" que coloqué... es para que puedas ver lo que estás recibiendo. Por otro lado, fíjate bien que la tasa de baudios del hyperterminal sea igual a la que estás configurando en el programa. No sé qué micro estás usando, pero con las instrucciones Hserout y Hserin estás usando el hard del micro, así que presta atención a que estés usando los pines correctos. Y por supuesto has de estar usando un max232 u otro inversor TTL/RS232 verdad?
Ok nos leemos!
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: barrabaixa en 04 de Julio de 2008, 14:34:53
Hola firepic, la cosa está en que el hypterminal no me deja enviar información (por eso ya no probaba ni de recibirla), es que no sé cómo va mucho el Hypterminal, pero ayer estuve experimentando y me funcionó con otra práctica.

Efectivamente lo tengo conectado con un max232.

Voy a probar con tu código a ver si al menos recibo algo.

En el hypterminal cómo veo lo que mando y lo que recibo, en pantallas distintas?
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: firepic en 04 de Julio de 2008, 14:45:03
Si estás dando tus primeros pasos con el hyperterminal, yo te recomendaría que hicieras un programa más sencillo, sin condicionales ni nada, que simplemente envíe una cadena de texto...como la conocida "Hola mundo"....
También fíjate en que estés haciendo correctamente las conexiones en el db9. Recuerda que 5 va a masa, 2 es transmisión y 3 recepción. Esos pines son los que necesitas.
La cuestión con el hyperterminal es así:
1- Lo abres, te pregunta si quieres hacerlo predeterminado, contestas,
2- Luego llegas a la pantalla de "Nueva conexión"... eliges el puerto serial que estés usando.. COM1, COM2, etc...
3- Te aparece la ventana "Propiedades de COMx"... allí colocas la velocidad de transmisió... donde dice "bits por segundo"... lo demás lo dejas así.
4- Sale una ventanita con un campo en blanco... allí se mostrarán los datos que recibas (los que recibas, no los que envíes; como te dije, a penas pulses una tecla, el hyperterminal enviará serialmente el valor correspondiente, sin mostrar nada).

Entonces haz el código que te digo, simplemente abres el puerto y luego un lazo enviando una cadena de texto, si quieres le pones un delay para visualizar mejor.
En lo que tengas eso posteas los resultados obtenidos. Si quieres también puedes colocar el esquemático de lo que tienes conectado, a ver si está todo correcto. No te preocupes que esto de la transmisión serial al principio es posible que cueste un poco, pero no es nada del otro mundo, ya verás que funcionará.

Saludos, nos leemos!  :mrgreen:
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: barrabaixa en 04 de Julio de 2008, 15:06:15
A ver, vamos a ir paso a paso.

En la ventana de propiedades pongo 9600 bits por segundo y hasta ahora en control de flujo ponia ninguno, dejo hardware?

Entonces me aparece la ventana con el recuadro en blanco.

El programa que he hecho y programado es el siguiente ( pregunta: los puertos que no utilizo cómo los declaro, 1 o 0, entrada o salida?):

Código: [Seleccionar]
AllDigital  '0 = SORTIDA

TRISA = %00011111
TRISB = %01000000

Hseropen 9600
Hserout "h"
WaitMs 500
Hserout "o"
WaitMs 500
Hserout "l"
WaitMs 500
Hserout "a"
WaitMs 500

Voy a hacer un esquema de las conexiones del circuito, pero con qué programa lo hago para poder colocar pic's, max232, conexion serie?

Mi objetivo final (que debo alcanzar para final de año) es construir un control numérico, pero de momento voy haciendo progresos poco a poco, así que muchas gracias.



Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: firepic en 04 de Julio de 2008, 15:39:35
Sobre lo de control de flujo, yo siempre lo dejo "hardware" y funciona al pelo. Ahora, con "ninguno" también debería funcionar. La cosa es que yo prácticamente no uso el hyperterminal para este tipo de cosas, uso un programita que me parece más simpático, que se llama Tera Term Pro (http://hp.vector.co.jp/authors/VA002416/teraterm.html), es gratuito y para mí es fabuloso. Usando este soft, por defecto el control de flujo es "ninguno" y también funciona. En eso me baso para decirte que debe funcionar de ambas maneras.

Los puertos que no usas los puedes colocar como entradas o salidas, no hay problema. Yo suelo colocarlos como salida, pero cada quien tiene sus gustos.  :D

Respecto al programa que hiciste, bueno no más una observación: no hace falta que escribas un Hserout por cada byte, puedes colocar la cadena de texto completa. Algo así:
Código: [Seleccionar]
Hserout "Hola",CrLf
El CrLf es retorno de carro y salto de línea.
Te recomiendo que consultes el manual. Los manuales son el eterno aliado de cualquier programador.
En esta página lo puedes conseguir, con ejemplos muy ilustrativos:
http://www.oshonsoft.com/picbasiccompiler.html (http://www.oshonsoft.com/picbasiccompiler.html)

Para hacer el esquemático, puedes usar cualquier programa editor de circuitos. Particularmente me gusta hacer esquemas con el eagle, ese soft tiene una versión demo gratuita, la puedes descargar de su web:
http://www.cadsoft.de/download.htm (http://www.cadsoft.de/download.htm)

Ok saludos, nos leemos!  :mrgreen:
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: barrabaixa en 04 de Julio de 2008, 16:25:45
Gracias firepic,

El Tera Term ya me lo instalé y con este programa me va igual que con el Hyperterminal, o sea, no me va.

cuando dices que el CrLf es el retorno de carro y salto de línea, a qué te refieres? (he estado buscando y no encuentro su función)

Voy a hacer el esquema y lo subo.
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: firepic en 04 de Julio de 2008, 16:47:08
Retorno de carro es que vuelva al inicio de la línea. Y salto de línea es justamente eso, otra línea.
Un ejemplo.
Si no colocas el retorno de carro y salto de línea, verás algo así:

Citar
HolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHolaHola

Si colocas el retorno de carro y el salto de línea aparecerá de esta forma:

Citar
Hola
Hola
Hola
Hola
Hola

Si colocas el salto de línea pero no el retorno de carro, aparecerá así:

Citar
Hola
       Hola
               Hola
                       Hola
                                Hola

O sea, salta de línea, pero no vuelve al principio (eso es lo que hace el retorno de carro).
Si colocas el retorno de carro sin el salto de línea, verás siempre lo mismo:

Citar
Hola

Porque retornará al principio y sobreescribirá sobre lo anterior.
Espero con esto te haya quedado claro. Entonces con el soft que estás usando, al colocar la frase CrLf es ambas cosas, retorno de carro y salto de línea, a la vez. Es un detalle pero así vez mejor los datos.

Saludos, nos leemos!  :mrgreen:
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: barrabaixa en 04 de Julio de 2008, 18:35:16
Me ha quedado más que claro, una explicación muy ilustrativa;)

Aún no he hecho el esquema pero las conexiones estan bien porque ahora ya recibo "cosas", pero no lo he esperado. Recibo carácteres así:

×ÖÑ·´±Ô÷×ÖÑÔ·´±ô·´±ô·´±Ô·¶±

(http://img375.imageshack.us/img375/5899/dibuixmu2.th.png) (http://img375.imageshack.us/my.php?image=dibuixmu2.png)

Por qué recibo esto?

Gracias

PD: No lo he dicho pero estoy trabajando con un pic 16F628A, con la conexion RX y TX des de el MAX232, de manera que el PORTB.1 = ENTRADA y PORTB.2 = SALIDA. Está bien definido esto en el código?
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: firepic en 04 de Julio de 2008, 18:55:40
Pues pareciera que el hyperterminal estuviera diciendo puras groserías  :D
La conexión que tienes de pines está correcta.

Mira viejo, cuando eso sucede podría ser por:
1- La tasa de baudios que tiene configurado el hyperterminal no es igual a la tasa con la cual está enviando el micro. En tu caso no creo que sea eso, pues dices que lo estás configurando bien.
2- El hard está mal.

Me parece más posible la segunda opción. Trata de colgar el esquemático de lo que estás montando, sobre todo la conexión con el max232 al pic y a la pc.
Otra cosa, no has intentado simular el código? Yo generalmente simulo en proteus ese tipo de circuitos antes de montarlo, así me ahorro tiempo.

Ok saludos, nos leemos!  :mrgreen:

P.D. La imagen que colocaste se ve demasiado pequeña, no se distingue nada. Cuando cargues imágenes en el imageshack, fíjate en la opción de "resize"... yo generalmente la coloco a tamaño de 17" o 19" para que se aprecie bien, o la dejas a tamaño real.
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: dogflu66 en 04 de Julio de 2008, 19:21:42
Hola, no he utilizado nunca el modulo usart sin interrupciones y en este ordenador no tengo instalado el compilador.

Aparte de lo que te dijeron los compañeros pueden salir caracteres raros o basura por dos motivos mas.

Si usas oscilador interno puede que tengas que calibrarlo, el valor de calibración lo facilita el fabricante en la ultima posición de memoria flash del PIC. Normalmente este valor se pierde al programar el PIC si no se tuvo esto en cuenta.

Otro problema puede ser que el % de error del BIT RATE sea muy grande mayor al 2% para la velocidad que usas. Esto si lo puedes ver cargando el código compilado en el editor de assembler del PSI y buscando la cabecera del HSEROPEN, en las primeras líneas el compilador Basic inserta el error del BIT rate en forma de comentario, tanto en % como el numero de bit de error que equivale.

Esta es la configuracion del hyperterminal (llego tarde ya te funciona):

'programar el hyperterminal del Windows:
'Bits por segundo: 9600
'Bits de datos: 8
'Paridad: Ninguno
'Bit de parada: 1
'Control de flujo: Ninguno

Aqui te dejo unos ejemplos, son un poco avanzandos pero ahi quedan.

http://www.todopic.com.ar/foros/index.php?topic=14917.0
Busca "COMUNICACION CON EL PC"

PD: Lo siento, pero no estoy de acuerdo con la opinion de que un simulador ahorra tiempo.
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: firepic en 04 de Julio de 2008, 19:54:43
PD: Lo siento, pero no estoy de acuerdo con la opinion de que un simulador ahorra tiempo.

Maestro dogflu, no es que trabajar con simulador ahorre tiempo, yo dije "me ahorra tiempo". O sea, en mi caso particular. Porque es que no tengo headers como para programar y de una vez probar... entonces tengo que sacar el pic del circuito, grabarlo, volver a colocarlo en el circuito...
En cambio en proteus puedo simular el código, hay muchos errores de programación que logro depurar antes de grabar al circuito final. Otra cosa es que no tengo osciloscopio... entonces en proteus puedo ver con el "analizador digital" las salidas del micro... por ejemplo he estado trabajando con interfaz spi y allí puedo ver su compartamiento. Creo que gran porcentaje de los errores por código pueden ser resueltos usando el proteus. Y luego que funciona allí, pues se tiene mayor certeza que el programa está bien, y si no funciona en físico, se duda más del hardware.
En verdad a mí me es una ventaja grandísima. 
Pero por supuesto es sólo mi opinión, entiendo que somos personas diferentes y tenemos modos diferentes de trabajar.  :lol:

Un cordial saludo, nos leemos!  :mrgreen:
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: barrabaixa en 06 de Julio de 2008, 12:38:32
El problema de baudios no puede ser porque los dos estan a 9600, y las conexiones las he revisado a fondo y estan todas OK. He simulado el código y el problema no está en eso, pues funciona bien.

Veo probable el tema del oscilador interno, ya que no he tenido en cuenta el valor de calibración. Ahora no dispongo de PIC's nuevos para comprobar este valor, pero cómo lo puedo calibrar? (Puede ser que ésta también sea la causa por la que el WinPic no me reconozca los PICs?)

dogflu66, los ejemplos que me pasas los vi pero para son demasiado avanzados para mi nivel, quizá dentro de un tiempo sea capaz de entenderlos.

Saludos y gracias

Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: navaismo en 06 de Julio de 2008, 19:01:31
A veces no solo es el oscilador interno si no la manera en que envias los datos, aunque esten a 9600 baudios no quiere decir que ambos los tengas en modo TRUE o modo INV. deberias checar por ese lado y un consejo la simulacion se queda en eso, la practica siempre  le gana a la teoria y com esta vez a la simulacion.
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: firepic en 07 de Julio de 2008, 12:16:05
Con eso sí estoy de acuerdo maestro navaismo, la práctica siempre le gana a la simulación... sin duda alguna.  :lol:
Ahora bien, no creo que el problema sea tenerlo en modo TRUE o INV, porque él está usando el comando HSEROUT, que usa el hard del micro, y por tanto siempre está en modo TRUE. Que yo recuerde (corrígeme si estoy equivocado) la forma INV se puede habilitar cuando estás trabajando con el comando SEROUT.
Yo le aconsejaría a barrabaixa que coloque un cristal oscilador y haga la prueba, así puede saber si es el oscilador o no.
Un cordial saludos, nos leemos!  :mrgreen:
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: RALF2 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
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: dogflu66 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
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: dogflu66 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
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: barrabaixa 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!
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: firepic 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:
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: dogflu66 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.
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: dogflu66 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
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: barrabaixa 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!
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: dogflu66 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.
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: barrabaixa 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!
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: firepic en 09 de Julio de 2008, 11:15:15
Felicitaciones Barrabaixa, enhorabuena!  :-/  :-/  :-/
Saludos, nos leemos!  :mrgreen:
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: dogflu66 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.
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: dogflu66 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.
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: kamisama 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.
Título: Re: programacion basic para conexion serie con hyperterminal
Publicado por: luis_tercero 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