Autor Tema: Confirmación de fin de transmision de datos en EUSART  (Leído 2370 veces)

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

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Confirmación de fin de transmision de datos en EUSART
« en: 31 de Octubre de 2016, 21:22:11 »
Estoy testeando con el bit TRMT del registro TXSTA de un PIC12F1822 cuando se han terminado de enviar una serie de datos por EUSART, y funciona, pero es muy lento, si le pongo un simple retardo de 10ms funciona igual pero mucho más rápido.

Aun no lo probado en real, pero en simulación tarda como 2s en detectar el fin de transmisión con ese bit.

Estoy haciendo esto despues de enviar los datos:
Código: [Seleccionar]
void EUSART_Write_Wait(void){
    while(!TXSTAbits.TRMT){}
}

Existe una forma mejor de hacerlo?

Gracias!!! un saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Confirmación de fin de transmision de datos en EUSART
« Respuesta #1 en: 31 de Octubre de 2016, 22:12:49 »
Creo que lo dijiste todo:

Citar
Aun no lo probado en real, pero en simulación tarda como 2s en detectar el fin de transmisión con ese bit.

Seria imposible pensar que el hardware tenga un delay de 2s ,, y que al ponerle un delay, milagrosamente el hardware mientras el procesador esta ejecutando saltos y ni siquiera tocando el modulo de UART, empieze a funcionar correctamente.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Confirmación de fin de transmision de datos en EUSART
« Respuesta #2 en: 01 de Noviembre de 2016, 10:37:52 »
Creo que lo dijiste todo:

Citar
Aun no lo probado en real, pero en simulación tarda como 2s en detectar el fin de transmisión con ese bit.

Seria imposible pensar que el hardware tenga un delay de 2s ,, y que al ponerle un delay, milagrosamente el hardware mientras el procesador esta ejecutando saltos y ni siquiera tocando el modulo de UART, empieze a funcionar correctamente.

Sí, la simulación está bien para desarrollar hasta cierto punto porque es más rápido o más comodo, pero creo que llegó el momento de empezar a montar en real.

Gracias!!! Saludos.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Confirmación de fin de transmision de datos en EUSART
« Respuesta #3 en: 05 de Noviembre de 2016, 07:32:53 »
Bueno, en real funciona perfecto  :)

Saludos!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado Paula

  • PIC10
  • *
  • Mensajes: 19
Re:Confirmación de fin de transmision de datos en EUSART
« Respuesta #4 en: 14 de Noviembre de 2016, 13:35:04 »
Hola,

Estoy realizando un programa para leer una cadena de caracteres, y estoy usando un módulo HC-05 que envía sus comandos AT con su respectivo retorno de carro, quisiera encender un led cuando haya leído el fin de línea, el problema es que el led nunca enciende quizás este definiendo mal cuando llega el retorno de carro? y hay alguna posibilidad de definir en xc8 un arreglo dinámico? Dejo la función de interrupción donde leo los caracteres. Gracias 

char array[10];
char *buffer=&array[0];

//RECEPCIÓN DE DATOS DEL MODULO USART

void interrupt int_usart(){
    if(PIR1bits.RCIF==1){
        *buffer=RCREG;
        buffer++;
       
        if (buffer==0x00){
            PORTDbits.RD0=~PORTDbits.RD0;
        }
    }
  }

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Confirmación de fin de transmision de datos en EUSART
« Respuesta #5 en: 14 de Noviembre de 2016, 14:15:10 »
El hexadecimal del retorno de carro es 0x0D

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Confirmación de fin de transmision de datos en EUSART
« Respuesta #6 en: 14 de Noviembre de 2016, 14:25:45 »
Código: [Seleccionar]
if (buffer==0x00){
            PORTDbits.RD0=~PORTDbits.RD0;

Tu programa no va a entrar nunca por este if... "buffer" es un puntero, contiene una dirección de memoria y no el valor que esperas por usart

Desconectado Paula

  • PIC10
  • *
  • Mensajes: 19
Re:Confirmación de fin de transmision de datos en EUSART
« Respuesta #7 en: 14 de Noviembre de 2016, 15:37:57 »
No entiendo cuando dices que es un puntero y por eso no tomará el valor del USART, tengo entendido que un puntero puede cambiar el contenido de la dirección de memoria donde apunta, aun así hice un arreglo normal y tampoco me lee ese fin de línea. :/

char array[10];
int i=0;
//RECEPCIÓN DE DATOS DEL MODULO USART
void interrupt int_usart(){
    if(PIR1bits.RCIF==1){
        array=RCREG;
        i++;
        if (array==0x0D){
            PORTDbits.RD0=1;
            delay_ms(1000);
            PORTDbits.RD0=0;
        }}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Confirmación de fin de transmision de datos en EUSART
« Respuesta #8 en: 14 de Noviembre de 2016, 16:50:22 »

buffer -> Contiene la direccion a la cual apunta.

*buffer -> es el contenido de la direccion que esta almacenada en buffer.

hacer:

Código: C
  1. if (buffer==0x00){

Es lo mismo que preguntar si buffer tiene la direccion 0x00.
Si quisiera preguntar si el CONTENIDO apuntado por la direccion de memoria almacenada en buffer, deberia ser asi:

Código: C
  1. if (*buffer==0x00){

----------------------

Lo mismo ocurre con array... En un vector, matriz, array. Tenes que:

char array[10];

array[0] = CONTENIDO del primer elemento
&array[0] = DIRECCION de memoria del primer elemento
&array[1] = DIRECCION de memoria del segundo elemento
array = DIRECCION de memoria del primer elemento

por lo tanto lo que vos buscas es algo asi:

Código: C
  1. char array[10];
  2. int i=0;
  3. //RECEPCIÓN DE DATOS DEL MODULO USART
  4. void interrupt int_usart(){
  5.     if(PIR1bits.RCIF==1){
  6.         array[i]=RCREG;
  7.         if (array[i]==0x0D){
  8.             PORTDbits.RD0=1;
  9.             delay_ms(1000);
  10.             PORTDbits.RD0=0;
  11.             i=10; // Asi cuando pasa por el if, vuelve a 0, y comeinza de vuelta.
  12.         }
  13.  
  14.         //Incremento el indice
  15.         i++;
  16.  
  17.         // Verifico que la i no sea mayor a 9
  18.         if(i>=sizeof(array))
  19.         {
  20.              i=0;
  21.         }
  22. }

Desconectado Paula

  • PIC10
  • *
  • Mensajes: 19
Re:Confirmación de fin de transmision de datos en EUSART
« Respuesta #9 en: 16 de Noviembre de 2016, 00:18:35 »
Hola,

Muchas gracias por tu ágil respuesta, si me sirvió y gracias por tus explicaciones también son muy buenas.


 

anything