Diferencia entre revisiones de «SCI (Interfaz de Comunicación Serial) - MC9S08QE128»

De Wikitronica
Saltar a: navegación, buscar
Línea 50: Línea 50:
 
Configuración mas utilizada para transmitir y recibir por encuesta.
 
Configuración mas utilizada para transmitir y recibir por encuesta.
  
<source lang="asm">
+
<syntaxhighlight lang="asm">
  
 
   LDA #$00
 
   LDA #$00
Línea 61: Línea 61:
 
   STA SCI1C2 ;/*Habilita transmisor y receptor*/   
 
   STA SCI1C2 ;/*Habilita transmisor y receptor*/   
 
    
 
    
</source>
+
</syntaxhighlight>
  
 
Configuración mas utilizada para transmitir y recibir por interrupción del SCI
 
Configuración mas utilizada para transmitir y recibir por interrupción del SCI
  
<source lang="asm">
+
<syntaxhighlight lang="asm">
  
 
   LDA #$00
 
   LDA #$00
Línea 77: Línea 77:
 
   STA SCI1C2 ;/*Habilita transmisor y receptor*/   
 
   STA SCI1C2 ;/*Habilita transmisor y receptor*/   
 
    
 
    
</source>
+
</syntaxhighlight>
  
  
Línea 87: Línea 87:
 
Configuración mas utilizada para transmitir y recibir por encuesta
 
Configuración mas utilizada para transmitir y recibir por encuesta
  
<source lang="c">
+
<syntaxhighlight lang="c">
 
   // Inicializaciones para trabajar con SCI     
 
   // Inicializaciones para trabajar con SCI     
 
   SCI1BDH = 0x00;
 
   SCI1BDH = 0x00;
Línea 93: Línea 93:
 
   SCI1C1 = 0x00; /*Transmisión y recepción normal de 8 bits sin paridad*/
 
   SCI1C1 = 0x00; /*Transmisión y recepción normal de 8 bits sin paridad*/
 
   SCI1C2 = 0x0C; /*Habilita transmisor y receptor*/   
 
   SCI1C2 = 0x0C; /*Habilita transmisor y receptor*/   
</source>
+
</syntaxhighlight>
  
  
 
Configuración mas utilizada para transmitir y recibir por interrucpcion del SCI
 
Configuración mas utilizada para transmitir y recibir por interrucpcion del SCI
  
<source lang="c">
+
<syntaxhighlight lang="c">
 
   // Inicializaciones para trabajar con SCI     
 
   // Inicializaciones para trabajar con SCI     
 
   SCI1BDH = 0x00;
 
   SCI1BDH = 0x00;
Línea 104: Línea 104:
 
   SCI1C1 = 0x00; /*Transmisión y recepción normal de 8 bits sin paridad*/
 
   SCI1C1 = 0x00; /*Transmisión y recepción normal de 8 bits sin paridad*/
 
   SCI1C2 = 0x2C; /*Habilita transmisor y receptor, habilito recepción por interrupciones*/   
 
   SCI1C2 = 0x2C; /*Habilita transmisor y receptor, habilito recepción por interrupciones*/   
</source>
+
</syntaxhighlight>
  
  
Línea 150: Línea 150:
 
Ejemplo:
 
Ejemplo:
  
<source lang="asm">
+
<syntaxhighlight lang="asm">
 
   LDA #$00
 
   LDA #$00
 
   STA SCI1BDH
 
   STA SCI1BDH
 
   LDA #$1A
 
   LDA #$1A
 
   STA SCI1BDL  ;/*Baud Rate = 9600bps para un clock de 4MHZ*/
 
   STA SCI1BDL  ;/*Baud Rate = 9600bps para un clock de 4MHZ*/
</source>
+
</syntaxhighlight>
  
  
Línea 162: Línea 162:
 
Ejemplo:
 
Ejemplo:
  
<source lang="c">
+
<syntaxhighlight lang="c">
 
SCI1BD=0x1A;
 
SCI1BD=0x1A;
</source>
+
</syntaxhighlight>
  
  
Línea 339: Línea 339:
  
  
<source lang="asm">
+
<syntaxhighlight lang="asm">
 
;**************************************************************
 
;**************************************************************
 
;*                Interrupt Vectors                          *
 
;*                Interrupt Vectors                          *
Línea 346: Línea 346:
 
              
 
              
 
             DC.W  Transmite    ; Rutina de Transmisión
 
             DC.W  Transmite    ; Rutina de Transmisión
</source>
+
</syntaxhighlight>
  
 
Un ejemplo para transmitir por serial es el siguiente:
 
Un ejemplo para transmitir por serial es el siguiente:
  
<source lang="asm">
+
<syntaxhighlight lang="asm">
 
