Autor Tema: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...  (Leído 7396 veces)

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« en: 15 de Noviembre de 2007, 17:15:48 »
Un PIC182550, corriendo a 48 Mhz (PLL y eso), con el Timer1 configurado como T1_INTERNAL | T1_DIV_BY_1, debe contar ...

Un tick cada 1 / 48.000.000 * 4 o sea cada 0,083 uS (microsegundos)

Un Bit transmitido a 9.600 Baudios tarda 1 / 9.600 de segundo en pasar o sea 104 uS

Contando con el Timer1 deben pasar 104 / 0,083 ticks de Timer1 para un Bit a 9.600 baudios

O sea 1.253 Ticks de Timer1 por Bit a 9.600 baudios.

Si configurara o configurase la Interrupción por Desbordamiento de Timer1 para que saltase cada 104 uS debería "cebar" el Timer1 en cada interrupción con 65.536 - 1.253 = 64.283 para que al ser incrementado y alcanzar su desbordamiento me "avise" exactamente cada 104 uS.

¿No? ¿Es correcto mi discurso? ¿Es coherente? ¿Me he equivocado en los cálculos? ¿Es cierto? ¿Es una rosa? ¿Es un clavel?  :shock: :shock: :shock:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #1 en: 15 de Noviembre de 2007, 18:19:27 »
Creo que esta bien, pero como haras el cambio entre velocidades??
Y la velocidad de 115.000 Bps que necesitas con que la haras?? :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #2 en: 15 de Noviembre de 2007, 18:36:22 »
No, esto es para otro tema. Es que tengo que comunicar con un cacharro que usa 2 bits de stop y el PIC solo detecta un bit de Stop por lo que cada vez que leo un byte pierdo un bit. así que me he puesto a desarrollar mi USART particular por Soft.

Detecto el flanco del bit de Start y sé que me van a llegar 12 bits completos a 9600 baudios, 1 bit cada 104 uS por lo que arranco el timer1 para recoger esos bits exactamente cada 104 uS.

Eso es lo que estoy haciendo, pero me encuentro que estoy recogiendo todos los bytes pero no tienen nada que ver con lo que sé que debería recoger, así que estoy cometiendo algún error y lo primero de lo que quiero asegurarme es de que mis timmings son los correctos ... y de ahí esta pregunta.  :mrgreen:

P.D. Este hilo es consecuencia de lo tratado en #use RS232 1 bit Start, 8 bits de Data, 1 Parity (E) y ... ¿dos bits de Stop? y que ya estoy poniendo en marcha.
« Última modificación: 15 de Noviembre de 2007, 18:38:34 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #3 en: 15 de Noviembre de 2007, 18:48:51 »
Hola Diego, creo que el error esta en que el primer bit, lo tienes que leer aen la mitad del recorrido, es decir 104/2=52 uS, asi lo "miras" en la mitad del bit, luego si, sigues con tus 104 uS  :mrgreen:

espero sea eso!
Un abrazo!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #4 en: 15 de Noviembre de 2007, 18:53:26 »
Si, barbaro el calculo, Diego, pero no termina alli...
El bit debe ser muestreado a determinado grado de avance (creo que al 30% dice la norma), y aunque hagas un calculo justo de los microsegundos de cada bit estas defasando indirectamente con las operaciones de reposicion del timer al valor de precarga.
Te recomiendo que estudies muy bien los tiempos que utilizas al hacer las recargas del timer, que por ahi se te escapan las liebres... :mrgreen: :mrgreen:
Ese tiempo debes restarlo a los microsegundos que te da cada bit, es la unica forma de tener un bit exacto.
Ademas si bien se permite un error de desfase, este cuanto mas parecido a cero mejor, especialmente si es por software. :lol:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #5 en: 15 de Noviembre de 2007, 18:54:14 »
Bueno, me ganaste Norberto!! :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #6 en: 15 de Noviembre de 2007, 19:09:35 »
Si, queridos Norberto y Marcos, lo he tenido en cuenta.

De hecho lo que hago para recoger un Byte es los siguiente:

  • Con la INT_TIMER1 deshabilitada habilito la INT_EXT para detectar el flanco de bajada del bit Start.
  • Cuando se dispara INT_EXT la deshabilito para que no vuelva a activarse y sé que este bit va a tardar los 104 uS de rigor así que precargo el TIMER1 con 104+52 uS y habilito la INT_TIMER1 para que se dispare justo en el centro del siguiente Bit, que es el Bit 0 de my Byte.
  • Cuando se dispara INT_TIMER1 recogo ese Bit y ahora ya precargo el TIMER1 solo con 104 uS para que se me dispare ahora en el centro del siguiente Bit ...
  • Repito esto último hasta recoger todos los Bits del Byte, el Bit de Paridad y los dos Bits de Stop.
  • Voy contando los bits que recojo y cuando llego a 12 he terminado y deshabilito definitivamente INT_TIMER1 y vuelvo a habilitar INT_EXT para esperar al siguiente Byte.

