Autor Tema: Fundamentos de la Transmisión Síncrona  (Leído 7297 veces)

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
Fundamentos de la Transmisión Síncrona
« en: 06 de Diciembre de 2007, 18:40:14 »
Fundamentos de la Transmisión Síncrona
Una visión general de qué es, para qué sirve y cómo se utiliza.

Para intentar acercarnos de forma clara a qué es una transmisión Síncrona voy a utilizar mi habitual forma indirecta de atacar las cosas y vamos a empezar por su antagonista por naturaleza: la transmisión Asíncrona.

Primero démosle un vistazo a su propio nombre y veamos qué significa esa palabreja de Asíncrona. Etimológicamente significa exactamente "sin reloj" o sea que no hay ninguna señal que marque los tiempos en que los datos deben leerse o están disponibles.
 
Esto significa que en una transmisión Asíncrona tanto la información transmitida como los tiempos en que ésta debe leerse son uno y todo va junto. El mejor ejemplo de este tipo de transmisión es la transmisión serie RS232. En esta forma asíncrona de transmitir información binaria cada bit es representado por un estado Alto o Bajo de la línea de transmisión durante un tiempo predeterminado. Este tiempo debe ser siempre el mismo, dentro de los márgenes de tolerancia normales y que son de aproximadamente de un 2% del valor nominal.
 
Fijaos por tanto que esto de Asíncrono no significa sin tiempo sino bien al contrario significa con tiempos perfectamente definidos y acordados de antemano ya que de otra forma no habría manera de poner de acuerdo al emisor y al receptor en cuanto a cuando está disponible cada bit para su lectura.
 
El sistema asíncrono funcionaría entonces así: En cuanto el receptor detecta el primer cambio de estado, una línea que pasa de Alto a Bajo por ejemplo en el RS232, sabe con total seguridad que tras cierto número de microsegundos transcurridos tendrá disponible el primer bit transmitido por el emisor, y tras otro igual número de microsegundos tendrá el segundo bit y ... así hasta el último bit que debe recibir.
 
Se detecta el primer flanco de bajada y a partir de ahí solo debe mirar, cada plazo de tiempo acordado, en qué estado está la línea de transmisión, si alto o bajo, para asignar ese valor a cada uno de los bits a recibir.
 
De esta forma cuando decimos que una comunicación RS232 es a 8 bits y a 9600 baudios lo que estamos diciendo es que vamos a recibir 8 estados consecutivos de la línea de transmisión, separados cada uno de ellos 1/9600 segundos, o sea un estado cada 104 microsegundos, siendo el primero el estado que tenga tras los primeros 104 microsegundos transcurridos desde el primer flanco de bajada.
 
A 19.200 baudios el "tiempo" de cada bit será la mitad, 52 microsegundos, y a 4.800 baudios será el doble o sea 208 microsegundos. A esta unidad de tiempo la conocemos como el etu de una transmisión, iniciales de elementary time unit. Abajo podemos ver una representación gráfica de esto que estamos tratando, la transmisión Asíncrona de un byte compuesto por 8 bits (un típico 8N1 9.600)



Una conclusión a la que podemos llegar después de expuesto todo esto sobre la transmisión Asíncrona es que es imprescindible saber a priori a qué velocidad vamos a recibir los distintos bits para ajustar nuestra rutina de recepción a dicha velocidad y mirar así la línea de transmisión en su momento justo, ni antes ni después, para recibir cada uno de los bits en el momento en que realmente les corresponde. Cualquier error en el cálculo dichos tiempos puede hacernos leer bits fantasmas debido a que leemos dos veces un mismo bit o porque nos saltemos alguno de ellos.
 
Y por fin llegamos a nuestra Transmisión Síncrona de datos.
 
Síncrono significa "con reloj" y exactamente eso es lo que necesitamos, un reloj (o dicho en inglés un Clock). La transmisión síncrona necesita de dos líneas, una de datos sobre la que se van a representar los distintos estados de los bits a transmitir y una de reloj donde vamos indicando cuando está disponible cada bit en la línea de datos. Esta línea de reloj es la de "sincronización" entre ambos dispositivos, el emisor y el receptor de la transmisión.
 
De esta forma una transmisión síncrona consiste exactamente en poner el estado de un bit en la línea de datos, generamos un pulso de subida y bajada en la línea del reloj, ponemos otro estado de bit en los datos, volvemos a dar un pulso de subida y bajada en la del reloj ... y así hasta completar el número de bits que deseemos transmitir.
 
