Autor Tema: Problema con comunicacion entre dos PIC y PC  (Leído 1384 veces)

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

Desconectado bacocio

  • PIC10
  • *
  • Mensajes: 4
Problema con comunicacion entre dos PIC y PC
« en: 08 de Abril de 2012, 19:03:26 »
Hola Amig@s

Estoy creando un "pequeño" control centralizado con PIC. Tengo dos pic, una 16F84A, la cual, por hardware le creo dos puertos UART. (UART 1, que va  hacia la otra PIC: Tx: A2;  Rx:A3 ) (UART 2, que va  hacia PC: Tx: A0;  Rx:A1). Y una 16F877A que sensa entradas digitales. Ej si se activa una entrada B0, activa la salida D0. Lo mismo con los otros 7 bits.

Basicamente, el programa de la 84A comienza enviando una cadena a la otra pic, la 877A, recibe ese caracter y le envia la informacion de los puertos de salida, cuales estan en 0 y 1. Envia una cadena de la siguiente foma: 10100010.

la 84A recibe esta cadena y la envia al PC para que se muestre en pantalla.  Y esa rutina siempre se ejecuta, actualizando los datos en pantalla.

Por el virtual terminal de proteus, funcionan bien las dos por separado, pero al momento de juntarlas. no funcionan. la 877A se queda pegada, creo que en la interrupcion.

Por favor, me podrian hechar una ayudita.

Gracias.

PIC 16F84A

Código: [Seleccionar]
#include "16f84a.h"                                     
#use delay(clock=20000000)     
#use rs232(baud=9600,parity=N,xmit=PIN_A2,rcv=PIN_A3,bits=8, stream=SUART1) // HACIA PIC
#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8, stream=SUART2) // HACIA PC
#include <string.h>
#include <stdlib.h>
#fuses hs,nowdt,noprotect 


#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86
#byte PORTB = 0x06


char  nombre[10]={0};
 int i;
 
void main ()
{
      set_tris_a(0x0A);                // puerto D como salida 10101010
      set_tris_b(0xFF);
      PORTA=0x00;
      PORTB=0x00;
      output_high(PIN_B0);
      delay_ms(1000);
   while (true)
      {
 fprintf(SUART1,"ST");    // lo envia a la pic
 gets(nombre);           // espera respuesta de la pic
 
 output_low(PIN_B0);
 delay_ms(500);
 output_high(PIN_B0);

 for(i=0;i<11;i++)
 {
  fprintf(SUART2,"%c", nombre[i]);
 }
  output_low(PIN_B0);
 delay_ms(1000);
 output_high(PIN_B0); 
}
}

PIC 16F877A

Código: [Seleccionar]
#include "16f877a.h"                                         
#use delay(clock=20000000)     
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use  fast_io(d)
#include <string.h>
#include <stdlib.h>
#fuses hs,nowdt,nobrownout,nolvp,noprotect 
#byte TRISB = 0x86
#byte PORTB = 0x06
#byte TRISC = 0x87
#byte PORTC = 0x07
#byte TRISD = 0x88
#byte PORTD = 0x08
#byte TRISE = 0x89
#byte PORTE = 0x09

   char     dato_rec[2]={0};
   int      D1=0;
   int      D2=0;
   int      D3=0;
   int      D4=0;
   int      D5=0;
   int      D6=0;
   int      D7=0;
   int      D8=0;
   int      i;
   int      c;
 
#INT_RDA 
 void mensaje()
 {
 i=0;
disable_interrupts(INT_RDA);
if(kbhit()){
c=getc();
      while(c!=0x0D)
         { 
         dato_rec[i]=c;
         i++;
         c=getc();
         }
 }
enable_interrupts(INT_RDA);
}



 
void main ()
{

     output_low(PIN_C0);
     
      set_tris_c(0x80);                // puerto C como salida 10001111
      set_tris_d(0x00);                // puerto D como salida
      set_tris_b(0xFF);                // puerto B como entrada
      PORTC=0x00;
      PORTD=0x00;
      PORTB=0x00;
      enable_interrupts(INT_RDA);
      enable_interrupts(global);
 
   while (true)
      {
 

 if (input(PIN_B0)) {
 output_high(PIN_D0);
 }
 else
{
 output_low(PIN_D0);
 }
 
  if (input(PIN_B1)) {
 output_high(PIN_D1);
 }
 else
{
 output_low(PIN_D1);
 }
  if (input(PIN_B2)) {
 output_high(PIN_D2);
 }
 else
{
 output_low(PIN_D2);
 }
  if (input(PIN_B3)) {
 output_high(PIN_D3);
 }
 else
{
 output_low(PIN_D3);
 }
  if (input(PIN_B4)) {
 output_high(PIN_D4);
 }
 else
{
 output_low(PIN_D4);
 }
  if (input(PIN_B5)) {
 output_high(PIN_D5);
 }
 else
{
 output_low(PIN_D5);
 }
  if (input(PIN_B6)) {
 output_high(PIN_D6);
 }
 else
{
 output_low(PIN_D6);
 }
  if (input(PIN_B7)) {
 output_high(PIN_D7);
 }
 else
{
 output_low(PIN_D7);
 }
 
 if(dato_rec[0]!=0) 
 {
 output_high(PIN_C0);
  delay_ms(500);
  D1=input(PIN_D0);
  D2=input(PIN_D1);
  D3=input(PIN_D2);
  D4=input(PIN_D3);
  D5=input(PIN_D4);
  D6=input(PIN_D5);
  D7=input(PIN_D6);
  D8=input(PIN_D7);
 
  printf("%d%d%d%d%d%d%d%d",D8,D7,D6,D5,D4,D3,D2,D1);

  output_high(PIN_C0);
  delay_ms(200);
  output_low(PIN_C0);
 
  for(i=0;i<9;i++)
  {
  dato_rec[i]=0;
  }
 }
}

}


Gracias

Desconectado bacocio

  • PIC10
  • *
  • Mensajes: 4
Re: Problema con comunicacion entre dos PIC y PC
« Respuesta #1 en: 19 de Abril de 2012, 23:59:39 »
nadie lo ha hecho que me pueda dar una respuesta?? :(


 

anything