Transmite: bclr SCI1S1_TDRE, SCI1S1; salta si el registro SCI1S1_TDRE es distinto de cero  
 
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
 
           lda dato ;se carga a el acumulador el dato deseado
Línea 358: Línea 358:
 
                             ;otro dato por interrupción de lo contrario borrar esta línea de código  
 
                             ;otro dato por interrupción de lo contrario borrar esta línea de código  
 
           RTI
 
           RTI
</source>
+
</syntaxhighlight>
  
 
==== '' En Lenguaje C '' ====
 
==== '' 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.         
 
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.         
  
<source lang="c">
+
<syntaxhighlight lang="c">
 
     void interrupt VectorNumber_Vsci1tx SCI_TX_ISR(void){
 
     void interrupt VectorNumber_Vsci1tx SCI_TX_ISR(void){
 
     byte leer;
 
     byte leer;
Línea 377: Línea 377:
 
     }
 
     }
  
</source>
+
</syntaxhighlight>
  
 
'''Bajar las banderas cada vez que transmitan es sumamente importante.'''  
 
'''Bajar las banderas cada vez que transmitan es sumamente importante.'''  
Línea 387: Línea 387:
 
En assembler hay que definir el vector de interrupción de recepción de la siguiente manera
 
En assembler hay que definir el vector de interrupción de recepción de la siguiente manera
  
<source lang="asm">
+
<syntaxhighlight lang="asm">
 
;**************************************************************
 
;**************************************************************
 
;*                Interrupt Vectors                          *
 
;*                Interrupt Vectors                          *
Línea 394: Línea 394:
 
              
 
              
 
             DC.W  Recibe    ; Rutina de Recepción
 
             DC.W  Recibe    ; Rutina de Recepción
</source>
+
</syntaxhighlight>
  
 
Un ejemplo para recibir por serial es el siguiente
 
Un ejemplo para recibir por serial es el siguiente
  
<source lang="asm">
+
<syntaxhighlight lang="asm">
 
Recibe:    bclr SCI1S1_RDRF,SCI1S1 ;pasa a la siguiente línea de código cuando el registro  
 
Recibe:    bclr SCI1S1_RDRF,SCI1S1 ;pasa a la siguiente línea de código cuando el registro  
 
                                   ; SCI1S1_RDRF es distinto de cero  
 
                                   ; SCI1S1_RDRF es distinto de cero  
Línea 409: Línea 409:
 
           RTI
 
           RTI
  
</source>
+
</syntaxhighlight>
  
 
==== '' En Lenguaje C '' ====
 
==== '' En Lenguaje C '' ====
Línea 415: Línea 415:
 
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.
 
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.
  
<source lang="c">
+
<syntaxhighlight lang="c">
 
//vector de interrupción por sci para recibir
 
//vector de interrupción por sci para recibir
 
void interrupt VectorNumber_Vsci1rx SCI_RX_ISR(void) {
 
void interrupt VectorNumber_Vsci1rx SCI_RX_ISR(void) {
Línea 424: Línea 424:
 
     SCI1C2=0x8C;  //esta línea de código es opcional, se escribe si se quiere que el programa transmita por interrupción  
 
     SCI1C2=0x8C;  //esta línea de código es opcional, se escribe si se quiere que el programa transmita por interrupción  
 
}
 
}
</source>
+
</syntaxhighlight>
  
 
'''Bajar las banderas cada vez que reciban es sumamente importante.'''  
 
'''Bajar las banderas cada vez que reciban es sumamente importante.'''  
Línea 439: Línea 439:
 
Esta es una sub-rutina para la cual se llama con la instrucción '''jsr Transmitir'''
 
Esta es una sub-rutina para la cual se llama con la instrucción '''jsr Transmitir'''
  
<source lang="asm">
+
<syntaxhighlight lang="asm">
 
Transmitir:   
 
Transmitir:   
 
   etiq:      lda dato ; se coloca en el dato que se desea transmitir en el acumulador
 
   etiq:      lda dato ; se coloca en el dato que se desea transmitir en el acumulador
Línea 447: Línea 447:
 
             lda SCI1S1 ; se aclara la bandera MUY IMPORTANTE
 
             lda SCI1S1 ; se aclara la bandera MUY IMPORTANTE
 
             RTS        ;  se sale de la sub rutina y vuelve al PC+1 de donde fue llamada
 
             RTS        ;  se sale de la sub rutina y vuelve al PC+1 de donde fue llamada
</source>
+
</syntaxhighlight>
  
 
==== '' En Lenguaje C '' ====
 
==== '' En Lenguaje C '' ====
 
Se crea como una función, la cual se llama con Transmitir_dato(dato)
 
