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
#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
#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