Autor Tema: Interrupcion por le puerto Serie  (Leído 1808 veces)

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

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Interrupcion por le puerto Serie
« en: 18 de Enero de 2008, 15:14:36 »
Hola amigos,

Estoy tratando de hacer un programa que se encuentra en un lazo infinito pero que cuando ingrese un caracter por el hipertterminal el pic sea interrumpido por el puerto serie,  lea el puerto y lo vuelva a retransmitir para que lo pueda ver en el hipertermional.

este es mi codigo, quisiera saber cual es el error por que no logro visualizar nada.

Código: [Seleccionar]
#include <18f4550.h>
//#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#define USE_INTERRUPTS 1

char dato;

// INTERRUPCION por RECEPCION SERIE -------------------------------------------

#int_rda
void serial_isr() {

     if(kbhit()){
     dato=getc();
     printf("Dato Recibido %S\r\n",dato);
   }
}
void main() {

   disable_interrupts(global);
   disable_interrupts(int_timer1);
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_tris_c(0b10000000);

  while (TRUE);
 {
//lazo infinito
 }
 }

Desconectado qwmnzxpo

  • PIC10
  • *
  • Mensajes: 27
Re: Interrupcion por le puerto Serie
« Respuesta #1 en: 18 de Enero de 2008, 15:51:19 »
¿Cuando configuras el Hyperterminal te fijas en poner --> Control de Flujo Ninguno, envez de Hardware?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Interrupcion por le puerto Serie
« Respuesta #2 en: 18 de Enero de 2008, 16:10:12 »
También deberías habilitar la interrupción:

enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Interrupcion por le puerto Serie
« Respuesta #3 en: 18 de Enero de 2008, 16:56:47 »
Hola modulay,

He habilitado las interrupciones y sigue con el mismo problema, el codigo lo hestoy probando con el Proteus7.2

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Interrupcion por le puerto Serie
« Respuesta #4 en: 18 de Enero de 2008, 17:09:13 »
Yo estoy teniendo un problema similar con un 18F2550.
Resulta que estos micros,además del 2455 y el 4455 tienen un defecto de fabricación en la usart,por lo que hay posibilidad de que sea el motivo de que no funcione el asunto,el menos en mi caso que lo estoy probando físicamente sobre el pic.
Puedes probar con otro micro como el 16F877 por ejemplo y ver si te ocurre lo mismo.
Yo estoy esperando que me lleguen unos que pedí para poder descartar que el problema venga de un bug de fabricación.

Desconectado qwmnzxpo

  • PIC10
  • *
  • Mensajes: 27
Re: Interrupcion por le puerto Serie
« Respuesta #5 en: 18 de Enero de 2008, 18:29:55 »
Yo lo estoy haciendo fisicamente en un 16f877a y no sale nada por pantalla con el programa que ha colgado.

Lo retoque un poco elimine algunas cosas que no necesitaba y las cabeceras las cambie.

Yo tambien tengo un problema y es que cada vez que salta la interrupcion y hace el getc() el valor que toma es un 0 y todo el rato me manda 0 al puerto serie.

El código de mi programa esta en: http://www.todopic.com.ar/foros/index.php?topic=20027.0

En el hilo hay varios codigos el "mas" correcto es el ultimo.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Interrupcion por le puerto Serie
« Respuesta #6 en: 19 de Enero de 2008, 04:17:56 »
Tienes que habilitar las interrupciones como te ha dicho Modulay.

En el printf("Dato Recibido %S\r\n",dato); ... esa S debe ser una c.

Yo lo he probado en PROTEUS con un 877 (la versión de este ordenador no tiene el 4550) y sí que va ... faltaría probarlo físicamente.

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Interrupcion por le puerto Serie
« Respuesta #7 en: 19 de Enero de 2008, 20:05:40 »
 
Citar
En el printf("Dato Recibido %S\r\n",dato); ... esa S debe ser una c.

Hola Poncher,

Tenias razon cambie el formato y funciona perfecto, gracias