Esta forma de transmisión tiene una clara ventaja, y es que no es necesario poner de acuerdo en velocidad alguna a emisor y receptor de la transmisión. El emisor coloca su bit y genera el pulso en el reloj, el receptor detecta el reloj y mira el estado del bit, y así uno tras otro, a cualquier velocidad, a distinta velocidad cada bit, a toda la velocidad posible. Hay pulso significa hay dato, leo y a esperar otro pulso, mas lento o mas rápido es irrelevante solo es importante aquello de pulso-dato y a empezar de nuevo.
 
La única limitación es que al receptor le debe dar tiempo a leer el estado de cada bit tras detectar el pulso de reloj antes de que aparezca un nuevo pulso.



Notad que en estos ejemplo estamos utilizando la "lógica negativa" es decir que detectamos los pulsos estando la línea en alto cuando cae a bajo, o sea recibiendo primero un un flanco de bajada y después uno de subida para conformar un pulso.
 
Todo lo que estamos tratando sería exactamente igual con los pulsos al revés, en "lógica positiva" con el  flanco de subida primero y el de bajada después. Esta configuración con las líneas en alto y dando pulsos negativos es la mas utilizada debido a la estabilidad y resistencia al "ruido" que tienen. Se consigue conectando una resistencia a VCC para que mantenga la línea a estado alto y nuestro emisor genera los pulsos poniendo la línea a GND. El receptor está constantemente recibiendo el estado alto y detecta cada pulso cuando pasa a bajo. Es el concepto de Pull-Up.



Bueno, y ahora vamos a ver cómo podemos implementar una simple comunicación Síncrona en C.
 

Las funciones para Transmitir de forma Síncrona que vamos a implementar son dos: Transmite_Bit_Clock_and_Data y Transmite_Byte_Clock_and_Data. La primera de ellas coloca el estado de un bit en la línea Data y genera un pulso en la del Clock, la segunda se encarga de extraer, bit a bit, el contenido de un byte (de 8 bits) y llamar a la función anterior.

Código: C++
  1.  
  2. #define OUT_CLOCK PIN_B0
  3. #define OUT_DATA  PIN_B1
  4.  
  5. void Transmite_Bit_Clock_and_Data(int1 bit){
  6.  
  7.    // Coloca Data
  8.    if( bit==0){
  9.       output_high(OUT_DATA);
  10.    }
  11.    else{
  12.       output_low(OUT_DATA);
  13.    }
  14.    // Genero pulso en Clock (500 microsegundos ó 2 Khz)
  15.    delay_us(250);
  16.    output_low(OUT_CLOCK);
  17.    delay_us(250);
  18.    output_high(OUT_CLOCK);
  19. }
  20.  
  21. void Transmite_Byte_Clock_and_Data(char c){
  22.  
  23.    int8 i;
  24.    int1 b;
  25.  
  26.    for(i=0;i<8;i++){
  27.       b = bit_test(c,i);
  28.       Transmite_Bit_Clock_and_Data(b);
  29.    }
  30. }
  31.  
  32.  

Para las funciones de recepción Síncrona vamos a usar el recurso de la  Interrupción Externa de los PIC's, eligiendo estratégicamente el PIN del reloj (CLOCK) de forma que tengamos disponible una de estas interrupciones.
 

La interrupción externa la configuramos para detectar los flancos de bajada (ved la nota anterior sobre la "lógica negativa") De esta forma cada vez que se dispara la interrupción sabemos que tenemos disponible un bit en la línea de los datos (DATA). Lo recogemos sobre nuestro recByte y contamos uno más. Cuando lleguemos a 8 bits recogidos tenemos nuestro Byte completo y podemos indicarlo convenientemente poniendo a uno el flag reccomplete.
 

   Cuando en main detectamos este reccomplete lo monitorizamos por el puerto serie y reiniciamos todo para recoger el siguiente byte.

Código: C++
  1.  
  2. #define IN_CLOCK PIN_B0
  3. #define IN_DATA  PIN_B1
  4.  
  5. char recByte=0;
  6. int8 nextBit=0;
  7. int1 reccomplete=0;
  8.  
  9. // INTERRUPCIÓN por EXT0 Clock CK (Data - Clock) --------
  10.  
  11. #int_ext
  12. ext_isr() {
  13.  
  14.    int1 bit;
  15.  
  16.    bit=!input(IN_DATA);
  17.    bit_clear(recByte,nextBit);
  18.    if(bit==1) bit_set(recByte,nextBit);
  19.    if(++nextBit=8){
  20.       nextBit=0;
  21.       reccomplete=1;
  22.    }
  23. }
  24.  
  25. // MAIN ------------------------------------------------
  26.  
  27. void main(void){
  28.  
  29.    ext_int_edge(0,H_TO_L);
  30.    enable_interrupts(int_ext);
  31.    enable_interrupts(global);
  32.  
  33.    do {
  34.       // Lectura Completa
  35.       if(reccomplete==1){
  36.          readcomplete=0;
  37.          putc(recByte);
  38.       }
  39.    } while (TRUE);
  40. }
  41.  
  42.  

