TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ochi en 09 de Abril de 2008, 12:35:03

Título: putsUART y WriteUART
Publicado por: ochi en 09 de Abril de 2008, 12:35:03
hola, me gustaría saber, si alguien sabe la diferencia entre utilizar las funciones de C30

putsUART1(unsigned int *buffer)  y
WriteUART1 (unsigned int data)

según entiendo, ambas enviarían un mensaje por medio del puerto U1TX del pic, la primera un mensaje entero y la segunda caracter a caracter.
Sin embargo sólo me envía los datos la segunda (caracter a caracter que parece algo feo...)

¿Estoy equivocada y putsUART1 no vale para eso? en ese caso, ¿para que vale? y en caso contrario ¿que puedo estar haciendo mal?


 Gracias
Título: Re: putsUART y WriteUART
Publicado por: MLO__ en 09 de Abril de 2008, 15:39:15
En la funcion se ve la diferencia. putsUART1 envia es un array, mientras que la segunda no. Por ejemplo, para enviar "hola mundo" seria asi:

Código: [Seleccionar]
char hi[11] = {'h','o','l','a',' ','m','u','n','d','o'};
...
for (i=0, i<=10, i++)
{
  WriteUART1(hi[i]);
}
.....
putsUART1("Hola Mundo");

Creo que es asi........
Título: Re: putsUART y WriteUART
Publicado por: maunix en 09 de Abril de 2008, 16:47:24
putsUART1(unsigned int *buffer)  y

Si tienes tiempo, fíjate de buscar el código fuente de la función.  Estimo que mandará datos hasta que encuentre un 0 o nulo.  Si te fijas en la sintaxis no hay nada que indice "hasta cuando debe mandar datos" con lo cual es lógico que sea hasta encontrar un caracter nulo.  Si no fuera así , cómo sabrá la rutina hasta cuando debe mandar datos? sería imposible adivinarlo.  Saludos

Si en tu arreglo tienes ceros , pues se detendrá en ellos y no seguirá imprimiendo.

En el otro caso no , porque está claro que se enviará solo 1 dato.


Título: Re: putsUART y WriteUART
Publicado por: ochi en 10 de Abril de 2008, 05:22:00
Si, todo eso que me decís está claro, lo que me pasa es, yo hago:

unsigned int buffer[80];
int i = 0;

