Autor Tema: Interrupción Serial con varios USART - CCS Compiler  (Leído 4161 veces)

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

Desconectado joseluislo12

  • PIC10
  • *
  • Mensajes: 20
Interrupción Serial con varios USART - CCS Compiler
« en: 06 de Mayo de 2016, 16:56:33 »
Buenos días

Tengo una pregunta: estoy trabajando con un PIC16F1936 al cual le configuro dos puertos de transmisión y recepción serial así:

Código: [Seleccionar]
#use RS232 (BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, bits=8, PARITY=N, stream=USB, errors)
#use RS232 (BAUD=9600, RCV=PIN_A1, RCV=PIN_A0, bits=8, PARITY=N, stream=master, errors)

En el main de mi programa estoy configurando la interrupción por recepción serial:

Código: [Seleccionar]
void main(){
   // Initial configuration
   ...
   enable_interrupts(global);
   enable_interrupts(int_rda);
   ...
   
   // Loop
   while(true){
      RESTART_WDT();
      // Serial reception
      if(flag_recep==1){
         RESTART_WDT();
         flag_recep=0;
         br = 0;
         // CODE
      }
   }
}

Y finalmente la interrupción serial:

Código: [Seleccionar]
// --------------- Serial Interrupt ---------------
#int_RDA
void RDA_isr(void){
   RESTART_WDT();
   temp[br] = getc();
   br++;
   if(br==1){
      //else{br = 0;}
   }
   if(br == 2){lenght = temp[1]+3;}
   if(br == lenght){
      br = 0;
      flag_recep = 1;
      lenght = 0;
   }
}

He utilizado esta configuración con un PIC16F1827 con un único puerto serial y todo funciona correctamente. Mi inquietud es qué sucede con la interrupción serial si hay más de un puerto serial configurado en el microcontrolador. ...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupción Serial con varios USART - CCS Compiler
« Respuesta #1 en: 06 de Mayo de 2016, 17:15:56 »
El PIC en cuestion posee una sola UART por hardware, por lo tanto es la unica que puede entrar a la interrupcion cuando llegue un dato.

El otro UART se realizar por software y no posee esta ventaja. Es decir podrias perder datos, ya que puede no estar pendiente de la entrada (deberia leer la entrada siempre) y esta haciendo otra cosa. Me refiero a que la diferencia esta en:

- Hardware, simplemente sabes que llego un dato mirando el flag ( o cuando entra a la interrupcion ) y ahi esta completo
- Software, para recibir un dato, tenes que estar todo el momento preguntando por la entrada para formar los 8 bits del dato.

Hay que tener cuidado por que estas funciones suelen ser bloqueantes y veo que usas el WDT, asi que ojo con eso ya que por ejemplo el kbhit() funciona distinto, en hardware funciona cuando hay un dato, en software es cuando detecta un 1 en el pin de recepcion, el manual especifica que esta funcion deberia llamarse 10 veces mas rapido que el bitrate de tranmision para asegurarse que ningun dato se pierda.


 

anything