Bueno, y eso es todo por hoy. Que os aproveche.

Mañana más.  :mrgreen:
 
« Última modificación: 20 de Noviembre de 2009, 18:11:29 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado valdorre

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 346
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #1 en: 06 de Diciembre de 2007, 23:20:04 »
Maestro Diego, como siempre, impecable...
gracias por compartir tus conocimientos y tu tiempo con nosotros...

gracias, saludos
Osvaldo
Osvaldo

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2565
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #2 en: 07 de Diciembre de 2007, 03:47:47 »
Diego, rara es la vez que al leerte no me dejes asombrado. Una explicación muy clara y sencilla de la comunicación síncrona y con funciones incluidas además.

Gracias Diego por ese gran afan tuyo en intentar enseñar.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #3 en: 07 de Diciembre de 2007, 10:39:43 »
Diego otra ventaja de la lógica negativa es que facilita el arbitraje de buses compartidos como I2C, ya que cualquier dispositivo que ponga en estado bajo la línea de Reloj se está apoderando del bus, no ocurre así con la lógica positiva, puesto que en ese caso cualquier dispositivo que pusiese la línea de reloj en estado bajo inhabilitaría a todo dispositivo que tiene esta línea en estado alto.

Es decir que no importa cuantos elementos en el bus tengan su línea de reloj en estado alto, basta que una ponga ponga un estado bajo para que toda la línea quede en este estado, prueben en el sentido contrario y verán que no ocurre así.

Saludos
Reinier

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #4 en: 07 de Diciembre de 2007, 12:14:24 »
muy buen trabajo RedPic, ya seleccione el tema como favorito :mrgreen:
.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #5 en: 07 de Diciembre de 2007, 15:43:08 »
Buen análisis, amigo reiniertl, si señor.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #6 en: 07 de Diciembre de 2007, 18:48:59 »
De hecho la lógica negativa no es desde el punto de vista del consumo la mejor opción, si se fijan en cualquier CI los estados lógicos bajos tienen corrientes de circulación mayor, pero para cosas como esta es lo que mejores resultados da. Por ejemplo un bus arbitrado o con alguna lógica de contención de buses, lo que hace es precisamente poner una entrada a estado lógico bajo, hasta que se haga con el control del BUS, simple pero efectivo.

I2C, SPI, Ethernet y otros por el estilo trabajan de esa forma.

Saludos
Reinier

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1339
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #7 en: 12 de Diciembre de 2007, 03:15:57 »
Muy buena explicacion! Gracias por compartir tus conocimientos! :P


salu2

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1796
    • IDEAA
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #8 en: 27 de Abril de 2009, 21:13:32 »
Espero que no moleste que reabra este tema despues de un año y medio sin actividad... tengo 2 dudas...
La primera es por que se envian los datos invertidos... es decir, los UNOS se envian como CEROS y viceversa... segun leo, la logica invertida era para la linea de Clock... o tambien es para datos?
La segunda duda es para reiniertl, no entiendo cual es el problema de la logica positiva... Solo habria que intercambiar los colectores abiertos de los dispositivos y poner una resistencia pull-down a las lineas... no?
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #9 en: 28 de Abril de 2009, 05:07:12 »
En todos los dispositivos que han pasado por ahora por mis manos tienen AMBAS LINEAS en inversa, Active On Low, y la razón es la de que es mucho mas inmune a los ruidos. Es mucho mas difícil bajar un HIGH para que parezca un LOW que subir por interferencias un LOW para que parezca un HIGH.

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1796
    • IDEAA
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #10 en: 28 de Abril de 2009, 10:05:53 »
Ok, entendidisimo  :mrgreen:
Gracias Diego!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Fundamentos de la Transmisión Síncrona
« Respuesta #11 en: 28 de Abril de 2009, 11:40:38 »
Creo que el maestro rojo lo ha dicho de la mejor manera posible.

Saludos
Reinier