TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: PabloFiscella en 27 de Marzo de 2006, 10:01:00

Título: #INT_RDA
Publicado por: PabloFiscella en 27 de Marzo de 2006, 10:01:00
Hola a todos:

En otro tema plantie como usar el kbhit para que el programa no se frene a menos de que se haya recibido un caracter y me comentaron que hay una interupcion llamada INT_RDA que se activa cada vez que se recibe un dato.
El problema es que parece no funcionar o no la estoy activando bien.
Busque en muchos lugares por internet y no es mas que lo que el ejemplo que ahora pongo. Saben por que puede no estar funcionando????

#include <18F452.h>
#device ADC=10
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C0,rcv=PIN_C1)
#fuses XT, NOPROTECT, PUT, NOWDT, BROWNOUT, NOLVP, NOCPD, NOWRT

#include <lcd_4x20.c>

unsigned int opcion;

#INT_RDA
rda_isr() {
    opcion = getc();
}

void main()
{
    enable_interrupts(INT_RDA);
    enable_interrupts(GLOBAL);

    lcd_init();

    while(true) {
        lcd_gotoxy(1,1);
        if(opcion == "1")
            printf(lcd_putc,"1111";
        else if(opcion == "2")
            printf(lcd_putc,"2222";
    }
}
Título: RE: #INT_RDA
Publicado por: Azicuetano en 27 de Marzo de 2006, 10:29:00
Mira esto que funciona muy bien Sonrisa Gigante

http://miarroba.com/foros/ver.php?foroid=46840&temaid=4691672


Un saludo desde Alicante.
Título: RE: #INT_RDA
Publicado por: PabloFiscella en 27 de Marzo de 2006, 11:55:00
En cuanto llego llego a casa lo pruebo. Con que programa se puede probar? con el hypertermilal se pueden ingresar datos?

Ahora el soft asi como lo puse en el otro mensaje no deberia funcionar?

Muchas gracias.
Saludos.
Pablo
Título: RE: #INT_RDA
Publicado por: PabloFiscella en 27 de Marzo de 2006, 20:04:00
Hola:

El programa lo grabe y en el Hyperterminal muestra los datos pero no tengo forma de ingresar algo para ver si lo lee.
Que programa usan para monitoriar rs232?

REDPIC si estas ahi por favor tirame una soga que ya no se que hacer y vos ya hiciste varios ejemplos.

Saludos.
Pablo
Título: RE: #INT_RDA
Publicado por: migsantiago en 27 de Marzo de 2006, 20:10:00
Hola Pablo

Para pruebas físicas puedes usar el hyperterminal de windows. Para pruebas virtuales usa proteus y el virtual terminal.

Título: RE: #INT_RDA
Publicado por: PabloFiscella en 27 de Marzo de 2006, 20:14:00
Use el hyperterminal y envia datos pero mi problema es la recepcion con la interupcion RDA si ella recibe bien, pero me es necesaria usarla.
Título: RE: #INT_RDA
Publicado por: migsantiago en 27 de Marzo de 2006, 20:31:00
Talvez te sirva este programa...

http://www.4shared.com/file/1093824/a9720e2f/serial_watcher.html

Si no, esperemos a RedPic para que te ayude.

Sonrisa Gigante
Título: RE: #INT_RDA
Publicado por: PabloFiscella en 27 de Marzo de 2006, 21:10:00
Hola lo probe y me muestra solo

.[Enter] Procesa comando
.[Escape] Borra todo el buffer
.[Delete] Borra último carácter del buffer
.[w] Comando Escribe
.[] Comando Lee

si envio un string w12 por ejemplo no hace nada, no dice leyendo o escribiendo como creo que deberia decir.
Título: RE: #INT_RDA
Publicado por: RedPic en 28 de Marzo de 2006, 01:42:00
Pabo:

Dame datos. ¿Has copiado el programa completo? o ¿lo has adaptado para el 18F452?

Si es así, ponme exactamente el código fuente que has usado, para ver si hay algo distinto.

Mi código lo he probado con el 16F876A y el 16F628A con cristales de 4, 6, 10 y 20 Mhz sin problemas.

Vamos a intentar descartar problemas de Soft antes de ver si es de Hard.



Título: RE: #INT_RDA
Publicado por: PabloFiscella en 28 de Marzo de 2006, 05:14:00
El programa lo copie tal cual como estaba.

Yo descarto que sea de hard porque probe este ejemplo y funciona:

#include <18F452.h>
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C0,rcv=PIN_C1)
#fuses XT, NOPROTECT, PUT, NOWDT, BROWNOUT, NOLVP, NOCPD, NOWRT
#include <lcd_4x20.c>
unsigned int opcion;

void main() {
  lcd_init();
  while(true) {
     opcion = getc();
     lcd_gotoxy(1,1);
     if(opcion == "1")
        printf(lcd_putc,"1111"Giño;
     else if(opcion == "2")
        printf(lcd_putc,"2222";
  }
}

Pero de esta otra no funciona:

#include <18F452.h>
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C0,rcv=PIN_C1)
#fuses XT, NOPROTECT, PUT, NOWDT, BROWNOUT, NOLVP, NOCPD, NOWRT
#include <lcd_4x20.c>
unsigned int opcion;

#INT_RDA rda_isr() {
  opcion = getc();
}

void main() {
  enable_interrupts(INT_RDA);
  enable_interrupts(GLOBAL);
  lcd_init();
  while(true) {
     lcd_gotoxy(1,1);
     if(opcion == "1")
        printf(lcd_putc,"1111"Giño;
     else if(opcion == "2")
        printf(lcd_putc,"2222";
  }
}
Título: RE: #INT_RDA
Publicado por: RedPic en 28 de Marzo de 2006, 05:42:00
Prueba esta combinación y dime qué obtienes :


Codigo:

#include <18F452.h>
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C0,rcv=PIN_C1)
#fuses XT, NOPROTECT, PUT, NOWDT, BROWNOUT, NOLVP, NOCPD, NOWRT

#include <lcd_4x20.c>

char opcion;

#INT_RDA
rda_isr() {
  opcion=0x00;
  if(kbhit()){
    opcion=getc();
  }
}

void main() {
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   lcd_init();
   while(true) {
      if(opcion!=0x00){
         lcd_gotoxy(1,1);
         switch(opcion){
            case "1": printf(lcd_putc,"1111";
                      break;
            case "2": printf(lcd_putc,"2222";
                      break;
            default:  printf(lcd_putc,"xxxx";
         }
      }
   }
}

Título: RE: #INT_RDA
Publicado por: PabloFiscella en 28 de Marzo de 2006, 16:40:00
Hola RedPIC Gracias por la ayuda.

Acabo de probarlo y tampoco. Es algo raro porque el hard parece funcionar. Si pongo este codigo en el pic desde visual puedo enviar datos. Pero con la interrupcion no.

Ah. Probe desde el pic mandar un printf y un putc y desde visual Basic capturarlo y eso funciona

#include <18F452.h>
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C0,rcv=PIN_C1)
#fuses XT, NOPROTECT, PUT, NOWDT, BROWNOUT, NOLVP, NOCPD, NOWRT

#include <lcd_4x20.c>

char opcion;

void main() {
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   lcd_init();
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Prueba"Giño;
   while(true) {
         opcion = getc();
         lcd_gotoxy(1,1);
         switch(opcion){
            case "1": printf(lcd_putc,"1111"Giño;
                      break;
            case "2": printf(lcd_putc,"2222"Giño;
                      break;
            default:  printf(lcd_putc,"xxxx"Giño;
         }
   }
}
Título: RE: #INT_RDA
Publicado por: PabloFiscella en 31 de Marzo de 2006, 22:45:00
Ayuda!!!!! Ya no se me ocurre nada probe todo y sigo con el mismo problema.
Ahora probe esta para ver si lo puedo hacer sin la interrupcion RDA y sin que se frene el programa. Pero el kbhit parece no funcionar. Sin este el programa funciona perfecto por eso descarto el hard.

void main() {
   lcd_init();
   lcd_gotoxy(1,2);
   while(true) {
      if(kbhit()) {
          opcion = getc();
      }
      if(opcion != 0x00) {
         lcd_gotoxy(1,1);
         switch(opcion){
            case "1": printf(lcd_putc,"1111"Giño;
                      break;
            case "2": printf(lcd_putc,"2222"Giño;
                      break;
         }
      }
   }
}
Título: RE: #INT_RDA
Publicado por: Mario_2004 en 01 de Abril de 2006, 14:07:00
Hola Pablo, creo que todo tu problema está en esta línea:
Codigo:
#use rs232(baud=9600,xmit=PIN_C0,rcv=PIN_C1)


prueba a ponerlo de esta forma:
Codigo:
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)


La interrupción RDA, solo funciona con el hard del micro.

saludos
Título: RE: #INT_RDA
Publicado por: PabloFiscella en 01 de Abril de 2006, 19:32:00
Biennnnn.

Era eso, mil gracias Mario y todos lo que me ayudaron.
Funciona Perfecto.

Saludos.