hola, tengo un problema con la comunicacion entre dos pics, la cual es por puerto serie.
en el 4550 uso el rs232 que tiene integrado, es decir no lo emulo, pero en el 16f84 si es emulado, no se si tenga al que ver, o sea algo mas, alguna ayuda se agradeceria,
en proteus lo simula perfectamente, a diferentes configuraciones de baudios... 1200...2400...9600 y todo bien, pero en la vida real no...
esta es la configuracion del 18f4550 y como recive por interrupcion los caracteres
#include <18F4550.h>
#device adc=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES PLL1 //No PLL PreScaler
#FUSES CPUDIV1 //No System Clock Postscaler
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD sin pasar por el pll
#FUSES NOBROWNOUT //No brownout reset
#FUSES USBDIV
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=4MHZ)
#use rs232(baud=1200, xmit=PIN_C6,rcv=PIN_C7)
--------------------------------
#int_RDA
void RDA_isr() { // Interrupción recepción serie USART
disable_interrupts(GLOBAL);
//lcd_putc('X');
//putc('x');
rcvchar=0x00; // Inicializo carácter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar=getc(); // lo descargo y ...
addcbuff(rcvchar); // lo añado al buffer y ...
echos(rcvchar); // hago eco (si procede).
lcd_putc(rcvchar);
} // termina if
if(flagcommand)procesa_comando();
ON(LCD_LED);
output_toggle(RELE_ALIMENTO); // invierte el led del sistema (para dar un parpadeo cada segundo)
flush=1;
enable_interrupts(GLOBAL);
} // termina interrupcion por RDA
esto es lo que envia el 18f4550,
#include <16F84A.h>
#FUSES NOWDT //Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#use delay(clock=4000000)
#use rs232(baud=1200,xmit=PIN_A0,rcv=PIN_A3)
//--------------------------------------------------------------------
#define ON output_high
#define OFF output_low
#define BOCINA PIN_A2//-------------A2
#define LED_rojo PIN_A1
#define columna_a PIN_B0
#define columna_b PIN_B1
#define columna_c PIN_B2
#define columna_d PIN_B3
#define fila_1 PIN_B4
#define fila_2 PIN_B5
#define fila_3 PIN_B6
#define fila_4 PIN_B7
/*#define columna_a PIN_B4
#define columna_b PIN_B5
#define columna_c PIN_B6
#define columna_d PIN_B7
#define fila_1 PIN_B0
#define fila_2 PIN_B1
#define fila_3 PIN_B2
#define fila_4 PIN_B3*/
#include "sonidos.c"
---------------------------------------
#include <main.h>
char columna; //Variable contador de columnas 1-4
char boton; //Variable de alamacenaje de tecla
int1 flag_banderilla=0; //bandera anti flanco de bajada
// Keypad layout:
char const KEYS[4][4] = {{'1','2','3','A'}, //Formato de Teclado
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
#int_RB //interrupcion de cambio del
void RB_isr(void) { //estado del puerto B
char fila;//variable de seleccion de fila
ON(LED_rojo);
//delay_ms(100);
flag_banderilla=0;
if(input_state(fila_1)==1){fila=0; flag_banderilla=1;}
if(input_state(fila_2)==1){fila=1; flag_banderilla=1;}
if(input_state(fila_3)==1){fila=2; flag_banderilla=1;}
if(input_state(fila_4)==1){fila=3; flag_banderilla=1;}
boton=KEYS[fila][columna-1]; //asigna a boton, el boton que disparo la interupcion
if(flag_banderilla==1){
putc('T');
delay_ms(50);
putc(boton);
delay_ms(50);
putc('\r');
delay_ms(50);
beep();
}
OFF(LED_rojo);
}
void main(){
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
do{
columna++;
if(columna==5)columna=1;
switch(columna){
case 1: OFF(columna_d); ON(columna_a); break;
case 2: OFF(columna_a); ON(columna_b); break;
case 3: OFF(columna_b); ON(columna_c); break;
case 4: OFF(columna_c); ON(columna_d); break;
}
delay_ms(10);
}while(TRUE);
}