Autor Tema: Interrupción por recepción de datos en la EUSART  (Leído 5275 veces)

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

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Interrupción por recepción de datos en la EUSART
« en: 22 de Septiembre de 2008, 16:33:26 »
Hola muchachos una preguntica....

Con respecto al tema de interrupciones sobre todo la que genera la EUSART cuando recibe un dato.

Aja, tengo la bandera de RCIF, que según el datasheet del 18F4550 es la que me avisa cuando un dato es recibido en los registros de la EUSART, corrijanme si me equivoco. Ahora, tengo este planteamiento que quiero hacer y diganme si es valido:

A ver como empiezo!! umm... Este.. aja ya! :lol:

Tengo un programa que el estará corriendo haciendo una serie de cosas, chequeando el conversor A/D, escribiendo esa medida en la LCD y todo eso. Pero aparte de eso, necesito que el pic me detecte cuando el conector serial RS232 sea conectado a la pc; no podría usar el comando Getc(), puesto que el programa se me quedaria paralizado allí esperando a que alguien le mande un dato desde el hyperterminal.... Mi propuesta es:

Habilitar las interrupciones por recepción de datos en la EUSART, y cuando RCIF, cambie de estado (porque hay un dato en los registros, ya que alguien conecto el cable serial y mando un dato a través del hyperterminal) pues el se me irá a la rutina de interrupción y hará lo que yo quiera que haga en esa interrupción...

Ahora mi pregunta es:

Cuando se de ese hecho, es decir, que se active la bandera de RCIF, ella misma al cambiar de estado va de una vez a la interrupción? o yo tengo que encuestar para saber la causa de interrupción y mandar l programa al vector de interrupción para que atienda la solicitud?? :?


No se si me explique!!!

Atte: Enigma... La llanerita de Guayana :-)

Voy a
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #1 en: 22 de Septiembre de 2008, 16:52:51 »
en CCS va directamente a ejecutar la rutina de interrupcion, siempre y cuando la habilites en tu main:

void main(){
   ...
   enable_interrupts(int_rda); //habilita la interrupcion por dato en uart
   enable_interrupts(global);  //habilitacion global de interrupciones
   ...
   ...
}

y que no se te olvide el:

#int_rda
void isr_rda(){
   ...
   ...  //tu código de interrupcion
}
.

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #2 en: 22 de Septiembre de 2008, 19:26:25 »
Ahhh o.k... gracias Cryn.... Ahora disculpa la molestia! otra preguntica: Imagina esta situación...

Tengo mi programa corriendo normalmente, entonces alguien por allá en el computador conecto el puerto serial y abrio el hyperterminal... Tres preguntas:

1) ¿El pic recibe inmediatamente alguna palabra o algun bit al momento de conectar el cacble serial a la pc?

2) ¿El pic recibe inmediatamente alguna palabra o algún bit al memomento de abrir el hyperterminal una vez ya conectado el cable serial?

ó

3) ¿Se le tiene que enviar cualquier letra al pic escribiendola en el hyperterminal para que el pic reciba algo en su registro de recepción?

y si es así como en está tercera pregunta; esto se hace sin usar el comando getc(), verdad???

Y disculpa la molestia!! :? es que no encuentro mucha información sobre esto, y pues bueno recurro a preguntarle a los maestros! :mrgreen:

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #3 en: 22 de Septiembre de 2008, 23:36:07 »
hola enigma! primero q nada te recomiendo leer un poco sobre la norma rs232, eso te va a sacar muchas dudas. por otro lado, no uso hyperterminal, pero vamos a ver si te puedo ayudar.
1) Segun la norma rs232, en el medio se mantiene un nivel alto, hasta que alguien desee mandar un dato, entonces se manda el bit de inicio q es un cero, y luego viene el paquete. Por lo tanto, si el cable esta desconectado, podes recibir ruido en la entrada... pero por defecto, en el momento de conectar el cable, no se recibe nada, solo este nivel alto del q te hablo.
2) No deberias recibir nada al abrir el programa, el mismo solo envia lo q vos le digas, ni mas, ni menos.
3) Lo de arriba, el programa envia lo q vos le digas. Y si, el software en tu pic tiene q hacer un getc o un gets para ir almacenando lo q se reciba en la memoria, ya que el registro q recibe los bytes se va refrescando con cada dato recibido.

Por ultimo, no te recomiendo hyperterminal, es mucho mejor el hercules, lo podes bajar de aca http://www.hw-group.com/products/hercules/index_en.html
suerte y saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #4 en: 23 de Septiembre de 2008, 00:10:57 »
Es decir, que si mi programa està corriendo normalito, el anda haciendo cualquier cantidad de instrucciones... y de repente se me ocurrio conectar el cable serial y abrir el hyperterminal o el hercules, y presione un tecla, ella inmediatamente se almacena en el registro de recepción del pic, activando a su vez la bandera de recepción sin necesidad del getc() correcto?? o estoy mal???

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #5 en: 23 de Septiembre de 2008, 09:47:34 »
si vos tenes todo bien conectado, tu micro ejecutando su programa principal, y de repente metes un caracter en hyperterminal, tu micro va a interrumpir, y va a ejecutar la ISR que hayas programado. Si en la ISR no pusiste q almacene la cadena q llega por el puerto, la vas a perder. Pensa q no solo podes mandar un caracter, sino q tambien podes mandar una cadena entera.
Tu problema es utilizar el getc? Porq no te cuesta nada hacer un var=getc(); en el caso q recibas una cadena, tendrias q enviar un caracter nulo (un cero) al final de la cadena para q gets() deje de leer.
saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #6 en: 23 de Septiembre de 2008, 13:51:48 »
Hola.

Tu puedes hacer lo que quieras en tu programa mientras esta en modo de espera para recibir un dato por el serial, siempre y cuando lo hagas mediante interrupciones (tal como lo mensiona Cryn arriba). Una vez se envia un dato por el serial del PC al PIC, la interrupcion del serial RDA se activa y se ejecuta la funcion de interrupcion, que en este caso deberia ser algo asi:

Código: C#
  1. #int_RDA
  2. void serial_isr(void)
  3. {
  4.   data_rs=0;
  5.   if(kbhit())//verifico si el dato ya esta disponible
  6.  {
  7.     data_rs=getc();//adquiero el dato
  8.         if(data_rs=='\r')//verifico final de trama de envio
  9.                 rs232_ok=true;//activo bandera de final de trama
  10.         else
  11.                 cbuff[xbuff++]=data_rs;//guardo el dato en el buffer
  12.  }
  13. }

Con ese codigo se esta guardando en el cbuff[] los datos enviados por el PC al pic. Luego de haber culminado el proceso de interrupcion, el programa principal sigue ejecutandose (esa es la gran ventaja de las interrupciones).

Saludos
El papel lo aguanta todo

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #7 en: 23 de Septiembre de 2008, 15:06:46 »
Ummm o.k ya entendi!!! jejeje

Ahora, en el programa hice lo siguiente:

Ya configure todo para la interrupción EUSART, y en efecto mi programa corre, y apenas abro el hyperterminal y conecto el cable serial pues imagino que es que el pic recibe un ruido o algo porque enseguida se me va a la rutina de interrupción, estoy segura de que va allá porque mande a encender un led de prueba y lo enciende. Pero hay un pequeño problema, el programa no me ejecuta un pedacito de codigo que hay en la interrupción, y lo se porque mande a encender otro led en ese pedacito y nada.

Este pedacito de código lo que deberia hacer es escribir en el hyperterminall lo que hay en la eeprom interna del micro, leo la memoria y escribo, pero no me lo hac e pórque mande a encender otro led y nada. No se si es que estoy haciendo algo mal o no se... Todo esto lo estoy enviando por una red 485 ya probrada que se que sirve. Donde con RA4 habilito la recepción y con RA5 la transmisión:

El pedacito de código que no funciona es este:

#int_rda
void isr_rda(void)
{
    ABDEN=0;                                         // Deshabilita la detección de Auto-Baud rate
    USART_activa_tx();                                                 // Llamo a la función que me habilita la transmisión
    output_high(PIN_A2);                                               // Enciendo un led de prueba
    delay_ms(1000);
    printf("               \n\r ");
    //printf("Puntero= %d V",puntero);
    //delay_ms(3);                                                     // Una demorita por si acaso
    index=0;
    //while(index<=puntero)
       //{
          output_high(PIN_A3);                                               // Enciendo un led de prueba
          delay_ms(1000);
          for(i = 0; i < 4; ++i)
             {
                *((int8 *)(&dato) + i) = read_eeprom(index + i);
             }
          index=index+4;
          for(i = 0; i < 4; ++i)
             {
                *((int8 *)(&valorc) + i) = read_eeprom(index + i);
             }
          index=index+4;
          printf("     Voltaje=  %2.2g V",dato);                       // Mando a mostrar el valor del conversor
          printf("     Corriente=  %2.2g mA",valorc);                  // Mando a mostrar el valor del conversor
          delay_ms(3);                                                 // Una demorita por si acaso
          output_low(PIN_A3);                                             // Enciendo un led de prueba
       //}
       output_low(PIN_A2);                                             // Enciendo un led de prueba
       RCIF=0;
}

