TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
03 de Septiembre de 2010, 05:24:58

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
257111 Mensajes en 28437 Temas por 27916 Usuarios
Último usuario: zororyuzaki
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Lenguaje C para microcontroladores PIC (Moderadores: Modulay, pikman, pocher, vszener, Suky)
| | |-+  Fundamentos de la Transmisión Síncrona
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Marcar como favorito Imprimir
Autor Tema: Fundamentos de la Transmisión Síncrona  (Leído 1242 veces)
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 4876



WWW
« : 06 de Diciembre de 2007, 06: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
GeSHi (cpp):
  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
GeSHi (cpp):
  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.  Mr. Green
 
« Última modificación: 20 de Noviembre de 2009, 06:11:29 por RedPic » En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
valdorre
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 346



« Respuesta #1 : 06 de Diciembre de 2007, 11:20:04 »

Maestro Diego, como siempre, impecable...
gracias por compartir tus conocimientos y tu tiempo con nosotros...

gracias, saludos
Osvaldo
En línea

Osvaldo
pocher
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2500



« Respuesta #2 : 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.
En línea
reiniertl
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 1011



« Respuesta #3 : 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
En línea
Cryn
Colaborador
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 3914


ahora con C18 C30 C32


« Respuesta #4 : 07 de Diciembre de 2007, 12:14:24 »

muy buen trabajo RedPic, ya seleccione el tema como favorito Mr. Green
En línea

El peor día, cuando te fuiste.
Cuando estabas a nuestro lado, los mejores
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 4876



WWW
« Respuesta #5 : 07 de Diciembre de 2007, 03:43:08 »

Buen análisis, amigo reiniertl, si señor.  Mr. Green
En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
reiniertl
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 1011



« Respuesta #6 : 07 de Diciembre de 2007, 06: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
En línea
jeremylf
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 587



« Respuesta #7 : 12 de Diciembre de 2007, 03:15:57 »

Muy buena explicacion! Gracias por compartir tus conocimientos! Razz


salu2
En línea
Marttyn
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 1280


Las cucarachas dicen "No al debugger!"


WWW
« Respuesta #8 : 27 de Abril de 2009, 09: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?
En línea

La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 4876



WWW
« Respuesta #9 : 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.

En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
Marttyn
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 1280


Las cucarachas dicen "No al debugger!"


WWW
« Respuesta #10 : 28 de Abril de 2009, 10:05:53 »

Ok, entendidisimo  Mr. Green
Gracias Diego!
En línea

La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.
reiniertl
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 1011



« Respuesta #11 : 28 de Abril de 2009, 11:40:38 »

Creo que el maestro rojo lo ha dicho de la mejor manera posible.

Saludos
Reinier
En línea
TODOPIC
   

 En línea
Páginas: [1] Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC XHTML 1.0 válido! CSS válido!
Página creada en 0.129 segundos con 23 consultas.