Se crea como una función, la cual se llama con Transmitir_dato(dato)
  
<source lang="c">
+
<syntaxhighlight lang="c">
  
 
void Transmitir_dato(byte dato)    // Se ejecuta la transmisión de dato por encuesta
 
void Transmitir_dato(byte dato)    // Se ejecuta la transmisión de dato por encuesta
Línea 461: Línea 461:
 
   SCI1D = dato;        // Enviando dato  
 
   SCI1D = dato;        // Enviando dato  
 
  }
 
  }
</source>
+
</syntaxhighlight>
  
  
Línea 470: Línea 470:
 
Esta es una sub-rutina para la cual se llama con la instrucción '''jsr recepcion'''
 
Esta es una sub-rutina para la cual se llama con la instrucción '''jsr recepcion'''
  
<source lang="asm">
+
<syntaxhighlight lang="asm">
 
recepcion:   
 
recepcion:   
 
     etiq: BRCLR SCI1S1_RDRF,SCI1S1,etiq; Condición de salto que verifica si la el dato fue recibido
 
     etiq: BRCLR SCI1S1_RDRF,SCI1S1,etiq; Condición de salto que verifica si la el dato fue recibido
Línea 478: Línea 478:
 
           lda SCI1S1; se aclara la bandera MUY IMPORTANTE  
 
           lda SCI1S1; se aclara la bandera MUY IMPORTANTE  
 
           RTS;  se sale de la sub rutina y vuelve al PC+1 de donde fue llamada
 
           RTS;  se sale de la sub rutina y vuelve al PC+1 de donde fue llamada
</source>
+
</syntaxhighlight>
  
 
==== '' En Lenguaje C '' ====
 
==== '' En Lenguaje C '' ====
Línea 484: Línea 484:
 
Se crea como una función, la cual se llama con Recibir_dato()
 
Se crea como una función, la cual se llama con Recibir_dato()
  
<source lang="c">
+
<syntaxhighlight lang="c">
 
byte Recibir_dato(void)        //Se ejecuta la recepción de dato por encuesta
 
byte Recibir_dato(void)        //Se ejecuta la recepción de dato por encuesta
 
  {  byte dato_R;  
 
  {  byte dato_R;  
Línea 493: Línea 493:
 
           return dato_R;  // Retorna dato
 
           return dato_R;  // Retorna dato
 
  }
 
  }
</source>
+
</syntaxhighlight>
  
 
'''Hay que aclarar las banderas cada vez que se termine de transmitir o recibir dependiendo de cual sea el caso, es sumamente importante. Si no se hace puede que el programa genere algún tipo de error. Para bajar la bandera solamente tienen que leer el registro SCI1S1.'''
 
'''Hay que aclarar las banderas cada vez que se termine de transmitir o recibir dependiendo de cual sea el caso, es sumamente importante. Si no se hace puede que el programa genere algún tipo de error. Para bajar la bandera solamente tienen que leer el registro SCI1S1.'''

Revisión del 14:08 1 dic 2012


El módulo del SCI del MC9S08QE128, es una gran herramienta para la recepción / transmisión serial. El Microcontrolador MC9S08QE128, tiene dos puertos seriales el SCI1 y el SCI2. En el desarrollo del tema se explicará solo el SCI1 ya que es el mas usado, si requiere información sobre el SCI2 dirigirse al manual del MC9S08QE128.

En esta sección veremos los modos de uso y como se deben configurar los registros para la recepción y envió en general.

Puertos del MC9S08QE128


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 Capítulo 14 del Manual del MC9S08QE128 Reference Manual. Freescale

Inicializaciones Generales del SCI

A continuación se presenta unos ejemplos de como configurar el SCI para que transmita y reciba por encuesta e interrupciones

En Assembler

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

  LDA #$00
  STA SCI1BDH
  LDA #$1A
  STA SCI1BDL  ;/*Baud Rate = 9600bps para un clock de 4MHZ*/
  LDA #$00
  STA SCI1C1  ;/*Transmisión y recepción normal de 8 bits sin paridad*/
  LDA #$0C
  STA SCI1C2 ;/*Habilita transmisor y receptor*/

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

  LDA #$00
  STA SCI1BDH ;/* Tasa alta de transmisión deshabilitada (Baud high disabled)*/
  LDA #$1A   ;/* Pre-escaler ajustado: [SBR12:SBR0] = 4Mhz/(16*9600) =~ 26,04d= 1A (hex)*/ 
              /* valor requerido para trabajar a 9600bps*/
  STA SCI1BDL  ;/*Baud Rate = 9600bps*/
  LDA #$00
  STA SCI1C1  ;/*Transmisión y recepción normal de 8 bits sin paridad*/
  LDA #$2C
  STA SCI1C2 ;/*Habilita transmisor y receptor*/


