Autor Tema: Ayuda con códigos de TX y RX del módulo Serial SCI  (Leído 2618 veces)

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

Desconectado cdrpo

  • PIC18
  • ****
  • Mensajes: 317
Ayuda con códigos de TX y RX del módulo Serial SCI
« en: 28 de Mayo de 2010, 09:30:10 »
Hola, freescaleros

Los siguientes códigos escritos para el microcontrolador GP32 creo que también sirve para los APIx,  permiten recibir un carácter

Código: C++
  1. void SCI_configuracionInicial ( void ) {
  2.   SCC1_ENSCI = 1; // Habilita el SCI
  3.  
  4.   SCC2_TE = 1;    //  Habilita el TX Transmisor
  5.   SCC2_RE = 1;    // Habilita el RX receptor
  6.  
  7.   // Baudios 9600
  8.   SCBR_SCP1 = 0; // preescaler por 1
  9.   SCBR_SCP0 = 0;
  10.  
  11.  
  12.   SCBR_SCR2 = 1;  // 010 para 4.9152 MHz, 100 para  9.8MHz
  13.   SCBR_SCR1 = 0;
  14.   SCBR_SCR0 = 0;
  15.            
  16.   SCC2_SCRIE = 1; // Habilita servicio de interrupción, Nota SCC2_SCRIE = 0; cuando no se trabaja por interupcion
  17. }

Código: C++
  1. unsigned char SCI_recibir1Caracter ( void ) {
  2.    while ( SCS1_SCRF == 0 ){ // ciclo infinito, sale cuando SCS1_SCRF == 1
  3.                                                 // o lo que es lo mismo, hasta que el receiver este full
  4.   }
  5.   return ( SCDR ); // retorna el caracter recibido
  6. }

La anterior función trabaja bien, pero por interrupción no

unsigned char datoRecibido;  // se coloca como variable global al inicio
Código: C++
  1. void interrupt 13 SCI_recibir1Caracter_ServicioInt( void ){
  2.  
  3.  //SCS1_SCRF = 1; // receptor lleno // bit de habilitacion SCC2_SCRIE = 1;
  4.  //SCS1_IDLE = 1; // receptor inactivo // bit de habilitacion SCC2_ILIE = 1;
  5.  datoRecibido = SCDR;
  6.  
  7. }
Me dijeron que hay que suprimir while ( SCS1_SCRF == 0 ) con respecto a la funcion sin interrupcion, que otras consideraciones hay que tener algún flag?

Gracias
« Última modificación: 28 de Mayo de 2010, 15:27:09 por cdrpo »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Ayuda con códigos de TX y RX del módulo Serial SCI
« Respuesta #1 en: 28 de Mayo de 2010, 11:25:08 »
Hola, en la primera versión de código el while permite esperar hasta que haya un caracter en el buffer de recepción. Al trabajar con interrupciones no tenes que esperar, es decir poner un while, sino que justamente al producirse la misma el caracter fue recibido en el buffer de recepcion. Lo que deberias usar es un flag ( una variable ) que le indique al programa principal que esto a ocurrido. Consejo, podes usar el ProcessExpert para generar código para la UART y copiar el mismo ademas de ver/entender como lo hace.

Saludos !

Desconectado cdrpo

  • PIC18
  • ****
  • Mensajes: 317
Re: Ayuda con códigos de TX y RX del módulo Serial SCI
« Respuesta #2 en: 28 de Mayo de 2010, 15:37:42 »
Gracias RICHI777 por tu respuesta, agregue una variable para almacenar el dato recibido, pero aun no me trabaja. El procesador experto de código no lo se operar :cry: por favor puedes generar este código y lo comparamos con el mio para mirar en que estoy fallando
Muchas Gracias

Código: C++
  1. unsigned char datoRecibido;  // se coloca como variable global al inicio
  2. unsigned char datoEnviado;
  3.  
  4. void interrupt 13 SCI_recibir1Caracter_ServicioInt( void ){
  5.  
  6.   //SCS1_SCRF = 1; // receptor lleno // bit de habilitacion SCC2_SCRIE = 1;
  7.   //SCS1_IDLE = 1; // receptor inactivo // bit de habilitacion SCC2_ILIE = 1;
  8.   datoRecibido = SCDR;
  9.  
  10. }
  11.  
  12. void interrupt 14 SCI_Enviar1Caracter_ServicioInt( void ){
  13.  
  14.   //SCS1_SCTE = 1; // transmisor vacio // bit de habilitacion SCC2_SCTIE = 1;
  15.   //SCS1_TC = 1; // transmision completa // bit de habilitacion SCC2_TCIE = 1;
  16.   SCDR = datoEnviado;
  17. }

Desconectado cdrpo

  • PIC18
  • ****
  • Mensajes: 317
Re: Ayuda con códigos de TX y RX del módulo Serial SCI
« Respuesta #3 en: 28 de Mayo de 2010, 17:59:17 »
incorporo dos rutinas mas, que trabajan bien sin interrupcion

 :)
/* Enviar un solo caracter por el puerto serie */
Código: C++
  1. void SCI_enviar1Caracter( unsigned char caracter ) {
  2.   while ( SCS1_SCTE == 0 ){
  3.   }
  4.   SCDR = caracter; // Envia el caracter */
  5. }

 :)
/* Enviar una cadena de texto por el puerto serie */
Código: C++
  1. void SCI_enviarnCaracteres( const char *cad )
  2. {
  3.   unsigned char posCar = 0;
  4.   while ( cad[ posCar ] != 0 ) {
  5.     SCI_enviar1Caracter( cad[ posCar ] );
  6.     posCar++;
  7.   }
  8. }


Pero cuando quiero leer varios caracteres, no me trabaja

supongo una cadena de 5 caracteres

unsigned char bufferChrStr[6]= "00000";
/* Leer n caracteres por el puerto serie  */
Código: C++
  1. void SCI_recibirnCaracteres( void ) {
  2.  
  3. unsigned char caracterRecibido, cont = 0, cont1 = 0;
  4.  
  5.   for ( cont1 = 0; cont1 <= 6; cont1++ ){
  6.     bufferChrStr[ cont1 ] = 0; // inicializa la cadena toda en 0  
  7.   }
  8.  
  9.   for ( cont = 0; cont <= 6; cont++ ) {
  10.    caracterRecibido = SCI_recibir1Caracter();
  11.    if( caracterRecibido != 13 ) { // mientras no se oprima enter caracter de finalizacion de cadena
  12.     bufferChrStr[ cont ] = caracterRecibido; // llena el bufer  
  13.     cont = 7;
  14.    }
  15.   }
  16. }

Que código alternativo han trabajado para capturar n caracteres del serial

gracias nuevamente


 

anything