SCI (Interfaz de Comunicación Serial) - MC9S08QE128

De Wikitronica
Revisión del 17:03 15 nov 2012 de Misato (Discusión | contribuciones) (Registros SCI)

Saltar a: navegación, buscar

Uso y Configuración para la recepción / transmisión serial para el MC9S08QE128

Texto---------------------------Imagen En construcción

Características Generales del SCI

  • Formato Full-duplex, estándar sin retorno a cero (NRZ).
  • Doble buffer de transmisión y el recepción con habilitadores separados.
  • Tasas de baudios programables (13-bits).
  • Opera por Interrupciones o por encuesta las siguientes actividades:

- Transmisión registro de datos y registros completos.

- Recepción de registros de datos completos.

- Recepción de desbordamiento(carry) , error de paridad, error de framing y error de ruido.

- Recepción de inactividad.

- Pin receptor de flanco activo.

- Detección de banderas.

  • Hardware de generación y comprobación de paridad.
  • Programable a 8-bits o 9-bits de caracteres de longitud.
  • Receptor de activación por línea libre o marca de dirección.
  • Opcionales: Generación de salto de carácter de 13-bit / Detección de saltos de carácter de 11-bit.
  • Transmisor de polaridad de salida seleccionable.

Estas características fueron extraídas del Capitulo 14 del Manual del MC9S08QE128 Reference Manual. Freescale

Inicializaciones Generales del SCI

En Assembler

  ;Configuración mas utilizada para transmitir y recibir por encuesta

  LDA 0x00
  STA SCI1BDH
  LDA 0X1A
  STA SCI1BDL  ;/*Baud Rate = 9600bps*/
  LDA 0X00
  STA SCI1C1  ;/*Transmisión y recepción normal de 8 bits sin paridad*/
  LDA 0X0C
  STA SCI1C2 ;/*Habilita transmisor y receptor*/   
  
  ;Configuración mas utilizada para transmitir y recibir por interrupción del SCI

  LDA 0x00
  STA SCI1BDH
  LDA 0X1A
  STA SCI1BDL  ;/*Baud Rate = 9600bps*/
  LDA 0X00
  STA SCI1C1  ;/*Transmisión y recepción normal de 8 bits sin paridad*/
  LDA 0X2C
  STA SCI1C2 ;/*Habilita transmisor y receptor*/   
  

En Lenguaje C

//Configuración mas utilizada para transmitir y recibir por encuesta

  // Inicializaciones para trabajar con SCI    
  SCI1BDH = 0x00;
  SCI1BDL = 0x1A; /*Baud Rate = 9600bps*/ 
  SCI1C1 = 0x00; /*Transmisión y recepción normal de 8 bits sin paridad*/
  SCI1C2 = 0x0C; /*Habilita transmisor y receptor*/   

//Configuración mas utilizada para transmitir y recibir por interrucpcion del SCI

  // Inicializaciones para trabajar con SCI    
  SCI1BDH = 0x00;
  SCI1BDL = 0x1A; /*Baud Rate = 9600bps*/ 
  SCI1C1 = 0x00; /*Transmisión y recepción normal de 8 bits sin paridad*/
  SCI1C2 = 0x2C; /*Habilita transmisor y receptor*/   

Guía Rápida de los Módulos de Inicialización

Registros SCI

Los Registros del SCI son de 8-bits. Cada registro tiene características para la configuración del puerto serial dependiendo de cómo se desea trabajar con él.

SCIxBDH y SCIxBDL

      7             6              5             4      ¦       3             2             1             0
LBKDIE RXEDGIE ////// SBR12 SBR11 SBR10  SBR9   SBR8 

Este par de registros son usados en la inicialización del puerto serial. Ellos controlan la escala de baudios a la cual se transmite y se recibe la información. Generalmente se configuran para 9600 Baudios

SCIxC1

      7             6              5             4      ¦       3             2             1             0
LOOPS SCISWAI RSRC M WAKE ILT  PE   PT 

Este registro es usado en la inicialización del puerto serial. Se utiliza para controlar varias caracterizas opcionales del sistema SCI. Generalmente se programa para la transmisión y recepción normal de 8 bits sin paridad

SCIxC2

      7             6              5             4      ¦       3             2             1             0
TIE TCIE RIE ILIE TE RE  RWU   SBK 

Este registro es usado en las inicializaciones para activar las interrupciones de transmisión y recepción. Cuando el bit 7 esta en 1 se activa la transmisión y cuando el bit 5 esta en 1 se activa la recepción.

SCIxS1

      7             6              5             4      ¦       3             2             1             0
TDRE TC RDRF IDKE OR NF  FE   PF 

Este registro contiene 8 banderas de estatus. El bit 7 contiene la bandera de estatus de transmisión, cuando se transmite dicha bandera se pone en 1. Cuando se recibe la bandera del bit 5 RDRF se pone en 1. Para limpiar las banderas hay que leer el registro SCI1S1 (Ej, Variable=SCI1S1 en C y LDA SCI1S1 en assembler)

SCIxS2

      7             6              5            4       ¦       3             2             1             0
LBKDIF RXEDGIF /////// RXINV RWUID BRK13 LBKDE  RAF 

Configura las opciones de soporte LIN y supervisa la actividad del receptor.

SCIxC3

      7          6           5            4     ¦       3          2          1           0
 R8   T8  TXDIR TXINV ORIE NEIE FEIE PEIE

SCIxD

El registro SCIxD se utiliza para recibir o transmitir un dato por el puerto serial. Para más detalles ver la sección de Inicializaciones Generales del SCI de este mismo artículo.

      7             6              5              4     ¦       3             2             1             0
 R7/T7   R6/T6   R5/T5   R4/T4   R3/T3   R2/T2   R1/T1   R0/T0 

