Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

30/09/2012 #1


Problemas con interrupcion uart con 18f4550
Hola a todos. Tengo que realizar una comunicación usart entre dos pics 18f. Mientras el emisor envía valores numéricos el receptor los almacena y demás. Mi problema radica en que deseo que el receptor le envíe al emisor un código que lo habilite a este ultimo a enviar la información. Para ello he hecho los siguientes programas y lamentablemente no se realiza la comunicación. Sospecho que el problema esta en que al usar interrupciones de recepción el receptor nunca ejecuta la función putc(15), y no tengo idea de por que ocurre esto. Alguien puede ayudarme? Agrego los códigos a continuación:

Transmisor:
Código:
#include <18F2550.h>

#fuses XTPLL,USBDIV,PLL1,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG
#use delay(clock=48000000)

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=n)

#byte porta=getenv("SFR:PORTA")
#byte portc=getenv("SFR:PORTC")
#byte portb=getenv("SFR:PORTB")

int val,valor;


#int_RDA
void RDA_isr() 
{ 
   delay_ms(250);
   val=GETC();
   
   if (val==15){
                  output_toggle(pin_a0);
                  PUTC(valor);
                  portb=(valor&0x0f);
                  delay_ms(100);
                  valor++;
               }
}

void main()
{
   portb=porta=portc=0;
   set_tris_a(0b11111110);
   set_tris_b(0xf0);
 //  set_tris_c(0b10111111);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

while(true)
   {
   }
}
Receptor:
Código:
#include <18F4550.h>

#fuses XTPLL,USBDIV,PLL1,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG
#use delay(clock=48000000)
#include <lcdpf.c>
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=n)

#byte porta=getenv("SFR:PORTA")
#byte portb=getenv("SFR:PORTB")
#byte portc=getenv("SFR:PORTC")


int8 val;

#int_RDA
void RDA_isr() 
{
 val=GETC();
 output_toggle(pin_a0);
}

void main()
{  int i;
   lcd_init();
   porta=portc=portb=0;
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
 
   set_tris_b(0x00);
   set_tris_c(0b10000000);
   set_tris_a(0xfe);
//   set_tris_d(0xff);
   
   WHILE(TRUE)
   {  
                   lcd_gotoxy(1,1);
                   printf(lcd_putc,"usart=%3u     ",val);
                   putc(15);
                   
   }
}
Desde ya les agradezco sus respuestas
02/11/2012 #2


Hola a todos nuevamente. Por si alguien se topa con el problema que presenté anteriormente, les comento que pude resolverlo haciendo unas muy pequeñas modificaciones a los firmwares. Los respectivos programas quedaron como se muestran a continuación:

Transmisor:

Código:
#include <18F2550.h>

#fuses XTPLL,USBDIV,PLL1,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG  // FUSES PARA USAR USB
#use delay(clock=48000000)
#include <lcdpf.c>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#byte porta=getenv("SFR:PORTA")
#byte portc=getenv("SFR:PORTC")
#byte portb=getenv("SFR:PORTB")

int VALOR;
int val,val1;

#int_RDA
void RDA_isr() 
{ 
   val=GETC();
   if (val==1){
                  output_toggle(pin_a0);
                  PUTC(valor);
                  portb=(valor&0x0f);
                  valor++;
               }
}


void main()
{
   int valor=0;
   portb=porta=portc=0;
   set_tris_a(0b11111110);
   set_tris_b(0xf0);
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA);

while(true)
    {
    }
}
Receptor:

Código:
#include <18F4550.h>

#fuses XTPLL,USBDIV,PLL1,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG  // FUSES PARA USAR USB
#use delay(clock=48000000)
#include <lcdpf.c>
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=n)
#byte porta=getenv("SFR:PORTA")
#byte portb=getenv("SFR:PORTB")
#byte portc=getenv("SFR:PORTC")
#byte portd=getenv("SFR:PORTD")
#byte porte=getenv("SFR:PORTE")

int8 val;

#int_RDA
void RDA_isr() 
{
   val=GETC();
}

void main()
{  int i;
   lcd_init();
   porta=portc=portb=0;
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
 
   set_tris_b(0x00);
   set_tris_c(0xff);
   set_tris_a(0xff);
   set_tris_e(0x00);
   
   WHILE(TRUE){
                   putc(1);
                   lcd_gotoxy(1,1);
                   printf(lcd_putc,"usart=%3u     ",val);
                   lcd_gotoxy(1,2);
                   printf(lcd_putc,"usart=%3u     ",val);
                   lcd_gotoxy(1,3);
                   printf(lcd_putc,"usart=%3u     ",val);
                   portb=val;   
                   delay_ms(200);
                   output_toggle(pin_e0);
                
         
   }
}
03/11/2012 #3


Muy buen aportee murphy!! algo identico necesito yo. Espero que pueda lograr lo que necesito.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.