Como podéis ver primero espero 104+52 uS para saltarme el Bit Star y aterrizar justo en el centro del primer Bit de datos y después varias veces 104 uS, tantas como Bits quiero leer.  :mrgreen:
« Última modificación: 15 de Noviembre de 2007, 19:22:13 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #7 en: 15 de Noviembre de 2007, 19:20:41 »
Edite porque me confundiste con Mario   :mrgreen: :mrgreen:

Bueno te recuerdo revisar esto:

Citar
Te recomiendo que estudies muy bien los tiempos que utilizas al hacer las recargas del timer, que por ahi se te escapan las liebres...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #8 en: 16 de Noviembre de 2007, 01:33:47 »
Don RedPic:

¿No? ¿Es correcto mi discurso? ¿Es coherente? ¿Me he equivocado en los cálculos? ¿Es cierto? ¿Es una rosa? ¿Es un clavel?  :shock: :shock: :shock:

Los calculos son correctos, lo unico que te recomiendo es que uses mayor exactitud, son 1250 tick

65535 - 1250 = 64285 (más lo que demore la interrupción en ejecutarce hasta el punto de lectura del bit)

Tal como comentó Norberto el primero (bit start) debés detectarlo a la mitad, luego los otros sí cada 104us

Por lo demas es todo correcto.

Un saludo.

Atte. CARLOS.

Pda. RS-232, lo e sufrido vastante por hardware  :mrgreen:
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #9 en: 16 de Noviembre de 2007, 03:11:29 »
Efectivamente son 1250, querido Diego.
De todas formas, aparezco por aquí para aconsejarte una herramienta fantástica para ajustar tiempos con precisión: el simulador de MPLAB. Tiene una ventana que te ayuda bastante porque te indica exactamente en qué microsegundo está ejecutándose cada instrucción.

Tienes que tener en cuenta los ciclos que se pierden al entrar en la interrupción, y antes de hacer la precarga del timer con un nuevo valor.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #10 en: 16 de Noviembre de 2007, 08:28:19 »
Diego, consideraste la posibilidad de usar también el CCP en modo de comparación? Lo veo mucho más adecuado para tus propósitos que andar calculando desbordes del timer1.

Alguna vez se me presentó el mismo problema que a vos pero lo resolví en assembly con un 16F876 a 20MHz.  El C se complica cuando se necesitan timings muy precisos como en una comunicación asíncrona como la que planteas sobre todo si recibes "muchos" bytes es probable que empieces a tener un desfasaje.

Ahora te propongo un cambio de enfoque a tu problema que según entiendo es que el dispositivo que deseas controlar trabaja con 1 bits start - 8 bits de datos - 1 bit de paridad - 1 bit de stop

En ese esquema me parece más simple hacer lo siguiente

1) Al recibir no tendrás problemas ya que tener 2 bits de stop no te afectará en nada.  Tu usart lo tomará como que hay un tiempo sin recibir nada (se mantiene la línea en Alto)

2) Al enviar podrías detectar el bit TMRT de la usart el cual te indica cuando salió el ultimo bit, a partir de allí esperas el tiempo del que hablas.



- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #11 en: 16 de Noviembre de 2007, 08:51:24 »
Igualmente en modo CPP hay que realizar la recarga del valor, pero me parece una buena opcion la que plantea Maunix....
Muy buena Mauricio !! :-/
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #12 en: 16 de Noviembre de 2007, 08:58:47 »
Igualmente en modo CPP hay que realizar la recarga del valor, pero me parece una buena opcion la que plantea Maunix....

Marcos creo que te estas confundiendo.  En modo CCP el valor queda fijo pero se resetea solito el timer (si lo configuras en el modo adecuado).

 :) :) :)

También está el timer2 y su registro PR2 pero no es tan preciso para delays largos.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #13 en: 16 de Noviembre de 2007, 09:01:26 »
O sea que precargas el valor una sola vez y despues cada vez que el valor del comparador se supera, vuelve al original ??
Joya !! :-/ :-/
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: 1 Bit a 9600 baudios y un Timer1 a 48 Mhz cuenta ...
« Respuesta #14 en: 16 de Noviembre de 2007, 09:09:04 »
O sea que precargas el valor una sola vez y despues cada vez que el valor del comparador se supera, vuelve al original ??
Joya !! :-/ :-/

La secuencia es así

1) cargas el comparador con el valor a comparar adecuado para los 104useg
2) Disparas el timer
3) cuando el valor del timer es igual al comparador -> se enciende el flag del comparador.  Acá uno puede configurar si el timer se vuelve a 0 o si sigue corriendo (en este caso si solo se lo hará correr un ciclo, da lo mismo).
y el ciclo se repite continuamente


En el caso de diego lo que sugiero es que cargue el CCP, dispare el timer cuando es momento de contar para un segundo bit de stop y cuando salta el flag , detiene el timer1, borra el flag del ccp1 , pone el timer1 a 0 (para dejarlo listo para la proxima comparacion) y ya puede enviar otro dato completo.

 :)

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything