Autor Tema: Interrupciones por puerto serial...  (Leído 7982 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado ks-zero

  • PIC10
  • *
  • Mensajes: 17
Interrupciones por puerto serial...
« en: 16 de Noviembre de 2010, 12:03:27 »
Hola chicos, necesito una ayudita en cuento a las interrupciones por el pto. serial. por mas que busco e intento enterder las interrupciones que tienen en este foro, no puedo encontrar una tan facil como para entenderla!

al grano...
necesito solamente saber como es la programacion para que un micro, ejemplo: 16f84, al tener una interrupcion, tome ese caracter recivido y lo refleje en el puerto de salida.  en lo posible si puedes hacer el programa desde el la declaracion de variables  :oops:

disculpa por lo exigente pero me estoy viendo muy compicado con un proyecto en mi instituto.  :shock:


de antemano, MUCHAS GRACIAS!!!!!!  :)  
« Última modificación: 16 de Noviembre de 2010, 12:26:30 por Suky, Razón: El titulo no informaba de que se trata el tema... »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Interrupciones por puerto serial...
« Respuesta #1 en: 16 de Noviembre de 2010, 12:28:14 »
Puedes revisar las reglas del foro  ;-)

También revisar el datasheet del 16F84, este microcontrolador no tiene modulo UART. La recepción tienes que hacerla por software.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado ks-zero

  • PIC10
  • *
  • Mensajes: 17
Re: Interrupciones por puerto serial...
« Respuesta #2 en: 16 de Noviembre de 2010, 12:49:23 »
entonces dejemoslo en el pic 16f874a  :)

y si no, me das una ayudita?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
No contesto mensajes privados, las consultas en el foro

Desconectado ks-zero

  • PIC10
  • *
  • Mensajes: 17
Re: Interrupciones por puerto serial...
« Respuesta #4 en: 16 de Noviembre de 2010, 15:28:06 »

quiero hacer ese circuito..
http://www.pablin.com.ar/electron/proyecto/plink/index.htm

y es por eso q te ponia el ejemplo el 16F84.

y en cuanto a lo que llevo... no tengo nada. por q te preguntaras?
por q nunca aprendì a programar las interruciones en C, y se suma mi mala memoria !!
pero estoy tratando de entender...


#include <16f876a.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7)



// INTERRUPCION DE LA UART POR RX
#int_RDA
void RDA_isr()
{

//recibimos comando

recepcion=getc();

//confirmamos lo recibido

printf(recepcion);

}

void main (void)
{
  if (recepcion == "1")
   {
   if (activado == 0)
      OUTPUT_B(0x01)
   else
      activado = 0;
   }
}




y mi pregunta va: ¿ como puedo seguir ocupando el carácter recibido en "recepción", imaginando nos enviaron por el serial un "1", y ese valor se lo queremos dar al OUTPUT_B ? y así sucesivamente con cada dato que le mandemos teniendo el micro funcionando.


y de antemano, GRACIAS MAN OTRA VES ;)
MUCHAS!!



Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Interrupciones por puerto serial...
« Respuesta #5 en: 16 de Noviembre de 2010, 15:57:27 »
Una forma sencilla es tomar el valor en una variable temporal y luego asignar este valor al puerto.


Código: C
  1. // INTERRUPCION DE LA UART POR RX
  2. #int_RDA
  3. void RDA_isr()
  4. {
  5. char recepcion;
  6. //recibimos comando
  7. recepcion=getc();
  8. // Cargamos valor recibido en PORTB
  9. output_b(recepcion);
  10. }
  11.  
  12. void main (void)
  13. {
  14.      enable_interrupts(INT_RDA);
  15.      enable_interrupts(GLOBAL);
  16.      while(1){}
  17. }

En el foro hay muchos ejemplos para ver  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado djdapinrmx

  • PIC10
  • *
  • Mensajes: 6
Re: Interrupciones por puerto serial...
« Respuesta #6 en: 18 de Noviembre de 2010, 20:20:03 »
Se te olvido decir en que programas? bueno yo uso el CCS.

Yo entiendo que tu quieres mandarle numeros por rs232 y representarlos en bits en el puerto B ¿cierto?