Escribe: Recepción (Rx) de dato; Escribe: Transmisión (Rx) de dato.

Serial por Interrupciones

Antes de usar transmisión y recepción por interrupción se debe de usar la inicialización adecuada

Transmisión

En Assembler

En assembler hay que definer el vector de interrupción de la siguiente manera

;**************************************************************
;*                 Interrupt Vectors                          *
;**************************************************************            
            ORG   $FFDE ; Posición en memoria donde se encuentra el vector de interrupción  
            
            DC.W  Transmite     ; Rutina de Transmisión

Un ejemplo para transmitir por serial es el siguiente:

Transmite: bclr SCI1S1_TDRE, SCI1S1; salta si el registro SCI1S1_TDRE es distinto de cero 
           lda dato ;se carga a el acumulador el dato deseado
           sta SCI1D ;se transmite el dato por el puerto serial
           lda SCI1S1 ;se baja la bandera de transmisión para poder volverla usar
           mov #$2C, SCI1C2 ; se modifica el registro SCI1C2 para que interrumpa el programa cuando se reciba un dato si se recibir
                            ;otro dato por interrupcion de lo contrario borrar esta linea de codigo 
           RTI

En Lenguaje C

Para transmitir por interrupción se tiene que usar el siguiente vector "void interrupt VectorNumber_Vsci1tx SCI_TX_ISR(void)". Este vector de interrupción se debe colocar después del main. Un ejemplo de como usar el vector es el siguiente.

    void interrupt VectorNumber_Vsci1tx SCI_TX_ISR(void){
    
     SCI1S1_TDRE = 0; //SCI1S1_RDRF es un registro que pone en uno cuando transmite, por tal motivo para
                     volverlo a utilizar hay que ponerlo nuevamente en cero
     SCI1D=dato;  //en el registro SCI1D se guarda lo que se quiere enviar por serial, la variable dato se tiene 
                  //que inicializar como una variable global
                       
     SCI1C2=0x2C;  //esta linea de código es opcional, se escribe si se quiere que el programa reciba por interrupción
                   //en caso contrario borrarla.
    }

Recepción

En Assembler

En assembler hay que definir el vector de interrupción de recepción de la siguiente manera

;**************************************************************
;*                 Interrupt Vectors                          *
;**************************************************************
             ORG   $FFE0  ; espacio en memoria donde se encuentra la interrupción 
            
            DC.W  Recibe     ; Rutina de Recepción

Un ejemplo para recibir por serial es el siguiente

Recibe:    bclr SCI1S1_RDRF,SCI1S1 ;pasa a la siguiente linea de código cuando el registro SCI1S1_RDRF es distinto de cero 
           lda SCI1D  ;guarda en el acumulador el dato recibido por serial 
           sta dato  ; se guarda el dato
           lda SCI1S1 ; se baja la bandera de recepción  
           mov #$8C, SCI1C2 ; se modfica el registro SCI1C2 para entrar a un vector de transmision si es necesario, de lo contrario                     
                            ; borrar la linea de codigo      
           RTI

En Lenguaje C

Para recibir por interrupción se tiene que usar el siguiente vector "void interrupt VectorNumber_Vsci1rx SCI_RX_ISR(void)". Este vector de interrupción se debe de colocar después del main. Un ejemplo de como usar el vector es el siguiente.

//vector de interrupcion por sci para recibir
void interrupt VectorNumber_Vsci1rx SCI_RX_ISR(void) {

     byte dato; //se declaran las variables que recive el dato que se escribe
     SCI1S1_RDRF = 0; //SCI1S1_RDRF es un registro que pone en uno cuando recibe, por tal motivo para
                     volverlo a utilizar hay que ponerlo nuevamente en cero
     dato = SCI1D;  //el registro SCI1D es donde se guarda el dato que se manda por puerto serial,
                       dicho dato se le asigna a la variable dato
     SCI1C2=0x8C;  //esta linea de codigo es opcional, se escribe si se quiere que el programa transmita por interrupción 
}

Serial por Encuesta

Texto---------------------------Imagen

Transmisión

Se en carga de ejecutar la transmisión de dato por encuesta, es decir se queda esperando hasta que transmita un dato, para luego salir del ciclo, enviar por el puerto el dato y finalmente limpiar la bandera, para volver a transmitir.

En Assembler


Prueba

En Lenguaje C


void Transmitir_dato(byte dato)    // Se ejecuta la transmisión de dato por encuesta
 {   byte bandera;
     while (SCI1S1_TDRE == 0);   /* No finaliza ciclo hasta que esté libre el registro en el que se
                                    guardará el dato que se enviará*/
         bandera= SCI1S1;	// Aclara la bandera
   	 SCI1D = dato;         // Enviando dato 
 }

Recepción

Se en carga de ejecutar la recepción de dato por encuesta, es decir se queda esperando hasta que reciba un dato, para luego salir del ciclo, enviar el dato por el puerto y finalmente limpiar las banderas, para volver a recibir.

En Assembler


Prueba

En Lenguaje C

<source lang = "C">
 
byte Recibir_dato(void)         //Se ejecuta la recepcion de dato por encuesta
 {   byte dato_R; 
     byte bandera;
     while (SCI1S1_RDRF == 0); // No finaliza ciclo hasta que esté listo el dato 
	   bandera= SCI1S1;   // Aclara la bandera 
	   dato_R = SCI1D;   // Se Salva el dato 
           return dato_R;   // Retorna dato
 }

</source>

Referencias

Bibliografía

Texto


Ángel Diaz y Rhayza Rodríguez