if(DataRdyUART1()){
  buffer = ReadUART1();



Título: Re: putsUART y WriteUART
Publicado por: ochi en 10 de Abril de 2008, 05:24:19
Si, todo eso que me decís está claro, lo que me pasa es, yo hago:

unsigned int buffer[80];
unsigned int i = 0;

if(DataRdyUART1()){
  buffer = ReadUART1();
  i++;
  if(i == 10) {
    putsUART1(buffer);
    i = 0;
    }
}




si lo pongo así cada vez que i es igual a 10 envía sólo un caracter, la primera vez el primero, la segunda el segundo, ... y así.

sin embargo, si pongo putsUART1("hola") lo hace perfectamente.

¿que puede estar mal?

muchas gracias


Título: Re: putsUART y WriteUART
Publicado por: jfh900 en 10 de Abril de 2008, 05:41:15
La función:

putsUART1(unsigned int *buffer)

Hay que pasarla un puntero y no el propio buffer:

char cBuffer = "Hola Mundo";

putsUART1(&cBuffer);

Un saludo
Título: Re: putsUART y WriteUART
Publicado por: ochi en 10 de Abril de 2008, 05:52:45
si, eso ya lo he intentado, con & y con * (no entiendo muy bien el tema de los punteros en C) pero hace lo hace mal también (el & sólo pone el primer caracter y el * no hace nada)

Perdon por haber puesto antes un post a medias, ni siquierea me había dado cuenta...

Gracias
Título: Re: putsUART y WriteUART
Publicado por: jfh900 en 10 de Abril de 2008, 08:55:41
Repasando tu mensaje, creo que lo que está mal es la forma de guardar los caracteres (no se muy bien como trabaja la función ReadUART1). La forma correcta de hacerlo es:

Código: C
  1. unsigned int buffer[80];
  2. unsigned int i = 0;
  3.  
  4. if(DataRdyUART1()){
  5.   buffer[i] = ReadUART1();
  6.   i++;
  7.   if(i == 10) {
  8.     cBuffer[i] = '\0'; //Terminamos el string
  9.     putsUART1(buffer);
  10.     i = 0;
  11.     }
  12. }

Un saludo
Título: Re: putsUART y WriteUART
Publicado por: ochi en 10 de Abril de 2008, 10:45:20
Uff, vaya lo puse mal en el post, pero en el programa lo tenía bien, he conseguido arreglarlo de una forma muy rara, si cambio:

unsigned int buffer[80];
por
char buffer[80];

funciona, pero, en la librería pone

void putsUART2(unsigned int *buffer) __attribute__ ((section (".libperi")));

funciona, pero si alguien tiene una idea de porque con  unsigned int sólo pone el caracter de la posición 0 y con char lo hace bien y me lo puede decir se lo agradecería, por entender bien como van las cosas. Gracias
Título: Re: putsUART y WriteUART
Publicado por: RICHI777 en 10 de Abril de 2008, 11:33:01
Hola,

Citar
Uff, vaya lo puse mal en el post, pero en el programa lo tenía bien, he conseguido arreglarlo de una forma muy rara, si cambio:

unsigned int buffer[80];
por
char buffer[80];
Porque no es lo mismo trabajar con un entero que con un caracter sin un cast especifico, además como bien te comento jfh900 estas almacenando mal el dato leido en el buffer debido a que nunca actualizas el indice del mismo, es decir al:
Código: [Seleccionar]
buffer = ReadUART1();
Con cada nueva lectura estas pisando el valor anterior.

Con respecto a esto:
Citar
char cBuffer = "Hola Mundo";
putsUART1(&cBuffer);

En teoria ( Standart ANSI C ) cuando no pones el & es lo mismo que colocar &cBuffer[0], es decir implicitamente el compilador le esta pasando un puntero al primer elemento del array.
Saludos !
Título: Re: putsUART y WriteUART
Publicado por: ro en 16 de Abril de 2008, 12:40:00
hola, tengo problemillas con la intrucción putsUART y el uso de interrupciones. Tengo habilitadas las interrupciones de la UART con la máxima prioridad y pongo:

int main (void){
    IFS1bits.U2TXIF = 1; //hay interrupción
    while(1) {} //para que el programa se ejecute todo el tiempo.
}


void __attribute__((__interrupt__)) _U2TXInterrupt (void) {
   
    putsUART2("hola");
    IFS1bits.U2TXIF = 0;
    return;
}



Esto me escribe continuamente holaholaholaholahola....  he probado de todo y no se ya que hacer. ¿porqué no me desactiva las interrupciones?

si pongo PORTB = 0xFF; después de deshabilitar la bandera, y lo llevo a los leds se encienden, osea, que el programa llega ahí, pero sigue escribiendo.

También he probado ejecutando paso a paso, pero después de putsUART me desaparece el cursor.

¿alguna idea? Muchas gracias.
Título: Re: putsUART y WriteUART
Publicado por: RICHI777 en 16 de Abril de 2008, 12:46:15
Hola, a mi entender la funcion putsUART2 deberia estar fuera de la interrupción, ya que dentro de la misma estas enviando siempre a transmitir osea un loop infinito.
Saludos !
 
Título: Re: putsUART y WriteUART
Publicado por: ro en 16 de Abril de 2008, 12:58:13
pero... si no lo meto dentro de la interrupcion... ¿como lo hago? quiero interrumpir si tengo algo que transmitir...
Título: Re: putsUART y WriteUART
Publicado por: RICHI777 en 16 de Abril de 2008, 13:23:03
Mira normalmente la cosa es asi, tanto para transmitir o recibir se utilizan buffers en anillo ( hay info en la web con respecto a la implementacion ), te explico someramente...
Vos tenes definido un buffer de transmicion de largo n y dos indices uno que cuenta la cantidad transimitida y el otro cuenta la cantidad en el buffer. Cuando queres transmitir algo llamas a la funcion y lo que haces es colocar en el buffer de transmicion lo que queres transmit¡r actualizando el indice de caracteres en el buffer y por ultimo habilitando la interrupcion de transmicion, despues de esto salis de la función.
Por otro lado en el handler de la interrucpion, se llamara cuando el registro interno de transmicion de la UART este vacio, hay verificas que exista algo para transmir ( en este caso sii ) lo pones en el registro de transmicion y actualizas el ind¡ce de transmitidos cuando los dos indices son iguales paras, deshabilitando las int y listo.
Como te dije antes es bien somero pero es terminos generales es asi.
Saludos !
Título: Re: putsUART y WriteUART
Publicado por: ro en 17 de Abril de 2008, 09:02:29
Entonces... si no te he entendido mal la interrupción de transmisión se activa después de enviar las cosas, ¿no? [dependiendo del valor de UTXISEL, al tx un caracter o vaciar el buffer]

Pero yo lo que quiero es transmitir después de interrumpir (con prioridad máxima) para que nadie me pueda dejar la transmisión a medias.
¿se puede hacer esto que digo? Muchas gracias
Título: Re: putsUART y WriteUART
Publicado por: RICHI777 en 17 de Abril de 2008, 12:29:29
Hola como te comente antes, en la función de transmición una vez que llenas el buffer, habilitas la interrupción.
Saludos !
Título: Re: putsUART y WriteUART
Publicado por: superprp en 16 de Junio de 2008, 10:46:53
como veis esta funcion para sustituir a putsUART y a writeUART???

void putUART2(char *buffer, int longitud) {

   int i =0;
   while (i < longitud){
        while(U2STAbits.UTXBF);  /* wait if the buffer is full */
        U2TXREG = *buffer++;   /* transfer data byte to TX reg */
      i++;
    }
}