Bueno pensando en que quieres eso y modificando un poco tu programa, a mi se me ocurre hacerlo asi:


#include <16f876a.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7)

char recepcion[4], abc=0;   //Declaras variables
int i=0, comando;
int1 bandera=0;

// INTERRUPCION DE LA UART POR RX
#int_RDA
void RDA_isr()
{
//recibimos comando
abc = getc ();   //Guarda lo recibido

if ((abc!=0x0D) && (abc<='9') && (abc=>'0'))      //Recibimos solo numeros
   recepcion=getc();                                  //Guarda el numero recibido en el string
else if ((abc==0x0D))            //Si recibimos enter
{
   recepcion='\0';                                  //Terminanos el string con un null 
   disable_interrupts(GLOBAL);         //Desactivamos interrupciones temporalmente
   fprintf("%s\n\r", recepcion);      //mostramos el string

}
//confirmamos lo recibido
fprintf("%c\n\r", abc);      
bandera=1;            //decimos que ya recibio un caracter

}

void main (void)
{
  enable_interrupts(INT_RDA);      //Habilita interrupcion del RS232
  enable_interrupts(GLOBAL);

 while (1)
 {
   if (bandera==1)         //Entramos solo si se recibio algun caracter
   {
     if (abc == 0x0D)         //Si se recibio enter mostar lo recibido en PORTB
     {
        comando = atoi (recepcion);   //transformamos lo recibido a numero
        OUTPUT_B(comando);      // Lo mandamos
        i=0;            //nuestro indice lo hacemos 0
        abc=0;
   enable_interrupts(GLOBAL);   //habilitamos la interrupcion
     }
     else
        i++;            //Si no es enter seguimos aumentado nuestro indice
   bandera=0;            //Sea como sea volvemos hacer bandera 0 para no entra infinitamente

   }
 }
}





Espero que si sirva, realmente lo hica al vuelo, no lo probe

Desconectado djdapinrmx

  • PIC10
  • *
  • Mensajes: 6
Re: Interrupciones por puerto serial...
« Respuesta #7 en: 18 de Noviembre de 2010, 20:25:53 »
Perdon. creo que me faltó algo.


Código: [Seleccionar]
#include <16f876a.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7)

char recepcion[4], abc=0;   //Declaras variables
int i=0, comando;
int1 bandera=0;

// INTERRUPCION DE LA UART POR RX
#int_RDA
void RDA_isr()
{
//recibimos comando
abc = getc ();   //Guarda lo recibido

if ((abc!=0x0D) && (abc<='9') && (abc=>'0'))      //Recibimos solo numeros
   recepcion[i]=getc();                                  //Guarda el numero recibido en el string
else if ((abc==0x0D))            //Si recibimos enter
{
   recepcion[i]='\0';                                  //Terminanos el string con un null  
   disable_interrupts(GLOBAL);         //Desactivamos interrupciones temporalmente
   fprintf("%s\n\r", recepcion);      //mostramos el string

}
//confirmamos lo recibido
fprintf("%c\n\r", abc);      
bandera=1;            //decimos que ya recibio un caracter

}

void main (void)
{
  enable_interrupts(INT_RDA);      //Habilita interrupcion del RS232
  enable_interrupts(GLOBAL);

 while (1)
 {
   if (bandera==1)         //Entramos solo si se recibio algun caracter
   {
     if (abc == 0x0D)         //Si se recibio enter mostar lo recibido en PORTB
     {
        comando = atoi (recepcion);   //transformamos lo recibido a numero
        OUTPUT_B(comando);      // Lo mandamos
        i=0;            //nuestro indice lo hacemos 0
        abc=0;
   enable_interrupts(GLOBAL);   //habilitamos la interrupcion
     }
     else
        i++;            //Si no es enter seguimos aumentado nuestro indice
   bandera=0;            //Sea como sea volvemos hacer bandera 0 para no entra infinitamente

   }
 }
}


Los comandos serian asi

001  (presionas enter)
002  (presionas enter)
...
...
...
y asi hasta
255   (presionas enter)

255 seria el limite por lo 8 pines del puerto.

Espero que te sirva y haberme explicado bien.
Cualquier duda preguntas.
« Última modificación: 18 de Noviembre de 2010, 20:33:39 por djdapinrmx »