• Sábado 4 de Mayo de 2024, 19:33

Autor Tema:  Sci  (Leído 2319 veces)

borgo

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Sci
« en: Miércoles 22 de Noviembre de 2006, 13:19 »
0
Hola todos.

Por favor alguien tiene algún ejemplo de como inicializar el SCI en C con un JK8??
Y otra consulta:
No logro hacer funcionar correctamente (de manera confiable) un código en C para comunicaciónes RS232 en un JK1, lo que hago es basicamente hacer un for o un while y esperar el tiempo del bit en estos bucles pero no se porque motivo esto parece no ser confiable en C, si funciona en asembler y es importante para los micros que no traen puerto SCI.

Si alguien me tira una idea gracias!!!

   Saludos  :hola:

    Angel

Daniel´s

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Sci
« Respuesta #1 en: Viernes 24 de Noviembre de 2006, 14:06 »
0
Hola Angel

Para inicializar el SCI digamos a 9600 baudios 8bit s/p
/*******************************************************/
/*        CONFIGURACION DEL  PUERTO SCI                */
/*******************************************************/
void Configurar_SCI(void){
 
  SCBR = 0X21; /*Configura SCI a 9600,8,N,1*/
  SCC1 = 0X40; /*Habilita el SCI*/
   SCC2 = 0X28; /*Habilita inte del receptor y habil. el Trans.*/
  SCC3 = 0;    /*Borra bit 8 (no utilizado)*/
  SCS1; /*Borra las banderas SCTE y TC del registro SCS1*/
 
}
//******************************************************
El tema del receptor en un JK1 es mas complicado en C, es mas te diría que una de las cosas mas engorrosas es hacer que los tiempos en bucles for, while, do while, etc se comporten como con la exactitud del assembler.
Te sugiero usar el timer uno para fijar los tiempos del bit, te posteo un transmisor para un jk1 que trabaja de esta forma.

/*******************************************************/
/*         Subrutina que maneja el Tranmisor           */
/*******************************************************/
void Transmitir_Caracter(void){
   
     bit =0;
   PTD_PTD6 = 0; //Pongo el bit de inicio
   bandera_Baudio = 1;
   T1SC ^= 0X20; /*Start Timer*/
   while((bandera_Baudio & 0x01) == 0x01);
   do {

   if(Caracter & 0x01 == 0x01) {
   
   PTD_PTD6 = 1; //Pongo TX en 1
   bandera_Baudio = 1;
   T1SC ^= 0X20; /*Start Timer*/
   while((bandera_Baudio & 0x01) == 0x01);  
 }
   else
 {
   PTD_PTD6 = 0; //Pongo TX en 0
   bandera_Baudio = 1;
   T1SC ^= 0X20; /*Start Timer*/
   while((bandera_Baudio & 0x01) == 0x01);  
 }
   
   Caracter = Caracter >>1; //Roto para pasar los 8 bits
   bit++;
 } while(bit <=7);
   
   PTD_PTD6 = 1; //Pongo el bit de Stop
   bandera_Baudio = 1;
   T1SC ^= 0X20; /*Start Timer*/
   while((bandera_Baudio & 0x01) == 0x01);
   
  }  
/*******************************************************/
/*  ISR DEL DESBORDE DEL TIMER   (CRISTAL DE 20 MHZ)   */
/*******************************************************/
#pragma TRAP_PROC
void TIMER(){
 
  T1SC = 0X70;    
  T1SC ^= 0X10;
  bandera_Baudio = 0;
  T1SC ^= 0X80;  

}  

/*******************************************************/
/*        CONFIGURACION DEL  TIMER POR DESBORDE        */
/*******************************************************/
void Configurar_Timer(void){
 
  T1SC = 0X70;
  T1SC0 = 0;    
  T1SC1 = 0;
   T1MODH = 0x07;
  T1MODL = 0x7F;
   
}

Cualquier cosa a tus órdenes.

Saludos  :hola:

     Daniel

borgo

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: Sci
« Respuesta #2 en: Viernes 24 de Noviembre de 2006, 17:50 »
0
GRACIAS Daniel !!!

Probé el código que posteaste impresionante como funciona!!
No se había ocurrido eso del Timer, está claro que me falta baste en esto del C  :(  ahora viendo tu código me surge una duda, como trabaja la línea:
   
       SCS1; /*Borra las banderas SCTE y TC del registro SCS1*/

O sea, solo con poner SCS1 ; ???


Gracias de nuevo
        Angel

Daniel´s

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Sci
« Respuesta #3 en: Viernes 24 de Noviembre de 2006, 18:36 »
0
Cita de: "borgo"
   
       SCS1; /*Borra las banderas SCTE y TC del registro SCS1*/

O sea, solo con poner SCS1 ; ???

Hola Angel
Colocar

      SCS1; >>>>>> equivale a LDA SCS1 o mas exactamente LDA 0X16, significa que cargas el regisro en el Acumulador y si te fijas en la hoja de datos del micro basta con leer este registro para que este borre las banderas, por eso solo con leerlo ya está  ;)

Saludos. :hola:

   Daniel