Intente quitar el while como observan allí para ver si era eso y pues nada, el pic ni se asoma por esa parte!

El código completo está adjunto por si le quieren echar un ojo!

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #8 en: 23 de Septiembre de 2008, 15:16:48 »
Hola.

Te recomiendo que halla la menor cantidad de codigo en la rutina de interrupcion. Es mejor declarar un flag tipo int1 y procesar todo lo demas en el programa principal. Tampoco es recomendable colocar delays dentro de las rutinas de interrupcion cuando son del orden de los milisegundo, esto trae muchos problemas que a uno lo dejan loco!!!

Coloca esa parte del codigo en el programa principal y activas la entrada con un flag. (esa es mi recomendacion  :mrgreen: )

Saludos
El papel lo aguanta todo

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #9 en: 24 de Septiembre de 2008, 00:18:56 »
Ummm o.k... entendido, atenderé tu recomendación....

Solo una duda, cuandp dices esto:

Cita de: MLO_
Es mejor declarar un flag tipo int1 y procesar todo lo demas en el programa principal.

Entiendo el poque hacer la rutina en el pograma principal, pero no entiendo lo de declarar el flag tipo int1... Y disculpa mi ignorancia! :(

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #10 en: 24 de Septiembre de 2008, 00:59:14 »
A lo q se refiere MLO, es q pongas un flag (una variable booleana, osea int1). Entonces cuando salta la interrupcion, lo unico q haces en la ISR, es levantar ese flag y salir. Luego en tu programa principal pones dentro del bucle principal un if, que verifique constantemente el estado del flag, cuando este sea 1, ejecutas tu codigo y al final lo volves a poner en 0.

Por cierto, no entiendo q hace la variable puntero en tu codigo... quizas nunca entra a la parte roja del codigo porq la condicion del while se cumple de entrada (index=puntero  osea  0=0)
saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #11 en: 24 de Septiembre de 2008, 01:03:03 »
una cosita mas... arriba te explique mas o menos lo q pasa cuando conectas el cable, eso genera mucho ruido. Conviene tener todo ya conectado a la hora de abrir el puerto serial en ambos lados (ucontrolador y pc). Podrias implementar algun sistema en tu pic que detecte cuando hay un alto en el pin de entrada, eso significa q se conecto el cable, entonces esperas algunos us a q pase el ruido y recien te pones a escuchar.
Saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #12 en: 24 de Septiembre de 2008, 14:04:21 »
Hola... Gracias por la aclaratoria, he entendido muy bien!!! voy a intentar hacer eso a ver que pasa, ya otras personas me habían dicho que colocar una rutina muy larga en la interrupción me ocasionaria lios...

Con respecto a lo de index=puntero... En realidad es while(index<=puntero)... Te explico: :lol:

Puntero es una variable que me va indicando la posición de la memoria en donde se deberia guardar el dato. Por eso para leer, digo que mientras la variable index sea menor o igual a puntero lea todo lo que hay. Puesto que imaginate que un dato se guardo en las 100 primeras posiciones de la memoria, entonces puntero ha de estar apuntando a la dirección 100. La rutina del while que está en la interrupción lo que hace es leerle todas las posiciones anteriores a la número 100... No se si me explique??? :(

Bueno al menos eso es lo que deberia hacer!!!!

Estado: Siguiendo consejos de los que más saben! jejejeje a implementar el FLAG!!!!!! jejeje :D

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #13 en: 24 de Septiembre de 2008, 15:46:43 »
pero si vas a hacer un while... tendrias q ir incrementando la variable puntero... no veo q la incrementes en ningun lugar...
te recomiendo q hagas esto
while(index<=puntero++)
suerte!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Interrupción por recepción de datos en la EUSART
« Respuesta #14 en: 24 de Septiembre de 2008, 16:05:04 »
Hola

Creo que Enigma aumenta es la variable index...

Saludos
El papel lo aguanta todo


 

anything