En Lenguaje C

Configuración mas utilizada para transmitir y recibir por encuesta


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, habilito recepción por interrupciones*/


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

Configuraciones de SCI para trabajar a diferentes velocidades

El puerto serial puede trabajar a la siguientes velocidades:

Como determinar a cuantos Baudios va a trabajar el MC9S08QE128
 Velocidad 
 9600 baudios 
 19200 baudios 
 38400 baudios 
 57600 baudios 
 115200 baudios 

Para configurar el baudrate para la sincronización del modulo SCI se ha de configurar los registros [SBR12:SBR0] con el valor del prescaler deseado, para esto tomar en cuenta la fórmula

[SBR12:SBR0] =(hex) [VelocidadDeReloj/(16*BaudrateDeseado)] 

Assembler

Se ha de pasar el valor del prescaler a los registros SCI1BDH (parte alta) SCI1BDL (Parte baja)

Ejemplo:

  LDA #$00
  STA SCI1BDH
  LDA #$1A
  STA SCI1BDL  ;/*Baud Rate = 9600bps para un clock de 4MHZ*/


En Lenguaje C

Se asigna el valor del prescaler al registro SCI1BD Ejemplo:

SCI1BD=0x1A;


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 


7 6 5 4 ¦ 3 2 1 0
 SBR7   SBR6   SBR5   SBR4   SBR3   SBR2   SBR1   SBR0 

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
 TI E   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

Es otro registro de control del SCI, que es poco usado, para mas información dirigirse al manual del MC9S08QE128

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 definir 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 interrupción de lo contrario borrar esta línea de código 
           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){
     byte leer;
     leer=SCI1S1; /*Baja la bandera de transmisión, 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 línea de código es opcional, se escribe si se quiere que el programa
                   // reciba por interrupción
                   //en caso contrario borrarla.
    }

Bajar las banderas cada vez que transmitan es sumamente importante. Si no lo hacen el programa no les volverá a transmitir. Para bajar la bandera solamente tienen que leer el registro SCI1S1

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 línea 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 modifica el registro SCI1C2 para entrar a un vector de 
                            ; transmisión si es necesario, de lo contrario
                            ; borrar la línea de código      
           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 interrupción por sci para recibir
void interrupt VectorNumber_Vsci1rx SCI_RX_ISR(void) {
     byte leer;
     byte dato;      //se declaran las variables que recibe el dato que se escribe
     leer = SCI1S1; //baja la bandera de recepción, 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 línea de código es opcional, se escribe si se quiere que el programa transmita por interrupción 
}

Bajar las banderas cada vez que reciban es sumamente importante. Si no lo hacen el programa no les volverá a recibir. Para bajar la bandera solamente tienen que leer el registro SCI1S1

Serial por Encuesta

Transmisión

Este programa 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

Esta es una sub-rutina para la cual se llama con la instrucción jsr Transmitir

Transmitir:  
  etiq:      lda dato ; se coloca en el dato que se desea transmitir en el acumulador
             sta SCI1D ; se coloca el dato en el registro de data del puerto para ser enviado
             BRCLR SCI1S1_TDRE,SCI1S1,etiq  ; Condición de salto que verifica si la 
             ;el dato fue transmitido
             lda SCI1S1 ; se aclara la bandera MUY IMPORTANTE
             RTS        ;  se sale de la sub rutina y vuelve al PC+1 de donde fue llamada

En Lenguaje C

Se crea como una función, la cual se llama con Transmitir_dato(dato)

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

Este programa 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

Esta es una sub-rutina para la cual se llama con la instrucción jsr recepcion

recepcion:  
    etiq: BRCLR SCI1S1_RDRF,SCI1S1,etiq; Condición de salto que verifica si la el dato fue recibido
          bclr SCI1S1_RDRF,SCI1S1 ; se aclara la bandera para decir que ya se recibió el dato
          lda SCI1D ;se coloca el dato del registro de data del puerto que fue recibida en el acumulador
          sta dato ; se coloca el valor del acumulador en la variable dato
          lda SCI1S1; se aclara la bandera MUY IMPORTANTE 
          RTS;  se sale de la sub rutina y vuelve al PC+1 de donde fue llamada

En Lenguaje C

Se crea como una función, la cual se llama con Recibir_dato()

byte Recibir_dato(void)         //Se ejecuta la recepción 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
 }

Hay que aclarar las banderas cada vez que se termine de transmitir o recibir dependiendo de cual sea el caso, es sumamente importante. Si no se hace puede que el programa genere algún tipo de error. Para bajar la bandera solamente tienen que leer el registro SCI1S1.

Referencias


Ángel Diaz y Rhayza Rodríguez